我在linux下创建了一个udp套接字来发现网络上的另一个系统。 创建一个udp套接字并分配src IP,src端口,dst端口(我知道正确的值)和dst IP(广播)后,应用程序将UDP数据包发送到另一端。这个想法是让另一台计算机发回一个UDP数据包,以便我的计算机推断出目标IP地址。另一端是使用包含其IP,端口以及我的IP&端口的ARP消息进行响应。
虽然,我使用的套接字是数据报,我的应用程序声明另一端被发现并且可以获得其IP。看起来我正在使用的udp套接字收到了另一端发送的ARP消息,这看起来让我感到困惑。
请有人解释会发生什么。
非常感谢。
答案 0 :(得分:5)
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)包括)并通过网卡发送出去。