文獻標識碼: A
文章編號: 0258-7998(2011)12-0114-04
隨著網(wǎng)絡技術的發(fā)展,集成網(wǎng)絡外設的嵌入式系統(tǒng)越來越多,對于目前大多數(shù)中低端的MCU來說,若運行較大型復雜網(wǎng)絡協(xié)議棧,如VXWORKS、LINUX系統(tǒng)自帶協(xié)議棧等,存在多種困難。由于上述協(xié)議棧均與各自操作系統(tǒng)綁定,需要同時移植相應操作系統(tǒng)(OS),另外對于一些低端MCU來說,其硬件限制也無法運行大型協(xié)議棧。本文在嵌入式系統(tǒng)中設計實現(xiàn)了一種簡化的UDPIP協(xié)議棧,該協(xié)議棧運行占用資源少,數(shù)據(jù)傳輸效率高,便于移植,并且可以運行在無操作系統(tǒng)的微型嵌入式系統(tǒng)中。
1 設計原理及整體架構
UDPIP協(xié)議棧對數(shù)據(jù)的處理過程,即對數(shù)據(jù)的發(fā)送和接收流程,主要完成對承載數(shù)據(jù)添加、剝離協(xié)議頭的操作。在兼顧UDPIP協(xié)議棧功能的基礎上,為了達到高效的目的,對協(xié)議棧的數(shù)據(jù)收發(fā)流程以及所涉及的重要數(shù)據(jù)結構進行優(yōu)化。
在數(shù)據(jù)發(fā)送流程,用戶數(shù)據(jù)傳入?yún)f(xié)議棧以及協(xié)議棧將數(shù)據(jù)遞交給ETH控制器兩個步驟耗時最多,尤其是大于MTU的數(shù)據(jù)。通過優(yōu)化協(xié)議棧BUFFER結構以及協(xié)議棧與ETH驅動的掛接方式,改進了這兩部分的效率;對于大于MTU數(shù)據(jù)的接收,需要進行重組,所涉及的定時機制以及重組數(shù)據(jù)的整合,是影響效率的關鍵所在,需對其進行重新設計。
根據(jù)優(yōu)化協(xié)議棧時流程簡化、功能不簡化的原則,設計開發(fā)了協(xié)議棧的控制模塊,以支持屬性設置,參數(shù)配置以及ETH設備的控制等功能。協(xié)議棧的整體架構如圖1所示。
2 關鍵技術
2.1 BUFFER管理
在數(shù)據(jù)收發(fā)過程中,內存分配、釋放、拷貝是耗時最多的部分,盡可能減少內存操作,特別是減少數(shù)據(jù)在收發(fā)流程中的內存拷貝次數(shù)能大幅提高協(xié)議棧效率,合理的BUFFER池結構是實現(xiàn)高效協(xié)議棧的關鍵。為了配合設計流程的實現(xiàn),便于協(xié)議棧數(shù)據(jù)BUFFER、系統(tǒng)BUFFER管理,提高協(xié)議棧數(shù)據(jù)傳輸效率,協(xié)議棧實現(xiàn)類LINUX系統(tǒng)中SLAB CACHE模式管理協(xié)議棧數(shù)據(jù)BUFFER和系統(tǒng)控制BUFFER。在系統(tǒng)初始化中分配大塊內存,按照不同BUFFER SIZE建立CACHE,其拓撲結構如圖2所示。
在數(shù)據(jù)發(fā)送流程中,應用程序通過BSD接口將數(shù)據(jù)傳入UDPIP協(xié)議棧后,協(xié)議棧直接將其拷貝到協(xié)議棧BUFFER,若數(shù)據(jù)長度大于一個MTU,則分片后依次拷貝到多個協(xié)議棧BUFFER,相比于復雜協(xié)議棧,該協(xié)議棧在處理發(fā)送流程時,沒有按照先加UDP頭后分片的順序,而是先將數(shù)據(jù)分片,之后在第一分片頭添加UDP頭,由此省去了一次內存拷貝。用戶數(shù)據(jù)傳入?yún)f(xié)議棧的示意圖如圖3所示。
在數(shù)據(jù)接收過程中,特有的BUFFER結構支持鏈表式數(shù)據(jù)重組,減少一次數(shù)據(jù)拷貝,有效地提高了數(shù)據(jù)的接收效率。從協(xié)議棧對數(shù)據(jù)的處理來講,接收流程是發(fā)送流程的逆過程,即發(fā)送流程將用戶數(shù)據(jù)傳入?yún)f(xié)議棧(大于MTU要分片),添加UDP頭,IP頭以及ETH頭,接收流程相反,首先對ETH提交上來的數(shù)據(jù)進行剝離ETH頭,解析IP頭(大于MTU的包完成重組),解析UDP頭,最終提交給用戶。
2.2 BSD接口實現(xiàn)
從通用性考慮,簡化的UDPIP協(xié)議棧實現(xiàn)BSD面向UDP協(xié)議的所有接口。BSD接口基于SOCKET與PORT管理本地資源,包括存儲、分配、回收等操作。為了提高SOCKET和PORT資源較多時上述操作的執(zhí)行效率,采用位圖方式管理可用資源,以比特位的0和1狀態(tài)標識資源是否可用,采用比特操作方式,實現(xiàn)對資源的分配和釋放。在分配資源時,采用二分法查詢可用資源,即遍歷比特為0狀態(tài)的位置(第幾個比特),也就獲取了可用資源的Index。該算法保證在資源較多時,查找可用資源耗時為常量且算法復雜度較低,同時也能夠實現(xiàn)資源的重復利用。遍歷查找方式如圖4所示。
在標準BSD接口中recvfrom涉及數(shù)據(jù)拷貝,且每次只能接收一個數(shù)據(jù)包,效率低且耗時。一般應用程序調用recvfrom接口的應用流程為:為了能夠獲取完整的數(shù)據(jù)包,特別是保證特大包(約64 KB)也能成功接收,應用程序在調用recvfrom接口時傳入的BUFFER要足夠大,一般設為64 KB。為了提高應用程序BUFFER的利用率,該BUFFER不是由應用程序提供,而是用一專門接受數(shù)據(jù)的緩存保存recvfrom的返回值,之后將該數(shù)據(jù)拷貝至應用程序提供的BUFFER進行處理。從上面流程可見,存在的主要問題是增加一次內存拷貝,特別是在協(xié)議棧滿負荷運行時,對協(xié)議棧性能影響巨大。在recvfrom讀取數(shù)據(jù)時,可以同時檢查SOCKET接收緩存是否還有數(shù)據(jù)包待接收,若有將其長度返回,應用程序在獲取當前數(shù)據(jù)時即可知道下一個數(shù)據(jù)包的長度,據(jù)此動態(tài)分配內存,既不浪費BUFFER空間也減少了一次拷貝。為了保持標準的recvfrom接口兼容性,考慮不通過擴展參數(shù)的情況下完成后續(xù)待接收數(shù)據(jù)長度提示信息的傳遞:接口recvfrom在每次拷貝一次數(shù)據(jù)到用戶緩存時,在拷貝完數(shù)據(jù)后,將后續(xù)是否有數(shù)據(jù)包待接收以及數(shù)據(jù)長度信息附于其后,應用程序可以提取該信息。
上述設計方案越是在協(xié)議棧繁忙時越能體現(xiàn)其優(yōu)越性,當每次接收數(shù)據(jù)時下一個數(shù)據(jù)均已到達SOCKET接收緩存時,可以保證每次數(shù)據(jù)接收均可以減少一次拷貝;若協(xié)議棧比較清閑,則該方案失效,但此時系統(tǒng)欠載,多拷貝一次對系統(tǒng)效率也無影響。
2.3 簡單路由設計
路由查詢需要確定數(shù)據(jù)包內所要填入的源IP地址,查找所要經(jīng)過的協(xié)議棧網(wǎng)口,網(wǎng)口由協(xié)議棧數(shù)據(jù)接口描述。該結構對應于ETH驅動面向的物理網(wǎng)口或虛擬網(wǎng)口,使數(shù)據(jù)包在物理上或邏輯上分流和隔離,達到負荷分擔,優(yōu)先級控制等目的。路由查詢同時需要獲取數(shù)據(jù)包下一跳所要發(fā)往的節(jié)點以及該節(jié)點的MAC地址,用于封裝ETH頭。UDPIP協(xié)議棧支持簡單多網(wǎng)口路由,策略如下:協(xié)議棧支持多網(wǎng)口掛接,網(wǎng)口個數(shù)取決于ETH向協(xié)議棧注冊的網(wǎng)口個數(shù),每個網(wǎng)口可以擁有多個IP地址,但每個IP地址唯一地屬于一個網(wǎng)口。數(shù)據(jù)發(fā)送時,根據(jù)目的IP地址,依次考慮其子網(wǎng)掩碼和網(wǎng)絡掩碼,采取網(wǎng)段位數(shù)最大匹配原理,選取網(wǎng)段最大匹配的本地IP所在的網(wǎng)口作為發(fā)送網(wǎng)口,若網(wǎng)段不能匹配,說明目的主機與本地主機不屬于同一網(wǎng)絡,UDPIP協(xié)議棧此時采取默認網(wǎng)關方式,選取任一ETH網(wǎng)口作為發(fā)送網(wǎng)口,將數(shù)據(jù)發(fā)往網(wǎng)關。
針對上述缺陷,優(yōu)化的UDPIP協(xié)議棧在實現(xiàn)上述簡單路由機制的基礎上,簡化了ARP協(xié)議,采用ARP表現(xiàn)靜態(tài)配置的方式,將有通信需求的對端IP及MAC地址靜態(tài)配置到本地,在通過簡單路由機制獲取下一跳IP地址后,通過查詢該靜態(tài)配置表,將IP地址解析為MAC地址,進而封裝ETH頭,將數(shù)據(jù)發(fā)送出去。整個流程如圖3所示。
2.4 重組機制
當?shù)谝淮问盏侥硤笪牡姆制瑫r,需要將分片暫存并啟動重組機制,直到該報文的所有分片到齊,重組成功,方能繼續(xù)執(zhí)行后續(xù)處理。在某些情況下,分片報文在傳輸過程中丟棄將導致數(shù)據(jù)永遠重組不全,已經(jīng)收上來的分片將長期占著資源不能釋放,因此必須防止此類情況發(fā)生。在標準協(xié)議棧中采用定時機制,在收到第一個分片時啟動重組定時器,若在定時期間內不能完成重組則將已收到的分片釋放,防止資源泄露。在簡化UDPIP協(xié)議棧中,考慮到定時機制相對復雜,而且增加定時器則會引入異步事件,增加了不可控因素,因此采用計數(shù)重組法保證重組機制的正常工作。
計數(shù)重組法的工作原理:正常情況下,定時重組機制在所設時間內所有分片應該可以收齊,計數(shù)重組法則假定在某數(shù)據(jù)報的所有分片應該在所設定的IP報文個數(shù)內收齊。如定時重組機制中每收到該報文的任何一個分片重啟定時器,計數(shù)重組機制中則將計數(shù)器復位,重新計數(shù)。因此,首先應該給出假定的數(shù)據(jù)報文個數(shù),此處設為N,在收到某個數(shù)據(jù)報的第一個分片時開始計數(shù),當收到第N個數(shù)據(jù)報文時該數(shù)據(jù)報仍沒有重組完成,則認為該數(shù)據(jù)報重組失敗,需要將已收上來的分片釋放。
在實現(xiàn)上,計數(shù)重組法與無符號數(shù)的計數(shù)溢出原理相結合,極大地提高了重組效率,系統(tǒng)聲明一無符號全局變量作為全局計數(shù)器,每收到一個IP報文,該計數(shù)器加1。當收到數(shù)據(jù)報D的第一個分片frag1時,若此時全局計數(shù)器的值為n,則初始化m對應的重組計數(shù)器基值為(0-n),之后在每次收到IP報文時,將全局計數(shù)器的當前值n1與其基值相加,獲取的值與設定的最大容限個數(shù)N比較,若大于N則認為數(shù)據(jù)重組失敗,否則繼續(xù)等待后續(xù)的分片。該算法具體實現(xiàn)原理如圖5所示。
2.5 與驅動掛接
協(xié)議棧若能實現(xiàn)正常通信,需要設備驅動與之配合,在一些稍高端的微處理器上,配有ETH外設,可實現(xiàn)ETH驅動與協(xié)議棧掛接,ETH驅動以BD(Buffer Descriptor)的方式管理以太數(shù)據(jù)的收發(fā)。為了提高數(shù)據(jù)傳輸效率,在數(shù)據(jù)接收方向BD采取替換方式以避免拷貝,接收流程如圖6所示;在數(shù)據(jù)發(fā)送方向,協(xié)議棧將數(shù)據(jù)封裝成ETH幀,掛接到發(fā)送BD上,啟動ETH控制器完成發(fā)送,在發(fā)送完成后釋放數(shù)據(jù)BUFFER。一些中低端的微控制器不支持ETH外設,若需要與UDPIP協(xié)議棧掛接,則必須實現(xiàn)虛擬的ETH驅動,底層物理傳輸可以承載于串口、SPI、GPIO等普遍存在的外設之上。虛擬驅動也需要提供類BD的管理模式,完成數(shù)據(jù)的發(fā)送、接收、緩存,由于物理承載的限制,要求通信的對端設備物理介質相同,否則需要通過硬件轉換電路實現(xiàn)不對等的物理設備間的ETH通信。
3 性能測試
協(xié)議棧的綜合性能取決于其接收方面的性能,因為數(shù)據(jù)接收流程要完成的工作相對于發(fā)送流程更為繁雜。將UDPIP協(xié)議棧與VXWORKS協(xié)議棧進行了性能對比測試,測試平臺為PPC85XX處理器,工作頻率為800 MHz,測試模型為發(fā)包儀器SmartBit與PPC85XX通過網(wǎng)線連接,ETH工作在千兆全雙工模式。SmartBit做為數(shù)據(jù)源向PPC發(fā)包,PPC應用程序接收到數(shù)據(jù)并處理。由于PPC硬件平臺處理能力較強,若應用程序調用recvfrom后不做任何處理,無論是Vxworks協(xié)議棧還是簡化UDPIP協(xié)議棧均能輕松達到單向900 Mb/s,區(qū)別在于CPU占用率不一樣。為了達到直觀的效果,測試用例采取附加應用程序處理數(shù)據(jù),使CPU工作在滿負荷情況下,測試數(shù)據(jù)收發(fā)性能對比如表1所示。
UDPIP協(xié)議棧為實現(xiàn)更高的傳輸效率,同時兼容各種硬件平臺,優(yōu)化設計了協(xié)議棧BUFFER管理系統(tǒng),SOCKET接口模塊,采用簡潔快速的路由策略及重組機制,充分利用以太BD的特性,采取BUFFER替換方式完成ETH數(shù)據(jù)向協(xié)議棧的提交,盡可能減少數(shù)據(jù)拷貝。改進了標準BSD SOCKET接口的實現(xiàn),既能很好地支持標準應用,又能夠大幅提高數(shù)據(jù)接收速率,兼容不同硬件平臺、操作系統(tǒng)平臺,甚至可以運行于無操作系統(tǒng)的低端MCU。在當前提倡三網(wǎng)融合的大環(huán)境下,電子終端種類日益增多,但IP化是電子終端的趨勢,也是三網(wǎng)融合實現(xiàn)的關鍵,相信UDPIP協(xié)議棧能夠滿足絕大多數(shù)中低端電子設備對IP傳輸?shù)男枨蟆?br/>參考文獻
[1] Ma Qiang, Zhao Jianguo,Liu Bingxu. Implementation of Embedded Ethernet Based on Hardware Protocol Stack in Substation Automation System [J]. Transactions of Tianjin University, 2008,14(2).
[2] JONES M T. TCP/IP Application layer protocols for embedded systems[M].Publishing House of Electronics Industry, 2002.
[3] 徐穎,欒勝. 基于UDP的端對端通訊的原理及實現(xiàn)[J]. 北京航空航天大學學報,2005,31(7):823-827.
[4] Dou Xiaobo, Wu Zaijun, Hu Minqiang,et al. Implementation of UDP in communication system of substation automation[J]. Electric Power Automation Equipment, 2003(12):5.
[5] JAMALIPOUR A,MARCHESE M,CMICKSHANKH S,et al. Broadband IP networks via satellites-Part I [J].IEEE Journal on Selected Areas in Communications, 2004,22(2):213-217.
[6] 何贊園,宋華偉,吉立新. VxWorks下UDP協(xié)議棧效率的 研究與改進[J]. 單片機與嵌入式系統(tǒng)應用, 2006(05):28-30