摘 要: 為了解決嵌入式設備無法自動獲取或釋放IP的問題,針對ARM9(S3C2440)嵌入式開發板,在Fedora操作系統上,配置了交叉編譯環境,編寫了動態主機配置協議(DHCP)客戶端程序代碼。利用交叉編譯環境對其進行編譯,將編譯成功產生的程序移植到以ARM9開發板為核心的嵌入式操作系統上。測試結果表明,該軟件可以在ARM9處理器的Linux和Android嵌入式操作系統上運行,在嵌入式設備開機時,軟件自動運行,廣播發送報文尋找DHCP服務器,自動獲取IP后,動態配置嵌入式設備的IP及各項網絡參數。
關鍵詞: 動態主機配置協議;嵌入式系統;交叉編譯
隨著網絡技術和嵌入式技術的迅速發展,網絡中的嵌入式移動設備大量出現。為了將嵌入式設備接入到網絡中,每個嵌入式設備都必須進行基本的網絡配置。嵌入式移動設備在網絡中頻繁的接入,需要及時更新所使用的IP地址才能正常通信;在同一個網段上,為出現的大量嵌入式移動設備配置IP地址等參數十分困難,這也導致網絡中的IP地址成為稀缺資源,在這樣的環境下,每個嵌入式移動設備最好能夠自動獲取動態IP地址等資源,使用完畢后還能夠及時釋放。因此,對于存在頻繁接入大量嵌入式移動設備的網絡,其管理和維護任務相當繁重的,需要一種機制讓TCP/IP的配置和管理從用戶端轉移到網絡管理端,實現IP的集中式管理[1-3]。
為了解決網絡管理的難題,提出了一種適用于嵌入式環境的DHCP客戶端的設計方法,并且在ARM環境下得以實現。這種方法適合分散控制和管理存在較大規模嵌入式設備的網絡。DHCP客戶端協議移植到嵌入式系統上,可以節省配置IP參數的時間,大大提高嵌入式設備的可管理性,降低了嵌入式設備手工配置IP地址所造成的管理成本和硬件成本。
1 DHCP協議和工作原理
1.1 DHCP協議
DHCP(Dynamic Host Configuration Protocol)即動態主機配置協議,是一個局域網的網絡協議。為了減輕TCP/IP網絡的規劃、管理和維護負擔,解決IP地址空間缺乏問題,DHCP為內部網絡或網絡服務供應商自動分配IP地址,為用戶或者內部網絡管理員提供對所有計算機進行中央管理的手段[4]。
DHCP是用于給多個客戶計算機集中分配IP地址以及相關的配置參數的協議,這樣就能將IP地址和TCP/IP的設置統一管理起來,從而避免不必要的地址沖突問題。該協議常常用在網絡中對眾多計算機的管理,以減少網絡管理員手工設置和分配地址的負擔。主機使用DHCP協議可以通過DHCP服務器得到IP地址、默認網關和DNS服務器等信息,從而大大減少了用戶的手動配置工作量,同時DHCP服務器能夠及時回收不用的IP地址,從而提高IP地址的利用率。
1.2 DHCP工作原理
DHCP的工作主要分為以下階段[5]:
(1)DHCP客戶端尋找DHCP服務器階段;
(2)DHCP服務器提供IP地址階段;
(3)DHCP客戶端選擇IP地址階段;
(4)DHCP服務器確認所提供的IP地址階段;
(5)租約確認階段;
(6)DHCP客戶端再次登錄網絡時,直接發送包含前一次所分配的IP地址的DHCP request請求信息。
DHCP客戶端使用DHCP獲取其IP地址的過程中,共有6種狀態。各個狀態之間的轉換以及引起狀態轉換的事件和報文如圖1所示。DHCP客戶端第一次啟動時,便進入初始化狀態。為了獲取一個IP地址,它會向所有服務器廣播一個DHCP discover報文,并進入選擇狀態。處于選擇狀態時,它從DHCP服務器收集DHCP offer響應,并選擇一個服務器向其發送DHCP request報文,進入請求狀態。DHCP服務器確認請求后,發出DHCP ack報文,DHCP客戶端收到確認消息后轉移到已綁定狀態。當需要重新續約時,DHCP客戶端發送DHCP request報文并轉移到更新狀態。DHCP客戶端可以隨時發送DHCP release報文,返回初始化狀態。進入更新狀態后,DHCP客戶端發送DHCP nack報文,返回初始化狀態;如果租用期超過閾值,DHCP客戶端發送DHCP request報文并轉移到重綁定狀態。進入重綁定狀態后,如果租期到期或發送DHCP nack報文,則返回初始化狀態。
2 DHCP客戶端的實現
2.1 開發環境
設計DHCP客戶端軟件的難點是DHCP客戶端在嵌入式系統上的移植[6],其中前臺技術采用B/S模式。Fedora是一個基于Linux的獨立操作系統,具有開放性、創新性和前瞻性。它允許任何人自由地使用、修改和重新發布,可以運行在多種體系結構上。因此,本文選擇Fedora操作系統作為開發平臺。
為了能夠編譯、鏈接、處理和調試跨越平臺體系結構的程序代碼,使用交叉開發工具鏈和不同的參數[7]。編譯環境為在X86系列的處理器平臺上編譯出能運行在ARM構架的處理器平臺上的程序所需要的編譯工具。構建交叉編譯環境首先要確定目標平臺。在GNU系統中,每個目標平臺都有一個明確的格式,這些信息用于在構建過程中識別要使用的不同工具的正確版本。本系統的移植平臺是基于ARM9的嵌入式系統,開發板S3C2440所配內核已為最新的Linux-2.6.32.2,交叉編譯器統一為arm-linux-gcc-4.3.2。
2.2 DHCP客戶端軟件設計
DHCP客戶端軟件主要是用來完成狀態跳轉以及發送和接收DHCP包的任務,同時記錄時間,在未到達指定時刻時,對程序實行有效的阻塞。根據這些需求,可以采用死循環與選擇狀態函數結合的方法。選擇狀態函數用來偵聽與服務器連接的socket端口的變化情況。當選擇狀態函數偵聽的socket端口發生變化時,處理相應接收報文;當socket端口沒有發生變化時,將相應報文作發送處理。DHCP客戶端軟件中各個函數之間的調用關系如圖2所示。
由上面分析可知,DHCP客戶端軟件主要由相互獨立的若干子函數組成,主函數主要用來對子函數進行調用,每次執行完一個函數后,返回一個要執行的函數的地址,繼續執行。下面介紹5個主要子函數:
(1)初始化函數的流程圖如圖3所示,主要用來對DHCP客戶端進行初始化,發送discover報文。如果發送成功,返回選擇狀態函數的地址;否則,停止DHCP。
(2)請求函數的流程圖如圖4所示。DHCP客戶端接收服務器的DHCP ack報文,如果接收失敗,返回初始化函數地址;否則,對服務器提供的IP地址進行驗證,如果校驗失敗,發送declient報文并返回初始化函數地址;否則配置DHCP;如果配置成功,客戶端轉換到綁定狀態函數;否則,停止DHCP。
(3)綁定函數的流程圖如圖5所示。DHCP客戶端將從服務器獲取到的IP設置成網卡的地址,DHCP客戶端進入更新狀態,等待服務器超時。
(4)更新函數的流程圖如圖6所示。DHCP客戶端在IP租約定時器超時的時候,向服務器發送DHCP request報文,進行續約。
(5)重綁定函數的流程圖如圖7所示,當DHCP客戶端在IP租約到達80%時,若服務器還沒有回應DHCP ack報文,則DHCP客戶端廣播DHCP request報文。若在原租約期到期時,DHCP客戶端收到了DHCP ack報文,則客戶端進入綁定狀態;否則轉換到初始化狀態。
3 測試結果與分析
DHCP客戶端軟件對硬件方面并沒有極其嚴格的要求,為了進行測試,選用的計算機型號為三星R458,ARM9型號為S3C2440。DHCP客戶端軟件的測試步驟如下:
(1)將編譯成功的DHCP客戶端軟件復制到U盤上,并將DHCP源代碼中client目錄下的dhclient-script和client.conf下載到U盤中;
(2)啟動ARM9,進入系統后,插入U盤,掛載U盤成功后,把U盤中的dhclient-scrip和client.conf下載到/etc目錄下并修改權限,把DHCP客戶端軟件復制到/sbin目錄下并修改權限;
(3)在/sbin中,運行DHCP客戶端軟件,命令為dhc-
lient eth0。
通過以上步驟可以得到DHCP客戶端軟件的運行結果,如圖8所示。
此外,通過對測試數據的分析可以得到以下結論:
(1)為了增加系統配置的靈活性,mac地址、主機名的設置是在系統啟動時的配置文件rcs中設置的,配置腳本如下:
ifconfig eth0
ifconfig eth0 hw ether 0A:08:09:17:14:13
ifconfig eth0 up
(2)為了使設備的DHCP客戶端正確運行,在編譯Linux內核時,還需要在網絡設置部分添加以下選項:
Networking——>
[*]Networking support——>
Networking options——>
<*>Packet socket
[*] IP:DHCP support
[*]Network packet filtering(replaces ipchains)
分別添加數據包socket、IP、DHCP支持和網絡數據包過濾選項,其中網絡數據包過濾后面子選項可不選。
(3)在S3C2440自帶的嵌入式系統上,上述第二項,必須進行內核編譯,否則DHCP客戶端不能直接運行。
(4)在適合S3C2440的Android系統上,DHCP客戶端程序能正常運行。
參考文獻
[1] 方華,李超.基于ARM平臺的嵌入式DHCP協議設計和實現[J].電腦知識與技術,2007,13(3):65-67.
[2] STEVENS W R,RAGO S A.Advanced programming in the UNIX environment(2nd Edition)[M].Boston:Addison Wesley Professional.2008.
[3] 李海燕,劉廣濤.DHCP客戶端在ARM9_Linux上的設計和實現[J].煙臺職業學院,2009,15(4):70-77.
[4] 王文龍,黃地龍.DHCP協議深入分析[J].電腦與電信,2010(4):46-48.
[5] 陳君,舒田華,高燕.嵌入式Linux系統的DHCP研究[J].九江學院學報,2007,26(3):22-26.
[6] 葉培順.嵌入式Linux在S3C2440上的移植[J].電子設計工程,2011,19(15):111-113.
[7] 樊濱溫,崔志強.DHCP協議客戶端的實現[J].計算機應用與軟件,2007,24(11):143-145.