TCP 如何保证可靠传输?
TCP(传输控制协议)通过一系列复杂的机制,在不可靠的 IP 层之上构建了一个可靠的传输层。所谓的“可靠”,指的是数据在传输过程中无差错、不丢失、不重复、且按序到达。
以下是 TCP 保证可靠传输的 7 大核心机制:
1. 校验和 (Checksum)
- 作用: 保证数据内容的完整性。
- 机制: TCP 首部中有一个校验和字段。发送方在发送数据前计算校验和,接收方收到数据后重新计算。如果计算结果不一致,说明数据在传输过程中发生了比特翻转或损坏,接收方会直接丢弃该数据包(不发送 ACK),等待发送方超时重传。
2. 序列号 (Sequence Number)
- 作用: 解决数据包的乱序和重复问题。
- 机制: TCP 将每个字节的数据都进行了编号。
- 去重: 如果接收方收到重复的序列号,会丢弃重复数据。
- 排序: IP 包到达的顺序可能是不确定的,接收方根据序列号将乱序到达的数据包重新排序,然后再交付给应用层。
3. 确认应答机制 (ACK)
- 作用: 告知发送方数据已被成功接收。
- 机制: 接收方收到数据后,会回复一个 ACK(Acknowledgment)报文。ACK 中的确认号(Ack Number)表示“该序号之前的数据我都收到了,请下次从这个序号开始发送”。
4. 重传机制 (Retransmission)
这是 TCP 应对丢包的核心手段,主要分为两种:
- 超时重传 (Timeout Retransmission):
- 发送方发出数据后启动一个定时器。如果在规定时间(RTO,Retransmission TimeOut)内没有收到 ACK,就认为数据丢失,重新发送。
- 注:RTO 是动态计算的,略大于 RTT(往返时间)。
- 快速重传 (Fast Retransmit):
- 如果接收方收到了乱序的数据报文段(比如收到了 M1, M2, M4,缺失了 M3),它会立即连续发送 3 个针对 M2 的重复 ACK。
- 发送方一旦收到 3 个连续的重复 ACK,就知道 M3 丢失了,于是立即重传 M3,而不需要等待超时定时器到期。这大大提高了效率。
5. 流量控制 (Flow Control)
- 作用: 防止发送方发得太快,把接收方“淹没”。
- 机制: 滑动窗口 (Sliding Window)。
- TCP 头里有一个
Window字段,接收方通过它告诉发送方自己缓冲区还能接收多少数据(rwnd)。 - 发送方根据这个值控制发送速度。如果接收窗口为 0,发送方会停止发送,并启动一个“零窗口探测定时器”来轮询接收方窗口何时恢复。
- TCP 头里有一个
6. 拥塞控制 (Congestion Control)
- 作用: 防止过多的数据注入到网络中,导致网络链路过载(堵车)。
- 机制: 发送方维护一个拥塞窗口 (cwnd),根据网络状况调整发送速度。主要包含四个算法:
- 慢启动 (Slow Start): 连接刚建立时,指数级增长发送窗口,试探网络承受能力。
- 拥塞避免 (Congestion Avoidance): 当窗口达到阈值(ssthresh)后,线性增长窗口,避免网络过早拥塞。
- 拥塞发生: 当检测到丢包(超时或收到重复ACK)时,认为网络拥塞,缩小窗口。
- 快速恢复 (Fast Recovery): 配合快速重传使用,在丢包后不直接回到慢启动状态,而是将窗口减半后开始拥塞避免,以保持较高的传输效率。
7. 连接管理 (Connection Management)
- 三次握手: 确保双方都能发送和接收数据,并同步初始序列号(ISN)。
- 四次挥手: 确保双方的数据都已发送完毕,连接安全关闭。
总结
TCP 的可靠性不仅仅是靠“重传”,而是一个系统工程:
- 坏了怎么办? -> 校验和
- 乱了/重了怎么办? -> 序列号
- 丢了怎么办? -> ACK + 重传机制
- 发太快接收方受不了怎么办? -> 流量控制(滑动窗口)
- 发太快网络受不了怎么办? -> 拥塞控制