6. 数据包接收 (Packet Reception)
当收到地址解析数据包时, 接收方以太网模块将数据包交给地址解析模块, 后者执行类似以下的算法. 否定条件表示处理结束并丢弃数据包.
算法流程 (Algorithm Flow):
?ar$hrd 中的硬件类型是否为我所支持?
是: (几乎肯定)
[可选: 检查硬件长度 ar$hln]
?ar$pro 中的协议是否为我所支持?
是:
[可选: 检查协议长度 ar$pln]
Merge_flag := false
如果 <protocol type, sender protocol address> 对已在我的转换表中,
则用数据包中的新信息更新该条目的发送方硬件地址字段,
并将 Merge_flag 设为 true.
?我是目标协议地址吗?
是:
如果 Merge_flag 为 false, 则将三元组 <protocol type,
sender protocol address, sender hardware address> 添加到转换表.
?操作码是 ares_op$REQUEST 吗? (现在才查看操作码!!)
是:
交换硬件和协议字段, 将本地硬件和协议地址放入发送方字段.
将 ar$op 字段设置为 ares_op$REPLY
在收到请求的同一硬件上将数据包发送到 (新的) 目标硬件地址.
注意, <protocol type, sender protocol address, sender hardware address> 三元组在查看操作码之前就已合并到表中. 这基于通信是双向的假设: 如果 A 有理由与 B 通信, 那么 B 也可能有理由与 A 通信. 还需注意, 如果 <protocol type, sender protocol address> 对的条目已存在, 则新硬件地址将取代现有条目. 相关问题 (Related Issues) 章节对此给出了一些说明.
泛化说明 (Generalization)
ar$hrd 和 ar$hln 字段允许本协议和数据包格式用于非 10Mbit 以太网. 对于 10Mbit 以太网, <ar$hrd, ar$hln> 取值为 <1, 6>. 对于其他硬件网络, ar$pro 字段可能不再对应以太网类型字段, 但应与正在寻求地址解析的协议相关联.