TCP重传机制

TCP协议通过重传机制保证所有的segment都可以到达对端,注意,此处重传机制特指数据传输阶段,握手、挥手阶段的传输机制与此不同。

TCP是面向字节流的,Seq与Ack的增长均以字节为单位。为了减少网络传输,接收端只回复最后一个连续包的Ack,并相应移动窗口。比如,发送端发送1,2,3,4,5一共五份数据(假设一份数据一个字节),接收端快速收到了Seq 1, Seq 2,于是回Ack 3;然后收到了Seq 4,由于在此之前未收到过Seq 3(乱序),如果序号在窗口内,则只填充窗口,但不发送Ack 5,否则丢弃Seq 4(与丢包的效果相似);假设在窗口内,则等以后收到Seq 3时,发现Seq 4及以前的数据包都收到了,则回Ack 5,并移动窗口。

超时重传机制

当发送方发现等待Seq 3的Ack(即Ack 4)超时后,会认为Seq 3发送“失败”,重传Seq 3。一旦接收方收到Seq 3,会立即回Ack 4。

这种方式有些问题:假设目前已收到了Seq 4;由于未收到Seq 3,导致发送方重传Seq 3,在收到重传的Seq 3之前,包括新收到的Seq 5和刚才收到的Seq 4都不能回复Ack,很容易引发发送方重传Seq 4、Seq5。接收方之前已经将Seq 4、Seq 5保存到窗口中,此时重传Seq 4、Seq 5明显造成浪费。

也就是说,超时重传机制面临“重传一个还是重传所有”的问题,即:

  • 重传一个:仅重传timeout的包(即Seq 3),后续包等超时后再重传。节省资源,但效率略低。
  • 重传所有:每次都重传timeout包及之后所有的数据(即Seq 3、4、5)。效率更高(如果带宽未打满),但浪费资源。

快速重传机制

如果包没有连续到达,就Ack最后那个可能被丢了的包;如果发送方连续收到3次相同的Ack,就重传对应的Seq。

比如:假设发送方仍然发送1,2,3,4,5共5份数据;接收方先收到Seq 1,回Ack 2;然后Seq 2因网络原因丢失了,正常收到Seq 3,继续回Ack 2;后面Seq 4和Seq 5都到了,最后一个可能被丢了的包还是Seq 2,继续回Ack 2;现在,发送方已经连续收到4次(大于等于3次)相同的Ack(即Ack 2),知道最大序号的未收到包是Seq 2,于是重传Seq 2,并清空Ack 2的计数器;最后,接收方收到了Seq 2,查看窗口发现Seq 3、4、5都收到了,回Ack 6。示意图如下:
在这里插入图片描述
快速重传解决了timeout的问题,但依然面临“重传一个还是重传所有”的问题。对于上面的示例来说,是只重传Seq 2呢还是重传Seq 2、3、4、5呢?

如果只使用快速重传,则必须重传所有:因为发送方并不清楚上述连续的4次Ack 2是因为哪些Seq传回来的。假设发送方发出了Seq 1到Seq 20供20份数据,只有Seq 1、6、10、20到达了接收方,触发重传Ack 2;然后发送方重传Seq 2,接收方收到,回复Ack 3;接下来,发送方与接收方都不会再发送任何数据,两端陷入等待。因此,发送方只能选择“重传所有”,这也是某些TCP协议的实际实现,对于带宽未满时重传效率的提升非常明显。

SACK机制

这种方式需要在TCP头里加一个SACK的东西,ACK还是Fast Retransmit的ACK,SACK则是汇报收到的数据碎版。
在这里插入图片描述

Duplicate SACK

Duplicate SACK又称D-SACK,其主要使用了SACK来告诉发送方有哪些数据被重复接收了。

下面的示例中,ACK丢了,所以,发送端重传了数据包(3000-3499),于是接收端发现重复收到,于是回了一个SACK=3000-3500,因为ACK都到了3500意味着收到了3500之前的所有数据,所以这个SACK就是D-SACK。

Transmitted  Received    ACK Sent
Segment      Segment     (Including SACK Blocks)
 
3000-3499    3000-3499   3500 (ACK dropped)
3000-3499    3000-3499   3500, SACK=3000-3500
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值