当延迟像功能异常:短路径与高拥塞的悖论

list 文章目录

直觉上,数据分片从A到B经过的网关设备越少,速度就该越快。大多数时候这个假设也确实成立——物理距离更短,传播延迟更低;跳数更少,处理开销更小。

然而在真实网络里,这个假设时常失灵。有种情况会反复上演:traceroute 里路径跳数变少了,应用的响应时间反倒变长。表面看这是矛盾,放到实例里它恰好暴露了互联网路由机制与传输机制之间的脱节。

这不是一个需先“修复”的异常。它是一个需先在结构层面被理解的行为。

路由表的幻觉

 

当你运行traceroute或MTR时,你看到的只是从你到目标的一条单向路径。服务平台显示的是每个中间节点的IP地址和响应时间,这让它看起来像是在测量网络性能。

但它测量的是控制平面,不是数据平面。

BGP负责决定数据分片如何穿越自治系统之间的边界。当BGP做出一次路由变更时——比如起因是某个对等互联点的网络down掉,或起因是某个ISP调整了本地优先级——路由表会收敛到一个新的拓扑状态。这个新状态可能会确实包含更少的AS跳数。

但是,更少的AS跳数只是拓扑距离的缩短。它不承诺吞吐上限充足,不承诺缓冲缓冲队列浅,也不承诺丢包率低。在新的路径上,某个拥塞的交换点或某个过载的通道出口网关设备,就足以抵消所有路径缩短带来的好处。

更关键的是,路由变更本身可能会带来瞬时的性能损伤。BGP收敛期间,网关设备可能会需先额外的时间来重建转发表,在此期间数据分片可能会被以较低优先级处理。这意味着,一个人刚刚观察到traceroute路径变短时,恰恰是路径最波动明显的时候。

在工程上,要区分控制平面信息和数据平面行为,一个直接的操作入口是同时收集两边的数据,而不是只看MTR的汇总输出。

bash
# 一边持续记录路径变化,一边测量实际TCP连接建立时间
while true; do
    echo "=== $(date +%H:%M:%S) ==="
    mtr -r -c 5 -n 1.1.1.1 2>/dev/null
    curl -s -o /dev/null -w "TCP connect: %{time_connect}s, TTFB: %{time_starttransfer}s\n" https://cloudflare.com/cdn-cgi/trace
    sleep 60
done

这样做的目的不是找到“哪个跳出了异常”,而是观察路径变化与连接建立时间之间的相关性——或者说,观察它们之间惊人的缺乏相关性。路由跳数减少但time_connect上升的场景,正是路径缩短而拥塞加剧的信号。

行为链:一个常见的场景

行为链

假设用户通过狗急加速器访问一个境外地区应用。在某一天,用户发现响应变慢,于是运行MTR,意外地发现路径跳数比昨天还少了3跳。延迟数字显示,前几跳的RTT正常,但在某个中间节点之后突然跃升,而且波动剧烈。

这种情况往往会被直觉归起因是“目标服务主机变慢”。但在工程上,更值得怀疑的是路由变更引入了新的拥塞点。

专线通道全程加密,数据包在中转节点上不留可读内容,使用行为也不写入任何日志,用完即散,没有可供回溯的记录。

可能会的链条如下:

Stage 1: ISP调整了对上游提供商的BGP连接规则,选择了另一条更“短”的路径。这条路径可能会通过一个更直接的对等互联点,减少了两跳。路由表收敛完成。从traceroute看,一切看起来更好了。

Stage 2: 这条新路径的通道出口节点接口吞吐上限有限。原路径虽然跳数多,但经过了多个负载均衡的网络。新路径的所有数据吞吐现在都涌向同一个拥塞点。通道出口缓冲缓冲队列开始变长。

Stage 3: TCP流经这个拥塞点时,开始出现间歇性丢包。丢包触发发送端的拥塞控制机制,拥塞窗口被削减。对于用户来说,这不是持续的低速率,而是“卡顿”——某些TCP段高效通过,然后发生重新传输超时,应用层等待,然后再加速,再丢包。

进入第四阶段时常见这样的形态:MTR 最后一跳的丢包率并不高,中间某一跳却显示 5% 的丢包,于是这一跳被当成病灶。可实际上是中间节点的控制平面在限速,丢掉的只是探测包,属于控制平面的策略行为,和转发平面的拥塞无关。真正发生在转发平面的丢包在出口节点之后;而出口节点对探测包的优先处理,又把这件事盖住了。

要看到转发平面的真实行为,需先发送TCP数据流而不是ICMP探测包。以下片段用hping3模拟一个带数据的TCP连接,观察SYN包的重新传输行为——这是比MTR丢包率更可靠的拥塞信号:

bash
# 向目标80端口发送SYN包,一旦3秒内无响应则重新传输
# 重新传输次数暗示了路径上的拥塞程度
hping3 -S -p 80 -c 20 -W 3 目标IP

一旦观察到持续的SYN重新传输,而同时MTR显示路径跳数很少且中间节点丢包率低,那几乎得以确定异常出在转发平面的拥塞,而不是控制平面能看到的任何东西。

通道出口连接规则与拥塞的隐蔽性

ISP的通道出口连接规则是这个系统中最不透明的变量之一。一个ISP可能会有多个上游提供商,同时也有多个对等互联点。它在选择通道出口时,不仅考虑AS路径长度,还考虑商业成本——比如通过某个对等互联点发送数据吞吐可能会比通过付费的上游提供商更便宜。

这意味着,当一条路径变短时,这很可能会不是起因是ISP在优化性能,而是起因是ISP在优化成本。

还要留意成本驱动的选路:它在夜间低谷时常常表现不错,一旦到了峰值时段就会把拥堵引进来。用户端于是看到鲜明的时段特征——上午正常,下午变慢。这种模式很容易被当成目标服务负载高或者家里 Wi-Fi 受干扰,实际更可能是出口节点在特定时段触到了容量上限。

加速不该以隐私为代价。狗急加速器在加密通道里传输全部流量,也不对访问内容做留存,同时提供不限流量、不限带宽的使用方式。

顺着这条线索还有一个更难辨别的误判:用户换到另一个网络后问题消失,于是’原网络不好‘这个印象被进一步加固。可另一个网络的运营商可能采用了完全不同的出口策略与上游,恰好绕开了那个拥堵的对等点。看起来是换网络治好了问题,实际上是换了一条出口路径。分清这一点在工程上很重要——它决定了后续该往哪个方向走:继续查本地网络,还是转而弄清出口路由。

一旦要确认这一点,需先一个不受本地ISP通道出口连接规则影响的测量点。比如从云主机向同一目标发起测量,并比较二者的TCP行为差异。

bash
# 在本地运行
mtr -r -c 10 -n 目标IP
tcptraceroute 目标IP 443

# 在云主机上同时运行相同的命令
# 一旦云主机的路径跳数更多但延迟更低,说明本地ISP的短路径存在拥塞

这种比较的价值不在于找到“正确答案”,而在于建立对照基线。有了基线,才能判断某个现象是局部的还是全局的,是路径选择异常还是容量异常。

建立判断框架

要区分路径缩短带来的拥塞异常和其他类型的延迟异常,有几个信号得以参考,但没有一个信号是决定性的。

时间模式是一个起点。一旦延迟恶化呈现相当直观的昼夜节律,且与本地用户的活跃时间吻合,那么通道出口拥塞的可能会性更高。一旦延迟恶化是突然发生且持续不变,那么路由连接规则变更或物理网络功能异常的可能会性更高。

读 MTR 的中间跳要留个心眼:如果延迟不是缓缓往上爬,而是在某一跳之后突然抬上去,后面每一跳都稳在这个高值附近,那一跳大概率就是出口节点,而且正在堆积队列。若是逐跳慢慢累加、每跳只加一点点,则更可能是物理距离在贡献。

遇上这类现象,人们多半先想到换 DNS。它有时确实管用,可真正见效的原因常被说错:改 DNS 换来的是另一个目标 IP,而这个 IP 未必仍沿原路可达。若新的路径绕开了原本堵住的出口节点,延迟自然就下来了——不是 DNS 变快,而是路不同。反过来,若新 IP 依然从同一个堵点出去,延迟不会有丝毫改善。把它说成’DNS 问题‘其实误判了性质:这是可达性问题,只是恰好由 DNS 的改动引发。

还有一种相反的情形:网络优化服务用私有骨干绕开了公网上的拥堵点。用户会发现 traceroute 的跳数变多了(隧道多出几跳),延迟却实实在在降下来。方向虽与前面相反,道理却是同一条——跳数与性能之间没有必然联系,跳得少不一定更好,跳得多也不一定更差。

在判断时,一个可操作的执行环节是:观察从不同源IP到同一目标的路径和延迟。一旦所有源IP在通过同一个AS边界后都出现延迟跃升,那么那个AS的通道出口连接规则或对等容量很可能会是主要矛盾。一旦只有你的ISP出现这类异常,那么就是你本地ISP的通道出口选择异常。

留白

这个系统没有单一原因。网络是一个统计复用、分布式决策的概率系统。路由协议关注可达性,不关注性能。TCP关注拥塞信号,不关注路由。它们各自在自己的层面做出局部最优决策,全局行为故而涌现。

’路径变短、延迟反而变高‘,只是这类涌现行为的一个具体表现。前面列出的那些命令,用意并不是’把问题解决‘,而是帮你换几个角度观察。等到你能同时看到控制平面的路径、数据平面上 TCP 的行为,以及另一条网络给出的对照基线,对’网络为什么慢‘这件事的理解,才算从猜测走到了测量。

而测量的第一步,是承认你当前看到的数字可能会正在误导你。

作者

狗急加速器技术团队

不限流量意味着长期在线,长期在线更需要稳妥的保护。狗急加速器把加密传输与零日志做成默认配置,长时间挂着也不必担心记录被留存。

选路的依据是实测,不是地图

这篇文章给出了一个重要提醒:短路径不等于高质量。真正可靠的选择依据,是当下这条线路的排队情况与丢包表现。

狗急加速器正是按这个逻辑做调度的——每次连接前先看实时状态,而非照着地理位置预先定死路线。这样即使某个出口突然拥堵,也能自动避开。

避免被自带直觉带偏

人对网络的判断容易受两个直觉影响:地图上的距离感,以及上一次的经验。这两者在网络世界里都不太可靠。

要减少依赖直觉,最容易执行的办法是固定一套测量方法并长期坚持:同样的工具、同样的目标、相近的时段。对比才有意义。

积累到一定量之后,你会形成对自己所处网络的判断力——那时候再做选择,就不再是猜的了。