上海最后一波疫情,公司园区封闭,强制WFH,这便有了更多的自由时间,阅读,写作,跑步,思考,时间更多了,缺点也有,由于居家办公大家吃饭睡觉时间不固定,特别是被隔离在酒店的更是24小时闲暇,因此原先的12小时工作制自然也就变成了24小时不固定工作制,虽然随时可以吃饭,小憩一会儿,放松一下,但同样的,随时也需要马上投入工作,这正和本文的有线网络和弱网的区别一致,写篇文章,夜谈。
TCP/IP最初诞生于主机位置固定的有线网络,不然网络层就是LISP协议(位置和标识分离)而不是IP了。
说起性能,TCP/IP在共享介质网络表现并不好,也一直没有为此做优化,想必和以太网很快就变成交换式网络有关。不然人们一定会针对共享介质网络的特征做优化。
但话说回来,共享介质网络向交换式网络的进化,恰恰说明交换式网络性能更高,而共享式网络根本无力承担100Mbps+的吞吐。
冲突和退避耽误了时间,多个包一旦发生冲突,一个也过不去,这个slot就浪费了,反过来若在任何一个空闲slot所有包都在退避,这个slot也就浪费了。
但事情并非绝对,在性能之外,还有成本因素,这也是Wi-Fi目前还在使用“落后的共享介质”的原因,这也是其“弱之根本”。
提到传输性能,人们一向使用延时和吞吐作为度量,以及二者的乘积表示管道的容量。人们理所当然认为这些指标是稳定可观测的,即便它们发生了变化,该变化也是可溯源原因的,换句话说,这些指标不会突变,排队导致的RTT,吞吐的变化是可观测的。
本质上,有线网络是一个积小流而成江海的模型,典型表现就是范雅各布森(Van Jacobson)管道。但弱网环境受概率影响很大,所有的度量都是统计度量。
这就是TCP在弱网场景表现拉胯的原因,因为TCP无法应对统计度量。
人们总是抱怨BBR在弱网表现不佳,因为BBR的假设根本就无法套在弱网环境。BBR的假设是一个完美理想的交换式网络,交换节点遵循先进先出排队规则。弱网环境恰与之相反。
先看RTT的变化。典型情况,只考虑一跳,交换式网络的RTT是稳定的,而共享介质的网络比如Wi-Fi(参考CSMA/CA)的RTT却是随机的,但其算术均值却是稳定的:
熟悉Linux自旋锁的可以类比一下争抢式自旋锁和ticket排队自旋锁的区别,同样也可以类比PCI总线和PCIe总线。
BBR采集最小RTT的方式忽略了概率因素,很容易采集到错误的值。
再看丢包,交换网络普遍采用的RED AQM虽然是随机丢包,但它着实给了主机拥塞信号,主机执行AIMD即可收敛到公平,这种情况下虽然带宽利用率不高,但损失也有限。
弱网丢包却并非拥塞,比如共享介质的争抢模型下,无论是持续争抢成功还是持续退避失败,都在赌概率,虽然长期来看,这个概率是稳定的,但单个RTT内成功或失败的次数并不是明确的信号,只有长期持续的信号才可作为定夺依据:
BBR连续3轮(哪怕5次,哪怕2次,问题在于"连续")采集带宽停滞被视为最大带宽在弱网环境运气因素就太大了。
弱网环境下,无论RTT还是带宽,都是一个长期的统计稳定,其量化方法和有线网络完全不同。常用的移动指数平均在这种统计过程中并不适用,因为概率性统计并没有趋势,算术平均可能更有益。
除此之外,信号串扰,信道冲突,信号衰减,终端移动等固有因素也会造成上述量化指标的不稳定,突变,而这些因素更难以控制,它们甚至是弱网之弱更核心的原因。
TCP遇到这种场景,唯一的办法就是少发,慢发,宁可用RTO超时也尽量不要激进重传。在发生客观丢包事实时,姑且不论你是否能探测到,退避,等一会儿总是最好的办法,而不是立即重传,时间总是可以平滑掉大多数的突发随机事件。
在这一点上,Reno/CUBIC做的不错。Reno/CUBIC重传非常保守,先足额降窗,然后保守重传,其burst特性也是利好共享介质网络,在这种网络上,pacing是很难pacing起来的,共享介质的争抢是一种天然的pacing,背后的道理就是没有谁能连续成功,也不易连续失败,所以burst发送,退避争抢便是最合理的,退避时间就是pacing slot,这个和RED AQM是不同的。Reno/CUBIC适应了几乎所有网络(对于RED AQM,Reno/CUBIC足额降窗之后便降低了RED丢包概率,但BBR并无此效果)。
总之,弱网环境的TCP,保守总没错,少发,慢发。也可以激进,但把控不好那个度,而且激进发送很容易上瘾,没事发几个包,事实上人可能已经进电梯了,任你多发,谁又能收到呢。。
浙江温州皮鞋湿,下雨进水不会胖。