为什么我会直接获得不同的 ping 时间到 10.0.1.1 而不是使用 TTL 1 ping google.com?

Joh*_*ohn 0 networking ping

使用mtr收集一些统计信息,如果我运行sudo mtr 10.0.1.1ping 我的路由器,它看起来很糟糕:

                              My traceroute  [v0.85]
Johns-MacBook-Air.local (0.0.0.0)                         Tue Feb 11 10:11:32 2014
Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                          Packets               Pings
 Host                                   Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. 10.0.1.1                             0.0%    52   17.1  79.0   1.0 298.9 103.1
Run Code Online (Sandbox Code Playgroud)

但是如果我运行sudo mtr google.com,并且只看第一跳,它看起来不错:

                              My traceroute  [v0.85]
Johns-MacBook-Air.local (0.0.0.0)                         Tue Feb 11 10:12:55 2014
Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                          Packets               Pings
 Host                                   Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. 10.0.1.1                             0.0%    40    1.4   1.7   1.4   4.1   0.5
 2. mosca-lan207.gw.monkeybrains.net     0.0%    39   13.7  23.8   5.6 111.4  22.9
 3. grillo.grillo-mosca-10GB.core.monke  0.0%    39    6.0  10.0   5.5  21.7   3.6
 [snip]
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?

Dav*_*rtz 7

你有一个路由器,它非常擅长路由数据包。它不是 ping 响应者,所以它不太擅长响应 ping。

路由器必须做更多的工作来响应ping而不是转发数据包,而且所有这些工作都没有优化。转发数据包通常完全在中断级别进行,使用经过高度优化的所有硬件和软件以尽快完成。响应 ping 需要接收数据包,发现它是本地的,调度一些更高级别的代码在进程级别运行,等待该代码运行(因为它与其他长时间运行的进程级别功能竞争),形成一个回复数据包,将该回复数据包排队,并调度代码以运行该队列。

基本上,路由器具有快速路径和慢速路径。快速路径处理路由。慢速路径处理其他所有事情。