深入理解 TCP:重传机制、滑动窗口、流量控制与拥塞控制
TCP(Transmission Control Protocol)是一个面向连接、可靠传输的协议,支撑着绝大多数互联网通信。在实现可靠性的背后,TCP 引入了多个关键机制:重传机制、滑动窗口、流量控制 和 拥塞控制。这些机制共同协作,确保了网络传输的稳定性、高效性和公平性。
本文将从这四大模块出发,逐层剖析其工作原理及内部联系。
一、TCP 重传机制
1.1 超时重传
当 TCP 发送方发出一个数据段后,如果在预定时间内没有收到 ACK(确认),就会触发超时重传。这个时间称为 重传超时时间 RTO(Retransmission Timeout)。
RTO 的计算通常使用 RTT(往返时间)预测算法,结合抖动值进行加权调整。
✅ 作用:解决数据包丢失或 ACK 丢失问题。
1.2 快速重传
快速重传避免了等待 RTO 超时时间。当接收方连续收到三个相同的 ACK(称为 Duplicate ACK)时,发送方立刻重传对应的段,认为该段可能丢失。
✅ 好处:显著缩短丢包检测时间,提高吞吐量。
1.3 SACK 方法(Selective Acknowledgment)
SACK(选择性确认)机制允许接收方告诉发送方:我收到了哪些数据段,即便这些段是不连续的。
例如,收到段 #1、#2、#4、#5,丢了 #3,那么接收方会告诉发送方:我收到了 #1-#2 和 #4-#5。发送方据此只需重发 #3,而不是整个窗口。
✅ 对比快速重传:SACK 更细粒度、效率更高。
1.4 Duplicate SACK
一种对 SACK 的增强,用于进一步标明哪些段被重复收到了,有助于快速判断拥塞与丢包状态。
ack包丢失:
网络延时:
二、滑动窗口机制
2.1 滑动窗口定义
滑动窗口是 TCP 中的核心机制之一,用于控制发送方可以连续发送多少字节而无需等待 ACK。其大小取决于接收方通告窗口(rwnd)和拥塞窗口(cwnd)中较小的值。
我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个,这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。
一发一ack:
为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率
2.2 工作原理
-
每次发送新的数据后,窗口向右滑动;
-
收到 ACK 后,窗口继续向右滑动;
-
丢包或拥塞时,窗口收缩。
-
✅ 作用:保持网络“流水线式”的高效传输。
三、流量控制
3.1 基本思想
流量控制主要是为了防止发送方“发太快”,而接收方“接不过来”。这依赖于接收方通告窗口(rwnd),它告诉发送方“我还能接收多少数据”。
3.2 缓冲区与窗口的关系
接收方在操作系统内核中分配一段 缓冲区 存储 TCP 数据。rwnd 就是这个缓冲区剩余大小的反映。
⚠️ 若发送数据快于应用层消费速度,缓冲区满,rwnd=0,发送方必须暂停发送。
可能出现的情况:
为了防止这种情况发生,TCP 规定是不允许同时减少缓存又收缩窗口的,而是采用先收缩窗口,过段时间再减少缓存,这样就可以避免了丢包情况
3.3 窗口关闭
当 rwnd=0 时,TCP 会暂时关闭窗口,不再发送数据。发送方会周期性发送“窗口探测包”(Zero Window Probe)询问接收方缓冲是否已空。
3.4 糊涂窗口综合症(Silly Window Syndrome)
当接收方的缓冲区空闲很少就通告窗口,或发送方每次只发一点点数据,这会导致网络效率极低。这种现象称为“糊涂窗口综合症”。
解决方式:
-
接收方策略:不通告过小窗口;
-
发送方策略(Nagle算法):累积数据后再发送。
四、拥塞控制
拥塞控制目标是防止发送方过快发送数据导致网络拥塞。TCP 通过以下机制动态调节发送速率:
4.1 慢启动(Slow Start)
初始时 cwnd 很小(1 MSS),每收到一个 ACK 就将 cwnd 加倍(指数增长)。直到达到阈值(ssthresh)或出现丢包为止。
✅ 作用:逐步探测网络能力,防止突发冲击。
4.2 拥塞避免(Congestion Avoidance)
当 cwnd > ssthresh 后,进入线性增长阶段,即每个 RTT 只增长 1 MSS,避免过快增大窗口。
4.3 拥塞发生(例如快速重传触发)
-
cwnd 减半(乘法减小);
-
ssthresh 设置为一半;
-
重回慢启动或进入快速恢复。
4.4 快速恢复
当触发快速重传时,不进入慢启动,而是认为网络并未严重拥塞,因此采用 快速恢复算法:
-
将 cwnd 设置为 ssthresh;
-
继续进入拥塞避免阶段。
五、四大机制的联系与整体架构
我们将四部分的核心关系梳理如下:
模块 | 控制目标 | 核心机制 | 所需信息 |
---|---|---|---|
重传机制 | 保证可靠传输 | 超时重传、快速重传、SACK | ACK、RTT |
滑动窗口 | 提升效率 | 流水线式传输 | 发送窗口 |
流量控制 | 防止接收方被压垮 | 接收窗口控制 rwnd | 缓冲区 |
拥塞控制 | 保持网络稳定 | 慢启动、拥塞避免、快速恢复 | 丢包信号、ACK 统计 |
✅ 总结一句话:
TCP 通过滑动窗口提高吞吐,通过流量控制保护接收端,通过拥塞控制避免网络瘫痪,而重传机制是保证可靠性基石。参考:4.2 TCP 重传、滑动窗口、流量控制、拥塞控制 | 小林coding