📡 第三章 路由器和它庞大的功能
📄 一句话概括

ping 与 traceroute 大多数人只看了「通不通」,其实 TTL 能反推跳数。 中间跳显示超时不代表断,中间跳延迟高不代表那里慢——两个最常见的误读。

📝 本节和前面几节的关系

上一节讲时间,这一节讲具体的排查命令。 这一节的价值不在「会用」,在「会读」。

一、ping 的四个字段

字段 说明什么 异常意味着


是否回包 通不通 路由、ACL、或被禁 ping RTT 往返延迟 路径远、拥塞、或排队 TTL 对端初始值减跳数 可反推经过几跳 丢包率 稳定性 链路质量或限速

「被禁 ping」这一项要记住:很多服务器与防火墙默认不回 ICMP, 所以「ping 不通」不等于「服务不可用」。 要判断端口通不通,得用 telnet 或 nc 测端口。

二、用 TTL 反推跳数

不同系统的初始 TTL 不同:Linux 与 macOS 是 64,Windows 是 128,部分网络设备是 255。

所以收到 TTL 等于 57,就能推出「经过 7 跳」(假设对端是 64)。 这是一个不用 traceroute 就能估跳数的办法。

它的用处在于「快速判断远近」:同一个服务从两个地方 ping,TTL 差很多, 说明路径长度差很多——而路径长度往往能解释延迟差异。

三、traceroute 的原理与耗时

它发 TTL 递增的包:第一组 TTL=1,到第一跳就减到 0,那一跳回一个 ICMP 超时; 第二组 TTL=2,到第二跳才超时……于是逐跳把路径画出来。

所以 traceroute 的耗时是「逐跳累加」的, 总时间大致等于「平均 RTT 乘跳数」——这就是它越往后越慢的原因。

顺带一个推论:traceroute 每一跳都要发多个包(通常三个), 所以它对目标产生的流量是「跳数乘三」——在很长的路径上,这本身就是一个不小的负担。

四、两个最常见的误读

误读一:中间几跳显示星号代表断。 很多设备不回 ICMP 超时(限速或禁用),但只要最后一跳能到,路径就是通的。

误读二:中间某跳 RTT 特别高代表那里慢。 它可能是「回 ICMP 这件事被限速了」,而转发本身是好的。 要看「到最后一跳的累计 RTT」,不是「单跳的差」。

这两个误读的共同根源是「把控制面当成数据面」:回 ICMP 是控制面的事,它的优先级很低; 而转发是数据面的事,优先级很高。 两者被区别对待,读数就不能直接当性能。

五、动手 Demo:ping 与 traceroute,读出来的信息比想象中多

这段列出 ping 四个字段的含义与异常判读,再用三组 TTL 反推跳数, 并按「RTT 乘跳数」算 traceroute 的累计耗时。

for ttl in (57, 50, 43):
    P(u"  收到 TTL=%d:约经过 %d 跳。" % (ttl, 64 - ttl))
P(u"  三跳累计约 %d 毫秒。" % (3 * 4))

实跑输出:

--------------------------------------------------------------------
ping 与 traceroute,读出来的信息比想象中多
--------------------------------------------------------------------
**这两个命令人人会用,但大多数人只看了「通不通」。**这一节看它们还能读出什么。

**ping 的四个输出字段各说明什么**:

  字段         说明什么                异常意味着
  -----------------------------------------------------------------------
  是否回包     通不通                  不通:路由、ACL、或者被禁 ping
  RTT          往返延迟                大:路径远、拥塞、或者排队
  TTL          对端初始 TTL 减跳数     可以反推经过几跳
  丢包率       稳定性的直观指标        有丢:链路质量或限速

**TTL 那一行值得展开**:不同系统的初始 TTL 不同——

  Linux/macOS:初始 64。
  Windows:初始 128。
  部分网络设备:初始 255。

**所以收到 TTL=57,就能推出「经过 7 跳」**(假设对端是 64)。
**这是一个不用 traceroute 就能估跳数的办法。**

**traceroute 的原理要讲清**:它发 TTL 递增的包,**每一跳把 TTL 减到 0 就回一个 ICMP 超时**,
于是知道了那一跳的地址。

**算一下三跳的时间**:

  · 第 1 组 TTL=1 → 第 1 跳回 ICMP
  · 第 2 组 TTL=2 → 第 2 跳回 ICMP
  · 第 3 组 TTL=3 → 第 3 跳回 ICMP

**所以 traceroute 的耗时是「逐跳累加」的**,
**总时间约等于「RTT 乘跳数」**——这也是为什么它越往后越慢。

**两个常见误读**:

1. **中间几跳显示 `* * *` 不代表断**:**很多设备不回 ICMP 超时**(限速或禁用),
但只要最后一跳能到,路径就是通的。
2. **中间某跳 RTT 特别高不代表那里慢**:**它可能是「回 ICMP 这件事被限速了」**,而转发本身是好的。
**要看「到最后一跳的累计 RTT」,不是「单跳的差」。**

「TTL=57 推出 7 跳」这个技巧要会用但要小心:它假设对端初始值是 64, 如果对端是 Windows(128),57 就要按「128 减 57 等于 71 跳」——明显不合理,这时候说明假设错了,要换一个初始值试。

「中间跳 RTT 高是限速」这一条是最有价值的: 很多人看到某跳 200 毫秒就去找那一跳的设备,结果白找半天。 正确的读法是「看最后一跳的累计值」。

最后「控制面与数据面被区别对待」是这一节的总结: 它解释了 ping 与 traceroute 的所有反常读数, 也解释了为什么「设备 ping 不通但它转发正常」是可能的。

30 秒实验

  1. 用 ping 一个外网地址,用 TTL 反推跳数。
  2. 用 traceroute 对比,看反推得对不对。
  3. 找一台 ping 不通但端口能通的服务器,验证「禁 ping」。

常见误区

  1. 以为 ping 不通就是服务没起。很多设备禁 ICMP。
  2. 以为 traceroute 的星号代表断。多数是那一跳不回 ICMP。
  3. 以为某跳 RTT 高就是那里慢。可能只是回 ICMP 被限速。
自测三问(点开对答案) 1. 收到 TTL 为 57,能推出什么? —— 若对端初始 TTL 为 64,则经过约 7 跳。 2. traceroute 为什么越往后越慢? —— 它逐跳累加,总耗时约等于平均 RTT 乘跳数。 3. 中间某跳 RTT 偏高该怀疑什么? —— 该跳对 ICMP 超时报文做了限速,转发本身可能正常。

下一节:排查之后要改配置,改之前先备份。

相关笔记