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

使用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 

但是,如果我运行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] 

为什么会这样呢?

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

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

基本上,路由器有一个快速path和一个慢path。 快速path处理路由。 慢path处理一切。