本文目录导读:

tcp_slow_start_after_idle 是 Linux 内核中一个用于控制 TCP 连接在空闲一段时间后如何恢复拥塞控制的机制。
它的核心作用是:当一个 TCP 连接长时间没有数据传输时,网络状况可能已经发生了很大变化(例如带宽、延迟、拥塞状态),为了避免直接用之前的“大窗口”发送数据导致网络拥塞或丢包,TCP 需要重新探测网络容量。
下面详细解释它如何实现“慢启动”,以及它和普通慢启动的区别。
核心机制:重置 cwnd(拥塞窗口)
当一个连接进入空闲状态(通常是发送了最后一个数据包后,经过了一个 RTO(重传超时时间)或 RTT(往返时间)以上),tcp_slow_start_after_idle 会触发以下动作:
- 重置拥塞窗口:
- 它会将当前连接的
cwnd(拥塞窗口)强制设置为初始化时的值。 - 这个初始值通常是 10 个 MSS(最大段长度) (在较新的内核中,通过
init_cwnd控制,早期是 2-3 个 MSS)。
- 它会将当前连接的
- 重新启动慢启动过程:
- 重置后,CWND 变得非常小(10 个包)。
- 连接在发送第一个数据段后,每收到一个 ACK(确认包),CWND 增加 1 个 MSS,这就是标准的 拥塞避免 的慢启动增长阶段(指数增长)。
- 这个过程会一直持续到 CWND 达到一个阈值,这个阈值是空闲前的
ssthresh(慢启动阈值) 与 空闲后计算的合理窗口 的较小者,这个合理窗口的大小与空闲持续时间和连接带宽有关。
它与普通慢启动的区别
| 特性 | 普通慢启动(连接建立时) | tcp_slow_start_after_idle(空闲后慢启动) |
|---|---|---|
| 触发时机 | 连接刚建立(SYN-ACK 完成) | 连接已存在,但空闲了一段时间 |
| 初始 cwnd | 初始拥塞窗口(10 MSS) | 重置为初始拥塞窗口(10 MSS) |
| ssthresh | 设置为初始值(如 65535 字节,或自定义值) | 保留空闲前的 ssthresh 值 |
| 增长方式 | 指数增长(每 RTT 翻倍/每 ACK 加 1) | 指数增长,直到触及保留的 ssthresh |
| 目的 | 探测网络初始容量 | 重新探测网络容量,避免拥塞 |
关键区别:tcp_slow_start_after_idle 保留了连接空闲前的 ssthresh,这意味着它不会像新连接那样从 0 开始无限制地指数增长到最大值,而是增长到之前已证明是安全的窗口大小(由 ssthresh 和空闲时间计算出的合理窗口共同决定)。
具体的“慢启动”流程示例
假设一个连接空闲了 10 秒,空闲前的状态:
cwnd= 1000 个 MSSssthresh= 500 个 MSS (之前发生过一次丢包后设置的)
- 空闲检测:内核检测到连接超过
RTO或RTT没有发送数据。 - 窗口重置:
cwnd被重置为 10 MSS (初始值)。ssthresh保持不变(500 MSS)。
- 开始发送:
- 第一个突发:一次性发送 10 个 数据包。
- 等待 ACK:收到第一个 ACK。
- 指数增长:
- 收到 ACK 后,
cwnd增加 1 → 11 MSS。 - 发送下一个 ACK 对应的数据包(如果接收窗口允许)。
- 重复此过程:等到收到 11 个 ACK 后,cwnd 达到 22 MSS;再经过一个 RTT,cwnd 达到 44 MSS... 这就是指数增长。
- 收到 ACK 后,
- 触及 ssthresh:
- 当
cwnd增长到 500 MSS 时(等于保存的ssthresh),慢启动阶段结束。 - 进入 拥塞避免 阶段:
cwnd增长方式变为线性(每收到一个 ACK 增加大约MSS * MSS / cwnd),增长缓慢得多。
- 当
- 结果:这个连接从空闲中恢复,以一个很小的窗口起步,迅速(指数)增长到之前证明过的安全窗口大小(500 MSS),然后平稳地线性增长以探测新容量,而不是一下子从 1000 MSS 往外冲。
为什么要做这个“慢启动”?
- 防止拥塞崩溃:如果网络状态在空闲期间变差了(例如引入了其他大流量的连接),直接用旧的大窗口发送数据,会瞬间造成大量丢包,导致严重拥塞。
- 适应网络变化:WAN(广域网)或 Wi-Fi 链路中带宽、延迟可能动态变化,空闲期后,路由器队列状态可能完全不同。
- 公平性:让空闲重连的流量有机会与其他活跃流量公平竞争资源,而不是凭借历史大窗口“插队”。
如何配置和查看?
- 默认开启:Linux 3.0+ 内核默认开启
tcp_slow_start_after_idle(值为 1)。 - 关闭它:可以通过设置
sysctl net.ipv4.tcp_slow_start_after_idle=0来关闭。 - 实际影响:关闭此功能后,空闲连接会直接用之前的
cwnd发送数据,这会提升某些场景下(如心跳保活的长连接、短间歇性的RPC调用)的瞬时吞吐量,但代价是增加了网络拥塞的风险。 - 查看当前值:
sysctl net.ipv4.tcp_slow_start_after_idle
tcp_slow_start_after_idle 的“慢启动”是指:当一个 TCP 连接空闲后,将其拥塞窗口 cwnd 重置为初始值(如10 MSS),然后按照标准的指数增长算法重新探测网络容量,直到达到空闲前保存的 ssthresh 阈值,之后进入线性增长的拥塞避免阶段,这是一种谨慎的、防止空闲后网络状况变化导致拥塞的网络流量控制策略。
标签: tcp_slow_start_after_idle 慢启动