use*_*592 0 sockets linux udp arp
我在Linux下创建了一个udp套接字,以发现网络上的另一个系统。创建udp套接字并分配src IP,src Port,dst端口(我知道正确的值)和dst IP(广播)后,应用程序将UDP数据包发送到另一端。目的是使另一台计算机发回UDP数据包,以便我的计算机推断出目标IP地址。另一端以包含其IP,端口以及我的IP和端口的ARP消息进行响应。
虽然,我正在使用的套接字是数据报,但我的应用程序声明发现另一端并可以获得其IP。看来我正在使用的udp套接字已收到另一端发送的ARP消息,这让我感到困惑。
请任何人解释发生的情况。
非常感谢你。
ARP不是基于UDP的协议,因此无法使用UDP套接字捕获。看一下OSI层,您会在2..3层(link..network)找到ARP,而UDP在传输层(第4层)。没有ARP,UDP甚至无法在本地网络中工作。
如果从套接字发送UDP数据包,它将检查系统的ARP缓存,以查找与目标IP地址关联的硬件地址(MAC)(至少在目标IP在同一本地网络内的情况下)。如果没有有效的缓存条目,它将执行ARP请求。该ARP请求由内核“拥有”,并且与套接字不相关,即使套接字上的发送导致ARP查找也是如此。一旦内核(不是您的套接字)接收到ARP答复,它将知道目标MAC地址,从而可以将您的IP数据包(UDP基于IP)封装到本地(物理)网络的帧中(包括本地和目标MAC)并通过网卡发送出去。