一、🍟前言
本文主要介绍了TCP的重传机制,通过图文并茂的形式进行讲解,以便大家更好地理解和记住该知识点。
二、🍔什么是TCP的重传机制?
在 TCP 中,当发送端的数据到达接收端时,接收端会返回一个确认应答消息,表示已收到消息。
然而,网络是错综复杂的,数据在传输过程中可能会丢失,所以针对数据包丢失的情况,TCP 会采用重新传输数据包的方案进行解决。
三、🌭常见的重传机制
1.超时重传
在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的
ACK
确认应答报文,就会重发该数据。
TCP 会在以下两种情况发生超时重传:
- 数据包丢失
- 确认应答丢失
图片来源:小林coding.图解网络.TCP篇
超时重传时间设置多少合适?
回答该问题前需要先了解什么是RTT和RTO
RTT指的是数据发送时刻和接收到对方发送回来的应答报文的时刻的差值,也就是包的往返时间。
---
RTO则是在RTT的基础上计算出来的超时重传时间,通常RTO略大于RTT。
如果RTO过大,会导致重传缓慢,丢包很长一段时间才进行重传,性能差;
如果RTO过小,会导致重传过快,增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
如何计算得到一个合适的RTO
?
首先需要估计往返时间(RTT),通常需要采样以下两个:
- 采样 RTT 的时间,然后进行加权平均,算出一个平滑 RTT 的值,而且这个值还是要不断变化的,因为网络状况不断地变化。
- 采样 RTT 的波动范围,这样就避免如果 RTT 有一个大的波动的话,很难被发现的情况。
RTO计算公式:
图片来源:小林coding.图解网络.TCP篇
其中 SRTT
是计算平滑的RTT ,DevRTR
是计算平滑的RTT 与 最新 RTT 的差距。
在 Linux 下,α = 0.125,β = 0.25, μ = 1,∂ = 4;这些值是通过大量的实验挑出来的。
上述是对超时重传的解释,那么这种方式存在什么问题呢?答案就是超时触发重传存超时周期可能相对较长。那么就可以用用「快速重传」机制来解决超时重发的时间等待。
2.快速重传
快速重传机制,它不以时间为驱动,而是以数据驱动重传。
在上图,发送方发出了 1,2,3,4,5 份数据:
- 第一份 Seq1 先送到了,于是就 Ack 回 2;
- 结果 Seq2 因为某些原因没收到,Seq3 到达了,于是还是 Ack 回 2;
- 后面的 Seq4 和 Seq5 都到了,但还是 Ack 回 2,因为 Seq2 还是没有收到;
- 发送端收到了三个 Ack = 2 的确认,知道了 Seq2 还没有收到,就会在定时器过期之前,重传丢失的 Seq2。
- 最后,收到了 Seq2,此时因为 Seq3,Seq4,Seq5 都收到了,于是 Ack 回 6 。
所以,快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传一个,还是重传所有的问题。
举个例子🌰:
假设发送方发了 6 个数据,编号的顺序是 Seq1 ~ Seq6 ,但是 Seq2、Seq3 都丢失了,那么接收方在收到 Seq4、Seq5、Seq6 时,都是回复 ACK2 给发送方,但是发送方并不清楚这连续的 ACK2 是接收方收到哪个报文而回复的, 那是选择重传 Seq2 一个报文,还是重传 Seq2 之后已发送的所有报文呢(Seq2、Seq3、 Seq4、Seq5、 Seq6) 呢?
如果只选择重传 Seq2 一个报文,那么重传的效率很低。因为对于丢失的 Seq3 报文,还得在后续收到三个重复的 ACK3 才能触发重传。
如果选择重传 Seq2 之后已发送的所有报文,虽然能同时重传已丢失的 Seq2 和 Seq3 报文,但是 Seq4、Seq5、Seq6 的报文是已经被接收过了,对于重传 Seq4 ~Seq6 折部分数据相当于做了一次无用功,浪费资源。
可以看到,不管是重传一个报文,还是重传已发送的报文,都存在问题。
为了解决不知道该重传哪些 TCP 报文,于是就有 SACK
方法
3.SACK
这种方式需要在 TCP 头部「选项」字段里加一个
SACK
的东西,它可以将已收到的数据的信息发送给「发送方」,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。
图片来源:小林coding.图解网络.TCP篇
举个例子🌰:
如下图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过 SACK
信息发现只有 200~299
这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。
图片来源:小林coding.图解网络.TCP篇
总结
以上就是今天要跟大家分享的内容,本文通过图片结合文字的形式讲解了TCP的重传机制,希望这篇文章能够帮助大家更好地掌握该知识点。💗