摘 要: 為了解決嵌入式設(shè)備無(wú)法自動(dòng)獲取或釋放IP的問(wèn)題,,針對(duì)ARM9(S3C2440)嵌入式開(kāi)發(fā)板,,在Fedora操作系統(tǒng)上,配置了交叉編譯環(huán)境,,編寫了動(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盤上,并將DHCP源代碼中client目錄下的dhclient-script和client.conf下載到U盤中,;
(2)啟動(dòng)ARM9,,進(jìn)入系統(tǒng)后,插入U(xiǎn)盤,,掛載U盤成功后,,把U盤中的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.