1. 程式人生 > >深入理解iputils網路工具-第6篇 rarpd:逆地址解析程式

深入理解iputils網路工具-第6篇 rarpd:逆地址解析程式

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