我查看了 BSD、Linux 和 BusyBox ping 实现。这三个实现都具有一个共同特点,即通过发送时间戳作为回显请求、接收回显回复来计算往返时间,然后从当前时间中减去收到的时间戳。
显然,目标主机可以在回显时间戳之前修改时间戳,从而产生奇怪的 ping 输出。除此之外,icmp 协议规范根本没有提到时间戳。它只是存储在有效负载字段中。如果您将有效负载的大小修改得太小而无法存储时间戳,则 ping 无法计算往返时间。
我已经修补了一个 ping 实现,以保存时间戳,而不依赖于回显。它似乎运行完美,但我不确定我是否会破坏任何东西(在现实生活中,补丁完全符合标准)。
我的问题:
1)我是否破坏了什么?
2)ping 的设计者以这种不明显的方式实现它的理由是什么?