让我用一个生活中的例子来解释 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 请求,同时把数据包放入等待队列