深入理解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