我只是想知道是否可以从同一源多次 ping 同一 IP 地址(即速度足够快,以便它们被流水线化),并且仍然获得有效结果。有效结果是指您记录所有 ping 数据包的有效往返时间。
我的意思是,数据包可能会混在一起,导致接收方无法知道哪个数据包是哪个数据包,因此记录的往返时间不准确。ICMP 或 IP 中是否有任何机制可以对 ping 数据包进行编号,以便将它们与对同一地址的其他 ping 进行区分。
答案1
ICMP 报头中有一个标识符和一个序列号,就是用于此目的。它们占据字节 5-7。
看RFC792第 15 页:
标识符和序列号可被回显发送者用来辅助匹配回复和请求。例如,标识符可能像 TCP 或 UDP 中的端口一样用来标识会话,而序列号可能在每次发送请求时递增。 目的地在答复中返回这些相同的值。
答案2
标准ping(1)
命令甚至包括-f
洪水参数,要求尽快发送 ping 数据包;ping
尝试尽可能快地发送而不丢失数据包。(这款工具非常实用,可以确保您的网络状况不会很糟糕,但不要在 OS X 计算机之间使用它,因为它们会限制 ICMP 回复的速率,您会对可怕的数据包丢失率感到疑惑。)
ICMP 标头包含足够的信息来跟踪两个主机之间 2^16 个未完成的 ICMP 数据包。摘自我的/usr/include/linux/icmp.h
:
struct icmphdr {
__u8 type;
__u8 code;
__sum16 checksum;
union {
struct {
__be16 id;
__be16 sequence;
} echo;
__be32 gateway;
struct {
__be16 __unused;
__be16 mtu;
} frag;
} un;
};