深入了解Linux TCP慢启动机制 (linux tcp 慢启动)

TCP慢启动机制是TCP协议的一部分,用于控制TCP连接传输的速度。当TCP连接开始时,慢启动机制被启用,它会逐渐增加传输速度,直到网络开始拥塞为止。在本文中,我们将,以便更好地理解TCP连接传输的过程。

TCP连接的慢启动机制可以帮助在连接开始的时候逐步增加传输速度,这个速度是根据连接的可用带宽和延迟时间决定的。网络带宽是指在一单位时间内数据传输的速率,而延迟时间表示从发送数据到接收到响应所需的时间。在TCP连接开始时,慢启动会将数据的传输速度逐渐增加,直到达到一个安全的速度,以避免网络拥塞。

为了更好地了解Linux TCP慢启动机制,我们需要先了解一些基本概念。需要了解的是TCP连接的三次握手。TCP连接的三次握手是建立TCP连接时的一个过程,即客户端发送SYN请求报文,服务器接收后回复SYN+ACK报文,最后客户端再回复一个ACK报文,此时连接已经建立。这个过程是用来确保连接的可靠性。

需要了解的是TCP拥塞控制算法。TCP拥塞控制算法是防止网络拥塞的一种算法。它的原理是当网络出现拥塞时,TCP连接会将传输速率降低,以避免数据包的丢失和重传。这个算法的实现是通过调整TCP发送数据包的速率和窗口大小来实现的。

在理解了TCP连接的三次握手和TCP拥塞控制算法后,我们就可以深入了解TCP慢启动机制。TCP慢启动机制的基本原理是在连接开始时,它会先发送一些数据包,然后等待接收方的确认消息。如果没有出现任何丢包现象,则会逐步增加发送的数据包数,同时也会增加窗口大小,从而逐渐提高网络传输速率。

具体来说,当一个TCP连接刚开始时,发送方会默认发送一个MSS(更大分段长度)的数据包,即表示可以承受的更大数据包大小。如果接收方能够正常接收这个数据包,则发送方会再发送两个MSS大小的数据包,即三个MSS大小的数据包。如果接收方也能正常接收这些数据包,则发送方会再发送四个MSS大小的数据包,以此类推,直到网络出现拥塞为止。当网络出现拥塞时,TCP连接就会向上层应用程序反馈信息,以请求降低传输速率。

在Linux系统中,TCP慢启动机制是通过调整TCP拥塞窗口来实现的。拥塞窗口指的是在一个周期内可以发送的数据包的数量,这个周期的长度是由网络延迟时间和网络带宽共同决定的。在拥塞窗口的计算中,Linux系统使用了一个指数级增长的算法。也就是说,在开始的时候,拥塞窗口的大小是1个MSS的大小,然后每当一个数据包被成功发送和接收时,拥塞窗口就会翻倍,直到达到实际带宽和延迟设定的阈值为止。

需要注意的是,TCP慢启动机制只会在连接开始时生效,在连接过程中不会启用。因此,在连接过程中,如果网络出现拥塞,则会启用TCP的快重传和快恢复机制,以避免数据包的丢失和重传。

TCP慢启动机制是TCP连接传输的一部分,用于控制TCP连接传输的速度。在Linux系统中,TCP慢启动机制是通过调整TCP拥塞窗口来实现的。拥塞窗口指的是在一个周期内可以发送的数据包的数量,这个周期的长度是由网络延迟时间和网络带宽共同决定的。在拥塞窗口的计算中,Linux系统使用了一个指数级增长的算法。需要注意的是,TCP慢启动机制只会在连接开始时生效,在连接过程中不会启用。

相关问题拓展阅读:

TCP 如何保证可靠性

1. TCP可靠性的保证机制总结

2. 网络基础:

TCP协议

-如何保证传输可靠性

3. TCP协议的

流量控制

和拥塞控制

4. TCP 的那些事儿(下)

5. TCP拥塞控制:慢开始、拥塞避免、快重传、快恢复

TCP检验和的计算与UDP一样,在计算时要加上12byte的伪首部,检验范围包括TCP首部及数据部分,但是UDP的检验和字段为可选的,而TCP中是必须有的。计算方法为:在发送方将整个报文段分为多个16位的段,然后将所有段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法进行计算,如最终结果为检验字段所有位是全1则正确(UDP中也是全为1则正确),否则存在错误。

TCP将每个

数据包

都进行了编号友纯,这就是序列号。

序列号的作用:

a、保证可靠性(当接收到的数据总少了某个序号的数据时,能马上知道)

b、保证数据的按序到达

c、提高效率,可实现多次发送,一次确认

d、去除重复数据

数据传输过程中的确认应答处理、重发控制以及重复控制等功能都可以通过序列号来实现

TCP通过确认应答机制实现可靠的数据传输。在TCP的首部中有一个标志位——ACK,此标志位表示确认号是否有效。接收方对于按序到达的数据会进行确认,当标志位ACK=1时确认首部的确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了。而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据;而如果等待了一定时间还没有收到确认报文就会启动重传机制。

当报文发出后在一定的时间内未收到接收方的确认,发送方就会进行重传(通常是在发出报文段后设定一个闹钟,到点了还没有收到应答则进行重传)。

一种情况是发送包丢失了好简咐,其基本过程如下:

另一种情况是ACK 丢失,过程如下:

当接收方接收到重复的数据时就将其丢掉,重新发送ACK。而要识别出重复的数据,前面提到的序列号就起作用了。

重传时间的确定:

重传时间的确定:报文段发出到收到应答中间有一个报文段的往返时间RTT,显然超时重传时间RTO会略大于这个RTT,TCP会根据网络情况动态的计算RTT,即RTO是不断变化的。在Linux中,超时以500ms为单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。其规律为:如果重发一次仍得不到应答,就等待2 500ms后再进行重传,如果仍然得不到应答就等待4 500ms后重传,依次类推,以指数形式递增,重传次数累计到一定次数后,TCP认为网络或对端主机出现异常,就会强行关闭连接。

连接管理机制即TCP建立连接时的

三次握手

和断开连接时的

四次挥手

接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满,而发送方继续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。

因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制叫做流量控制。

在TCP报文段首部中有一个16位窗口长度,当接收端接收到发送方的数据后,在应答报文ACK中就将自身咐谈缓冲区的剩余大小,放入16窗口大小中。这个大小随数据传输情况而变,窗口越大,

网络吞吐量

越高,而一旦接收方发现自身的缓冲区快满了,就将窗口设置为更小的值通知发送方。如果缓冲区满,就将窗口置为0,发送方收到后就不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。

注意:窗口大小不受16位窗口大小限制,在TCP首部40字节选项中还包含一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位。

流量控制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了更大生存时间也没有到达接收方,就会产生丢包问题。

为此TCP引入慢启动机制,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据。

此处引入一个拥塞窗口:

发送开始时定义拥塞窗口大小为1;每次收到一个ACK应答,拥塞窗口加1;而在每次发送数据时,发送窗口取拥塞窗口与接送段接收窗口最小者。

慢启动:在启动初期以指数增长方式增长;设置一个慢启动的阈值,当以指数增长达到阈值时就停止指数增长,按照线性增长方式增加;线性增长达到网络拥塞时立即“乘法减小”,拥塞窗口置回1,进行新一轮的“慢启动”,同时新一轮的阈值变为原来的一半。

“慢启动”机制可用图表示:

1)连接建好的开始先初始化cwnd = 1,表明可以传一个MSS大小的数据。

2)每当收到一个ACK,cwnd++; 呈线性上升

3)每当过了一个RTT,cwnd = cwnd*2; 呈指数让升

4)还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”(后面会说这个算法)

1)收到一个ACK时,cwnd = cwnd + 1/cwnd

2)当每过一个RTT时,cwnd = cwnd + 1

这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的更佳值。很明显,是一个线性上升的算法。

当出现ack超时的时候,需要重传数据包。

TCP认为这种情况太糟糕,反应也很强烈。

快速重传在收到3个duplicate ACK时就开启重传(三次 ack 就认为丢包的原理见 关于TCP乱序和重传的问题 、 TCP 快速重传为什么是三次冗余 ACK ),而不用等到RTO超时。

TCP Reno的实现是:

快速重传和快速恢复算法一般同时使用。快速恢复算法是认为,你还有3个Duplicated Acks说明网络也不那么糟糕,所以没有必要像RTO超时那么强烈。 注意,正如前面所说,进入Fast Recovery之前,cwnd 和 sshthresh已被更新:

然后,真正的Fast Recovery算法如下:

cwnd = sshthresh + 3 * MSS (3的意思是确认有3个数据包被收到了)

重传Duplicated ACKs指定的数据包

如果再收到 duplicated Acks,那么cwnd = cwnd +1

如果收到了新的Ack,那么,cwnd = sshthresh ,然后就进入了拥塞避免的算法了。

如果你仔细思考一下上面的这个算法,你就会知道,上面这个算法也有问题,那就是——它依赖于3个重复的Acks。注意,3个重复的Acks并不代表只丢了一个数据包,很有可能是丢了好多包。但这个算法只会重传一个,而剩下的那些包只能等到RTO超时,于是,进入了恶梦模式——超时一个窗口就减半一下,多个超时会超成TCP的传输速度呈级数下降,而且也不会触发Fast Recovery算法了。

linux tcp 慢启动的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux tcp 慢启动,深入了解Linux TCP慢启动机制,TCP 如何保证可靠性的信息别忘了在本站进行查找喔。


数据运维技术 » 深入了解Linux TCP慢启动机制 (linux tcp 慢启动)