拥塞的表现是冲突,大量消费者挤兑有限资源,即拥塞,在一个绝对没有冲突的系统里,自然就没有拥塞。而冲突的来源有两个,一个是无序,一个是贪婪。
仅引入秩序不能解决冲突,但可减少冲突损耗,所谓冲突损耗,即一旦碰撞,两败俱伤。控制拥塞的另一面是控制贪婪,这需要让 Host “在不能发送报文的时候不发送”。
贪婪问题需要端到端拥塞控制机制,而秩序是端到端机制的前提,所以先看秩序。
但秩序带来的额外复杂性与冲突损耗相比,孰轻孰重,需权衡。
最初的系统一般简单无秩序,而冲突与贪婪正相关,渐大的冲突损耗会迫使 Host 自行收敛。
交叉路口相交的两条道路上如果车流量极小,便不必安装红绿灯,谁也不想出车祸,只能慢速通过。以一个程序员更熟悉但不同意的例子来说。
假设应用程序拥有完备的错误检测机制,便无需引入同步机制,不再需要 spinlock 这种东西,如果应用程序检测到错误,重试,直到获得正确结果,在轻负载场景,这种方式可以极大降低系统复杂度,同时获得不错的效率。
程序员往往在意 “随着系统规模扩大的 O(1) 特征。” 即使系统规模永不会扩大,追求精确,完备,可扩展的思维方式也会促使绝大多数程序员过早考虑可扩展性,从而过度设计,丢失了快速拿出第一版的机会。
但如果系统规模果真逐渐扩大,就真要引入秩序。
看个真实的历史。
IEEE 802.3 采用 CSMA/CD 流程。这是典型的 “直接发,错了就重试,直到正确” 的方式,跟上面那个同步临界区的例子别无二致。这种方式在早期轻负载场景非常有效,当分布式一致性秩序代价太高时,随机就是性价比最高的。至于可扩展性,遇到了再说。
再看与 802.3 有点竞争的 802.4 令牌总线和 802.5 令牌环。令牌相当于仲裁者,有效解决了 CSMA/CD 冲突损耗问题。令牌总线 or 令牌环 拥有重负载可扩展性但却失去了接入可扩展性(没有接入,哪有重负载?),秩序引入的复杂性并不值得。人们更容易接受 802.3,因为简单廉价,接入新节点代价小,以当时条件,以太网的使用方式比标准允许的更保守,CSMA/CD 也足够。
但可扩展性问题迟早会暴露,这也促进了 CSMA/CD 到交换式的演进,而不是用令牌网络替换以太网。
交换机引入秩序的方式比较有趣:
以太网线太长,光速太慢(量子纠缠要快太多),仲裁时间太久,这意味着 CSMA/CD 这种争抢方式性价比更高。然而将需要仲裁的共享介质压缩到盒子里,理论上可将仲裁时间缩短几百倍(以 200 米线缆以及 0.5 米边长的交换机主板为度量),该尺寸下,集中控制的开关矩阵非常有效,A/B,C/D 的通信可轻易并行不悖,比如 CrossBar。为了消除 Host 到交换机间的收发冲突,拉两组线即可,非常平滑又简单的一次进化。
交换机并不神奇,看上面右下角的开关矩阵,数数一共多少根线,如果在共享介质的同轴电缆上这拉这么多线,用继电器相交连接,也可实现开关矩阵,问题是线缆太长,光速太慢,仲裁信号传输太久。
开关矩阵,双绞线,buffer 这三件套将以太网引入了新时代,一直到今天,它的版本还在迭代。
回顾共享以太网到交换以太网的进化很有意义,这个过程中抽出一个控制面,转发逻辑被集中困在一个盒子里进行,盒子的每个端口都引出来收发两组线缆仅传输数据报文而不再传输控制报文,以秩序代替随机。集中 or 分布,秩序 or 随机,复杂 or 简单,背后都是性价比。
现在看冲突的另一面,贪婪。
秩序减缓了冲突损耗,同时也延迟了冲突的发生。与无序状态不同,Host 在 buffer overflow 之前无需承担任何贪婪的代价,注定控制贪婪的滞后性。
很多人强调 “端到端拥塞控制”,就好像端侧可以完全覆盖拥塞控制逻辑一样。这种观点并不正确。这种观点只是在描述 TCP/IP 端网分离的沙漏模型时为拥塞控制找一个位置罢了。
如果没有转发节点 AQM(or QM) 的参与,拥塞控制完全无法实施。以最简单的尾丢策略即可理解,更别提 RED 了,转发节点上的任何 buffer 管理机制都是 “秩序” 的一部分,前面提过,控制贪婪的前提是引入秩序。
转发节点使数据报文以一种有序的方式通过,消除了随机冲突损耗。但真正解决拥塞需要消费者与资源相匹配。因此端侧必须有某种可预期(而不是随机)的方式检测到拥塞的发生并实施拥塞控制,减少资源占用。
端侧获取的可预期判断恰来自 AQM 的反馈。端到端拥塞控制部署在端侧,AQM 部署在网侧,它们正交作用于网络,一个完整拥塞控制体系,二者缺一不可。
相比分布式控制网络,比如令牌网,TCP/IP over 以太网的 Host 离交换机太远,而光速太慢,发生拥塞是注定的,端到端拥塞控制与网侧 AQM 共同控制拥塞也是必须,这就是秩序的代价。
令牌网几乎不产生网络拥塞,每个 Host 在获得令牌前不会将报文注入到网络,而令牌数量和资源是匹配的。
AQM 和交换矩阵是 TCP/IP 网络实施资源仲裁的唯一位置,Host 并不参与仲裁,Host 到仲裁点的距离,注定 TCP/IP 的拥塞控制的滞后。
浙江温州皮鞋湿,下雨进水不会胖。