摘??要: 對(duì)嵌入式TCP/IP協(xié)議棧發(fā)展現(xiàn)狀進(jìn)行了分析,并詳細(xì)剖析了嵌入式TCP/IP協(xié)議棧的實(shí)現(xiàn)細(xì)節(jié)及基于8位微處理器實(shí)現(xiàn)的技術(shù)思路。
關(guān)鍵詞: 微處理器? 嵌入式? TCP/IP? 協(xié)議棧
?
1 基于8位微處理器的嵌入式TCP/IP協(xié)議棧的意義
隨著Internet的爆炸式增長(zhǎng),TCP/IP已經(jīng)成為通信領(lǐng)域事實(shí)上的國(guó)際標(biāo)準(zhǔn),。對(duì)于嵌入式系統(tǒng)而言,能夠通過自身的嵌入式TCP/IP協(xié)議棧連接Intranet,甚至Internet,將使其具有更好的實(shí)用性,且可帶來巨大的經(jīng)濟(jì)效益。目前出現(xiàn)了很多依靠通信技術(shù)開發(fā)出的十分有用的嵌入式系統(tǒng)應(yīng)用實(shí)例,。例如嵌入式系統(tǒng)可以通過低帶寬的無線鏈路傳輸電度表讀數(shù)。采用全球定位系統(tǒng)GPS技術(shù)和無線鏈路的嵌入式系統(tǒng)可以用于確定在國(guó)內(nèi)任何地方行駛的車輛的準(zhǔn)確位置,、速度,、油壓和其他參數(shù)。
傳統(tǒng)TCP/IP協(xié)議棧(包括桌面PC和服務(wù)器中的TCP/IP協(xié)議棧以及一般的基于32位的嵌入式TCP/IP協(xié)議棧等)的實(shí)現(xiàn)需要大量的存儲(chǔ)器資源,。這是由于這些實(shí)現(xiàn)的代碼量偏大,且運(yùn)行時(shí)也要耗用大量?jī)?nèi)存,。因此,存儲(chǔ)資源有限的8位系統(tǒng)無法滿足這種需求。現(xiàn)場(chǎng)智能化儀表多采用8位微處理器,如果能夠在低端8位微處理器上實(shí)現(xiàn)連網(wǎng)的功能,其經(jīng)濟(jì)效益將非??捎^,應(yīng)用前景極其廣闊,。
2 嵌入式TCP/IP協(xié)議棧發(fā)展現(xiàn)狀
目前已存在的TCP/IP協(xié)議棧大致分為2類:(1)沿用了BSD TCP/IP協(xié)議棧的實(shí)現(xiàn)思路。(2)完全與BSD TCP/IP協(xié)議棧無關(guān)的實(shí)現(xiàn),。
由于BSD協(xié)議棧最初是針對(duì)工作站設(shè)計(jì)的,而并非是針對(duì)嵌入式設(shè)備設(shè)計(jì)的,因此,沿用BSD TCP/IP協(xié)議棧實(shí)現(xiàn)思路的嵌入式TCP/IP協(xié)議棧(如InterNiche NicheStack)通常都比較復(fù)雜,且代碼較多,所以一般都在32位微處理器上實(shí)現(xiàn),。
另一類完全與BSD TCP/IP協(xié)議棧無關(guān)的實(shí)現(xiàn)通常都對(duì)通信環(huán)境做了某些假設(shè),從而可以使用簡(jiǎn)化的模型來實(shí)現(xiàn)TCP/IP協(xié)議棧,如PIC micro stack。通常假設(shè)嵌入式TCP/IP協(xié)議棧只與那些具有完整標(biāo)準(zhǔn)的TCP/IP協(xié)議棧的系統(tǒng)進(jìn)行通信,即簡(jiǎn)化的TCP/IP模型可以通過遠(yuǎn)端完整的標(biāo)準(zhǔn)TCP/IP協(xié)議棧進(jìn)行通信,。但是,如果遠(yuǎn)端也是一個(gè)簡(jiǎn)化的嵌入式TCP/IP協(xié)議棧,通信就有可能失敗。這類TCP/IP協(xié)議棧一般都定位在16位甚至8位微處理器上實(shí)現(xiàn),。
TCP/IP模型通??梢葬槍?duì)某個(gè)具體的應(yīng)用進(jìn)行簡(jiǎn)化。以Web服務(wù)器應(yīng)用為例,由于Web服務(wù)器不使用TCP/IP協(xié)議棧的緊急數(shù)據(jù)功能,也不需要維持活動(dòng)連接(在HTTP協(xié)議中定義的),因此針對(duì)Web服務(wù)器應(yīng)用開發(fā)嵌入式TCP/IP協(xié)議棧時(shí),前述功能不需要實(shí)現(xiàn),。
3?嵌入式TCP/IP協(xié)議棧的技術(shù)剖析
嵌入式TCP/IP協(xié)議棧通常都包括IP,、ICMP、TCP和UDP等幾個(gè)協(xié)議,。下面分別針對(duì)這幾個(gè)協(xié)議進(jìn)行相關(guān)技術(shù)剖析并探討其基于8位微處理器實(shí)現(xiàn)的技術(shù)思路,。
3.1 IP協(xié)議
從網(wǎng)絡(luò)接口層進(jìn)來的數(shù)據(jù)包,首先將被網(wǎng)絡(luò)層的IP協(xié)議處理,。IP協(xié)議對(duì)數(shù)據(jù)包進(jìn)行一些簡(jiǎn)單的檢查,如數(shù)據(jù)包的目的IP地址是不是本地IP地址,同時(shí)校驗(yàn)數(shù)據(jù)包。由于8位嵌入式TCP/IP協(xié)議棧幾乎不需要使用IP選項(xiàng),因此對(duì)于接收到的數(shù)據(jù)包中的IP選項(xiàng),可以忽略不處理,。
對(duì)于IP協(xié)議中的分段重組功能,可以使用單獨(dú)的緩沖區(qū)來實(shí)現(xiàn),。當(dāng)一個(gè)分段被接收后,將被拷貝到緩沖區(qū)中的相應(yīng)位置,同時(shí)使用位圖來跟蹤指示哪些分段已成功接收。根據(jù)IP協(xié)議可知,一個(gè)分段的第一個(gè)字節(jié)在緩沖區(qū)的位置必然是8的倍數(shù),也就是按8字節(jié)進(jìn)行對(duì)齊,因此,位圖只占用很少的內(nèi)存,。當(dāng)所有分段被正確接收后,重組好的分組將被傳送給TCP協(xié)議層進(jìn)行處理,。通常8位嵌入式TCP/IP協(xié)議棧傳輸?shù)膯蝹€(gè)分段的數(shù)據(jù)量都比較小。如果在某些具體應(yīng)用或者某些具體環(huán)境中能確保8位嵌入式TCP/IP協(xié)議棧接收到的分組不存在分片的分段,則可以忽略實(shí)現(xiàn)IP協(xié)議的分段重組功能,。
IP協(xié)議有組播和廣播的功能,因此IP分組的目的地址可以是組播地址或者廣播地址,。IP廣播在許多基于UDP協(xié)議的應(yīng)用中經(jīng)常被使用,如Microsoft Windows File-Sharing SMB協(xié)議。IP組播多用于多媒體的發(fā)布,如RTP,。如果要使協(xié)議棧支持基于UDP協(xié)議的應(yīng)用,則除了要實(shí)現(xiàn)UDP協(xié)議外,通常還應(yīng)該實(shí)現(xiàn)IP廣播和組播功能,。
3.2 ICMP協(xié)議
ICMP主要用來進(jìn)行網(wǎng)絡(luò)故障診斷,如常用的Ping程序就是利用ICMP協(xié)議的回應(yīng)機(jī)制(Echo)來測(cè)試網(wǎng)絡(luò)的連通性。在8位嵌入式協(xié)議棧中,一般應(yīng)該實(shí)現(xiàn)ICMP協(xié)議的回應(yīng)機(jī)制,而其他功能則可以忽略,。
ICMP的回應(yīng)機(jī)制就是對(duì)接收到的回應(yīng)請(qǐng)求消息(Echo Request)返回一個(gè)回應(yīng)應(yīng)答消息(Echo Reply),。因此實(shí)現(xiàn)起來很簡(jiǎn)單,只需要將接收到的回應(yīng)請(qǐng)求消息中分組的源端IP和目的端IP交換一下,然后將該分組的ICMP頭部設(shè)置為ICMP回應(yīng)應(yīng)答消息類型,最后按標(biāo)準(zhǔn)方法計(jì)算ICMP校驗(yàn)和即可。
3.3 TCP協(xié)議
由于TCP協(xié)議包含超時(shí)重發(fā)機(jī)制,因此其實(shí)現(xiàn)需要一個(gè)定時(shí)器,。接收到的分組經(jīng)過IP協(xié)議層處理后,就可交給TCP協(xié)議層處理,具體來說就是調(diào)用TCP協(xié)議實(shí)現(xiàn)的接口函數(shù),。如果分組中除了TCP頭部外,還包含應(yīng)用數(shù)據(jù),則TCP協(xié)議將把該數(shù)據(jù)傳給某個(gè)具體的應(yīng)用層協(xié)議做進(jìn)一步處理;如果分組只是確認(rèn)前一次數(shù)據(jù)的成功發(fā)送,則更新連接狀態(tài)信息(Connection State),并且通知某個(gè)具體的應(yīng)用層協(xié)議可以發(fā)送新數(shù)據(jù)。
TCP允許半打開的連接(Half-Open Connection),即該半打開的連接正對(duì)連接請(qǐng)求進(jìn)行監(jiān)聽,。在實(shí)現(xiàn)中,可以使用鏈表來組織所有正監(jiān)聽的連接,且可以使用16位的端口號(hào)來惟一標(biāo)識(shí)每個(gè)正監(jiān)聽的連接,。當(dāng)一個(gè)連接請(qǐng)求到來時(shí),根據(jù)連接請(qǐng)求指定的端口號(hào),查找該鏈表。同時(shí)該鏈表隨著應(yīng)用層程序的運(yùn)行,可以動(dòng)態(tài)調(diào)整,。
????當(dāng)發(fā)送數(shù)據(jù)時(shí),應(yīng)用層程序必須檢查TCP協(xié)議的發(fā)送窗口的大小,并根據(jù)其大小來調(diào)整本次發(fā)送的字節(jié)數(shù),。發(fā)送窗口大小取決于可用內(nèi)存的大小和數(shù)據(jù)接收者聲明的窗口大小。在發(fā)送數(shù)據(jù)時(shí),先要用緩沖空間來緩沖需要發(fā)送的數(shù)據(jù),。如果緩沖空間不可使用,則必須等待直到緩沖空間可用為止,。當(dāng)從接收者接收到確認(rèn)信息后,緩沖空間變?yōu)榭捎谩.?dāng)緩沖空間可用時(shí),將通知應(yīng)用程序可以發(fā)送數(shù)據(jù)了,。
大多數(shù)TCP協(xié)議的實(shí)現(xiàn)中都使用滑動(dòng)窗口機(jī)制來發(fā)送數(shù)據(jù),。通過滑動(dòng)窗口機(jī)制,多個(gè)數(shù)據(jù)段可以連續(xù)同時(shí)發(fā)送。如果不使用滑動(dòng)窗口機(jī)制,則需要在每次發(fā)送完一個(gè)數(shù)據(jù)段后等待確認(rèn)信息,當(dāng)接收到確認(rèn)后才能發(fā)送下一個(gè)數(shù)據(jù)段,。在基于8位微處理器的協(xié)議棧中,不推薦使用滑動(dòng)窗口機(jī)制,。這是由于滑動(dòng)窗口算法需要使用許多32位操作數(shù),而在許多8位微處理器上32位的操作效率非常低下。而且滑動(dòng)窗口機(jī)制需要較多的緩沖空間來緩沖多個(gè)要發(fā)送的數(shù)據(jù)段,這對(duì)內(nèi)存資源有限的8位微處理器來說比較浪費(fèi),。此外,滑動(dòng)窗口機(jī)制并不是TCP協(xié)議必需的,沒有滑動(dòng)窗口機(jī)制,完全不會(huì)影響網(wǎng)絡(luò)的互聯(lián),只是發(fā)送效率比較低而已,。
為了得到合理的重發(fā)時(shí)延,TCP需要持續(xù)對(duì)該活動(dòng)連接進(jìn)行回旋時(shí)間(Round-Trip Time,RTT)的評(píng)估。在TCP協(xié)議中,可以通過定時(shí)器來評(píng)估RTT。具體方法是:每個(gè)活動(dòng)連接維護(hù)一個(gè)計(jì)數(shù)器;每當(dāng)定時(shí)器觸發(fā)時(shí),對(duì)每個(gè)剛發(fā)送了數(shù)據(jù),且當(dāng)前還沒有接收到確認(rèn)信息的活動(dòng)連接計(jì)數(shù)器加1;當(dāng)收到確認(rèn)信息后,該連接計(jì)數(shù)器的當(dāng)前值就作為RTT樣例值,結(jié)合標(biāo)準(zhǔn)的RTT評(píng)估函數(shù)就可以得到RTT的評(píng)估值,最后將該連接的計(jì)數(shù)器清零,。
TCP重發(fā)機(jī)制的實(shí)現(xiàn)依賴于定時(shí)器,。每個(gè)活動(dòng)連接維護(hù)一個(gè)重發(fā)時(shí)延值,該值取決于RTT。當(dāng)定時(shí)器觸發(fā)時(shí),每個(gè)剛發(fā)送了數(shù)據(jù)且當(dāng)前還沒有接收到確認(rèn)信息的活動(dòng)連接的重發(fā)時(shí)延值減1,當(dāng)重發(fā)時(shí)延值減為0時(shí),該連接重發(fā)前一次發(fā)送的數(shù)據(jù),。數(shù)據(jù)重新發(fā)送完后,重發(fā)時(shí)延值設(shè)為初始值,。重發(fā)數(shù)據(jù)的來源有2種方式:(1)緩沖區(qū),即當(dāng)數(shù)據(jù)發(fā)送完后,先放到緩沖區(qū)中,直到收到確認(rèn)信息后才將該數(shù)據(jù)從緩沖區(qū)中刪除。(2)不對(duì)發(fā)送的數(shù)據(jù)進(jìn)行緩沖,當(dāng)重發(fā)時(shí),通知應(yīng)用程序重新獲得前一次發(fā)送的數(shù)據(jù),。
TCP流量控制機(jī)制的目的在于使性能和內(nèi)存大小具有較大差異的主機(jī)間能夠進(jìn)行通信,。每一個(gè)TCP數(shù)據(jù)段中指定了發(fā)送者可用的緩沖空間的大小。發(fā)送者發(fā)送的數(shù)據(jù)不應(yīng)該大于接收者指定的緩沖空間大小,。如果接收者已不能接收數(shù)據(jù),則指定可用的緩沖空間大小為0,。
TCP擁塞控制機(jī)制限制了網(wǎng)絡(luò)中并發(fā)的TCP數(shù)據(jù)段的數(shù)目。擁塞控制算法非常容易實(shí)現(xiàn),只需少量的代碼,。如果協(xié)議棧沒有實(shí)現(xiàn)滑動(dòng)窗口機(jī)制,則每個(gè)活動(dòng)連接只能一次發(fā)送一個(gè)TCP數(shù)據(jù)段,。這樣,網(wǎng)絡(luò)中并發(fā)的TCP數(shù)據(jù)段就得到了控制,從而可以忽略擁塞控制機(jī)制的實(shí)現(xiàn)。
TCP緊急數(shù)據(jù)機(jī)制提供了應(yīng)用到應(yīng)用的通知機(jī)制,。應(yīng)用程序可以使用該機(jī)制使某些數(shù)據(jù)流比正常的數(shù)據(jù)流更快地發(fā)送出去,。緊急數(shù)據(jù)的含義由接收應(yīng)用程序負(fù)責(zé)解釋。如果要實(shí)現(xiàn)緊急數(shù)據(jù)機(jī)制,則會(huì)大大增加協(xié)議棧的復(fù)雜度,。因此在基于8位微處理器的嵌入式協(xié)議棧中,一般都忽略該機(jī)制,。
每個(gè)TCP連接都需要一定的狀態(tài)信息。由于這些狀態(tài)信息必然要占用內(nèi)存,因此在實(shí)現(xiàn)時(shí)應(yīng)該最小化TCP連接所需要的狀態(tài)信息,。如果實(shí)現(xiàn)TCP滑動(dòng)窗口機(jī)制,則會(huì)大大增加TCP連接所需要的狀態(tài)信息,。滑動(dòng)窗口機(jī)制需要每個(gè)TCP連接都必須保存一些32位序號(hào)信息,而且如果要支持宿主機(jī)(一個(gè)主機(jī)有多個(gè)IP地址),則每個(gè)連接還要保存更多的信息,。因此,對(duì)于基于8位微處理器的嵌入式協(xié)議棧而言,必須忽略一些機(jī)制,。
3.4 UDP協(xié)議
與TCP協(xié)議相比,UDP協(xié)議非常簡(jiǎn)單。UDP主要應(yīng)用于不同的進(jìn)程之間鏈路的多路復(fù)用,。它沒有復(fù)雜的機(jī)制,只需要按照協(xié)議標(biāo)準(zhǔn)實(shí)現(xiàn),。
4? 結(jié)束語
一個(gè)實(shí)用的基于8位微處理器的嵌入式協(xié)議棧首先要保證能和其他協(xié)議棧正確通信,這既包含完整的協(xié)議棧,也包括同樣是基于8位微處理器的嵌入式協(xié)議棧。其次要合理,、高效地使用資源,尤其是存儲(chǔ)資源,。此外,還要求代碼簡(jiǎn)潔高效。
?
參考文獻(xiàn)
1 Tanenbaum A S著,熊桂喜,王小虎譯.計(jì)算機(jī)網(wǎng)絡(luò).北京:清華大學(xué)出版社,1998
2 Comer D E,Stevens D L著,趙剛,林瑤,蔣慧譯.用TCP/IP進(jìn)行網(wǎng)際互連(第2版).北京:電子工業(yè)出版社,1998
3?劉磅.TCP/IP Ethernet—自控設(shè)備的新選擇.http://www.gongkong.com,2003
4 劉磅.現(xiàn)場(chǎng)級(jí)TCP/IP控制器及其實(shí)踐.http://www.gongkong.com,2003