计算机网络-传输层

TCP

TCP头结构详解

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。TCP头部包含了多个字段,用于实现连接管理、数据传输控制和错误检测等功能。以下是对TCP头部结构的详细解析:

TCP头结构

TCP头部通常包含20字节的固定部分和可选的40字节选项部分,总共最多60字节。以下是TCP头部的各个字段:

字段名称 位数 作用
源端口号(Source Port) 16 标识发送端应用程序的端口号。
目标端口号(Destination Port) 16 标识接收端应用程序的端口号。
序号(Sequence Number) 32 在建立连接时由计算机生成的随机数作为初始值,通过SYN包传给接收端主机。每发送一次数据,就“累加”一次该“数字字节数”的大小。用于解决网络包乱序问题
确认号(Acknowledgment Number) 32 指下一次“期望”收到的数据的序列号。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。。
数据偏移(Data Offset) 4 指示TCP头部的长度(以32位字为单位),即TCP头部的总字节数。
保留字段(Reserved) 6 保留字段,未使用,必须设置为0。
控制位(Control Bits) 6 包含多个控制标志位,用于控制TCP连接的建立、维护和终止。
窗口大小(Window Size) 16 指示发送端可以接收的数据量(以字节为单位),用于流量控制。
校验和(Checksum) 16 用于检测TCP头部和数据在传输过程中是否发生错误。
紧急指针(Urgent Pointer) 16 当URG标志位为1时,指示紧急数据的结束位置。
选项(Options) 长度可选,最大32位 可选字段,用于扩展TCP功能,如最大段大小(MSS)、窗口缩放因子等。

控制位(Control Bits)详解

标志位 作用(相应位为1时有效)
URG 紧急指针有效,表示数据包中包含紧急数据,接收端应优先处理。
ACK 确认号有效,表示确认号字段包含有效的确认信息。
PSH 推送数据,接收端应尽快将数据交给应用程序,而不等待缓冲区满。
RST 用于重置连接,当连接出现异常时,发送RST包重置连接。
SYN 用于建立连接,发送端和接收端通过交换SYNSYN-ACK包来同步初始序号。
FIN 用于终止连接,发送端和接收端通过交换FINACK包来关闭连接。

TCP三次握手

TCP是面向连接的协议,所以在使用TCP之前必须通过TCP三次握手来建立TCP连接,流程图如下:

图片来源小林coding

三次握手过程

  1. 初始状态
  • 客户端:处于CLOSE状态。
  • 服务器端:主动监听某个端口,处于LISTEN状态。
  1. 第一次握手(SYN)
  • 客户端
    • 生成一个随机的初始序号(ISN,Initial Sequence Number),记为client_isn
    • client_isn放入TCP头部的序号字段中。
    • 将控制位SYN设置为1,表示这是一个同步请求。
    • 发送SYN包给服务器端。
    • 发送完后,客户端进入SYN-SENT状态。
  1. 第二次握手(SYN-ACK)
  • 服务器端
    • 收到客户端发来的SYN包。
    • 生成一个随机的初始序号(ISN),记为server_isn
    • server_isn放入TCP头部的序号字段中。
    • 将客户端发来的SYN包中的序号加1(即client_isn + 1)存放到TCP头部的确认号字段中。
    • 将控制位SYNACK设置为1,表示这是一个同步确认响应。
    • 发送SYN-ACK包给客户端。
    • 发送完后,服务器端进入SYN-RCVD状态。
  1. 第三次握手(ACK)
  • 客户端
    • 收到服务器端发来的SYN-ACK包。
    • 将TCP头部的序号字段值加1(即client_isn + 1)。
    • 将服务器端发来的序号加1(即server_isn + 1)存放到TCP头部的确认号字段中。
    • 将控制位ACK设置为1,表示这是一个确认响应。
    • 此时可以在报文后携带应用层的数据。
    • 发送ACK包给服务器端。
    • 发送完后,客户端进入ESTABLISHED状态。
  • 服务器端
    • 收到客户端发来的ACK包。
    • 服务器端进入ESTABLISHED状态。
步骤 客户端状态 服务器端状态 描述
1 CLOSE LISTEN 客户端和服务器端初始状态。
2 SYN-SENT LISTEN 客户端发送SYN包,进入SYN-SENT状态。
3 SYN-SENT SYN-RCVD 服务器端收到SYN包,进入SYN-RCVD状态,发送SYN-ACK包。
4 ESTABLISHED SYN-RCVD 客户端收到SYN-ACK包,进入ESTABLISHED状态,发送ACK包。
5 ESTABLISHED ESTABLISHED 服务器端收到ACK包,进入ESTABLISHED状态,连接建立完成。

三次握手的特点

  • 前两次握手不携带数据:第一次握手(SYN)和第二次握手(SYN-ACK)不携带应用层数据,只包含TCP头部信息。
  • 第三次握手可以携带数据:第三次握手(ACK)可以携带应用层数据,因为此时双方都已经确认了对方的初始序号,连接已经建立。
  • 同步初始序号:通过三次握手,客户端和服务器端同步了初始序号(ISN),确保双方在数据传输过程中能够正确识别数据包的顺序。
  • 确认机制:通过确认号(Acknowledgment Number),双方可以确认对方已经接收到的数据包,确保数据的可靠传输。

TCP为什么要进行三次握手

  • 三次握手才可以防止历史连接(主要原因):假设只进行两次握手,当网络拥塞时客户端发送了多个数据,假如旧的SYN包先到达服务器端,服务器端收到后向客户端返回SYN-ACK包后就立即进入了ESTABLISH状态,虽然客户端能够分辨出这是历史连接,但服务器端并没有中间状态来预防,而是直接建立了一个历史连接,浪费了资源。
  • 三次握手才可以同步序列号
  • 三次握手才可以避免浪费资源