以太网地址转换协议或转换网络协议地址( 二 )


16比特:(ar$pro)协议地址空间 。对于以太网硬件,它属于类型字段ether_type$<协
议>的集合
8比特:(ar$hln)每种硬件地址的字节长度
8比特:(ar$pln)每种协议地址的字节长度
16比特:(ar$op)操作码(ares_op$REQUESTares_op$REPLY)
n字节:(ar$sha)源硬件地址,n从ar$hln字段得到
m字节:(ar$spa)源协议地址,m从ar$pln字段得到
n字节:(ar$tha)目的硬件地址(假如知道的话)
m字节:(ar$tpa)目的协议地址 。
7.发包
当网络层往下传来一个包,路由将决定这个包下一跳的协议地址,并根据目的协议地
址决定用哪个硬件进行传输 。在10兆以太网需要地址转换 。一些更低的层次(像硬件驱动层
)必须咨询地址转换模块(也许在以太网支持模块中实现)把<协议类型,目的协议地址>对转
换成48比特以太网地址 。地址转换模块试图在一个表中寻找这个对 。假如找到,则返回相
应的48比特以太网地址给调用者(硬件驱动层) 。假如找不到,也许应通知调用者这个包正
在被丢弃(假定包会被高层重传),同时发出一个类型字段为ether_type$ADDRESS_RESOLUTI
ON的以太网包 。地址转换模块在ar$hrd字段中填ares_hrd$Ethernet,在ar$pro字段中填
要被转换的协议类型,在ar$hln字段中填6(48比特以太网地址字节数),在ar$pln字段中
填该协议地址的字节数,在ar$op字段中填ares_op$REQUEST,在ar$sha字段中填自己的48
比特以太网地址,在ar$spa字段中填自己的协议地址,在ar$tpa字段中填要访问机器的协
议地址 。不能在ar$tha字段中填非凡的值,因为它的值正是要得到的 。假如实现上简单的话,
ar$tpa字段可以填硬件的广播地址(在10兆以太网上所有机器) 。根据原先的路由机制,这
个包将被广播到所有在以太网电缆上的工作站 。
8.收包
当收到地址转换包时,收包模块把它送到运行类似下面算法的地址转换模块 。条件不
成立意味着处理结束,并丢弃包 。
?我用ar$hrd字段中的硬件吗?
是的:(几乎肯定)
[检查ar$hln的硬件地址长度(可选)]
?我用ar$pro字段中的协议吗?
是的:
[检查ar$pln的协议地址长度(可选)]
Merge_flag:=false
假如<协议类型,发送者协议地址>对在我的转换表中,用包中的发送者硬件
地址更新表,并把Merge_flag设成true 。
?我是目的协议地址吗?
是的:
假如Merge_flag是false,在转换表中加入三元组<协议类型,发送者协
议地址,发送者硬件地址> 。
?操作码是ares_op$REQUEST吗?(现在看操作码)
是的:
交换硬件和协议字段,把本地硬件和协议地址填在发送者字段中 。
在ar$op字段中填ares_op$REPLY 。然后从收到包的硬件上把这个包
发送到目的硬件地址 。
注重到在检查操作码之前,<协议类型,发送者协议地址,发送者硬件地址>三元组就
被加入转换表中 。这是建立在通信是双向的假设上的,假如A有某种理由与B“交谈”,B也
会有某种理由与A“交谈” 。还注重到假如<协议类型,发送者协议地址>对已存在表项中,
新的硬件地址将覆盖旧的 。相关情况给出了这样做的动机 。

以太网,就是<1,6> 。对于其它硬件网络,ar$prozi字段也许不再对应以
太网类型字段,但会和地址转换要看的协议有关 。
9.为什么这么做
定期广播并不是所期望的,假设一个以太网上有100台主机,每隔10分钟广播地址转换
信息(可能通过参数设置),这样每隔6秒钟就有一个包 。这完全合理,但有用吗?工作站一

推荐阅读