计算机网络自顶向下方法30——运输层 网络拥塞控制中的公平性
网络拥塞控制中的公平性详解
一、什么是公平性?
1. 核心思想
在共享同一网络瓶颈的多个数据流之间,公平地分配可用的带宽资源。理想情况下,N个相同特性的流竞争同一链路,每个流应获得 1/N 的链路带宽。
2. 公平性的衡量
max-min公平性:这是一种经典的公平性定义。它要求在满足所有流的最小需求后,将剩余带宽公平地分配给那些需要更多带宽的流。这通常被认为是网络中最理想的公平分配方式。
二、TCP的公平性:AIMD的魔力
TCP通过其AIMD 的核心机制,在宏观上实现了公平性。
AIMD解释:
AI - 加法增大:在拥塞避免阶段,每个RTT将
cwnd增加1 MSS。这使得流的发送速率线性增长。MD - 乘法减小:当检测到拥塞时(超时或收到ECN),将
cwnd减半。这使得流的发送速率断崖式下降。
AIMD如何导致公平?
下图通过两个TCP流的竞争,直观地展示了AIMD如何神奇地引导它们收敛到公平的平衡点:
- 过程分析:
初始:流1的窗口为30,流2的窗口为10。流1占用更多带宽。
加法增大:两者窗口都线性增长,但差距保持不变。
拥塞发生:当它们的窗口之和超过瓶颈带宽时,发生拥塞(如丢包)。
乘法减小:两个流同时将窗口减半。流1从32减至16,流2从16减至8。注意:此时两者的差距从16缩小到了8!
再次加法增大:两者又从新的起点开始线性增长。
收敛:经过几次AIMD循环后,两个流的窗口值会越来越接近,最终在公平点(各25个单位)附近达到动态平衡。
结论:AIMD就像一个“奖惩分明”的系统,做得好大家一起慢慢奖励(AI),出问题大家一起受罚(MD),而且罚的是比例(乘法),这使得占便宜多的流罚得更疼,从而迅速拉平大家的起点。
三、公平性的挑战与破坏者
1. 挑战一:RTT不公平性
问题:具有较小RTT的TCP连接比具有大RTT的连接能获得更多的带宽份额。
根源:TCP的窗口增长是基于ACK的。RTT小的连接能更快地收到ACK,从而更快地增加其
cwnd。在AIMD的“赛跑”中,RTT小的连接起跑更频繁,增长更快。举例:两个流共享10Mbps链路。流1的RTT=10ms,流2的RTT=100ms。在同样的时间内,流1完成的AIMD周期数是流2的10倍,其平均窗口和吞吐量将远高于流2。
现代算法的改进:像CUBIC这样的算法,其窗口增长更多地依赖于真实时间而非ACK计数,从而在一定程度上缓解了RTT不公平性问题。
2. 挑战二:UDP的“不公平性”
问题:UDP本身不实现任何拥塞控制。
机制:UDP发送方可以按照恒定的、很高的速率发送数据包,而完全不理会网络的拥塞状况。当网络中出现UDP流量时(如视频流、语音通话),它会无情地占满路由器缓冲区,导致TCP流检测到丢包并不断进行“乘法减小”,最终TCP流被“饿死”。
本质:这就像在一個所有人都排队(TCP)的场合,突然来了一个不排队的人(UDP),他总能抢到资源。
解决方案:
应用层控制:鼓励基于UDP的应用在应用层实现拥塞控制。例如,QUIC协议在UDP之上实现了类似TCP的拥塞控制。
网络层管理:在网络设备上部署公平队列 等机制,在不同流之间公平地调度分组,防止任何一个流独占队列。
3. 挑战三:并行TCP连接的“侵略性”
问题:一个应用(如早期的下载管理器、某些BitTorrent客户端)可以同时打开多个TCP连接来传输同一个对象。
机制:从网络的角度看,这是多个独立的流。如果一个应用打开10个连接,那么在公平队列看来,它就像是10个不同的用户。在分配带宽时,这个应用将获得10份,而其他使用单个连接的应用只能获得1份。
影响:这严重破坏了“每流公平性” 的原则。一个“贪婪”的应用可以通过这种方式霸占绝大部分带宽。
解决方案:
应用自律:开发者应遵守网络礼仪,避免滥用并行连接。
网络识别与惩罚:更复杂的网络设备可以尝试识别属于同一对主机的多个连接,并将它们作为“一个流”来整体进行调度。
四、总结
| 场景 | 对公平性的影响 | 核心原因 |
|---|---|---|
| 多个TCP流竞争 | 趋向公平 | AIMD 机制迫使所有流收敛到公平点。 |
| 不同RTT的TCP流 | 不公平 | 小RTT流增长更快,在AIMD循环中占优。 |
| TCP vs. UDP | 极不公平 | UDP不遵守拥塞控制“社会契约”,挤占TCP资源。 |
| 单连接 vs. 多连接 | 不公平 | 网络设备通常按流调度,多连接应用被视作多个用户。 |
公平性是互联网能够健康发展、避免“公地悲剧”的基石。它不仅仅是一个技术问题,更是一个需要端系统(协议栈)、应用程序和网络核心共同协作和维护的“社会规范”。理解这些公平性问题,有助于我们设计出更友好、更高效的网络应用和协议。
