TCP协议有了拥塞控制机制,为什么还会网络拥塞?

Posted 车小胖谈网络

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP协议有了拥塞控制机制,为什么还会网络拥塞?相关的知识,希望对你有一定的参考价值。

这个问题好像在问:有了警察,为何还有小偷?

 


网络发生拥塞时,毫无疑问是进水管的流量流入速度大于出水管的流量流出的速度。

 

在小学数学里经常会做这样的算术题:一个蓄水池,一个进水管,4个小时可以放满水。一个出水管,6个小时可以排完水。现在入水管与排水管同时打开,需要几个小时才能放满水?

 

大家可以轻松地算出,需要12小时。

 

12小时之后,进水管与出水管依然同时打开,会发生什么?

 

肯定溢出啊!

 

溢出的流量会到达目的地吗?

当然不会了!

 

路由器(节点)如何避免流量白白流失?

从流量的源头下手,让流量的源头减少流量进入网络。

 

源头是谁?

正在发送流量的源主机。

 

什么消息通知源主机呢?

 

  • 使用ICMP Type 4  “Quench”消息,让源主机熄火、减少流量的产生

 

可是,很多源主机往往忽视这个消息,装作没有看见,依旧我行我素。

 

这种方法往往会失效。所以,路由器往往不会使用这种“出力不讨好”的操作。

 

  • 在返程的流量的IP报文里设置(ECN =1

 

朝着源主机流动的流量里,明确告知源主机“网络发生拥堵,请降速”。

 

但是,不是所有主机都认识ECN(Explicit Congestion Notification)自然无法知道网络其实已经拥堵了。

 

这种方法同样也会大概率失效。。。


  • 路由器无为而治

路由器只是把溢出的流量丢弃处理,其它的什么都不做。

 

路由器这种消极的态度真的好吗?

路由器双手一摊,很无奈地说,我发的通知消息它们要么不认识,要么认识却忽视,让寡人有什么好的办法?

 

 

源主机的TCP对“丢包”非常敏感,所有源主机TCP能听懂的语言,就是“丢包”!

 

发现丢包了,源主机TCP会将流量降速差不多一半。

 

 

源主机这种“对丢包信号做出流量降速的行为”就是流量拥塞控制。

 

大家发现没有,是先发生的“路由器(节点)流量溢出(丢包)”,然后才触发了“源主机的流量拥塞控制”。

 

源主机的流量拥塞控制(Congestion Control)机制,永远都无法避免路由节点的网络拥塞,从而造成的流量溢出(丢包)!

 

读者可能还听说,流量拥塞避免(Congestion Avoidance)机制,对吗?

 

 

拥塞避免

 

路由器(节点)发现消极被动的“无为而治”似乎效果不好。于是乎,决定采取积极主动的手段来管理流量。



 

路由节点通常是这么做的:

 

  • 路由节点的蓄水池有两个吃水线,低吃水线、高吃水线。

 

  • 低吃水线通常为蓄水池高度的60%,高吃水线通常为蓄水池高度的90%

 

  • 蓄水池里的流量低于低吃水线,流量自由通过。

 

  • 蓄水池里的流量高于低吃水线,低于高吃水线,路由节点开始随机丢弃一部分流量,低优先级丢弃概率大,高优先级概率小。

 

  • 蓄水池里的流量高于高吃水线,高出的部分被统统丢弃,不管流量有多么高深的背景。

 

路由节点“未雨绸缪”的流量管理方式,以主动牺牲小部分流量为代价,将“路由节点即将发生拥塞”的信号传递给所有的源主机,让源主机提前降速,可以避免更多的后续流量溢出而牺牲!

 

这个拥塞避免机制的名字叫WRED(Weighted Random Early Discard)!

 

WRED看起来很完美,但是真的很完美吗?

 

源主机通常会有两种流量:

 

  • TCP流量

  • UDP流量

 

TCP对丢包信号非常敏感,路由节点丢一个包,会引起TCP的连锁反应,流量降速立竿见影。

 

UDP对丢包及其不敏感,路由节点丢多少包,UDP该发多少,依然还会发多少,大不了无法到达目的的而已,有啥大不了的。

 

很快,UDP就会占据TCP流量降速让出来的蓄水池空间。

 

TCP是绅士,UDP无疑就是地地道道无赖!

 

对付UDP这种无赖,最有效的方式就是限速,将蓄水池划出一块空间给UDP使用。

 

一旦拥塞时,UDP只能使用自己的专用的蓄水池空间,而不会挤占TCP降速让出来的空间!

以上是关于TCP协议有了拥塞控制机制,为什么还会网络拥塞?的主要内容,如果未能解决你的问题,请参考以下文章

TCP拥塞控制机制

计算机网络之TCP协议流量拥塞控制算法原理:滑动窗口cwnd与rwnd

TCP拥塞机制

TCP协议—拥塞控制

TCP拥塞控制

4-8:TCP协议之拥塞控制(慢启动拥塞避免拥塞发生和快速恢复)