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