第十四章 TCP 超时与重传
本章主要讨论了 TCP 超时和重传策略。第一个例子描述了当 TCP 需要发送一个数据包时,简单地暂时断开网络,导致重传计时器超时触发了一次超时重传。每次重传都在之前一次传输的两倍时长后被成功接收,形成二进制指数退避,即 Karn 算法的第二部分。
TCP 测量 RTT 并用这些测量值纪录平滑的 RTT 与均值偏差估计值,用这两个估计值计算新的重传超时值。在不采用时间戳选项的情况下,TCP 在每个数据窗口只能测量一个 RTT。Karn算法通过不测量重传报文段的 RTT 样本值来避免重传二义性问题。现在的大部分 TCP 版本都使用时间戳选项,使得每个报文段都可以单独测量。时间戳选项即使在包失序或包重复的情况下也能很好地工作。
本章中还讨论了快速重传算法,它在计时器没有超时的情况下就能被触发。该算法可有效地填补由丢包引起的空缺。结合选择确认可更好地提高算法性能。选择确认在 ACK 中携带其他信息,允许发送端在每个 RTT 内修补多个空缺,在某些环境下可有效提高传输性能。
如果 RTT 测量值小于连接的实际值,就可能发送伪重传。在这种情况下,若 TCP 的等待时间稍长,重传就可能不会发生。针对伪超时问题提出了很多算法。DSACK 需要等到接收到重复报文段的 ACK。Eifel 检测方法依据 TCP 时间戳,但它的响应速度能比 DSACK 更快,这是因为它是根据超时前所发送报文段返回的 ACK 来检测伪超时的。F-RTO 与 Eifel算法类似,但不需要时间戳。它使得发送端在判断出现伪超时后发送新数据。以上这些检测算法都需要结合使用响应算法,我们讨论到的响应算法主要是 Eifel响应算法。它在延迟大幅增长的情况下,会重新设置 RTT 和 RTT 变化估计值。
本章也讨论了 TCP 怎样储存连接状态,怎样重新组包,以及相关攻击,包括使得 TCP 过分被动或过分积极。
希望我的总结可以帮助大家,感谢阅读我的博客!