TCP 拥塞控制

前提:

我们都知道 TCP 是传输层的协议,网络请求经过传输层到达网络层之后是通过 ip 包进行传输的。如果我们发送方大量的 ip 包的时候,有可能我们的链路资源有限,那么我们的 ip 包就有可能丢失或者被丢弃,这样我们的请求就不是绝对安全的,那接下来我们就说一下,TCP是如何处理前面的情况的。

 

一、什么是网络拥塞

是指在分组交换网络中传送分组的数目太多时,由于存储转发节点的资源有限而造成网络传输性能下降的情况。当网络发生拥塞时,一般会出现数据丢失,时延增加,吞吐量下降,严重时甚至会导致“拥塞崩溃”(congestion collapse)。通常情况下,当网络中负载过度增加致使网络性能下降时,就会发生网络拥塞。

 产生拥塞的原因:

1、物理链路的带宽有限。

2、交换节点的缓存有限。

3、节点的处理能力有限

归根结底来说,当我们的上诉三点的需求 > 可用资源的时候就会产生网络拥塞。

 

二、TCP 面对网络拥塞是如何处理的

其实解决上述问题,我们只需要保证两个点就可以了,第一,我们发送的 ip 包不能丢失,第二,还要保证发送的速度最大化

滑动窗口:

TCP 处理网络拥塞,主要涉及到一个动态变化的窗口(拥塞窗口,也可以叫滑动窗口),该窗口的数量与网络拥塞的程度有关,在网络情况好的时候,拥塞窗口不断的增加,发送方的窗口自然也随着增加,但是接受方的接受能力有限,在发送方的窗口达到某个大小时就不在发生变化了。一般的TCP协议,拥塞窗口的门限的数量为 65536,当小于这个值的时候,使用慢启动算法增加发送 ip 包的数量,当大于或等于这个值的时候,使用拥塞控制算法增加发送 ip 包的数量。

 发送方如何判断拥塞的:

当我们发送一段报文的时候,如何在一段时间内,没有收到确认报文,那么我们就可以认为网络拥塞了。

 慢启动算法:

发送方开始发送数据报时,如果立即将大量的数据注入到网络中,可能会出现网络的拥塞。慢启动算法就是在发送方刚开始发送数据报的时候先探测一下网络的状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小,即增加发送ip 包的数量。一般发送 ip 包的数量是通过幂次方增加的。例如,开始发送方先设置cwnd(拥塞窗口)=1,发送第一个报文段M1,接收方接收到M1后,发送方接收到接收方的确认后,把cwnd增加到2,接着发送方发送M2、M3,发送方接收到接收方发送的确认后cwnd增加到4,慢启动算法每经过一个传输轮次(认为发送方都成功接收接收方的确认),拥塞窗口cwnd就 * 2。

拥塞控制算法:

是让cwnd缓慢的增加而不是加倍的增长,每经历过一次往返时间就使cwnd增加1,而不是加倍,这样使cwnd缓慢的增长,比慢启动要慢的多。

拥塞避免:

上面我们说到一个拥塞窗口数量的门限(ssthresh)一般为 65536,那么就有如下算法:

 1.、当cwnd < ssthresh,使用慢启动算法,

 2.、当cwnd > ssthresh,使用拥塞控制算法,停用慢启动算法。

 3.、当cwnd = ssthresh,这两个算法都可以。

当出现网络拥塞的时候,首先会把门限 ssthresh 的数量减半,然后 cwnd 的数量会变为 1,然后在使用慢启动算法,这样做的目的能迅速的减少主机向网络中传输数据,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。

实例:

例如我们的 cwnd (也就是我们要发送 ip 包的数量) 为1,然后我们的门限为 16。

1、在慢启动算法开始时,cwnd的初始值是1,每次发送方收到一个ACK拥塞窗口就增加1,当 ssthresh = cwnd 时,就启动拥塞控制算法,拥塞窗口按照规律增长,

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


三、快重传 

      快重传算法要求首先接收方收到一个失序的报文段后就立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。接收方成功的接受了发送方发送来的M1、M2并且分别给发送了ACK,现在接收方没有收到M3,而接收到了M4,显然接收方不能确认M4,因为M4是失序的报文段。如果根据可靠性传输原理接收方什么都不做,但是按照快速重传算法,在收到M4、M5等报文段的时候,不断重复的向发送方发送M2的ACK,如果接收方一连收到三个重复的ACK,那么发送方不必等待重传计时器到期,由于发送方尽早重传未被确认的报文段。

 

四、快恢复

1、 当发送发连续接收到三个确认时,就执行乘法减小算法,把慢启动开始门限(ssthresh)减半,但是接下来并不执行慢开始算法。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值