下载速度突然腰斩是什么原因?多半是TCP重传在背后疯狂补件,我抓包数了一遍

上个月我在公司下个 2G 的系统镜像,头一分钟稳稳 28MB/s,照这个速度两分钟收工。结果第二分钟直接掉到 3MB/s,网页也开始转圈,我还以为被同事挂了 BT。骂骂咧咧重启了路由器,没用。后来在浏览器按了 F12 才看见,网络那一栏躺着一行 RTO,数字大得吓人——是 TCP 在帮我补件,补得越多,速度越慢。
这事儿我后来在家里又碰上两回,一回是我妈拿手机在阳台看直播,一回是网线被老鼠啃了半根皮。三次病根不一样,症状却一样:速度腰斩、网页转圈、语音还行。这篇就讲清楚 TCP 重传到底是个什么东西、怎么自己量出来、以及量出来之后该修哪。
先说清楚:重传是TCP的救火队,不是故障本身
TCP 发每个数据包都带编号,对方收一个回一个执。发送方盯着这些回执,哪个包的回执迟迟不来,就把那个包再发一遍——这个动作就叫重传。触发它有两条路:一条是「等够了时间」,行话叫 RTO 超时,字面意思就是「再等下去黄花菜都凉了」,直接补发;另一条是「收到三个重复确认」,意思是对方在喊「我这边缺第 541 号包,后面的全堵着进不来」,发送方不用等超时,立刻补——这条快路有个名字叫快速重传。
所以重传本身不是病,它是 TCP 在替你兜底。你平时刷网页从来没见过缺半张图,就是这套补件机制在干活。真正的问题是丢包率高了以后,TCP 会从「偶尔补一件」变成「天天在补件」,每次补件,等于这段路白白多跑了一个来回,速度自然被拖垮。
打个比方,你网购十件货丢一件,快递悄悄补发,你无感;丢六件,快递天天在补发路上,你的到货速度直接慢一半。下载速度腰斩就是这么来的——路还是那条路,一半的运力浪费在返工上。TCP 为什么要这么费劲地签收回执,TCP和UDP有什么区别里我拿挂号信打过比方,忘了可以先翻那篇。
怎么自己量:两条路,一个数都不用猜
光猜没用,我说说我常敲的两样。
第一样是浏览器 F12。按开,切到「网络」标签,刷新一下页面,随便点一个体积大的请求,在计时或连接信息里能找到 RTT 和 RTO。RTT 是一个来回实际花了多久,RTO 是「等多久没回执就补发」的阈值。RTT 显示 30ms、RTO 显示 200ms,正常;RTT 飘到 80ms、RTO 飙到 1000ms 以上,这条链路就在丢包,TCP 已经把超时等得越来越久、发得越来越保守了。F12 每一栏都是什么意思,F12是什么意思里有逐栏的翻译。
第二样是三段 ping。开三个窗口,分别 ping 网关(192.168.1.1)、公网 DNS(114.114.114.114)、要下载的那个站点域名,各跑个一两百个包。看两条:丢包率那一行的 percent,和时间的波动幅度。网关这段丢,锅在家里;网关不丢、公网丢,锅在运营商那段。这套定位法我在 WiFi丢包率怎么排查里展开写过,照着分段走就行。ping 输出里那行 ttl 是什么意思,TTL是什么顺带也讲过,别把它当延迟看。
我的判断口径就一张表:
| 量出来的数 | 说明什么 | 先动手修哪 |
| 丢包率 0~1%,速度偶尔抖一下 | 正常范围,别折腾 | 不用管 |
| 丢包率 2~5%,RTO 明显变大 | 链路在丢包,TCP在补件 | 先查家里这一段 |
| 丢包率 5% 以上,速度稳定腰斩 | 补件补到运力被吃掉一半 | 家里段排除后直接报修 |
| ping 一点不丢,速度照样掉 | 多半是限速或远端服务器慢 | 换节点再测,别冤枉线路 |
表里末行这种最容易想岔。ping 只发 32 个字节的小包,一百个全过说明不了大包的事——丢包率跟包的大小有关系,满载的大包更容易在路上被挤掉。所以 ping 不丢但速度照样掉,先怀疑别处,宽带测速怎么测才准里有正确的测速姿势。
速度掉了为什么像被限速:慢启动这笔账
还有个怪现象值得一讲:丢包恢复之后,速度不是立刻弹回 28MB/s,而是像爬坡一样慢慢爬回来。这不是卡了,是 TCP 的自保动作。
TCP 发数据的速率不是一步到位的,它先试探着发一点,没丢就加倍,再没丢再加倍,爬到满速为止,这一段叫慢启动。一旦发生重传,尤其是超时那种重传,TCP 会认定「这条路挤了」,立刻把速率砍到很低重新爬。你看到的速度曲线就是:掉到 3MB/s,然后 5、9、14、20 这样一段一段爬回去,中间每一格爬升都对应一个来回的确认。
所以短连接最吃亏。开一个网页才传几百 KB,可能刚爬到高速就传完了,整段都在低速区干活;下载大文件吃亏的是每次丢包都要重新爬一遍。我那次下镜像,就看着任务管理器里的速度曲线锯齿一样上上下下——每个锯齿的谷底,就是一次重传加砍速。想看这条链路到底丢得多不多,tracert 把路径逐跳亮出来更直观,tracert每一跳是什么意思里我拿自家宽带跑过一遍。
家里这段的四个嫌疑,我按概率排
量出来网关这段就丢,或者 WiFi 段丢包,按这个顺序查,我三次踩坑基本全在里面:
- 网线:被门夹过、水晶头氧化、老鼠啃了半根皮,都会让链路一边跑一边丢。看电脑网卡协商速率,千兆口谈成 100M 就有猫腻。我后来买了根六类线换上立刻正常,旧线剪开一看,第 3 对线都快断了。千兆跑不满别先怪路由器,网线超五类和六类有什么区别里我剪开三根对比过。
- WiFi 信号:-75dBm 以下的角落,重传排队双倍开销,速度先腰斩再转圈。挪路由器或者补一个 Mesh 节点,比换路由器管用。
- 干扰和信道:2.4G 晚高峰全楼的 WiFi 挤在三个不重叠信道里互踩,邻居一开微波炉雪上加霜。2.4G 认准 1、6、11,能挪 5G 的设备全挪过去。
- 路由器过载:连接数满了、CPU 被 QoS 或家长控制占满,转发本身就丢。进后台看 CPU 和会话数,我之前挂 BT 那晚网页全打不开就是这个,路由器连接数满了会怎样里算过这笔账。
这四条里网线最冤,因为它最不像嫌疑人——链路指示灯亮着、也能上网,只是偷偷丢包。判断手法就一条:把网卡协商速率和丢包率对着看,协商速率无故掉档,十有八九是线的问题。
网关不丢、公网丢:别自己瞎折腾
如果三段 ping 量下来,网关 0 丢、114.114.114.114 丢 6%,家里再怎么折腾都没用,锅在运营商那段。晚高峰片区拥塞是重灾区,表现就是:白天 28MB/s,晚上八点掉 3MB/s,第二天早上自己好。这种周期性的掉速基本不用怀疑家里设备,游戏ping值多少正常里有省内节点和跨境的延迟分档表,对着看你卡在哪一段。
报修前把证据备齐:三段 ping 的截图、晚高峰和非高峰各一份测速记录、光衰读数(光猫后台能看,-28dBm 以内算正常,这个我在光衰那篇写过分档)。有数字在手里,师傅上门直接测线,省得来回扯皮。顺手说一句,测速结果要和带宽、协商速率分开算,三本账混在一起永远查不出头绪,为什么千兆宽带WiFi测速只有600兆把这三本账拆开讲过。
还有一种情况也别冤枉线路:下载源本身限速。有些服务器对免费用户就是给 3MB/s,换一个源立刻满速。判断方法很简单,换两个不同的下载源各测一次,源都慢才怪线路。
收尾:按这个顺序走,别绕路
把整套动作压成五步,我三次都是这么走通的:
- F12 看一眼 RTO 和 RTT,确认是链路丢包不是别的问题。
- 三段 ping 定位:网关丢在家里,公网丢在运营商。
- 家里段按网线、信号、信道、路由器负载四个嫌疑挨个排。
- 网关不丢就备好证据报修,晚高峰数据一定要留着。
- 还不放心,换个下载源再测一轮,排除源限速。
收个尾:TCP 重传这套机制好就好在你平时完全感觉不到它存在,坏就坏在一旦它刷存在感,你看到的所有症状——速度腰斩、网页转圈、锯齿状的速度曲线——都不指向真凶。下次碰到下载速度突然砍半,先按 F12,别急着重启路由器,更别急着骂运营商。

发表评论