文章

网络拥塞的本质

什么是网络拥塞

通俗的讲网络拥塞就是网络发送的包因为链路拥堵,造成了网络包中途丢失,或者到达延迟变高。丢失和延迟要看具体网络链路上的路由器交换机等设备的设定,一般来说网络拥堵了,网络包首先会在路由器或交换机缓存一下,如果超过了路由器或交换机承载能力,则网络包丢弃。

什么情况下发生网络拥塞

可以把网络链路想象为发快递,你到附近的快递点A寄东西,如果寄快递的人少则你基本不用等待,如果人多,那块就要排队。发送网络包时,如果接入的网络上网的人就比较多了,带宽资源有限,就会发生拥堵。

快递送到了快递点A,接着往下想,A要送到集散地B,集散地B有来自各个县市的快递,来自A地的快递不多,但是其他地可能很多,所以B处也可能发生快递处理不过来的情况。B处理不过来,有两种处理方案,一种是堆在仓库(缓存延迟),慢慢装车发送,一种是把快递扔了(丢包)。

假如B没有发送拥堵,那么快递发送到目的地C,C的话要收来自全国各地的快递,也可能赶上双11, 618的日子,爆仓。那么你到快递,大概率又会延迟到达。C集散地把快递在派发到各个县市的快递点,这些点也可能有好多人在点上排队取快递了,所以也可能发生拥塞。

所以类比下快递网络,互联网各个环节都可能发生拥塞,只要大家都发包,再大的网络带宽都可能被填满。

怎么知道发生网络拥塞

这也是各种网络拥塞算法在做的事情。你是发送端,包发出去了,你就不知道包在链路上的情况了,比如经过哪些路由器,走了哪些网络链路等等。

那该如何判断网络拥塞呢?

一种是基于延迟的模型估测。发送的时候带个时间戳,让接收端,也就是收信端把接收到的包情况做一个统计,并把发送的时间戳带回来,接收端就可以知道具体的发包到接收的延迟情况。如果这个延迟大于一定阈值,可以认为网络拥塞了。还是以快递为例,如果你发送了一个快递正常3天收到,但是4或5天才收到,可以认为网络有轻微的拥塞,如果一周或者半月才收到,带概率是赶上双11了,有严重的网络拥塞。

另一种是基于丢包的模型。如果发送的包丢了,接收端只收到部分包,也写一封信高数发送端,你发了10个包,我只收到了5个,其中1,4,7,8,9 我没收到。那么这种情况下也大概率发生了网络拥塞。

也就是快递点把你的包裹10个扔了5个,他处理不过来了。

发生拥塞的时候应该做点什么

正常来说如果网络发生拥塞,就应该减少发包的数量,每个人都适当的减少,比如下降为原来的80%。这样的话网络的负荷就小了,丢包和延迟也相应的小了。

公平和道德问题

带宽拥塞了,假如有人不主动降低发送码率呢?比如网络拥塞造成了10%的丢包,我只要多发点包,就能更高的提高我包到达的数量,从而保证通信质量。

从理论上说这样做是没问题的,但是如果每个人都这样做的话,那么是不是网络的总的包数量又增加。最终大家都发生更严重的丢包,网络都不好。

就像发快递,快递点处理不过来了,给你扔了10%的包裹,你多发10%,到达的包数量不变。假如其他人也这样想,也多发10%,估计快递点就会爆仓,下一步快递点就该决定:现在快递包太多了,咱们工人处理不过来,扔调20%吧。

这下好了发快递的都有了20%的丢包,谁的日子也不好过。

所以网络拥塞情况下大家都应该适当的避让,减少发包量。偶尔有个人多发点包也没人什么,人多了就谁也别想好好上网了。

操作系统的拥塞算法

TCP的网络拥塞算法是内置到系统中的,一般用户也不会轻易去修改,它的策略就是网络发生拥塞的时候,退让带宽,大家都有网可以上,保证了一个大概的公平。

如果拥塞算法的实现控制在每个人手中,想发多少发多少,没有控制,那整个互联网就完了。就像高速公路有点堵车,你加快车速想加个塞,大家都怕堵,都加快车速要加塞,结果整个路堵了,谁都跑不了。

城市里交通限号也是同样的道理。

运营商的态度

运营商对TCP的态度还是比较好的,TCP有流控。对于UDP,因为其没有拥塞控制,或者拥塞控制的实现一般是自己控制的,这样就很容易出现有人要多发包,以抢占带宽,实现多到达包的目的。

这样挤占带宽的行为在用网低峰还好,但是当用网高峰,运营商会为了保证TCP通信的稳定性,主动的去对UDP做限制,比如说丢包。

这样某些人就会发现UDP的通信质量并不好,可能就是运营商烦你了,正常用户上网都快保障不了,你还在这加塞,多发包😤

知道了运营商和防火墙的态度,是不是我在用UDP的时候就可以多发包对抗他们的主动丢包呢?最好不要! 运营商肯定会加大丢包的力度,抽风似的不间断丢包,让你的QOS效果非常差。

防火墙的态度

公司一般都会有网络运维,他们对UDP的抢占带宽行为也有一定警惕,所以一些企业对UDP也不友好。另外听说好多网络攻击可以使用UDP来发起,那UDP就更不太招人喜欢。

但是在音视频通信方面UDP是一套基础的通信协议,这就造成了某些情况下公司网很好,就是音视频通话比较卡,或者根本无法进行。所以就出现了RTP over TCP。

纯丢包的网络

有没有不是因为运营商或者防火墙等非正常原因引起的网络丢包呢?

有,但很少!

为什么呢?想象互联网就是个水管网络,不可能出现大面积漏水的情况,即使出现了也很快就被修复了。

所以你说哪个用户经常网络出现10% - 20%丢包,一般不太可能,因为这个时候用户普通网页浏览都成了问题,大概率去向运营商报修去了。

后记

所以说到底网络拥塞的本质就是大家一块竞争有限的网络带宽资源,造成的网络拥堵。拥堵的表现就是延迟+丢包。

本文想到哪写到哪,可能有些啰嗦

本文由作者按照 CC BY 4.0 进行授权