您的位置:首页 > 理论基础 > 计算机网络

深入理解iputils网络工具-第6篇 rarpd:逆地址解析程序

2012-09-16 13:57 288 查看

6.1 引言

通过逆地址解析协议RARP,客户端可以通过硬件地址得到对应的IP地址,一般用于无盘系统中,用以获得自身的IP地址。rarpd就是处理RARP请求的服务器程序。

RARP分组的格式与ARP分组基本一致。它们之间主要的差别是RARP请求或应答的帧类型代码为0x8035,而且RARP请求的操作代码为3,应答操作代码为4。

6.2 rarpd程序的使用

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 <bootdir>

使用<bootdir>而不是默认的/tftpboot作为查询可启动(bootable)镜像的TFTP的启动文件夹。

6.3 rarpd程序的流程图





6.4 rarpd程序的全局变量分析

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数据库。

6.5 rarpd程序的数据库组织形式

当rarpd程序接受到RARP请求时,需要查询数据库,找到对应主机的列表项,取出IP地址信息发送回复。

数据库组织形式如下所示:





本文章欢迎转载,请保留原始博客链接http://blog.csdn.net/fsdev/article
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: