宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

前言

TCP的深度在于,任何机制都可以长期学习。 我们今天进行了TCP的慢启动和拥塞避免、

让我们来看看

专业名词

TCP慢启动和拥塞避免相关的几个名称

慢启动:慢启动

慢启动阈值:慢启动阈值==ssthresh

拥塞窗口:连接窗口==cwnd

接收窗口:接收窗口==rwnd

cwnd 与 rwnd

rwnd是接收窗口,是TCP接收方的窗口

cwnd是拥塞窗口,是TCP发送端的窗口

在TCP通信中,TCP的接收方需要向TCP的发送方通知自己的接收窗口。 TCP的发送方根据两个参数决定要发送多少数据。 一个参数是接收方通知的接收窗口,另一个参数是发送方自己的cwnd窗口大小。 TCP的真正发送窗口=min(rwnd,cwnd )。

拥塞避免是发送侧使用的流量控制,广播窗口是接收侧进行的流量控制

慢启动的引入

慢启动的想法:主机开始发送数据报。 如果立即将大量数据注入网络,可能会导致网络拥塞。 慢启动算法是指在主机开始发送数据报之后立即首先检测网络状况,如果网络状况良好,则发送方在每次发送消息段时都正确接收确认消息段。 那么,将拥塞窗口的大小从小到大,也就是说增大发送窗口的大小。 但是,拥塞窗口始终不会变大。 这里有慢启动的阈值ssthresh,如果cwnd增加到ssthresh,则每当接收到确认时,cwnd就会被加1/cwnd。

tcp慢启动和拥塞避免算法(慢启动)-风君子博客

慢启动与拥塞避免

cwnd=ssthresh时,进入慢启动阶段——-“,执行慢启动算法

慢启动算法最初将cwnd设置为一个消息段,然后在每次收到确认时加1。 这将使窗口呈指数级增长。 发送一个消息段,然后是两个,然后是四个……。

对于cwnd ssthresh,进入拥塞避免阶段——执行拥塞避免算法

每次收到确认时,都会在cwnd上加1/cwnd。 这保证了RTT的估算中cwnd的增加值在1以下。

tcp慢启动和拥塞避免算法(慢启动)-风君子博客

慢启动与拥塞避免实例图解

的示例:

在初始化TCP连接的情况下,cwnd=1,ssthresh=16。

慢启动算法开始时,cwnd的初始值为1,每当发送端接收到ACK拥塞窗口时增加1,当ssthresh=cwnd时,启动拥塞控制算法,拥塞窗口规则增加

cwnd=24时,网络发生超时,发送侧无法接收确认ACK。 在这种情况下,设定ssthresh=12,cwnd的二分之一,设定cwnd=1,然后开始慢启动算法,在cwnd=ssthresh=12的情况下,慢启动算法成为拥塞控制算法,

tcp慢启动和拥塞避免算法(慢启动)-风君子博客

AIMD(加法增大乘法减小)

乘法减少:无论是慢启动阶段还是拥塞控制阶段,网络发生超时时,将cwnd设定为1,将ssthresh设定为cwnd的一半,执行慢启动算法(cwndssthresh )

加法增大)网络频繁超时后,ssthresh会迅速降低,减少注入网络的数据包数量,因此加法增大是指在执行拥塞避免算法后,拥塞窗口逐渐增大,网络提前拥塞

这两种算法结合起来就是AIMD算法,是应用最广泛的算法。 拥塞避免算法无法完全避免网络拥塞,只能通过控制拥塞窗口的大小来使网络不容易拥塞。

请看一下

慢启动真的很“慢”吗

慢启动阶段的cwnd的变化。 具体而言,在新连接的情况下,cwnd被初始化为一个最大消息段(MSS )大小,发送端以拥塞窗口大小开始发送数据,每确认一个消息段,cwnd就增加一个MSS大小。 这样,cwnd的值随着网络往返时间(Round Trip Time,RTT )呈指数增加

开始— cwnd=1

经过RTT个后— cwnd=2*1=2

经过两个RTT—cwnd=2*2=4

经过三个RTT—cwnd=4*2=8

从上面可以看出,慢起点的速度一点也不慢,只是起点有点低。

tcp慢启动和拥塞避免算法(慢启动)-风君子博客