張奎
【摘要】DHCP是為了實現TCP/IP網絡參數的自動分配而設計的,本文深入分析DHCP工作原理,在以太網板卡的基礎上,設計了一個DHCP客戶端,從而實現了板卡端口的地址自動配置。
【關鍵詞】DHCP客戶端;以太網板卡;設計
1.引言
隨著網絡技術的發展,TCP/IP網絡與人們的工作與生活越來越緊密的聯系在一起。為確保網絡通信的正常進行,需要配置IP地址等網絡參數。目前,IP地址分配主要采用手動分配和自動分配的方式。其中,手動分配的地址將被長期占用,導致地址利用率低。而自動分配則是由處于網絡中的服務器分配地址,這種方式將手工配置IP地址所導致的錯誤減少到最低程度[1]。
IETF設計的動態主機配置協議(DHCP)正是這樣一種動態分配機制。本文將闡述利用以太網板卡的現有功能,設計一個DHCP客戶端,從而使板卡的每個端口可以動態獲取IP地址等網絡參數。
2.DHCP原理
DHCP(Dynamic Host Configuration Protocol),是一種動態向網絡終端提供配置參數的協議。DHCP使用客戶端/服務器模式,請求配置信息的終端被稱為DHCP客戶端,而提供配置信息的被稱為DHCP服務器。
DHCP客戶端和服務器之間的交互通過以下8種類型的報文來實現:
①DISCOVER:由客戶端廣播,尋找可達的服務器;
②OFFER:由服務器響應客戶端的DISCOVER報文,攜帶了相關配置參數;
③REQUEST:客戶端發往服務器,請求配置參數或確認原來的配置是否可用;
④ACK:服務器發往客戶端,該報文包含了所提交的配置參數;
⑤NAK:服務器發往客戶端,提示客戶端參數錯誤或租期已滿;
⑥DECLINE:客戶端發往服務器,告訴服務器IP地址已被使用;
⑦RELEASE:客戶端發往服務器,告訴服務器放棄IP地址并終止剩余租期;
⑧INFORM:客戶端發往服務器,告訴服務器已配置了網絡,僅向服務器請求本地配置參數[2];
客戶端從服務器動態獲取IP地址,主要通過四個階段進行:
①發現階段:客戶端尋找服務器的階段。客戶端以廣播方式發送DISCOVER報文。
②提供階段:服務器提供IP地址的階段。服務器接收到客戶端的DISCOVER報文后,根據IP地址分配的規則選出一個IP地址,與其他參數一起通過OFFER報文發送給客戶端。
③選擇階段:客戶端選擇IP地址的階段。如果有多臺服務器向該客戶端發來OFFER報文,客戶端只接受第一個,然后以廣播方式發送REQUEST報文,該報文中包含服務器在OFFER報文中分配的IP地址。
④確認階段:服務器確認IP地址的階段。服務器收到REQUEST報文后,只有被選擇的服務器會進行如下操作:如果確認將該地址分配給該客戶端,則返回ACK報文;否則返回NAK報文,表明該地址不能分配給該客戶端[3]。
3.系統設計
軟件部分采用VC++6.0開發工具設計和編譯,程序運行在WindowsXP環境下,程序設計的流程如圖2所示。客戶端程序的具體實現過程主要包括:
(1)定義一個數據結構,保存程序運行中的配置參數,描述如下:
struct dhcp_frm_params
unsigned char op; // 操作類型.
unsigned char htype; // client網絡硬件協議類型.
unsigned char hlen; // client網絡硬件地址長度.
unsigned char hops; // 當前的DHCP報文經過的DHCP中繼的數量.
unsigned int tx_id; // 匹配Server的響應報文是對哪個請求報文的響應.
unsigned short seconds; // client開始DHCP請求后到現在經歷的時間.
unsigned short flags;
unsigned char ciaddr[4]; // 表示client的IP地址.
unsigned char yiaddr[4]; // server分配給client的IP地址.
unsigned char siaddr[4]; // client獲取配置信息的服務器的IP地址.
unsigned char giaddr[4]; // 記錄第一個DHCP中繼的IP地址.
unsigned char chaddr[16]; // 記錄client的實際硬件地址內容.
signed char sname[64]; // client獲取配置信息的服務器的名稱.
signed char file[128]; // client的配置文件的名稱.
unsigned char* options; // 包含大量可選的終端初始配置信息.
unsigned int options_len; // options的長度.
}
(2)為了產生特定的交互報文,定義了一系列函數,主要函數描述如下:
根據配置參數,生成一個dhcp報文:
make_up_dhcp_frm(dhcp_frm_params& dhcp_frm, char* buf);
①發送一個dhcp-discover報文;
tx_one_dhcp_disscover_frm();
②判斷收到報文是否是dhcp-discover報文的響應報文;
chk_dhcp_discover_response_frm(char*buf, unsigned int dataLen );
③發送一個dhcp-request報文;
tx_one_dhcp_request_frm();
④判斷收到報文是否是dhcp-request報文的響應報文;
chk_dhcp_request_response_frm(char *buf, unsigned int dataLen );
⑤查找dhcp-discover的響應報文;
get_dhcp_discover_response_msg();
⑥查找dhcp-request的響應報文;
get_dhcp_request_response_msg();
⑦發送免費的ARP報文,進行地址沖突檢測;
tx_one_gratis_arp_frm();
⑧檢測對免費ARP的響應報文;
chk_gratis_arp_response_frm();
⑨查找免費ARP的響應報文。
get_gratis_arp_response_msg()。
(3)報文的收發:
當由軟件生成交互報文后,通過板卡的協議仿真通道,將數據發送出去。同時,通過檢測通道接收到的數據,獲取服務器或者其他網絡節點發送的報文。
在設計過程中,硬件部分實現創建一個協議仿真通道,執行數據的收發。軟件部分實現初始化系統數據,產生交互過程中需要的報文,保存獲取的網絡參數。
測試中使用了某國產路由器作為DHCP服務器,將板卡的一個測試端口直接與路由器相連,通過超級終端以console方式登陸路由器,配置地址池,使能路由器端口的DHCP服務器功能。啟動配置過程后,在超級終端中可以看到服務器成功為客戶端分配了IP地址,并設置了地址的過期時間。
4.結語
本文詳細介紹了DHCP客戶端如何動態獲取IP地址的過程,并基于以太網板卡的功能,實現了一個DHCP客戶端,可以用來測試從網絡中獲取地址的能力,對現有板卡的功能是一個很好的補充。
參考文獻
[1]邢國穩.工業以太網中DHCP協議應用技術分析[J].微計算機信息,2005,5:30-31.
[2]RFC 2132,DHCP Options and BOOTP Vendor Extensions.
[3]Dynamic Host Configuration Protocol,RFC 2131,1997.