探究一下拥塞控制算法的不足

357 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情

拥塞控制算法我想大家很熟悉,计算机网络中,tcp协议最基础的一个算法。我在这里简短介绍一下教科书中常用的算法,其实也就是Reno算法。

拥塞是指对某资源的需求超过了该资源能提供的可用部分,网络性能变坏。而拥塞控制是防止过多的数据注入网络,这样使网络中的路由器或链路不至于过载。

拥塞控制是基于窗口的拥塞控制,发送方维持一个拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度。发送方的发送窗口等于拥塞窗口。

拥塞控制使用慢开始、拥塞避免、快重传、快恢复四种算法进行全局控制。

慢开始:刚开始不清楚网络的负荷情况,需要先探测一下,由小到大逐渐增大发送窗口。没经过一个传输轮次,拥塞窗口加倍。慢并不是拥塞窗口的增长速率慢,而是在刚开始发送报文段时设置拥塞窗口为1,再逐渐拥塞窗口,避免刚开始时过多的报文段注入。

拥塞避免:当拥塞窗口增加到一定程度,等于慢开始门限值时,会触发拥塞避免,让拥塞窗口缓慢增大,每经过一个传输轮次,拥塞窗口加1。当拥塞窗口逐渐增大,会出现网络超时,此时让慢开始门限值等于拥塞窗口的一半,拥塞窗口为1,启动慢开始算法。

快重传:网络传输过程中可能未超时,但会出现报文丢失的情况,而让发送方错误以为网络拥塞。为了避免这种情况,需要让发送方尽快知道个别报文段的丢失。快重传要求接收方不要在自己发送数据时捎带确认,而是立即发送确认,即使收到失序报文也要对当前按序收到的报文段进行重复确认。当发送方一连收到三个连续确认,就知道有个别报文段的丢失。

快恢复:发送方知道个别报文段的丢失,不会启动慢开始算法,而是启动快恢复算法。拥塞窗口变为之前的一半,慢开始门限值等于拥塞窗口,执行拥塞避免算法。

1. 公平性问题

首先,我们理解一下公平性。是指多条tcp链接,每条都有不同的端到端路径,但是都经过一段传输速率为R bps的瓶颈链路。(瓶颈链路是指对于每条连接,沿着该连接路径上所有其他段链路不拥塞,且与该瓶颈链路的传输容量相比,都有充足的传输容量。)假设每条连接都在传输一个大文件,且无udp流量通过该瓶颈链路。如果每条连接的平均传输速率接近R/K,即每条连接都得到相同份额的链路带宽,则认为该链路控制机制是公平的。

那么,tcp的AIMD算法(additive-increse,multiplicative-decrease)公平吗?

tcp的不公平性主要体现在两个方面:

  1. 面向连接的TCP和无连接的UDP在拥塞发生时对拥塞时的不同反应和处理,导致对网络资源的不公平使用问题。在拥塞发生时,有拥塞控制反应机制的TCP数据流会按拥塞控制步骤进入拥塞避免阶段,从而主动减小发送入网络的数据量。但对无连接的数据报UDP,由于没有端到端的拥塞控制机制,即使网络发出了拥塞指示(如数据包丢失、收到重复ACK等),UDP也不会像TCP那样减少向网络发送的数据量。结果遵守拥塞控制的TCP数据流得到的网络资源越来越少,没有拥塞控制的UDP则会得到越来越多的网络资源,这就导致了网络资源在各源端分配的严重不公平。

网络资源分配的不公平反过来会加重拥塞,甚至可能导致拥塞崩溃。因此如何判断在拥塞发生时各个数据流是否严格遵守TCP拥塞控制,以及如何“惩罚”不遵守拥塞控制协议的行为,成了目前研究拥塞控制的一个热点。在传输层解决拥塞控制的公平性问题的根本方法是全面使用端到端的拥塞控制机制。

  1. TCP连接之间的不公平问题:一些TCP在拥塞前使用了大窗口尺寸,或者它们的RTT较小,或者数据包比其他TCP大,这样它们也会多占带宽

  2. AIMD拥塞窗口的不公平问题:和式增加策略使发送方发送数据流的拥塞窗口在一个往返时延(RTT)内增加了一个数据包的大小,因此,当不同的数据流对网络瓶颈带宽进行竞争时,具有较小RTT的TCP数据流的拥塞窗口增加速率将会快于具有大RTT的TCP数据流,从而将会占有更多的网络带宽资源。

拥塞发生必然导致数据包丢失,数据包丢失会导致各数据流之间争抢有限网络资源发生竞争,争抢能力弱的数据流获得的资源就更少。

当rtt较长,时常丢包。而tcp的设计目的是为了实现不可靠线路上的可靠传输,即为了解决丢包。而解决丢包却让tcp速率下降。丢包使tcp传输速率大幅下降的原因是丢包重传机制,控制这一机制就是tcp的拥塞控制算法。

也就是说,tcp拥塞控制算法的不公平性,导致在某些条件下,想要实现可靠传输,却导致某些竞争资源能力的数据流,如rtt较大的数据流,或和udp同时传输数据时等,丢包率增加。

2. 窗口增长机制的问题

通过前面的TCP的拥塞控制的机制我们可以了解TCP的增长方式是AIMD原则的,即加法增大,在拥塞避免阶段,每次增加1,按照我们上面计算的网络环境1Gbps,100ms时延,其窗口大小到12,500,000(1000,000,000B*0.1s/8=12,500,000),如果按照最理想的情况每个包大小为1500个字节的话,那么必须需要8333(12,500,000/1500=8333)个包大小的拥塞窗口,也就是要8333个RTT才能增长到这个值,这个时间还随着RTT和带宽的增大而增大,而且在增长过程中只要一出现丢包的话,那么窗口就立即减半,此时又得重新开始增长,显然当网络带宽过大时,该增长函数反而导致了一定的开销。

总结

tcp实现的是不可靠链路上的可靠传输,使用拥塞控制算法解决丢包。而拥塞发生必然导致数据包丢失,数据包丢失会导致各数据流之间争抢有限网络资源发生竞争,争抢能力弱的数据流获得的资源就更少,丢包率增加。

当网络带宽很丰裕时,需要很多RTT才能增长到这个值,由于拥塞控制的不公平性,时间还随着RTT和带宽的增大而增大,而且在增长过程中只要一出现丢包的话,那么窗口就立即减半,此时又得重新开始增长,当网络带宽大时,增长函数机制反而导致了一定的开销。

参考

blog.csdn.net/zhangskd/ar…
www.cnblogs.com/fll/archive…