TCP拥塞控制

TCP模块需要提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性,这就是拥塞控制。
拥塞控制有四个部分:慢启动、拥塞避免、快速重传和快速恢复。
拥塞控制的是发送端向网络一次连续写入(受到其中的第一个数据的确认之前)的数据量,称为SWND。因为发送端最终以TCP报文段来发送数据,所以SWND限定发送端能连续发送的TCP报文段的数量。这些TCP报文段的最大长度(仅指数据部分)称为SMSS,其值就是这些报文段中长度最大的那个报文段的长度。

发送端需要合理选择SWND的大小。如果SWND太小,会引起明显的网络延迟;如果SWND太大,容易导致网络拥塞。仅仅通过TCP头部中的接收通告窗口(RWND)来控制发送数据的速度远不够,发送端还要通过拥塞窗口(CWND)来控制。实际的SWND就是RWND和CWND中比较小的一个。

一、慢启动

TCP连接建立好以后,一开始并不知道网络能传输多少数据,如果过大就会拥塞,先试探一下,再逐渐增大CWND。CWND被设为初始值IW,此后发送端每收到接收端一个确认,其CWND按CWND+=min(N,SMSS)增加。其中N为此次确认中包含的之前未被确认的字节数。每次最多增加一个SMSS。CWND将按照指数形式扩大,这就是所谓的慢启动。
这里CWND增长方式可能不好理解,举个例子:初始发送端设置CWND=1,发送报文段M1,接收端接收到M1并发送确认报文,发送端收到确认报文段后增加CWND。这时N=1,因为此次确认中包含M1一个TCP报文段之前没被确认。所以CWND=CWND+min(N,SMSS)=1+min(1,1)=2.
然后,发送端发送报文段M2、M3。接收端接收到M2并发送确认报文,发送端收到确认报文段后CWND=2+min(1,1)=3;接收端接收到M3并发送确认报文,发送端收到确认报文段后CWND=3+min(1,1)=4。这时CWND=4.
以此类推,发送端发送报文段M4、M5、M6,完成后CWND=8.

可以看到CWND增加是很快的(可见慢启动并不慢),如果不加以控制,会导致网络拥塞。因此,当CWND的大小超过慢启动门限(ssthresh)时,TCP拥塞控制进入拥塞避免阶段。

二、拥塞避免

拥塞避免阶段使CWND每经过一次往返时间加一,呈线性增长,减缓增长速度。无论是慢启动算法还是拥塞避免算法,只要出现拥塞,就要把ssthresh的值变成FlightSize(已发送但未收到确认的字节数)的一半(>=2),把CWND的值变为1,接着慢启动算法。这样可以迅速减少主机向网络中传输数据,使发生拥塞的路由器能把堆积的数据发出去。

例如:


1.TCP连接进行初始化的时候,cwnd=1,ssthresh=16。
2.在慢启动算法开始时,cwnd的初始值是1,每次发送方收到一个ACK拥塞窗口就增加1,当ssthresh =cwnd时,就启动拥塞控制算法,拥塞窗口按照规律增长,

3.当cwnd=24时,网络出现超时,发送方收不到确认ACK,此时设置ssthresh=12,(二分之一cwnd),设置cwnd=1,然后开始慢启动算法,当cwnd=ssthresh=12,慢启动算法变为拥塞控制算法,cwnd按照线性的速度进行增长。

这里有的图横坐标为RTT,RTT(Round-Trip Time)往返时间在计算机网络中它是一个重要的性能指标。表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认,不包含数据传输时间)总共经历的时间。

RTT由三个部分决定:链路的传播时间、末端系统的处理时间、路由器的缓存中的排队和处理时间。其中前两个部分的值作为一个TCP连接相对固定,路由器的缓存中的排队和处理时间会随着整个网络拥塞程度的变化而变化。所以RTT的变化在一定程度上反映了网络拥塞程度的变化。简单来说就是发送方从发送数据开始,到收到来自接受方的确认信息所经历的时间

三、快速重传

在很多情况下,发送端都有可能收到重复的确认报文段,拥塞控制算法需要判断网络是否真的发生了拥塞。具体做法:发送端如果连续收到3个重复的确认报文段,就认为拥塞发生了。然后启用快速重传和快速恢复。
快速重传首先要求接收方每收到一个失序的报文段后就立即发出重复确认,发送方只要收到连续三个重复确认报文段,就立即重传接收方尚未收到的报文段。如下图所示:


接收方收到M1、M2并确认,但是没有收到M3,接着收到M4。这时M4是失序的报文段,不能确认,根据快速重传规定,立即发送对M2的重复确认。连续收到3次对M2的确认后,立即重传M3,而不必等待为M3设置的重传计时器到期。快速重传可以使整个网络的吞吐量提高约20%。

四、快速恢复

与快速重传配合的还有快速恢复:
1. 当发送发连续接收到三个确认时,就执行乘法减小算法,把慢启动开始门限(ssthresh)减半,但是接下来并不执行慢开始算法。

2. 此时不执行慢启动算法,而是把cwnd设置为ssthresh的一半, 然后执行拥塞避免算法,使拥塞窗口缓慢增大。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值