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