TCP重传机制

重传机制

在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回⼀个确认应答消息,表示已收到消息。
但在错综复杂的⽹络,并不⼀定能顺利能正常的数据传输,万⼀数据在传输过程中丢失了呢?
所以 TCP 针对数据包丢失的情况,会⽤重传机制解决。

一、超时重传

1. 什么是超时重传

重传机制的其中⼀个⽅式,就是在发送数据时,设定⼀个定时器,当超过指定的时间后,没有收到对⽅的 ACK 确认应答报⽂,就会重发该数据,也就是我们常说的超时重传
TCP会在以下两种情况下进行数据的重传:

  • 数据包丢失
  • 应答包丢失

2. RTT 和RTO

两个概念:

  • RTT(Round-Trip Time 往返时延)就是数据从⽹络⼀端传送到另⼀端所需的时间,也就是包的往返时间。
  • RTO(Retransmission Timeout 超时重传时间)。
    在这里插入图片描述

当数据包丢失时RTO设置为多少是比较合适的?我们先来看一下RTO设置过长或过短时会有什么样的情况产生?
在这里插入图片描述

  • RTO时间过长,重发时间就长了,数据丢了老半天才重发,效率太低,性能差。
  • RTO时间过短,导致可能并没有丢数据就重发了,重发的快会增加网络拥塞,导致更多的超时,更多的超时就会导致更多的重发。
    精确的测量超时时间 RTO 的值是⾮常重要的,这可让我们的重传机制更⾼效。

二、快速重传

快速重传的⼯作⽅式是当收到三个相同的 ACK 报⽂时,会在定时器过期之前,重传丢失的报⽂段。
举个例子如下图:
在这里插入图片描述
从上图看出发送房发送了1-5份数据:

  • 第1份数据seq1先到,就回复了ack2
  • seq2数据没有收到,seq3先到了,于是也回复ack2
  • 后面的seq4、seq5数据都收到了,也回复的是ack2
  • 发送端收到3个相同的ack2,知道了seq2数据没有送达对方,于是会在定时器过期之前重传丢失的seq2。
  • 由于seq3、4、5都收到了,于是恢复ack6

快速重传只解决了一个问题,就是超时时间的问题,但是依然面临另一个问题,就是重传的时候是只重传之前的一个还是重传所有的。

⽐如对于上⾯的例⼦,是重传 Seq2 呢?还是重传 Seq2、 Seq3、 Seq4、 Seq5 呢?因为发送端并不清楚这连续的三个 Ack 2 是谁传回来的。

为了解决不知道该重传哪些 TCP 报⽂,于是就有 SACK ⽅法

三、SACK

SACK ( Selective Acknowledgment 选择性确认)。
这种⽅式需要在 TCP 头部「选项」字段⾥加⼀个 SACK 的东⻄,它可以将缓存的地图发送给发送⽅,这样发送⽅就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据
如下图,发送⽅收到了三次同样的 ACK 确认报⽂,于是就会触发快速重发机制,通过 SACK 信息发现只有200~299 这段数据丢失,则重发时,就只选择了这个 TCP 段进⾏重复。
在这里插入图片描述
如果要⽀持 SACK ,必须双⽅都要⽀持。在 Linux 下,可以通过 net.ipv4.tcp_sack 参数打开这个功能(Linux2.4 后默认打开)。

四、Duplicate SACK

Duplicate SACK ⼜称 D-SACK ,其主要使⽤了 SACK 来告诉「发送⽅」有哪些数据被重复接收了
以下2个例子说明D-SACK的作用。
例子1:ACK包丢失
在这里插入图片描述

  • 接收方给发送方发送的2个ack都丢失了,所以发送方超时后会重传第一笔数据包3000-3499
  • 接收方发现接收的数据时重复的,于是回了一个SACK是3000-3500,告诉发送方3000-3500的数据早就被接收了,因为ack已经到4000了,就意味着4000以前的数据都已经被接收了,所以这个SACK就代表着D-SACK。
  • 这样发送发就知道数据没有丢失,是ack丢失了。
    例子2:网络延时
    在这里插入图片描述
  • 数据包1000-1499倍网络延迟了,导致了发送方没有收到1500的ack
  • 后面的3个数据包到达后,导致接收端收到了3个相同的ack,触发了快速重传机制,但是在快速重传后1000-1499的包又收到了
  • 所以接收方回复了一个SACK=1000-1500因为ack已经到了3000,所以SACK是D-SACK,表示收到了重复的包。
  • 这样发送方就知道了发送的数据包不是丢失了,也不是ack丢了,而是被网络延迟了。

可见D-SACK的几个好处:

  • 可以让「发送⽅」知道,是发出去的包丢了,还是接收⽅回应的 ACK 包丢了;
  • 可以知道是不是「发送⽅」的数据包被⽹络延迟了;
  • 可以知道⽹络中是不是把「发送⽅」的数据包给复制了

说明:参考《图解网络-小林coding》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值