Network programming 使用第二层广播地址向默认网关发送回显请求

Network programming 使用第二层广播地址向默认网关发送回显请求,network-programming,ping,broadcast,scapy,data-link-layer,Network Programming,Ping,Broadcast,Scapy,Data Link Layer,我正在尝试向Scapy中具有第二层广播地址的默认网关发送回显请求 我写了这段代码: packet = Ether(dst='FF:FF:FF:FF:FF:FF') / IP(dst='192.168.1.1') / ICMP() sendp(packet) 但没有返回任何响应 据我所知,在网络内部发送数据包的过程中,帧应该已经发送到交换机,因为目的地的ip地址在同一个网络中,然后交换机应该已经将它发送到每个连接到它的人,因为它看到了广播地址 这个理论有什么错 顺便说一句,我使用wireshar

我正在尝试向Scapy中具有第二层广播地址的默认网关发送回显请求

我写了这段代码:

packet = Ether(dst='FF:FF:FF:FF:FF:FF') / IP(dst='192.168.1.1') / ICMP()
sendp(packet)
但没有返回任何响应

据我所知,在网络内部发送数据包的过程中,帧应该已经发送到交换机,因为目的地的ip地址在同一个网络中,然后交换机应该已经将它发送到每个连接到它的人,因为它看到了广播地址

这个理论有什么错

顺便说一句,我使用wireshark嗅探流量,在那里我可以看到捕获的ping请求,但找不到该答案的响应,这可能意味着这是一个网络问题,而不是软件问题。

首先,有两个“Scapy相关”点可能会阻止您看到潜在的响应

  • 如果要发送数据包并获取答案(如果未收到答案,则使用
    srp1()
    sendp()
    将发送数据包,但不会等待应答

  • 当使用第2层命令(
    *p()
    函数)时,不要忘记指定要使用的接口作为
    iface=
    参数,而该接口不是默认接口(
    conf.iface

然后,有一个“网络”原因可以解释您没有得到任何答案:您发送的数据包在第2层“广播”,在第3层“单播我”(从网关的角度)

一些IP栈(至少是OpenBSD)丢弃这样的数据包,而另一些IP栈(至少是Linux)接受这样的数据包

您可以尝试向网关地址发送一个单播数据包,看看会发生什么:
srp1(Ether()/IP(dst='192.168.1.1')/ICMP())
,或者(让Scapy处理第2层,假设您的路由表正确到达192.168.1.1:
sr1(IP(dst='192.168.1.1')/ICMP())

首先,有两个“Scapy相关”可能阻止您看到潜在响应的要点

  • 如果要发送数据包并获取答案(如果未收到答案,则使用
    srp1()
    sendp()
    将发送数据包,但不会等待应答

  • 当使用第2层命令(
    *p()
    函数)时,不要忘记指定要使用的接口作为
    iface=
    参数,而该接口不是默认接口(
    conf.iface

然后,有一个“网络”原因可以解释您没有得到任何答案:您发送的数据包在第2层“广播”,在第3层“单播我”(从网关的角度)

一些IP栈(至少是OpenBSD)丢弃这样的数据包,而另一些IP栈(至少是Linux)接受这样的数据包


您可以尝试向网关地址发送一个单播数据包,看看会发生什么:
srp1(Ether()/IP(dst='192.168.1.1')/ICMP())
,或者(让Scapy处理第2层,假设您的路由表正确到达192.168.1.1:
sr1(IP(dst='192.168.1.1')/ICMP())
).

我不确定交换机只使用第2层地址来处理分发(作为一个简单的网桥工作)的假设是否正确。我希望它使用IP来决定……我不确定交换机只使用第2层地址来处理分发(作为一个简单的网桥工作)的假设是否正确。我希望它使用IP来决定。。。