14.1 引言
TCP 拥有2套独立的机制来完成重传:
基于时间: 发送数据后设置计时器,若超时还未收到数据确认,则触发超时重传。
基于确认信息的构成: 也叫做快速重传,通常发生在没有延时的情况下(根据以前的知识就是连续收到 3 个相同的 ACK),重传可能丢失的分组
当失序数据到达时,重复 ACK 应当立即返回,不能延时发送,原因在于 使发送端尽早得知有失序报文,并告诉其空缺在哪
与超时重传相比,快速重传能更有效地修复丢包情况
14.3 设置超时重传
TCP 并非对其接收到的每个报文段都返回 ACK,例如:当传输大批量数据时,TCP 通常采取每2个报文段返回一个 ACK 方法;另外,当数据出现丢失、失序或者重传成功时TCP 的累积确认机制表明报文段与ACK 之间并非严格一一对应的。
在TCP 握手阶段,SYN 、ACK 等数据包并未包含实际数据,由于 TCP 对不包含数据的报文段不提供可靠传输,意味着若出现丢包不会重传,因此无须设定重传计时器!
由于接收端在收到失序的数据后会立即返回 ACK,以此来帮助触发快速重传,因此网络中任何一个失序的数据包都会生成重复的ACK。如果我们一旦收到重复 ACK 就立即启动快速重传,那就会导致大量不必要的重传发生,为了解决这一问题,快速重传仅在达到重复阈值之后才会被触发
14.10 重新组包
当TCP 超时重传时,并不需要完全重传相同的报文段。TCP 允许执行重新组包发送一个更大的报文来提高性能。
允许这样做的原因在于,TCP 是通过字节号来识别发送和接收的数据,而非报文段(或包)号。
可以基于重新组包的方式来检测伪超时。
14.11 与 TCP 重传相关的攻击
有一类 DoS 攻击称为 低速率DoS 攻击。这类攻击向网关或主机发送大量数据,使得受害系统持续处于重传超时的状态,由于攻击者可以预知受害TCP何时启动重传,并在每次重传时发送大量数据,因此,受害 TCP 总能感知到拥塞的存在,根据Karn算法不断减小发送速率并退避发送,导致无法正常使用网络宽带
解决方案:随机选择 RTO,使得攻击者无法预知准确的重传时间