TCP协议

TCP头格式

TCP收到应用层提交的数据之后,将其分段,并在每个分段前面封装一个TCP头,最终的IP包是在TCP头之间再添加IP形成的

image-20220926040258467

TCP头由20B的固定长度部分加上变长的选项字段组成

image-20220926040457943

TCP头的各字段含义如下:

  1. 源端口(Source Port)

    源端口是初始化通信的端口号,通常与IP地址一起起到标识报文的返回地址

  2. 目的端口(Destination Port)

    目的端口是定义传输的目的,通常指接收方计算机上的应用程序接口

  3. 序列号(Sequence Number)

    用于标识TCP源端设备向目的设备发送的字节流,形象的指对每个字节进行计数

  4. 确认号(Acknowledgement Number)

    用于标识期望收到的下一个段的第一个字节,并声明此前接收到的所有数据都正确无误的收到。因此,确认序号应该是上一次成功收到的数据字节序列号加1。确认号的字段只有在ACK标志被置为1时生效

  5. 数据偏移(Data Offset)

    表示数据开始的地方离TCP段的起始位置有多远,实际上就是TCP头部长度,TCP头部是不固定的

  6. 保留(Reserved)

    顾名思义

  7. 控制位(Control Bits)

    • URG: 用于表示TCP包的紧急指针字段有效,用来保证TCP连接不被中断,并督促中间层设备要尽快处理这些数据
    • ACK: 取值为1时表示应答字段有效,为0时反之
    • PSH: 表示Push操作,当数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队
    • RST: 表示连接复位请求,用来复位产生错误的连接,也被用来拒绝和非法的数据包
    • SYN: 表示同步序列号,用来建立连接
    • FIN: 表示发送端已经发送完毕,发送FIN标志位的TCP段后,连接将被断开
  8. 窗口(Window)

    表示它期望每次收到的数据的字节数

  9. 校验和(Checksum)

    源主机基于部分IP头信息、TCP头和数据内容计算出一个校验和,目的主机也要进行相同的计算,如果计算一致可证明数据的有效性

  10. 紧急指针(Urgent Pointer)

    当URG标志被设置时才有效

  11. 选项(Options)

    标识哪个选项有效。如果没有选项这个字节等于0,这个字节等于1标识无须再有操作;等于2表示下4个字节包括源机器的最大长度(MSS),MSS是数据字段中可包含最大的数据量,源和目的机器要对此达成一致。当一个TCP建立时,双方都要通告各自的MSS,协商可以传输的最大段长度。

  12. 填充(Padding)

    用于保证TCP头是32位的整倍数,不够将添加额外的零

  13. 数据(Data)

    用于载荷数据,数据的长度是由源目的主机之间进行协商的

三次握手

image-20220926045027324

  1. 由发起方HostA向被叫方HostB发出连接请求。将随机生成一段数字作为序列号为a(100),并将控制位的SYN置位。由于是第一个包,ACK无效
  2. HostB收到连接请求后,读出序号为a(100),并随机生成一个序列号b(200),发送序列号为b的包,同时将ACK置为有效,并将确认号置为a+1(100+1),同时将SYN置位
  3. HostA收到HostB的连接确认后,对该确认再次确认。HostA收到确认号为a+1(100+1)、序列号为b(200)的包后,发送序列号为a+1(100+1)、确认号为b+1(200+1)的段进行确认
  4. HostB收到确认报文之后,连接建立

抓包验证

  1. 由发起方192.168.64.1向被叫方192.168.64.11发出连接请求。将随机生成一段数字作为序列号为2224225331,并将控制位的SYN置位为1。由于是第一个包,ACK无效

    image-20220926054412047

  2. 192.168.64.11收到连接请求后,读出序号为2224225331,并随机生成一个序列号1836170397,发送序列号为1836170397的包,同时将ACK置为有效,并将确认号置为2224225331+1,同时将SYN置位

    image-20220926054705676

  3. 192.168.64.1收到192.168.64.11的连接确认后,对该确认再次确认。192.168.64.1收到确认号为2224225331+1、序列号为1836170397的包后,发送序列号为2224225331+1、确认号为1836170397+1的段进行确认,同时将Ack置为1

    image-20220926055204885

四次挥手

image-20220926154734711

  1. HostA要求终止连接,发送序列号为p(随机生成的一段数字)的段,FIN控制位置为有效,同时确认此前收到的段。
  2. HostB收到HostA发送的段后,发送ACK段,确认号为p+1,同时关闭连接
  3. HostB发送序列号为q(随机生成的一段数字)的段,FIN置为有效,通知连接关闭
  4. HostA收到HostB发送的段后,发送ACK段,确认号为q+1,同时关闭连接。