The sr
功能每官方API文档 http://www.secdev.org/projects/scapy/files/scapydoc.pdf:
sr(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0)
使用第 3 层发送和接收数据包conf.L3socket
超级插座。
The srp
功能:
srp(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0, iface hint=None)
Same as srp
但对于在第 2 层工作conf.L2socket
超级插座。
自从你的ICMP
数据包也填充了第 2 层字段,如输出所示ICMP.show2()
,你应该使用srp
功能。如果你让它们保持原样,就像在本教程 http://thepacketgeek.com/scapy-p-06-sending-and-receiving-with-scapy/,你可以使用sr
功能。
现在,关于你的问题ICMP
的分类为第 2 层协议或第 3 层协议。许多人认为这是第 3 层协议,例如here http://smallbiztrends.com/2013/09/osi-model-layer-networking.html,因为它使用IP
标题并“位于”其顶部。然而,其他人认为它是第 2 层协议,例如here https://stackoverflow.com/a/19218648/3903832. 这是一个问题 https://serverfault.com/q/511965关于这个问题有一些很好的答案,但请注意,它们指的是OSI
模型,因此分层方案编号有点不同。这是我设法找到的最好的,来自here http://www.tenouk.com/Module43.html:
IP 本身没有建立和维护连接的机制,甚至没有包含数据作为直接有效负载的机制。互联网控制消息传递协议仅仅是IP的补充,用于承载错误、路由和控制消息和数据,并且通常被认为是网络层的协议。
编辑-我刚刚遇到这个链接 http://www.linuxchix.org/content/courses/security/icmp,并认为值得一提:
ICMP 是 TCP/IP 堆栈中的一个协议,主要用于提供控制、故障排除和错误消息。它像 TCP 和 UDP 一样在 IP 上运行,但它是像 IP 一样的网络层协议,而不是像 TCP 和 UDP 那样的传输层协议。 (是的,这有点奇怪,ICMP 被封装在 IP 中,并且与 IP 处于同一层。但是话又说回来,您也可以将 IP 封装在 IP 中。)
RFC 792 http://www.ietf.org/rfc/rfc0792.txt也非常明确:
ICMP使用IP的基本支持,就好像它是一个更高层的协议一样,然而,ICMP实际上是IP的一个组成部分。
也是如此RFC 1122 https://www.rfc-editor.org/rfc/rfc1122:
ICMP 是一种控制协议,被认为是 IP 的组成部分,尽管它在架构上分层于 IP 之上,即,它使用 IP 端到端地传送其数据,就像 TCP 或 UDP 等传输协议一样。
...
尽管 ICMP 消息封装在 IP 数据报中,但 ICMP 处理被认为是(并且通常实现为)IP 层的一部分。
关于您关于显式指定接口的最后一个问题,请参阅scapy的教程 http://www.secdev.org/projects/scapy/doc/usage.html#sending-packets:
The send()
函数将在第 3 层发送数据包。也就是说,它将为您处理路由和第 2 层。这sendp()
功能将在第 2 层工作。您可以选择正确的接口和正确的链路层协议。
官方API文档比较详细:
当Scapy启动时,它的路由表与主机的路由表同步。对于三层发送的报文,目的IP决定了所使用的输出接口、源地址和网关。对于二层报文,可以精确的输出接口,也可以以IP的形式给出提示来确定输出接口。如果没有给出输出接口和提示,conf.iface
用来。
具体来说,iface
参数用于设置输入接口(但也设置输出接口,如果iface_hint
未使用):
iface:仅在提供的界面上收听答案
用于暗示output
接口、使用iface_hint
对于第 2 层功能:
还有一个附加参数,iface_hint
,这给出了可以帮助选择正确的输出接口的提示。默认情况下,如果没有指定iface
, conf.iface
被选中。该提示采用第 2 层数据包可能的目的地 IP 的形式。 Scapy 路由表 (conf.route
) 用于确定使用哪个接口来访问此 IP。