发送&通过本地接口接收带有datalink原始套接字的ICMP

时间:2013-11-22 22:34:27

标签: linux sockets data-link-layer

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

1 个答案:

答案 0 :(得分:0)

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

  
      
  • 不会发送ICMP错误消息以响应ICMP错误消息,以避免无限重复。

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

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

  •   
  • 永远不会发送ICMP错误消息以响应作为链接层广播发送的数据报。

  •   
  • 永远不会发送ICMP错误消息以响应源地址不代表唯一主机的数据报(源地址   不能为零,环回地址,广播地址或组播   解决)。

  •   
  • 永远不会发送ICMP错误消息以响应任何类型的IGMP消息。当收到未知类型的ICMP消息时,它必须   被安静地丢弃。

  •   

路由器几乎总是会生成ICMP消息,但当涉及目标主机时,生成的ICMP消息数量取决于实现。