TCP三次握手四次挥手
TCP协议
TCP头格式
TCP收到应用层提交的数据之后,将其分段,并在每个分段前面封装一个TCP头,最终的IP包是在TCP头之间再添加IP形成的
TCP头由20B的固定长度部分加上变长的选项字段组成
TCP头的各字段含义如下:
源端口(Source Port)
源端口是初始化通信的端口号,通常与IP地址一起起到标识报文的返回地址
目的端口(Destination Port)
目的端口是定义传输的目的,通常指接收方计算机上的应用程序接口
序列号(Sequence Number)
用于标识TCP源端设备向目的设备发送的字节流,形象的指对每个字节进行计数
确认号(Acknowledgement Number)
用于标识期望收到的下一个段的第一个字节,并声明此前接收到的所有数据都正确无误的收到。因此,确认序号应该是上一次成功收到的数据字节序列号加1。确认号的字段只有在ACK标志被置为1时生效
数据偏移(Data Offset)
表示数据开始的地方离TCP段的起始位置有多远,实际上就是TCP头部长度,TCP头部是不固定的
保留(Reserved)
顾名思义
控制位(Control Bits)
- URG: 用于表示TCP包的紧急指针字段有效,用来保证TCP连接不被中断,并督促中间层设备要尽快处理这些数据
- ACK: 取值为1时表示应答字段有效,为0时反之
- PSH: 表示Push操作,当数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队
- RST: 表示连接复位请求,用来复位产生错误的连接,也被用来拒绝和非法的数据包
- SYN: 表示同步序列号,用来建立连接
- FIN: 表示发送端已经发送完毕,发送FIN标志位的TCP段后,连接将被断开
窗口(Window)
表示它期望每次收到的数据的字节数
校验和(Checksum)
源主机基于部分IP头信息、TCP头和数据内容计算出一个校验和,目的主机也要进行相同的计算,如果计算一致可证明数据的有效性
紧急指针(Urgent Pointer)
当URG标志被设置时才有效
选项(Options)
标识哪个选项有效。如果没有选项这个字节等于0,这个字节等于1标识无须再有操作;等于2表示下4个字节包括源机器的最大长度(MSS),MSS是数据字段中可包含最大的数据量,源和目的机器要对此达成一致。当一个TCP建立时,双方都要通告各自的MSS,协商可以传输的最大段长度。
填充(Padding)
用于保证TCP头是32位的整倍数,不够将添加额外的零
数据(Data)
用于载荷数据,数据的长度是由源目的主机之间进行协商的
三次握手
- 由发起方HostA向被叫方HostB发出连接请求。将随机生成一段数字作为序列号为a(100),并将控制位的SYN置位。由于是第一个包,ACK无效
- HostB收到连接请求后,读出序号为a(100),并随机生成一个序列号b(200),发送序列号为b的包,同时将ACK置为有效,并将确认号置为a+1(100+1),同时将SYN置位
- HostA收到HostB的连接确认后,对该确认再次确认。HostA收到确认号为a+1(100+1)、序列号为b(200)的包后,发送序列号为a+1(100+1)、确认号为b+1(200+1)的段进行确认
- HostB收到确认报文之后,连接建立
抓包验证
由发起方192.168.64.1向被叫方192.168.64.11发出连接请求。将随机生成一段数字作为序列号为2224225331,并将控制位的SYN置位为1。由于是第一个包,ACK无效
192.168.64.11收到连接请求后,读出序号为2224225331,并随机生成一个序列号1836170397,发送序列号为1836170397的包,同时将ACK置为有效,并将确认号置为2224225331+1,同时将SYN置位
192.168.64.1收到192.168.64.11的连接确认后,对该确认再次确认。192.168.64.1收到确认号为2224225331+1、序列号为1836170397的包后,发送序列号为2224225331+1、确认号为1836170397+1的段进行确认,同时将Ack置为1
四次挥手
- HostA要求终止连接,发送序列号为p(随机生成的一段数字)的段,FIN控制位置为有效,同时确认此前收到的段。
- HostB收到HostA发送的段后,发送ACK段,确认号为p+1,同时关闭连接
- HostB发送序列号为q(随机生成的一段数字)的段,FIN置为有效,通知连接关闭
- HostA收到HostB发送的段后,发送ACK段,确认号为q+1,同时关闭连接。