Chinaunix首页 | 论坛 | 博客
  • 博客访问: 483472
  • 博文数量: 285
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 629
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-14 17:53
个人简介

相信自己,快乐每一天

文章分类

全部博文(285)

分类: LINUX

2013-11-05 09:27:22

http://blog.csdn.net/fsdev/article/details/7984374

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

        使用而不是默认的/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

阅读(997) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~