2013-11-22 38 views
0

我正在学习Linux上的datalink原始套接字编程,并且我发现这些帮助examples。我编译了icmp4_ll.c,并用它将ICMP数据包发送到同一局域网中的另一台计算机。我可以收到目标计算机的回复。但是,当我使用它向本地计算机发送ICMP数据包时,即将源和目标以太网MAC和IP地址设置为eth0的MAC和IP地址时,我无法在eth0或lo上收到ICMP应答接口(在Wireshark中,我只注意到通过eth0发送的ICMP请求,但在任何接口上都没有ICMP回复。) 我认为ICMP请求消息组成正确,否则远程目标不会回复。但我不知道为什么操作系统没有回复请求。任何帮助或暗示赞赏。通过本地接口发送和接收带有数据链路原始套接字的ICMP

+0

如果您没有得到回复,回应请求可能是错误的,或者有其他地方阻止了回复。 – nos

+0

我正在考虑这种可能性,但是当使用同一个程序向远程计算机发送ICMP请求时,我可以看到远程计算机的答复表单。只有当程序用于向本地接口发送请求时,回复才会丢失。 – user2975098

回答

0

RFC 792定义的ICMP消息的特殊条件:

  • 否ICMP错误消息响应于ICMP错误消息发送到避免无限重复。

  • 对于零碎的IP数据报,ICMP消息仅针对分片零(第一个片段)上的错误发送。

  • ICMP错误消息永远不会发送以响应发往广播或多播地址的数据报。

  • ICMP错误消息从不响应作为链路层广播发送的数据报而发送。

  • ICMP错误消息从不响应发送到一个数据报的源地址不表示一个唯一的主机(源地址 不能为零,环回地址,广播地址或组播 地址)。

  • ICMP错误消息不会响应任何类型的IGMP消息发送。当接收到一个未知类型的ICMP消息时,必须丢弃它,并且默认为 。

路由器将几乎总是产生ICMP消息,但是当它涉及到一个目标主机,产生ICMP消息的数量与实现有关。

相关问题