流量控制、拥塞控制、计时器
2026/7/23大约 3 分钟
1. 流量控制 (Flow Control)
目的: 防止发送方发得太快,导致接收方的缓存溢出(别让接收者“噎死”)。
-
机制: 使用滑动窗口 (Sliding Window) 协议。
-
实现: 接收方在确认报文(ACK)中会携带一个
rwnd(Receiver Window) 字段,告诉发送方:“我现在的缓存还能收多少字节”。 -
状态: * 如果
rwnd = 0,发送方必须停止发送,直到收到新的窗口更新。 -
持续计时器(见下文)会介入,防止窗口更新包丢失导致的死锁。
2. 拥塞控制 (Congestion Control)
目的: 防止过多的数据注入到网络中,导致路由器或链路过载(别让网络“堵死”)。
TCP 主要通过四个算法来动态调整拥塞窗口 (**cwnd**):
| 阶段 | 动作 | 触发条件 |
|---|---|---|
| 慢启动 (Slow Start) | cwnd<br>从 1 开始,每收到一个 ACK,窗口翻倍(指数增长)。 |
建立连接初期。 |
| 拥塞避免 (Congestion Avoidance) | 当 cwnd<br>达到阈值 (ssthresh<br>) 后,变为线性增长(每轮 +1)。 |
cwnd >= ssthresh<br>。 |
| 快重传 (Fast Retransmit) | 发送方连续收到 3 个冗余 ACK,立即重传丢失包,不等待超时。 | 丢包但网络未完全瘫痪。 |
| 快恢复 (Fast Recovery) | 将 ssthresh<br>减半,cwnd<br>设为减半后的值,直接进入拥塞避免。 |
配合快重传使用。 |
注意: 如果发生了超时 (Timeout),TCP 会表现得很悲观:将 ssthresh 设为当前窗口的一半,并将 cwnd 直接重置为 1,重新开始慢启动。
3. TCP 的四大计时器
为了处理网络中的不确定性,TCP 手里握着好几块“表”:
① 重传计时器 (Retransmission Timer)
- 作用: 解决丢包问题。
- 原理: 当发送一个报文时,启动计时。如果在 RTO (超时重传时间) 内没收到确认,就重发。
- 细节: RTO 是根据网络往返时间 (RTT) 动态计算的。
② 坚持计时器 (Persistence Timer)
- 作用: 解决“零窗口”死锁。
- 原理: 如果接收方告诉发送方
rwnd=0,后来接收方缓存空了并发送了窗口更新,但这个更新包丢了。发送方会一直等,接收方也会一直等。 - 方案: 坚持计时器到期后,发送方发一个很小的“探测报文”,强迫接收方回传当前的窗口状态。
③ 保活计时器 (Keepalive Timer)
- 作用: 检测“死连接”。
- 场景: 如果客户端突然断电(未正常关闭连接),服务器不能永远等下去。通常设为 2 小时,若无活动则发送探测报文,没响应就关闭连接。
④ 时间等待计时器 (Time-Wait Timer)
- 作用: 确保连接正常关闭。
- 场景: 发生在主动关闭连接的一方(通常是客户端)进入
TIME_WAIT状态时。 - 时长:****2MSL (Maximum Segment Lifetime)。
- 理由: 确保最后一个 ACK 到达对方;并让本次连接产生的所有报文都在网络中消失,防止影响下一个新连接。
