使用地铁为了收集一些统计数据,如果我运行sudo mtr 10.0.1.1
ping 我的路由器,结果看起来很糟糕:
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]
为什么会发生这种情况?
答案1
您有一个路由器,它非常擅长路由数据包。但它不是 ping 响应器,因此它不太擅长响应 ping。
路由器响应 ping 比转发数据包需要做更多的工作,而且这些工作都不是路由器优化的。转发数据包通常完全在中断级别进行,使用所有经过高度优化的硬件和软件来尽快完成转发。响应 ping 需要接收数据包、发现它是本地的、安排一些更高级别的代码在进程级别运行、等待该代码运行(因为它与其他长时间运行的进程级函数竞争)、形成回复数据包、将该回复数据包排队,并调度代码以运行该队列。
基本上,路由器有一条快速路径和一条慢速路径。快速路径处理路由。慢速路径处理其他所有事情。