1. 超时重传
1.1 什么是超时重传
- 在发送数据时,发送方会设置一个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文,就会重发该数据,这就是超时重传。
- 两种情况下会发生超时重传:
- 数据包丢失
- 确认应答丢失
1.2 超时时间应该设置为多少
- RTO(Retransmission Timeout 超时重传时间)
- RTT: 往返时延,一个数据报从发送到接收到响应所需要的时间
- 超时重传时间RTO的初始值应该略大于报文往返时延RTT的值
- 采用超时间隔加倍策略:每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为原先值得两倍,如1,2,4,8...。两次超时,就说明网络环境差,不宜频繁反复发送。
2. 快速重传
- 快速重传机制,不以时间为驱动,而是以数据驱动重传
- 发送方一旦收到连续三个重复确认(首次确认不算重复确认)就立即将相应的报文重传,而不是等待该报文的超时计数器超时再进行重传
3. SACK的引入为了解决什么问题
实现重传机制的方式之一:SACK(Selective Acknowledgment 选择性确认)
- 这种方式需要在TCP头部的“选项”字段里加一个SACK的东西。它可以将缓存的地图发送给发送方。这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,发送方就可以只重传丢失的数据
- 而且如果多段数据不连续,SACK也可以发送。比如SACK 0-500,1000-1500,2000-2500。表明这几段已经接收到了
4. 什么是D-SACK(Duplicate SACK)
- 主要是使用SACK来告诉发送方,有哪些数据被重复接收了。
- 接收方发给发送方的两个ACK确认应答都丢失了,所以发送方超时后,重传第一个数据包(3000-3499)
- 接收方发现数据重复收到了,于是回了一个SACK=3000~3500,告诉发送方3000~3500的数据早已被接收了,因为ACK都到了4000了,这就意味着4000之前的所有数据都已经收到了,所以可以判断这个SACK就是代表D-SACK
- 然后发送方能够知道,数据没有丢失,只是接收方发送的ACK确认报文丢失了。
4.1 通过D-SACK知道了数据重复有什么用处
- 知道重复说明对方收到刚才的那个包了,所以是回来的ACK包丢了
- 发送方知道了是不是包乱序,先发的包后到了
- 发送方可以知道是不是自己的RTO设置的太小了