TCP Retransmission

TCP协议需保证所有的数据包都可以到达,因此必须要有重传机制。

  • RTT: Round Trip Time
  • RTO: Retransmission Timeout(重传超时时间)

RTO Algorithm

如何计算RTO:

  • 经典算法
  • Karn’s Algorithm
  • 标准算法(Jacobson/Karels Algorithm, 目前Linux内核在用)

前面两种算法用的都是“加权移动平均”,这种方法最大的毛病就是如果RTT有一个大的波动的话,很难被发现,因为被平滑掉了。

重传机制

超时重传

通过重传计时器(retransmission timer)实现。

快速重传

TCP在收到一个乱序的报文段时,会立即发送一个重复的ACK,并且此ACK不可被延迟。

如果连续收到3个或3个以上重复的ACK,TCP会判定此报文段丢失,需要重新传递,而无需等待RTO。这就叫做快速重传。

SACK && Duplicate SACK

Selective Acknowledgment (SACK)是 TCP 的一项可选特性,可以提高某些网络中所有可用带宽的使用效率。普通 TCP(即未提供 SACK 特性)应答是严格累积的 — 对 N 的应答意味着字节 N 和所有之前的字节都已经收到。SACK 要解决的问题普通累积式应答的 “全有或全无” 性质。

例如,即使包 2(假设从 0 到 9 的序列)是在传送过程中惟一丢失的包,接收方也只能对包 1 发出一个普通的 ACK,因为这是连续接收到的包中的最后一个。另一方面,SACK 接收方可以发出包 1 的 ACK 和包 3 到包 9 的 SACK 选项。这样,发送端就可以根据回传的SACK来知道哪些数据到了,哪些数据丢失了,进而可以优化Fast Retransmit。SACK需要两端的协议都支持,在目前的Linux Kernal中默认为开启状态。

low-rate DoS attacks

应用层应用:Slowloris (HTTP slow headers)

防范:随机化RTO

文章目录
  1. 1. RTO Algorithm
  2. 2. 重传机制
    1. 2.1. 超时重传
    2. 2.2. 快速重传
    3. 2.3. SACK && Duplicate SACK
  3. 3. low-rate DoS attacks