当前位置: 首页 > news >正文

关于TCP三次握手

一、什么是TCP

TCP(传输控制协议),位于传输层,为应用层提供可靠的、面向连接的字节流服务。

每个TCP连接由四元组唯一确定:(源IP, 源端口, 目的IP, 目的端口)

关键特性

        可靠:数据无差错、不丢失、不重复,并且按序到达

                通过停止等待协议等机制实现

        面向连接:当连接建立后才发送数据

        全双工通信:建立连接后双方可同时收发数据

二、TCP首部关键字段

1.SYN(同步序列号):用于建立连接时同步序列号。当SYN=1时,表示这是一个连接请求或连接接受报文。

2.ACK(确认):表示确认号是否有效。当ACK=1时,确认号字段有效。

3.序列号:32位无符号数,标识发送的数据字节流,确保数据能按序到达。在建立连接时,双方会交换初始序列号(ISN)。

4.确认号:32位无符号数,表示期望收到的下一个字节的序号,实际上是对收到的所有数据的确认。

三、TCP三次握手流程

第一次握手(SYN):

        客户端发送一个请求报文,SYN=1,选择一个初始序列号seq=x

第二次握手(SYN+ACK):

        服务器收到SYN报文后,如果同意建立连接,则发送一个应答报文

        SYN=1,ACK=1,确认号ack=x+1,并随机选择一个初始序列号seq=y

第三次握手(ACK):

客户端收到服务器的SYN+ACK报文后,向服务器发送确认报文

ACK=1,确认号ack=y+1,序列号seq=x+1

四、第三次握手的必要性

主要原因: 避免重复连接

场景: 客户端发送SYN请求,等待超时,然后再次发送SYN请求

若第二次请求先于第一次请求到达服务端:

        如果采用二次握手: 服务端收到两个请求,就会建立两个TCP连接

        如果采用三次握手: 客户端知道第一个请求是无效的,不会回复ACK,只会建立一个TCP连接

五、关于TCP三次握手的一些疑问

1.TCP由四元组唯一标识, 为什么会建立重复连接?

客户端发起连接请求时, 需要显示指定服务端的端口(如HTTP-80)

客户端的端口一般由操作系统临时分配(通常32768~60999),所以请求四元组可能不同

如果没有第三次握手机制,不同的请求都会被建立

2.初始序列号ISN是怎么生成的?

早期系统使用简单的时钟计数器(如每秒递增1)

现代采用基于时钟、哈希、加密种子等随机算法

3.确认号为什么每次加1?

确认号表示"已成功收到了所有数据,期待下次从该序号开始发送"

ACK = 对方发送的序列号seq + 数据长度len (累积确认)

当发送纯SYN数据包时, 数据长度部分为0,但SYN标志位占有1个虚拟序号,所以ACK=seq+1

4.服务端为什么被动打开?

服务端程序启动时会调用 listen() 系统调用,将socket置于"监听状态"

被动打开: 指的是服务端预先准备好接受连接请求,但并不主动发起连接

http://www.xdnf.cn/news/567631.html

相关文章:

  • 【ULR #1】打击复读 (SAM, DAG链剖分)
  • PHP学习笔记(八)
  • Linux操作系统之进程(二):进程状态
  • cocos creator使用jenkins打包微信小游戏,自动上传资源到cdn,windows版运行jenkins
  • 攻防世界-stegano
  • 物流项目第五期(运费计算实现、责任链设计模式运用)
  • TDengine 运维—容量规划
  • 学习 Android(十一)Service
  • 安卓蓝牙frameworks/base/core/java/android/bluetooth这个路径下文件的作用
  • Android 自定义SnackBar和下滑取消
  • 命令行参数和环境变量
  • 力扣热题100,力扣148.排序链表力扣.26找出字符串中第一个匹配项的下标力扣146.LRU缓存序列管理器
  • MySQL 8.0 OCP 1Z0-908 171-180题
  • Keepalived 配置深度解析及最佳实践
  • 回表是数据库概念,还是mysql的概念?
  • MyBatis 关联映射深度解析:_association_ 与 _collection_ 实战教程
  • k8s-ServiceAccount 配置
  • spring5-配外部文件-spEL-工厂bean-FactoryBean
  • 【疑难杂症】Mysql 无报错 修改配置文件后服务启动不起来 已解决|设置远程连接
  • Redis SETNX:分布式锁与原子性操作的核心
  • Docker run命令-p参数详解
  • Python打卡训练营day28-类的定义与方法
  • 2021-04-12 VSC++: 寻找N以内的亲密数对。(求因子和)
  • 【Node.js】Web开发框架
  • 牛客网NC15869:长方体边长和计算问题解析
  • Python中的常量和变量分别是怎么定义的?
  • 【QT】在界面A打开界面B时,界面A隐藏,界面B关闭时,界面A复现
  • chromedp -—— 基于 go 的自动化操作浏览器库
  • Redis 的 key 的过期策略是怎么实现的
  • Redis String 设计思想深度解析