我正在学习 C 中的 ping 实现。问题是,我使用原始套接字来接收数据包。对于所有数据包,我们在 中都有一个标识值ICMP header
。
我正在多个终端中运行ping
。
例如,我正在运行ping google.com
三个终端中的三个。
对于第一个 ping,标识值为 23456,第二个 ping 标识值为 34564,第三个 ping 标识值为 98763。
我的问题是第二个 ping 必须接收带有 34564 数据包的标识,但它收到的标识值为 23456。
对于每个 ping,都会创建新的原始套接字。但它收到另一个 ping 数据包。
谁能解释一下,为什么它会收到另一个 ping 数据包?
答案1
基本上,原始套接字将捕获所有 ICMP 数据包。您引用的内部编号正是用于识别当前进程中的数据包。 ICMP 中没有允许协议栈对每个套接字进行多路分解的端口号。
回答你的评论,如果数据包已收到,它就没有丢失,不是吗?像 ping 这样设置的所有套接字都会获取所有匹配数据包的副本,因此所有正在运行的 ping 都会获取所有收到的 ICMP 数据包的副本。