相信自己,快乐每一天
分类: LINUX
2013-11-05 09:27:22
通过逆地址解析协议RARP,客户端可以通过硬件地址得到对应的IP地址,一般用于无盘系统中,用以获得自身的IP地址。rarpd就是处理RARP请求的服务器程序。
RARP分组的格式与ARP分组基本一致。它们之间主要的差别是RARP请求或应答的帧类型代码为0x8035,而且RARP请求的操作代码为3,应答操作代码为4。
RARP协议的使用并不常见,一般是在没有本地磁盘的系统启动的时候,系统需要通过网卡的硬件地址,发送一份RARP请求,请求某个主机相应该无盘系统的IP地址。
可以发送RARP请求编写程序(见<./test/getIPbyname.cpp>)。而在局域网中的另一个主机中运行rarpd程序来进行测试。
通过tcpdump的却可以看见请求程序发送的RARP请求:
-------------------------------------------------------------------------------
12:36:25.082273 rarp who-is 00:15:58:de:98:61 (oui Unknown) tell00:15:58:de:98:61 (oui Unknown)
-------------------------------------------------------------------------------
由于本人没有两台主机的控制权,所以没有进行详尽测试。
rarpd程序的选项的解释如下:
-a
不要绑定设备。
-A
不仅回复RARP请求,也回复ARP请求。
-v
使用冗余的输出来告知用户出现什么情况。
-d
Debug模式,不要和终端分离。正常模式下,服务程序要运行在后台,所以会和终端分离。
-o
是不是允许脱链(offlink)。所谓的脱链就是通过gethostbyname由客户主机的MAC地址得到的IP地址如果只有一个,而且通过-o选项设置了允许脱链,那么如果实在在列表项中找不到对应项,就返回这个IP地址作为回应。
-e
忽略对TFTP启动文件夹里面是不是有对应IP地址可启动镜像(bootable image)。如果-e选项没有设置,那么即使/etc/ethers的数据库里面有对应的以太网地址,如果对应IP的可启动镜像不存在,rarpd将不会对请求进行回复。
-b
使用
int do_reload = 1;
标识是否重读配置信息。
在中断SIGHUP的中断处理程序中设置。
当程序判断这个标识为1时,则调用configure()程序来重新配置列表项。
int debug;
标识是不是debug模式。
正常模式下,服务程序要运行在后台,所以程序会调用fork()产生一个新的进程运行服务程序,从而实现与终端的分离。而debug模式下则不进行这种分离。
int verbose;
标识是不是冗余输出模式。
在冗余输出模式下,会输出很多冗余的信息让用户判断出现了什么情况。
int ifidx;
接口标志号。
接口标志号是由接口名字得来的,如果没有设置接口名字,则默认标识号为0。
int allow_offlink;
是否允许脱链。
可以通过-o选项设置为允许。
int only_ethers;
标识是否忽略对TFTP启动文件夹里面是不是有对应IP地址可启动镜像。
可以通过-e参数设置为忽略。
int all_ifaces;
标识是否不要绑定到对确定的接口。
可以通过-a参数设置为不要绑定。
如果设置为不要绑定,则不管是不是设置设置了确定接口,接口号都会设置为0。
int listen_arp;
标识是不是也对ARP请求报文予以回复。
char *ifname;
接口名字,形如"eth0"。
可以在启动rarpd程序的时候使用形如“rarpd eth0”的命令来调用对确定接口的监听。
char *tftp_dir = "/etc/tftpboot";
tftp的文件夹地址
struct iflink
{
structiflink *next;
int index;
int hatype;
unsignedchar lladdr[16];
char name[IFNAMSIZ];
structifaddr *ifa_list;
} *ifl_list;
存放MAC和IP地址对应关系的列表。
struct ifaddr
{
structifaddr *next;
__u32 prefix;//前缀
__u32 mask;//掩码
__u32 local;//
};
存放MAC和IP地址对应关系的表项。
struct rarp_map
{
structrarp_map *next;
int ifindex;
int arp_type;
int lladdr_len;
unsignedchar lladdr[16];
__u32 ipaddr;
} *rarp_db;
rarp数据库。
当rarpd程序接受到RARP请求时,需要查询数据库,找到对应主机的列表项,取出IP地址信息发送回复。
数据库组织形式如下所示:
本文章欢迎转载,请保留原始博客链接http://blog.csdn.net/fsdev/article