TCP协议

提前知晓:

TCP 的连接与关闭的概念和过程

Alt text

以客户端主动连接 TCP连接为例,TCP 连接建立过程如下:

  • 客户端 TCP 发送一个 SYN 报文段。该报文段包括源端口号、目的端口号、客户的初始序号、客户可接收的 TCP 报文段数据的最大长度(MSS)等信息。
  • 服务器端 TCP 收到客户端的 SYN 报文段后,返回一个 SYN 和 ACK 报文段。该报文段使用ACK标志和确认号字段确认已经收到了客户端的SYN报文段,另外对服务器端的报文段进行初始化。
  • 客户端 TCP 收到服务器端的 SYN 和 ACK 报文段后,发送一个 ACK 报文段。该报文段使用 ACK 标志和确认号字段确认已经收到了服务器端的 SYN 和ACK 报文段。

Alt text

TCP 连接中的任何一方(客户或服务器)都可以关闭连接。当一方的连接被终止时,另一方还可以继续向对方发送数据。因此,要关闭双向的 TCP 连接就需要 4 个动作。
以客户端主动关闭 TCP 连接为例,TCP 连接终止过程如下:

  • 客户端 TCP 发送一个 FIN 报文段,宣布它要终止连接。
  • 服务器端 TCP 收到客户端的 FIN 报文段后,返回一个 ACK 报文段,用来确认已收到了客户端的 FIN 报文段。
  • 服务器端 TCP 可以在服务器到客户方向上继续发送数据。当服务器没有更多的数据发送时,就发送一个 FIN 报文段。
  • 客户端 TCP 收到服务器端的 FIN 报文段后,返回一个 ACK 报文段,用来确认已收到了服务器端的 FIN 报文段。

TCP协议分析

TCP 协议(RFC 793)是一个面向连接的、可靠的运输层协议,通过连接建立和连接终止这两个过程完成面向连接的传输。TCP 的连接建立通常被称为“三向握手”。在建立 TCP 连接之前,服务器程序需要向它的 TCP 模块发出被动打开请求,表示该服务器已经准备好接受客户的连接。客户程序则要向它的 TCP 模块发出主动打开请求,表示该客户需要连接特定的服务器。然后即可开始建立 TCP 连接。

格式:

Ethernet II:
目的MAC地址:6个字节
源MAC地址:6个字节
协议类型:2个字节

Internet Protocol Version 4:
IP数据报固定首部:20个字节

针对Ethernet II和Internet Protocol Version 4的具体分析在ICMP协议

Transmission Control Protocol:
源端口号(Source Port):2字节
目的端口号(Destination Port):2字节
序列号(Sequence Number):4字节
确认号(Acknowledgment Number):4字节
标志位(Flags):2字节(第一位表示头部长度,第二到四位表示flags)
窗口(Window):2字节,
校验和(Checksum):2字节,
紧急指针(Urgent Pointer):2字节
选项(Options):可变长度,最长可达40字节,也可以没有。

Alt text

  • 源端口号(Source Port)和目的端口号(Destination Port):用于标识通信的源和目的应用程序。这两个值加上IP首部中的源IP地址和目的IP地址唯一确定一个TCP连接。
  • 序列号(Sequence Number):表示本报文段所发送的数据的第一个字节在整个数据流中的位置,用于数据的重组和接收方确认。序号是32位的无符号数,序号到达2^32-1后从0开始。
  • 确认号(Acknowledgment Number):表示期望收到对方下一个报文段的首部中的序号,也就是期望收到的下一个字节的序号。只有ACK标志为1时,确认号才有效。
  • 标志位(Flags):用于传输控制,有以下几种:
    • URG:当URG=1时,表示紧急指针字段有效,用于传送紧急数据。
    • ACK:当ACK=1时,表示确认号字段有效,用于确认已收到的数据。
    • PSH:当PSH=1时,表示推送操作,要求接收方尽快将本报文段交付给应用层,而不要等待缓存区填满。
    • RST:当RST=1时,表示复位操作,用于异常中断或拒绝一个连接。
    • SYN:当SYN=1时,表示同步序号,用于建立连接时同步双方的序号。
    • FIN:当FIN=1时,表示终止连接,用于释放连接资源。
  • 窗口(Window):表示接收方的接收窗口大小,用于流量控制。窗口大小是一个16位的无符号数,因此窗口大小最大为65535字节。
  • 校验和(Checksum):用于检验TCP首部和数据的完整性和正确性。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部,包括源IP地址、目的IP地址、协议号(TCP为6)和TCP长度。
  • 紧急指针(Urgent Pointer):只有当URG标志为1时才有效,表示紧急数据的最后一个字节的序号,用于指示紧急数据的长度。
  • 选项(Options):用于提供一些额外的功能,如最大报文段长度(MSS)、窗口扩展、时间戳等。

连接分析:
由于TCP连接的3次握手,所以我们会捕获到三个连续的TCP数据包,
Alt text

第一个TCP数据包是SYN数据包:
其中Seq=0,Ack=0;
SYN=1表示发起一个连接请求
Alt text

第二个TCP数据包是SYN/ACK数据包:
其中Seq=0,Ack=1;
SYN=1表示发起一个连接请求,ACK=1表示确认连接请求
Alt text

第三个TCP数据包是ACK数据包:
其中Seq=1,Ack=1;
ACK=1表示确认连接请求
Alt text

关闭分析:
由于TCP连接的4次挥手,所以我们会捕获到四个连续的TCP数据包,
Alt text

第一个TCP数据包是FIN/ACK数据包:
其中Seq=331,Ack=134;
FIN=1表示发起一个关闭连接的请求,ACK=1
Alt text

第二个TCP数据包是ACK数据包:
其中Seq=134,Ack=332;
ACK=1表示确认请求
Alt text

第三个TCP数据包是FIN/ACK数据包:
其中Seq=134,Ack=332;
FIN=1表示发起一个关闭连接的请求,ACK=1
Alt text

第四个TCP数据包是FIN/ACK数据包:
其中Seq=332,Ack=135;
ACK=1表示确认请求
Alt text