我在linux下创建了一个udp套接字来发现网络上的另一个系统。创建udp套接字并分配src IP、src Port、dst端口(我知道正确的值)和dst IP (广播)后,应用程序向另一端发送UDP数据包。这个想法是让另一台计算机发回一个UDP数据包,这样我的计算机就可以推断出目的IP地址。另一端使用ARP消息进行响应,其中包含其IP、端口以及我的IP和端口。
虽然,我使用的套接字是数据报,但我的应用程序声明另一端已被发现并可以获取其IP。我使用的udp套接字似乎收到了另一端发送的ARP报文,这让我看起来很困惑。
请任何人解释一下发生了什么。
非常感谢。
发布于 2014-11-06 21:04:20
ARP不是基于UDP的协议,因此无法使用UDP套接字捕获。查看OSI layer,您会发现ARP位于第2层...3层(link..network),而UDP位于传输层(第4层)。如果没有ARP,UDP甚至无法在本地网络中工作。
如果您从套接字发送UDP数据包,它将查找系统的ARP缓存,以找出与目标IP地址关联的硬件地址(MAC) (至少如果目标IP位于同一本地网络内)。如果没有有效的缓存条目,它将发出ARP请求。此ARP请求由内核“拥有”,它与您的套接字没有关联,即使您的套接字上的发送导致了ARP查找。一旦内核(而不是您的套接字)接收到ARP回复,它将知道目标MAC地址,因此可以将您的IP数据包(UDP基于IP)封装到本地(物理)网络(包括本地和目标MAC )的帧中,并通过网卡发送出去。
https://stackoverflow.com/questions/26779828
复制相似问题