TCP之重传机制

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设置的太小了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值