跳到主要内容

4.1. 重启空闲连接 (Restarting Idle Connections)

问题

上述 TCP congestion control 算法的一个已知问题是, 当 TCP 空闲了相对较长时间后, 它们允许发送一个可能并不合适的流量突发.

在空闲期之后, TCP 不能使用 ACK clock 将新的 segment 节拍式地送入网络, 因为所有 ACK 都已从网络中排空. 因此, 如上所述, TCP 在空闲期之后可能向网络发送一个 cwnd 大小,线速的突发.

此外, 在较长空闲期内, 网络条件可能发生变化, 使 TCP 通过 cwnd 估计的两个端点之间可用 end-to-end 网络容量变得不准确.

建议

[Jac88] 建议 TCP 在相对较长的空闲期后使用 slow start 重启传输. 与传输开始时一样, slow start 用于重新启动 ACK clock.

实现

该机制已以下列方式得到广泛部署:

当 TCP 在超过一个 retransmission timeout 的时间内没有收到 segment 时, 在开始传输前将 cwnd 降低到 restart window (RW) 的值.

就本标准而言, 我们定义:

RW = min(IW, cwnd)

HTTP 持久连接问题

使用最后一次收到 segment 的时间来判断是否降低 cwnd, 在 HTTP persistent connection 的常见场景中可能无法收缩 cwnd [HTH98]. 在这种情况下, Web server 会先收到请求, 然后才向 Web client 传输数据. 收到请求会使空闲连接测试失败, 从而允许 TCP 以可能不适当地偏大的 cwnd 开始传输.

标准要求

因此, 如果 TCP 在超过 retransmission timeout 的时间间隔内未发送数据, 则在开始传输前, TCP 应该将 cwnd 设置为不超过 RW.