1.什么是TCP重传机制
在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回⼀个确认应答消息,表示已收到消息。 但是如果传输的过程中,数据包丢失了,就会使⽤重传机制来解决。TCP的重传机制是为了保证数据传输的可靠性而设计的一系列机制,它主要通过重新发送丢失或确认失败的数据段来确保数据能够正确地到达接收方。
2.重传的方式
2.1超时重传
它主要解决的问题是当发送方发送数据后,长时间未收到接收端的确认(ACK)时,发送方认为数据可能丢失或损坏,因此会通过重新发送数据来确保数据的可靠性。
重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK
确认应答报文,就会重发该数据,也就是我们常说的超时重传。
TCP 会在以下两种情况发生超时重传:
- 数据包丢失
- 确认应答丢失
如果超时重发的数据,再次超时⼜要重传的时候, TCP 的策略是将超时间隔加倍,也就是 每当遇到⼀次超时重传的 时候,都会将下⼀次超时时间间隔设为先前值的两倍。
2.2快速重传
快速重传( Fast Retransmit )机制 ,它 不以时间为驱动,⽽是以数据驱动重传 。
⼯作原理:
当收到三个相同的 ACK 报⽂时,会在定时器过期之前,重传丢失的报⽂段。快速重传解决了超时时间的问题,但还⾯临另外⼀个问题:重传的时候,是重传之前的⼀个,还是重传所有的问题。
2.3 SACK(Selective Acknowledgment,选择性确认)
为了解决 重传哪些报⽂的问题⽽提出。
这种⽅式需要在 TCP 头部「选项」字段⾥加⼀个 SACK 的东⻄, 可以将已收到的数据的信息发送给「发送⽅」 ,这样发送⽅就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据 。
2.4 D-SACK(Duplicate SACK)
主要使⽤了 SACK 来告诉【发送⽅】有哪些数据被重复接收了。下⾯举例来说明 D-SACK 的作⽤:
ACK 丢包:
⽹络延时:
使⽤ D-SACK 的好处:
( 1 )可以让【发送⽅】知道,是发出去的包丢了,还是接收⽅回应的 ACK 包丢了;
( 2 )可以知道是不是【发送⽅】的数据包被⽹络演示了;
( 3 )可以知道⽹络中是不是把【发送⽅】的数据包给复制了。