深入理解 TCP 协议


TCP(Transmission Control Protocol,传输控制协议)是互联网协议族中最重要的协议之一。它位于传输层,为应用层提供可靠的、面向连接的字节流服务。

TCP 的核心特性

  • 面向连接:在传输数据前,必须先建立连接(三次握手)。
  • 可靠性:通过确认应答、超时重传、错误校验等机制保证数据完整到达。
  • 全双工通信:连接的两端可以同时发送和接收数据。
  • 流量控制与拥塞控制:动态调整发送速率,防止网络拥塞或接收端缓冲区溢出。

三次握手:建立连接

三次握手是为了确保客户端和服务器都具备发送和接收数据的能力,并同步序列号。

  1. 第一次握手 (SYN):客户端发送 SYN 包(序列号 seq=x),进入 SYN_SENT 状态。
  2. 第二次握手 (SYN+ACK):服务器收到后,回复 SYN+ACK 包(序列号 seq=y, 确认号 ack=x+1),进入 SYN_RCVD 状态。
  3. 第三次握手 (ACK):客户端收到后,回复 ACK 包(确认号 ack=y+1),双方进入 ESTABLISHED 状态。

为什么不是两次? 为了防止失效的连接请求报文段突然又传送到了服务端,产生错误或浪费资源。

四次挥手:断开连接

由于 TCP 是全双工的,每个方向的连接都需要单独关闭。

  1. 第一次挥手 (FIN):客户端发起关闭请求,发送 FIN,进入 FIN_WAIT_1
  2. 第二次挥手 (ACK):服务器收到后回复 ACK,进入 CLOSE_WAIT。此时客户端到服务器的连接释放,但服务器仍可向客户端发送数据。
  3. 第三次挥手 (FIN):服务器数据发送完毕,发送 FIN,进入 LAST_ACK
  4. 第四次挥手 (ACK):客户端收到后回复 ACK,进入 TIME_WAIT。等待 2MSL(最大报文生存时间)后彻底关闭。

可靠传输机制

1. 确认应答(ACK)

接收端收到数据后会回复确认号,告知发送端:“我已经收到了第 N 字节之前的所有数据”。

2. 超时重传

若发送端在一定时间内未收到 ACK,会认为数据丢包并重新发送。

3. 滑动窗口(流量控制)

TCP 利用滑动窗口实现流量控制。接收端会告诉发送端自己的“接收窗口”大小,发送端据此限制发送速率,避免接收端处理不过来。

4. 拥塞控制

当网络出现拥塞时,TCP 会通过以下四个算法降低发送速率:

  • 慢启动:指数级增长发送窗口。
  • 拥塞避免:线性增长发送窗口。
  • 快重传:收到三个重复 ACK 时立即重传。
  • 快恢复:丢包后不直接回到慢启动,而是减半窗口。

TCP vs UDP

特性TCPUDP
连接性面向连接无连接
可靠性可靠传输(无丢包、顺序准确)不可靠(尽力而为)
传输形式字节流数据报
速度较慢(首部开销大、有确认机制)快(首部小、无连接)
应用场景Web、文件传输、邮件视频流、实时游戏、DNS

总结

TCP 是一种复杂的协议,其设计的核心在于如何在不可靠的 IP 网络上构建可靠的通信渠道。虽然它的开销比 UDP 大,但在绝大多数需要数据准确性的场景下,它是不可或缺的选择。