反向地址转换协议( 二 )


的硬件地址 。
ar$tpa未定义
当操作码是4(应答):
ar$sha是响应者的硬件地址(应答包的发送者)
ar$spa是响应者的协议地址(见下面的注重)
ar$tha是目的硬件地址,必须和请求包中得到的相同
ar$tpa是目的协议地址,即需要得到的地址 。
注重:在操作码为4的包中ar$spa字段填响应者的协议地址,只是为了方便 。例如,
系统同时使用ARP和RARP,有效的协议-硬件对(ar$spa,ar$sha)会减少以后发ARP
请求的需要 。
4.参考
[1] Plummer,D.,"AnEthernetAddressResolutionProtocol",RFC826,MIT-LCS,
November1982.
附录A.4.2BSDUnix下的两个实现例子
下面的实现描述概括了4.2BSDUnix下实现RARP服务器的两种不同方法 。
A. 提供在内核外访问数据链路层包 。RARP服务器完全在内核外实现,只在收发RARP
包时和内核进行互操作 。内核被修改成能提供接口来访问这些包,目前4.2内核只
答应访问IP包 。CMU的“包过滤”伪驱动是提供这种功能的现有机制 。它在CMU
和斯坦福实现“用户级”网络服务器排序上,使用的很成功 。
B. 在内核里维护一个数据库表项的缓存 。整个RARP服务器数据库通过一个用户进程
在内核外维护 。RARP服务器本身直接在内核中实现,并为应答维护一个小的数据
表项缓存 。这个缓存和传输ARP的相同 。这个缓存通过两个新的输入输出控制从实
际的RARP数据库得到(这像SIOCIFADDR,因为他们不直接和具体的套接字相关) 。
一种是:“睡眠直到需要进行地址转换,然后把请求直接输出到用户进程”;另一种
是:“把地址转换输入内核表” 。因此,当内核不能在缓存中发现一个表项的时候,
把这个请求放到队列中,然后调用wakeup() 。第一个输入输出控制的实现是sleep(),
从队列中取出第一项返回给用户进程,因为内核不能在中断级等待直到用户进程回
应,它或者放弃(假设请求主机一定时间后会重传请求包),或者假如第二个输入输
出控制把请求拷贝到内核,在那个时候应答 。


推荐阅读