TCP 重传
TCP 实现可靠传输的⽅式之⼀,是通过序列号与确认应答。
在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回⼀个确认应答消息,表示已收到消息。
常⻅的重传机制:
超时重传
快速重传
SACK
D-SACK
超时重传
重传机制的其中⼀个⽅式,就是在发送数据时,设定⼀个定时器,当超过指定的时间后,没有收到对⽅的 ACK确认应答报⽂,就会重发该数据,也就是我们常说的超时重传。
TCP 会在以下两种情况发⽣超时重传:
数据包丢失
确认应答丢失
超时时间应该设置为多少呢?
RTT 就是数据从⽹络⼀端传送到另⼀端所需的时间,也就是包的往返时间。
超时重传时间是以 RTO (Retransmission Timeout 超时重传时间)表示。
假设在重传的情况下,超时时间 RTO 「较⻓或较短」时,会发⽣什么事情呢?
当超时时间 RTO 较⼤时,重发就慢,丢了⽼半天才重发,没有效率,性能差;
当超时时间 RTO 较⼩时,会导致可能并没有丢就重发,于是重发的就快,会增加⽹络拥塞,导致更多的超时,更多的超时导致更多的重发。
精确的测量超时时间 RTO 的值是⾮常重要的,这可让我们的重传机制更⾼效。
根据上述的两种情况,我们可以得知,超时重传时间 RTO 的值应该略⼤于报⽂往返 RTT 的值。
快速重传
TCP 还有另外⼀种快速重传(Fast Retransmit)机制,它不以时间为驱动,⽽是以数据驱动重传。
快速重传的⼯作⽅式是当收到三个相同的 ACK 报⽂时,会在定时器过期之前,重传丢失的报⽂段。
快速重传机制只解决了⼀个问题,就是超时时间的问题,但是它依然⾯临着另外⼀个问题。就是重传的时候,是重传之前的⼀个,还是重传所有的问题。
为了解决不知道该重传哪些 TCP 报⽂,于是就有 SACK ⽅法。
SACK ⽅法
还有⼀种实现重传机制的⽅式叫: SACK ( Selective Acknowledgment 选择性确认)。
这种⽅式需要在 TCP 头部「选项」字段⾥加⼀个 SACK 的东⻄,它可以将缓存的地图发送给发送⽅,这样发送⽅就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。
Duplicate SACK
Duplicate SACK ⼜称 D-SACK ,其主要使⽤了 SACK 来告诉「发送⽅」有哪些数据被重复接收了。
D-SACK 有这么⼏个好处:
- 可以让「发送⽅」知道,是发出去的包丢了,还是接收⽅回应的 ACK 包丢了;
- 可以知道是不是「发送⽅」的数据包被⽹络延迟了;
- 可以知道⽹络中是不是把「发送⽅」的数据包给复制了;