为什么家里办了千兆宽带,一开下载游戏还是卡成PPT

封面,路由器内存里望不到头的大纸箱长队,队尾一个顶着游戏手柄的小包急得跳脚

千兆宽带最让人头疼的一幕,往往发生在玩游戏的时候。

家里拉了 1000 兆光纤,配了上千块钱的路由器,平时测速轻松跑满,看 4K 视频进度条随便拖。

晚上在电脑上开一局游戏,延迟稳稳保持在十几毫秒。这时候如果家里有人在手机上备份相册,或者电脑后台顺手下了个文件。

游戏延迟就会突然跳到两三百毫秒。技能按下去慢半拍,人物走位开始莫名回弹。

打开任务管理器看一眼,下载速度其实只有几十兆,千兆带宽连十分之一都没占满。

只要把下载暂停,游戏延迟立刻恢复正常;一旦继续下载,卡顿马上又回来。

这边游戏人物卡成一串残影,那边室友的相册正一张张飞向路由器

大部分人遇到这种情况,第一反应是运营商虚标,或者是路由器性能不够。

其实都不是。网络变卡根本不是带宽不够,恰恰相反,是因为现代路由器里的缓存配得太大了。

在计算机网络里,这个折磨了全世界十几年的问题,叫 Bufferbloat,缓冲区膨胀。

2010 年 11 月,一个叫 Jim Gettys 的老哥在家里抓到了它。

Gettys 不是什么路人甲,他是贝尔实验室的资深研究员,X Window 的共同发明人,互联网早期的核心工程师之一。

他发现自己家里只要有人往云端同步照片,视频会议就会瞬间卡死,延迟从 20 毫秒飙到 1200 以上。千兆网络,就跑个照片同步,不至于吧。

他在自家路由器上挂了抓包工具,花了几周时间,终于搞明白了。

蹲在自家路由器旁边抓包,路由器肚子里的数据包已经撑到往外挤

这事其实是个历史遗留问题,得从 1988 年的一个老设计说起。

那一年,Van Jacobson 发表了奠定现代网络通信的经典论文,正式提出了 TCP 拥塞控制算法。

这套算法的核心逻辑是:把「丢包」,当成了判断网络拥堵的唯一信号。

当时路由器的内存极小,采用的是最基础的尾部丢弃(Drop-tail)策略。缓冲区一旦装满,多出来的数据包直接被丢掉。发送端只要检测到丢包,TCP 拥塞控制就会立刻介入,把拥塞窗口(cwnd)直接砍半,强制发送方减速。

虽然天天丢包,但由于路由器里根本没有多余内存去排长队,所有人的端到端延迟一直被死死压在几十毫秒以内。

丢包虽然难看,但整个系统跑得又快又公平。

到了 2000 年前后,内存芯片的价格大跌。

路由器厂商突然意识到,几十兆的内存只要几毛钱,塞进路由器里跑分特别好看,「零丢包」是个绝佳的卖点。于是从光猫到家用路由,大家开始无节制地堆缓存。

但他们没想到,Van Jacobson 在 1988 年设计的那个刹车系统,靠的就是丢包来踩刹车。

你把丢包消灭了,等于把刹车拆了。

左边 1988 年的小岗亭装不下就往外扔,司机看见就踩刹车,右边的大仓库照单全收,刹车踏板被扔在了路上

大文件传输的时候,成千上万个大数据包涌进路由器,巨大的缓存池照单全收,一个不丢。发送端以为前方一路畅通,源源不断地把数据塞进来。

数据包在路由器内存里排成长龙。

这时候你在游戏里按了一个技能键,这个只有几十字节的小包,得排在前面成千上万个大体积数据包后面慢慢排队。

很多人不知道,千兆宽带的下行虽然有 1000 兆,但往外发数据的上行带宽,往往被运营商卡在 50 兆左右。

路由器内存里积压的 10MB 数据,顺着这个小出口一点点往外挤,全部发完需要整整 1.6 秒。

按照先进先出的规矩,你的游戏按键包必须等前面的大文件全部发完。你的操作根本没在光纤里堵车,是在自家路由器的内存芯片里,活活排了 1.6 秒的队。

进来的门有 1000 兆那么宽,出去的门只有 50 兆,游戏小包排在队尾干着急

Gettys 搞清楚这件事以后,觉得又可气又荒唐。全世界花了上千亿美元铺更粗的光纤,结果因为几块钱的便宜内存芯片,让整个网络反而变得越来越迟钝。

带宽提速了上百倍,延迟却被大缓存毁掉了。

2012 年,当年设计出拥塞控制算法的 Van Jacobson 带着团队做了一个新算法,叫 CoDel。它不再看队列堆了多少包,而是盯每个包在内存里待了多久。超过 5 毫秒,直接扔。

只要主动扔掉几个包,发送端就会立刻感知到拥堵主动减速,内存里的长队迅速散开,游戏的小包就能第一时间发出去。

新门卫只看秒表,谁在里面待久了就扔出去,队伍一短,游戏小包一溜烟就出了门

想验证自家有没有中招,很简单。浏览器打开 Waveform Bufferbloat Test,看载荷延迟那一项。空载 10 毫秒,满载飙到两三百以上,就是缓冲区膨胀了。

修也不难,路由器刷 OpenWrt,开 SQM 智能队列管理,选 fq_codel 或者 CAKE 算法就行。

你看,一个 1988 年设计得好好的刹车系统,被几毛钱的内存芯片拆了个干净,然后全世界的人在自家客厅里被卡了十几年,最后还是当年那个写刹车的人出来把刹车装回去。

下次游戏卡了别骂运营商。先看看你路由器的内存,是不是太大了。

署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
位旅人路过 次翻阅 初次见面