时延变高不等于真异常:通路变短拥堵加剧的真相

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 受到干扰,但更可能的真相是出口节点在特定时间点触到了容量天花板。

连上之后不必再管它。狗急加速器持续比较 80+ 条专线的往返时延与丢包情况,随时切换到更稳的一条,重连过程在后台完成。

顺着这条线还会出现更难辨别的误判:用户换到另一个网络之后问题消失,于是’原来的网络有问题‘这个直觉被进一步坐实。但另一个网络的运营商也许采用了完全不同的出口策略与上游供应商,恰好避开了那个拥堵的对等互联点。看上去是换网络治好了毛病,实质是换了一条出口路径。这一区分在工程上至关重要,因为它决定后续的动作:继续排查本地网络,还是转而理解出口路由。

若要确认这一点,必须一个不受本地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 的行为,以及另一条网络作为基线的数据,’网络为什么慢‘这个问题的答案,才会从猜测过渡到测量。

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

作者

狗急加速器技术团队

卡顿多半发生在链路开始变挤的那一刻。狗急加速器在质量下滑之前就先迁移线路,你看不到切换动作,只看到延迟一直没有变化。

物理距离不是唯一变量

这篇文章想纠正的是一个常见直觉:离得近就一定快。实际排队情况、跨境出口的繁忙程度、运营商之间的互联质量,往往比地图上的直线距离更能决定最终结果。

也正因为如此,选线路不能只看地理位置。狗急加速器在做线路规划时把实时质量放在第一位,宁可多绕一点,也不让流量挤在晚高峰的拥堵路段上——这就是专线方案存在的意义。

什么时候别相信直觉

直觉最容易出错的地方有三处:认为离得近就一定快、认为贵的一定好、认为上一次有效这次也有效。前两条前文已经解释过,第三条尤其常见——网络问题随时段变化,昨天顺的线路今天未必。

解决办法是养成记录的习惯:把每次测速的时间、目标、结果简单记下来。积累几次之后,你就能看出自己在哪些时段该换线路,而不是每次临时重新判断。

这套做法听起来笨,却是最可靠的。网络优化最终依赖的是数据,而不是某一次的好运气。