在wireshark上监控UDP数据显示ARP包
Monitoring UDP data on wireshark shows ARP packet
我正在尝试将 UDP 数据包发送到端口号为 20000 的服务器 10.20.1.2。我在 PC 上实现了 UDP 客户端,当我使用 sendto API 发送数据时,同时我监控数据在 wireshark 上,wireshark 将其显示为 ARP 数据包。
18967 5440.858646 PcsCompu_ef:b4:89广播ARP 42 谁有10.20.1.2?告诉 192.168.1.70
192.168.1.70 是我的机器 ip,其中 UDP 客户端是 运行。
我不确定 UDP 数据包是如何转换为 ARP 数据包的?
我知道 ARP 是为了找到目标节点的 MAC 地址,但我已经知道目标设备的 MAC 地址,我如何将它添加到我的 udp 客户端以便它直接启动 UDP 通信.我的目标设备是一个嵌入式摄像头,我不希望它回复 ARP 请求,所以我想阻止发送 ARP 请求。
下面是我的 UDP 客户端代码:
非常感谢任何意见。提前致谢。
/*
Simple udp client
*/
#include<stdio.h> //printf
#include<string.h> //memset
#include<stdlib.h> //exit(0);
#include<arpa/inet.h>
#include<sys/socket.h>
#define SERVER "10.20.1.2"
#define PORT 20000 //The port on which to send data
char message[3]={0x00, 0x00 , 0x24};
int main(void)
{
struct sockaddr_in si_other;
int s, i, slen=sizeof(si_other);
int ret;
if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
printf("socket failed");
}
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
if (inet_aton(SERVER , &si_other.sin_addr) == 0)
{
fprintf(stderr, "inet_aton() failed\n");
exit(1);
}
ret = sendto(s, message, sizeof(message) , 0 , (struct sockaddr *) &si_other, slen);
close(s);
return 0;
}
关于网络的一些说明。
1。必须发送和回复 ARP
你的摄像头有IP接口,这意味着它肯定能很好地处理ARP请求。 ARP 是通过 IP 通信的重要组成部分,不支持 ARP 的摄像头毫无意义。 ARP 不是转换 UDP 的结果,它是发送实际 UDP 数据报之前的准备步骤。一旦发现目标 MAC-address 的 ARP 回复,UDP 数据包就会发送到该目标。您看到的问题不是硬编码 MAC 以避免 ARP。
2。您的代码看起来不错
在本地编译并稍作修正(缺少 #include <unistd.h>
header 和 close()
声明),在多个目标上测试,客户端按预期工作。
3。您的网络拓扑有问题
您正在从 192.168.1.70 向 10.20.1.2 发送消息,这很奇怪。 192.168.0.0/24 和 10.0.0.0/8 来自不同的范围 private IP addresses,因此如果没有黑魔法(如 NAT 穿越),它们通常无法相互访问。而且,更奇怪的是,在您尝试 ARP 请求期间,ARP 请求被发送到陌生的目的地。让我举例说明不同的情况:
- 如果两个设备在同一子网中(例如 192.168.1.70 发送到 192.168.1.71),则直接发送消息,因此客户端在 ARP 请求中询问 "who has 192.168.1.71"。
- 如果设备在不同的子网中(例如 192.168.1.70 发送到 8.8.8.8),则消息通过网关发送,因此 ARP 请求读取 "who has 192.168.1.1" 或任何您的网关地址。网关 MAC 可能已经在缓存中,在这种情况下根本不会发送 ARP。
- 在您的情况下,子网明显不同,但 ARP 询问的是直接目标地址而不是网关 MAC 地址。
这是在黑暗中拍摄的,但您的 PC 上可能有两个网络接口,一个连接到 192.168.0.0 子网,另一个连接到 10.0.0.0 并且 ARP 请求从两者发送。如果你嗅探错误的接口,你会看到奇怪的 ARP 请求,而看不到 UDP,后者实际上是在它之后发送的。顺便说一句,看到单arp请求也是一头雾水,因为没人回答应该重复几次
无论如何,你需要检查网络拓扑and/or 简化它。删除不必要的网络接口,将 PC 和摄像头配置在连接到相同 switch/router 的同一子网上并进一步调查。
我正在尝试将 UDP 数据包发送到端口号为 20000 的服务器 10.20.1.2。我在 PC 上实现了 UDP 客户端,当我使用 sendto API 发送数据时,同时我监控数据在 wireshark 上,wireshark 将其显示为 ARP 数据包。
18967 5440.858646 PcsCompu_ef:b4:89广播ARP 42 谁有10.20.1.2?告诉 192.168.1.70
192.168.1.70 是我的机器 ip,其中 UDP 客户端是 运行。
我不确定 UDP 数据包是如何转换为 ARP 数据包的?
我知道 ARP 是为了找到目标节点的 MAC 地址,但我已经知道目标设备的 MAC 地址,我如何将它添加到我的 udp 客户端以便它直接启动 UDP 通信.我的目标设备是一个嵌入式摄像头,我不希望它回复 ARP 请求,所以我想阻止发送 ARP 请求。
下面是我的 UDP 客户端代码:
非常感谢任何意见。提前致谢。
/*
Simple udp client
*/
#include<stdio.h> //printf
#include<string.h> //memset
#include<stdlib.h> //exit(0);
#include<arpa/inet.h>
#include<sys/socket.h>
#define SERVER "10.20.1.2"
#define PORT 20000 //The port on which to send data
char message[3]={0x00, 0x00 , 0x24};
int main(void)
{
struct sockaddr_in si_other;
int s, i, slen=sizeof(si_other);
int ret;
if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
printf("socket failed");
}
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
if (inet_aton(SERVER , &si_other.sin_addr) == 0)
{
fprintf(stderr, "inet_aton() failed\n");
exit(1);
}
ret = sendto(s, message, sizeof(message) , 0 , (struct sockaddr *) &si_other, slen);
close(s);
return 0;
}
关于网络的一些说明。
1。必须发送和回复 ARP
你的摄像头有IP接口,这意味着它肯定能很好地处理ARP请求。 ARP 是通过 IP 通信的重要组成部分,不支持 ARP 的摄像头毫无意义。 ARP 不是转换 UDP 的结果,它是发送实际 UDP 数据报之前的准备步骤。一旦发现目标 MAC-address 的 ARP 回复,UDP 数据包就会发送到该目标。您看到的问题不是硬编码 MAC 以避免 ARP。
2。您的代码看起来不错
在本地编译并稍作修正(缺少 #include <unistd.h>
header 和 close()
声明),在多个目标上测试,客户端按预期工作。
3。您的网络拓扑有问题
您正在从 192.168.1.70 向 10.20.1.2 发送消息,这很奇怪。 192.168.0.0/24 和 10.0.0.0/8 来自不同的范围 private IP addresses,因此如果没有黑魔法(如 NAT 穿越),它们通常无法相互访问。而且,更奇怪的是,在您尝试 ARP 请求期间,ARP 请求被发送到陌生的目的地。让我举例说明不同的情况:
- 如果两个设备在同一子网中(例如 192.168.1.70 发送到 192.168.1.71),则直接发送消息,因此客户端在 ARP 请求中询问 "who has 192.168.1.71"。
- 如果设备在不同的子网中(例如 192.168.1.70 发送到 8.8.8.8),则消息通过网关发送,因此 ARP 请求读取 "who has 192.168.1.1" 或任何您的网关地址。网关 MAC 可能已经在缓存中,在这种情况下根本不会发送 ARP。
- 在您的情况下,子网明显不同,但 ARP 询问的是直接目标地址而不是网关 MAC 地址。
这是在黑暗中拍摄的,但您的 PC 上可能有两个网络接口,一个连接到 192.168.0.0 子网,另一个连接到 10.0.0.0 并且 ARP 请求从两者发送。如果你嗅探错误的接口,你会看到奇怪的 ARP 请求,而看不到 UDP,后者实际上是在它之后发送的。顺便说一句,看到单arp请求也是一头雾水,因为没人回答应该重复几次
无论如何,你需要检查网络拓扑and/or 简化它。删除不必要的网络接口,将 PC 和摄像头配置在连接到相同 switch/router 的同一子网上并进一步调查。