反馈

TCP 协议深度解析:报文、三次握手、状态机和可靠性传输

如果说 IP 协议(层级 3)解决了数据包“去哪里”的问题,那么 TCP(传输控制协议,Transmission Control Protocol) 则在层级 4(传输层)解决了“怎么稳妥到达”的问题。在不可靠的 IP 网络之上,TCP 构建了一个可靠的、面向连接的字节流服务。

本篇文章将深入探讨 TCP 的核心机制,揭示它如何通过复杂的逻辑保证数据的绝对可靠。


1.TCP是什么?

传输控制协议(Transmission Control Protocol,TCP)是TCP/IP协议族中传输层的核心协议,由RFC 793(1981年)定义,后续通过多个RFC(如RFC 1122、1323、5681等)不断演进。它提供面向连接的、可靠的、字节流导向的全双工通信,是互联网上绝大多数应用(如HTTP/HTTPS、SMTP、SSH)的传输基础。TCP的设计目标是在不可靠的IP层之上构建可靠传输,处理丢包、乱序、重复和网络拥塞等问题。

当前TCP仍是主导传输协议,尽管QUIC(基于UDP)在网页传输中逐渐崛起,但TCP在可靠性要求高的场景中不可替代。


2. TCP 报文头部:控制的逻辑源泉

要理解 TCP 的行为,首先要看它的头部结构。每个TCP数据段都携带一个报头(Header),最小20字节,可扩展选项。每一个 TCP 报文段都包含了一组关键的控制信息:

  • 源/目的端口(16位):进程标识。
  • 序号(Sequence Number,32位):本段第一个字节在字节流中的位置。
  • 确认号(Acknowledgment Number,32位):期望接收的下一个字节序号(累计确认)。
  • 数据偏移(4位):报头长度(以4字节为单位)。
  • 标志位(Flags,9位):URG(紧急)、ACK(确认)、PSH(推送)、RST(复位)、SYN(同步)、FIN(结束)、ECE/CWR(显式拥塞通知)。
  • 窗口大小(Window,16位):接收窗口(RWND),流量控制。
  • 校验和(16位):覆盖伪首部+报头+数据。
  • 紧急指针(16位):与URG配合,指向紧急数据末尾。
  • 选项(Options):常见如MSS(最大段大小)、Window Scaling(窗口缩放,RFC 7323)、SACK(选择性确认,RFC 2018)、Timestamp(时间戳,防序号回绕和RTT测量)。

3. 状态机与连接管理:不仅仅是握手

三次握手:同步初始序列号 (ISN)

三次握手的核心目的不仅是确认对方存在,更重要的是同步双方的初始序列号。

  1. SYN: 客户端随机生成 $seq=x$,进入 SYN_SENT 状态。
  2. SYN-ACK: 服务端收到后,生成自己的 $seq=y$,并设置 $ack=x+1$,进入 SYN_RCVD。
  3. ACK: 客户端确认,设置 $ack=y+1$,双方进入 ESTABLISHED。

深度思考:为什么不是两次?

为了防止已失效的连接请求报文突然又传到了服务端。如果只有两次握手,服务端在发出确认后就会打开连接,而此时客户端可能早已关闭,导致服务端资源浪费。

四次挥手:全双工连接的优雅释放

TCP 是全双工的,这意味着每个方向的连接必须单独关闭。具体过程如下:

  1. 主动方发送FIN,进入FIN_WAIT_1。

  2. 被动方ACK,进入CLOSE_WAIT;主动方进入FIN_WAIT_2。

  3. 被动方发送FIN,进入LAST_ACK。

  4. 主动方ACK,进入TIME_WAIT(等待2MSL防延迟包),后CLOSED。

TIME_WAIT状态是TCP健壮性的关键,避免旧连接残留包干扰新连接。

  • TIME_WAIT 状态:主动关闭方在发送最后一个 ACK 后,必须等待 2MSL(最大报文生存时间)的时间。
    • 原因 1:确保最后一个 ACK 能到达对方,如果对方没收到 FIN,可以重发。
    • 原因 2:让本次连接产生的所有报文都在网络中消失,防止干扰下一个新连接。
状态机

4. 可靠性传输的三大支柱

A. 超时重传 (Retransmission)

TCP 为发送的每个报文段启动定时器。如果没有在 RTT(往返时间) 内收到 ACK,就会触发重传。现代 TCP 使用自适应算法动态计算 $RTT$,以适应波动的网络环境。

B. 流量控制:滑动窗口 (Sliding Window)

为了防止发送方发送太快导致接收方缓冲区溢出,TCP 使用了“滑动窗口”。

  • 接收方在 ACK 报文中通告自己的 Receive Window (rwnd)。
  • 发送方根据这个窗口大小动态调整发送量,确保不会“淹没”接收者。
C. 拥塞控制:社会化责任

流量控制是点对点的,而拥塞控制是全局性的。它防止过多的数据注入网络,导致路由器崩溃。主要算法包括:

  1. 慢启动 (Slow Start):从 $cwnd=1$ 开始,指数级增长发送量。
  2. 拥塞避免 (Congestion Avoidance):达到阈值后,改为线性增长。
  3. 快重传与快恢复 (Fast Retransmit/Recovery):通过收到三个冗余 ACK 来判断丢包,而不是等待超时,从而快速恢复传输。

5.TCP与UDP对比

特性 TCP UDP
是否连接 是 否
可靠性 高 低
顺序保证 有 无
延迟 相对较高 低
典型应用 HTTP、SSH DNS、视频、游戏

6. TCP 的局限性与进化

尽管 TCP 近乎完美,但它也有与生俱来的缺陷:

  • 队头阻塞 (Head-of-Line Blocking):如果序列号靠前的包丢了,后面已经到达的包必须在缓冲区等待,导致延迟。
  • 握手延迟:对于短连接(如 HTTP/1.1),三次握手带来的 RTT 开销显得过大。

演进方向:

  • QUIC (HTTP/3):基于 UDP,在应用层实现了类似 TCP 的可靠性,但解决了队头阻塞并实现了 0-RTT 连接。

7. 总结

TCP 协议是计算机科学史上的杰作。它将复杂的错误处理、流量调节和拥塞管理封装在传输层,让上层应用(如 Web 浏览器)可以假设网络是一个“可靠的管道”。理解 TCP,就理解了现代互联网一半的运行逻辑。