让我用一个生活中的例子来解释 ARP (Address Resolution Protocol,地址解析协议): 想象你搬到了一个新的小区,这个小区里: 1. 每户都有一个门牌号(类似 IP 地址) 2. 每户也都有一个手机号(类似 MAC 地址) 现在你想给邻居送东西: # 第一种情况:已知对方手机号 - 你知道 2 号楼 3 单元 302(IP)住户的手机号(MAC) - 直接打电话约好,去送东西 # 第二种情况:不知道对方手机号 1. 你只知道对方住在 2 号楼 3 单元 302(IP) 2. 你就会在小区广播喊话: - "2 号楼 3 单元 302 的住户在家吗?请告诉我你的手机号!"(这就是 ARP 请求) 3. 302 的住户听到后会回应: - "我是 302 的,我的手机号是 XXX"(这就是 ARP 响应) 4. 你记下这个手机号(存入 ARP 缓存) 5. 然后你就可以打电话联系对方了 # ARP 缓存就像你的通讯录 - 记录了门牌号(IP)和手机号(MAC)的对应关系 - 下次再找这家人就不用喊话了 - 但过一段时间如果不联系,你可能会删掉这个号码(ARP 缓存过期) 这就是为什么网络接口需要: - 一个 _cache 来存储已知的 IP-MAC 对应关系 - 一个 _queue_map 来存储等待发送的数据包 - 如果不知道对方 MAC 地址,就发 ARP 请求,同时把数据包放入等待队列