我正在开发一个必须通过 10Base-T 以太网与外界通信的嵌入式系统。我已经构建了服务网页所需的所有功能,包括 ARP、IP、TCP、ICMP (ping)、HTTP 和部分 FTP。现在,我需要构建其余代码,这将允许我充当客户端。从服务器的角度来看,所有上述协议已经运行了几个月。
现在,我需要构建这些协议的客户端一半,以从其他服务器请求数据。第 1 步是对远程服务器的硬件地址进行 ARP。据我了解,由于服务器位于另一个网络上,因此我的网关应使用其 MAC 地址进行响应,以便我知道将所有发往该 IP 的数据包传递给我的网关。这是问题所在:
我的设备(192.168.1.251,子网掩码 255.255.255.0)没有从我的网关(192.168.1.1)或网络外的任何机器获得 ARP 响应。但是,我的设备 (X.251) 确实从同一路由器下的笔记本电脑 (192.168.1.100) 收到了 ARP 响应。
我确定我的基本 ARP 以太网帧结构是正确的,因为我每次都正确回复 ARP 请求。不同之处在于 OPERATION 字段,取决于 REQUEST 或 REPLY,它是 1 或 2。
这是我的设备 (192.168.1.251) 对网关 (192.168.1.1) 的请求,但没有得到响应:
FF FF FF FF FF FF <-- 目标 MAC - 广播(也尝试过 0x00)
00 04 A3 7F C1 57 <-- 源 MAC - 我的设备
08 06 <-- ARP
00 01 <-- 以太网
08 00 <-- 知识产权
06 <-- 6 字节 MAC 地址
04 <-- 4 字节 IP 地址
00 01 <-- 请求(2 = 回复)
00 04 A3 7F C1 57 <-- 发件人 MAC - 我的
C0 A8 01 FB <-- 发件人 IP - 我的 = 192.168.1.251
00 00 00 00 00 00 <-- 目标 MAC - 未知,请求的原因
C0 A8 01 01 <-- 目标 IP - 网关 = 192.168.1.1
00 00 00 00 ..... 00 00 00 <-- 18 组 00 的预告片用于填充
现在,我的设备 (192.168.1.251) 对我的笔记本电脑 (192.168.1.100) 的请求几乎相同,得到了有效响应:
FF FF FF FF FF FF <-- 目标 MAC - 广播(也尝试过 0x00)
00 04 A3 7F C1 57 <-- 源 MAC - 我的设备
08 06 <-- ARP
00 01 <-- 以太网
08 00 <-- 知识产权
06 <-- 6 字节 MAC 地址
04 <-- 4 字节 IP 地址
00 01 <-- 请求(2 = 回复)
00 04 A3 7F C1 57 <-- 发件人 MAC - 我的
C0 A8 01 FB <-- 发件人 IP - 我的 = 192.168.1.251
00 00 00 00 00 00 <-- 目标 MAC - 未知,请求的原因
C0 A8 01 64 <-- 目标 IP - 笔记本电脑 = 192.168.1.100
00 00 00 00 ..... 00 00 00 <-- 18 组 00 的预告片用于填充
可能重要也可能不重要的旁注:
- 我的设备和网关都显示在笔记本电脑的 ARP 表中。
- 我的笔记本电脑运行的是Win7。
- 我的网关是 Linksys WRT54GL Wireless-G 宽带路由器。
- 我已经通过 Wireshark 分析了数据包以提供上述结果。
- 我的 DHCP 块涵盖 X.100 到 X.149,所以我的笔记本电脑被路由器分配了 X.100
- 我的 X.251 设备 IP 在设备中是硬编码的。我看不到在路由器配置应用程序中设置此 IP 和我设备的 MAC 之间的关系的方法。所有其他功能似乎都可以将我的设备用作服务器,所以我认为这不是问题。
- 我尝试将远程服务器(google = 173.194.43.33)的 ARP 请求直接发送到服务器的 IP 和我的网关的 IP(希望它会意识到它需要成为代理。)
- 我试过把头撞在桌子上,可悲的是,这有点帮助。