1 重传机制
TCP 实现可靠传输的方式之一,是通过序列号与确认应答。
常见的重传机制:
超时重传
快速重传
SACK
D-SACK
1.1 超时重传
TCP会在数据包丢失和确认应答丢失两种情况发生超时重传:
RTT(Round-Trip Time 往返时延):数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间。
超时重传时间是以 RTO (Retransmission Timeout 超时重传时间)表示。
当超时时间 RTO 较大时,重发就慢,丢了老半天才重发,没有效率,性能差;
当超时时间 RTO 较小时,会导致可能并没有丢就重发,于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
超时重传时间 RTO 的值应该略大于报文往返 RTT 的值。
每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。
1.2 快速重传
不以时间为驱动,而是以数据驱动重传
在上图,发送方发出了 1,2,3,4,5 份数据:
· 第一份 Seq1 先送到了,于是就 Ack 回 2;
· 结果 Seq2 因为某些原因没收到,Seq3 到达了,于是还是 Ack 回 2;
· 后面的 Seq4 和 Seq5 都到了,但还是 Ack 回 2,因为 Seq2 还是没有收到;
· 发送端收到了三个 Ack = 2 的确认,知道了 Seq2 还没有收到,就会在定时器过期之前,重传丢失的 Seq2。
· 最后,收到了 Seq2,此时因为 Seq3,Seq4,Seq5 都收到了,于是 Ack 回 6 。
快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
但会存在 重传一个or所有 的问题。
1.3 SACK
SACK( Selective Acknowledgment), 选择性确认。
这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的东西,
它可以将已收到的数据的信息发送给「发送方」,这样发送方就可以知道哪些数据收到了,哪些数据没收到,
知道了这些信息,就可以只重传丢失的数据。
如果要支持 SACK,必须双方都要支持。在 Linux 下,可以通过 net.ipv4.tcp_sack 参数打开这个功