隧道内不丢包 · 一个常被拿来卖的「技术方案」说法

链路丢 15%。
隧道里 0%。
是黑科技,还是障眼法?

15%峰值时段
裸链路丢包
0%隧道内 ping -i 0.01
实测丢包

有人卖一条隧道:哪怕用快速洪水 ping 打,丢包也是 0,而底下那条明显拥塞的链路丢着 15%。这不是「线路干净」,而是 一个可靠传输层在偷偷把链路扔掉的包补回来 —— 而你只要十分钟就能验证它到底是哪一种。

§ 证据

MTR 到底在说什么

这条 trace 走某 Tier-1 国际骨干网(伦敦 → 阿姆斯特丹 → 法兰克福),最后落到 境内运营商·上海。表里有两行标红 —— 但只有一行是真丢包。

14core14.lhr.tier1-backbone.example0.0%136ms
15core15.lon.tier1-backbone.example25.6%237ms
16core16.ams.tier1-backbone.example0.0%218ms
24203.0.113.41 · 落地·上海0.0%236ms
25198.51.100.90 · 落地·上海85.7%227ms
27192.0.2.49 · 落地出口0.0%238ms
28192.0.2.50 · 落地出口0.0%236ms
怎么读才对:第 25 跳的 85.7% 是假象 —— 它下面的 27、28 跳丢包又回到 0。一台「丢对自己的 ping、却照常转发流量」的路由器 = 在限速 ICMP,而非真丢包。真正的拥塞是第 15 跳:25.6% 丢包,而且延迟从 140 飙到 237ms。这就是你那 ~15%。
真丢包 ✓

第 15 跳 —— 骨干网伦敦互联点

丢包和抖动同时出现,又恰好卡在峰值时段的拥塞互联点。这是隧道必须面对的那部分丢包。

假象 ✕

第 25 跳 —— ICMP 被降优先级

不往后传递的丢包,是路由器在保护自己的控制面。端到端的真实流量照样通过。

§ 一句话结论

丢包是被藏起来了,不是被消除了

这类 QUIC 系隧道协议的官方文档自己就讲得很直白:

协议官方文档
“它并不会降低 UDP 本身的丢包率。”

那 15% 还在链路上照丢。被包装成 隧道内不丢包 的,其实是隧道的可靠传输层坐在链路之上,在你的内层流看到缺口之前就把每个丢掉的包补好。三层叠在一起 —— 只有最底下那层真的在丢东西:

那第②层是怎么把缺口补得够快,连 ping -c100 -i 0.01 都察觉不到的?两种机制 —— 一个个看。

§ 机制一 · 最可能的那个

ARQ —— 丢了就重发一遍

QUIC 的可靠流(如 Hysteria2、TUIC)给每个包编号。丢一个,接收端发现缺口、再要一次。你的内层 ping 只是多等了几毫秒 —— 然后报告 0% 丢包。代价不是丢包,而是延迟尾部的一根尖刺

链路丢弃:
应用层丢包:
好处

不浪费带宽

只有真丢的包才重发。链路大体良好时很省。

破绽

延迟尾部发尖

每次恢复 = 多一个往返。丢包读数是 0%,但 ping 的 max/抖动会跳。这就是认出 ARQ 的方法。

§ 机制二 · 拿带宽换

FEC —— 多带几份备份,根本不用重发

kcptun、UDPspeeder、Hysteria v1 会在数据旁边多发冗余包(比如 8 个数据 + 3 个冗余)。丢掉几个,接收端直接用冗余把它们重建出来 —— 完全不需要往返。延迟平滑,但要付一笔固定的带宽税;而且一旦丢包超过你预留的冗余量,它就崩。

丢弃:
恢复:
同行评审 · QUIC-FEC,IFIP 2019
FEC 在「高丢包 + 高延迟」下能大幅缩短完成时间 —— 但「长传输或低丢包时,这份冗余开销反而拖慢性能」。结论:要自适应地用 FEC。 它是个权衡,从来不是白送。
§ 机制三 · 最常见的误解

Brutal / BBR 让它变快 —— 但不修丢包

这里最容易被话术带偏。Hysteria 的 Brutal 和 Linux 的 BBR 是拥塞控制算法,它们不把丢包当成「慢下来」的信号。普通 TCP(CUBIC/Reno)每丢一次就砍速 30–50%,在 15% 丢包的链路上直接崩。Brutal/BBR 则照推不误 —— 所以隧道仍然

基于丢包 · CUBIC/Reno

吞吐崩塌

把丢包当拥塞,使劲退避。15% 丢包下基本爬行。这是「之前」。

基于速率 · Brutal/BBR

吞吐还活着

不把丢包当信号,硬撑速率。快 —— 但包还是在丢。15% 已经超过 BBR 约 2% 的舒适区;它在劣化,不是免疫。

关键:拥塞控制是发送端的速率控制。它能在丢包下保住你的速度,但单凭它做不到让 ping 读数变成 0%。如果卖家把「不丢包」归功于 BBR,那正说明他把不丢混为一谈了。

§ 唯一真正的解法

专线把丢包从源头挪走了

前面每种机制都是把丢包藏起来。只有一个选项能让底层链路真的干净:一条专用 IPLC / CN2-GIA 专线,它干脆不走那个拥塞的国际互联点。这时候 隧道内不丢包 才是字面意义上的真 —— 没有什么需要恢复,因为根本没丢。

物理层,而非软件

走的是另一条路

预留的专用带宽,不和公网骨干抢路。这才是真正值得花钱的那部分 —— 也是最该重点验证的一条声明。

暴力法

多路复制

同一个包走两条路各发一份,对端去重(如 ZeroTier「broadcast」模式)。能抗丢包、延迟代价 —— 但吞吐增益。纯粹拿带宽换可靠。

§ 别只听卖家说

辨认它究竟是哪一种

光看丢包率分不出来 —— 它们都显示 0%。延迟尾部和一次双向 MTR 对比才会露馅:

机制丢包率延迟特征本质是
ARQ 重传0%尾部发尖 —— 每次恢复 max/抖动跳一下藏丢包
FEC 冗余0%平滑 —— 但多 ~15–30% 带宽开销藏丢包
Brutal / BBR仍在丢快,但丢包持续存在只是快
专用 IPLC 专线0%平滑,而且裸链路本身也干净真的干净
  1. 双向 MTR,同时跑一边 ping 穿过隧道到后面的主机,一边对隧道的公网出口裸跑 MTR —— 而且来回两个方向都要。裸链路丢、隧道 0% ⇒ 是在藏丢包;裸链路也干净 ⇒ 才是真专线。
  2. 量一下开销隧道有效吞吐 vs 裸带宽。差 15–30% = FEC 的冗余税;几乎不差 = ARQ 或专线。
  3. 盯延迟尾部,别只看丢包率ping -c1000 -i 0.01 穿隧道,看 max/mdev。平滑 = FEC/专线;发尖 = ARQ。
  4. 打到真正的目的地不要只打到隧道出口 —— 打到最终 IP、来回两个方向 —— 排除丢包在「出口→目的地」这一段又冒出来。
§ 落到一句话

同一条链路。两个完全不同的故事。

裸的「国际骨干网 → 境内运营商」链路

  • 峰值约 15% 丢包(第 15 跳,骨干网伦敦)
  • 快速洪水 ping 会丢包 —— ping -i 0.01 显示真实丢包
  • 普通 TCP 吞吐崩塌
  • 这是链路上的物理事实 —— 任何隧道都改变不了它
一句话
「外面丢 15%、里面 0%」正是「可靠隧道 + 丢包链路」该有的样子 —— 最可能是 QUIC 系(如 Hysteria2)的 ARQ(也许加 FEC)在藏丢包,再靠 Brutal/BBR 撑住速度。这是成熟、可解释的工程 —— 不是黑科技。唯一「真不丢」而非「藏丢包」的版本,是底下有条专用 IPLC/CN2 专线 —— 而你用上面的双向 MTR 测试,十分钟就能确认是哪种。
15% — 被藏起 — 0%

丢包没消失,只是不再是你的问题了。