文獻標識碼: A
文章編號: 0258-7998(2011)12-0114-04
隨著網絡技術的發(fā)展,集成網絡外設的嵌入式系統(tǒng)越來越多,對于目前大多數中低端的MCU來說,若運行較大型復雜網絡協(xié)議棧,如VXWORKS、LINUX系統(tǒng)自帶協(xié)議棧等,存在多種困難。由于上述協(xié)議棧均與各自操作系統(tǒng)綁定,需要同時移植相應操作系統(tǒng)(OS),另外對于一些低端MCU來說,其硬件限制也無法運行大型協(xié)議棧。本文在嵌入式系統(tǒng)中設計實現了一種簡化的UDPIP協(xié)議棧,該協(xié)議棧運行占用資源少,數據傳輸效率高,便于移植,并且可以運行在無操作系統(tǒng)的微型嵌入式系統(tǒng)中。
1 設計原理及整體架構
UDPIP協(xié)議棧對數據的處理過程,即對數據的發(fā)送和接收流程,主要完成對承載數據添加、剝離協(xié)議頭的操作。在兼顧UDPIP協(xié)議棧功能的基礎上,為了達到高效的目的,對協(xié)議棧的數據收發(fā)流程以及所涉及的重要數據結構進行優(yōu)化。
在數據發(fā)送流程,用戶數據傳入協(xié)議棧以及協(xié)議棧將數據遞交給ETH控制器兩個步驟耗時最多,尤其是大于MTU的數據。通過優(yōu)化協(xié)議棧BUFFER結構以及協(xié)議棧與ETH驅動的掛接方式,改進了這兩部分的效率;對于大于MTU數據的接收,需要進行重組,所涉及的定時機制以及重組數據的整合,是影響效率的關鍵所在,需對其進行重新設計。
根據優(yōu)化協(xié)議棧時流程簡化、功能不簡化的原則,設計開發(fā)了協(xié)議棧的控制模塊,以支持屬性設置,參數配置以及ETH設備的控制等功能。協(xié)議棧的整體架構如圖1所示。

2 關鍵技術
2.1 BUFFER管理
在數據收發(fā)過程中,內存分配、釋放、拷貝是耗時最多的部分,盡可能減少內存操作,特別是減少數據在收發(fā)流程中的內存拷貝次數能大幅提高協(xié)議棧效率,合理的BUFFER池結構是實現高效協(xié)議棧的關鍵。為了配合設計流程的實現,便于協(xié)議棧數據BUFFER、系統(tǒng)BUFFER管理,提高協(xié)議棧數據傳輸效率,協(xié)議棧實現類LINUX系統(tǒng)中SLAB CACHE模式管理協(xié)議棧數據BUFFER和系統(tǒng)控制BUFFER。在系統(tǒng)初始化中分配大塊內存,按照不同BUFFER SIZE建立CACHE,其拓撲結構如圖2所示。

在數據發(fā)送流程中,應用程序通過BSD接口將數據傳入UDPIP協(xié)議棧后,協(xié)議棧直接將其拷貝到協(xié)議棧BUFFER,若數據長度大于一個MTU,則分片后依次拷貝到多個協(xié)議棧BUFFER,相比于復雜協(xié)議棧,該協(xié)議棧在處理發(fā)送流程時,沒有按照先加UDP頭后分片的順序,而是先將數據分片,之后在第一分片頭添加UDP頭,由此省去了一次內存拷貝。用戶數據傳入協(xié)議棧的示意圖如圖3所示。

在數據接收過程中,特有的BUFFER結構支持鏈表式數據重組,減少一次數據拷貝,有效地提高了數據的接收效率。從協(xié)議棧對數據的處理來講,接收流程是發(fā)送流程的逆過程,即發(fā)送流程將用戶數據傳入協(xié)議棧(大于MTU要分片),添加UDP頭,IP頭以及ETH頭,接收流程相反,首先對ETH提交上來的數據進行剝離ETH頭,解析IP頭(大于MTU的包完成重組),解析UDP頭,最終提交給用戶。
2.2 BSD接口實現
從通用性考慮,簡化的UDPIP協(xié)議棧實現BSD面向UDP協(xié)議的所有接口。BSD接口基于SOCKET與PORT管理本地資源,包括存儲、分配、回收等操作。為了提高SOCKET和PORT資源較多時上述操作的執(zhí)行效率,采用位圖方式管理可用資源,以比特位的0和1狀態(tài)標識資源是否可用,采用比特操作方式,實現對資源的分配和釋放。在分配資源時,采用二分法查詢可用資源,即遍歷比特為0狀態(tài)的位置(第幾個比特),也就獲取了可用資源的Index。該算法保證在資源較多時,查找可用資源耗時為常量且算法復雜度較低,同時也能夠實現資源的重復利用。遍歷查找方式如圖4所示。

在標準BSD接口中recvfrom涉及數據拷貝,且每次只能接收一個數據包,效率低且耗時。一般應用程序調用recvfrom接口的應用流程為:為了能夠獲取完整的數據包,特別是保證特大包(約64 KB)也能成功接收,應用程序在調用recvfrom接口時傳入的BUFFER要足夠大,一般設為64 KB。為了提高應用程序BUFFER的利用率,該BUFFER不是由應用程序提供,而是用一專門接受數據的緩存保存recvfrom的返回值,之后將該數據拷貝至應用程序提供的BUFFER進行處理。從上面流程可見,存在的主要問題是增加一次內存拷貝,特別是在協(xié)議棧滿負荷運行時,對協(xié)議棧性能影響巨大。在recvfrom讀取數據時,可以同時檢查SOCKET接收緩存是否還有數據包待接收,若有將其長度返回,應用程序在獲取當前數據時即可知道下一個數據包的長度,據此動態(tài)分配內存,既不浪費BUFFER空間也減少了一次拷貝。為了保持標準的recvfrom接口兼容性,考慮不通過擴展參數的情況下完成后續(xù)待接收數據長度提示信息的傳遞:接口recvfrom在每次拷貝一次數據到用戶緩存時,在拷貝完數據后,將后續(xù)是否有數據包待接收以及數據長度信息附于其后,應用程序可以提取該信息。
上述設計方案越是在協(xié)議棧繁忙時越能體現其優(yōu)越性,當每次接收數據時下一個數據均已到達SOCKET接收緩存時,可以保證每次數據接收均可以減少一次拷貝;若協(xié)議棧比較清閑,則該方案失效,但此時系統(tǒng)欠載,多拷貝一次對系統(tǒng)效率也無影響。
2.3 簡單路由設計
路由查詢需要確定數據包內所要填入的源IP地址,查找所要經過的協(xié)議棧網口,網口由協(xié)議棧數據接口描述。該結構對應于ETH驅動面向的物理網口或虛擬網口,使數據包在物理上或邏輯上分流和隔離,達到負荷分擔,優(yōu)先級控制等目的。路由查詢同時需要獲取數據包下一跳所要發(fā)往的節(jié)點以及該節(jié)點的MAC地址,用于封裝ETH頭。UDPIP協(xié)議棧支持簡單多網口路由,策略如下:協(xié)議棧支持多網口掛接,網口個數取決于ETH向協(xié)議棧注冊的網口個數,每個網口可以擁有多個IP地址,但每個IP地址唯一地屬于一個網口。數據發(fā)送時,根據目的IP地址,依次考慮其子網掩碼和網絡掩碼,采取網段位數最大匹配原理,選取網段最大匹配的本地IP所在的網口作為發(fā)送網口,若網段不能匹配,說明目的主機與本地主機不屬于同一網絡,UDPIP協(xié)議棧此時采取默認網關方式,選取任一ETH網口作為發(fā)送網口,將數據發(fā)往網關。
針對上述缺陷,優(yōu)化的UDPIP協(xié)議棧在實現上述簡單路由機制的基礎上,簡化了ARP協(xié)議,采用ARP表現靜態(tài)配置的方式,將有通信需求的對端IP及MAC地址靜態(tài)配置到本地,在通過簡單路由機制獲取下一跳IP地址后,通過查詢該靜態(tài)配置表,將IP地址解析為MAC地址,進而封裝ETH頭,將數據發(fā)送出去。整個流程如圖3所示。
2.4 重組機制
當第一次收到某報文的分片時,需要將分片暫存并啟動重組機制,直到該報文的所有分片到齊,重組成功,方能繼續(xù)執(zhí)行后續(xù)處理。在某些情況下,分片報文在傳輸過程中丟棄將導致數據永遠重組不全,已經收上來的分片將長期占著資源不能釋放,因此必須防止此類情況發(fā)生。在標準協(xié)議棧中采用定時機制,在收到第一個分片時啟動重組定時器,若在定時期間內不能完成重組則將已收到的分片釋放,防止資源泄露。在簡化UDPIP協(xié)議棧中,考慮到定時機制相對復雜,而且增加定時器則會引入異步事件,增加了不可控因素,因此采用計數重組法保證重組機制的正常工作。
計數重組法的工作原理:正常情況下,定時重組機制在所設時間內所有分片應該可以收齊,計數重組法則假定在某數據報的所有分片應該在所設定的IP報文個數內收齊。如定時重組機制中每收到該報文的任何一個分片重啟定時器,計數重組機制中則將計數器復位,重新計數。因此,首先應該給出假定的數據報文個數,此處設為N,在收到某個數據報的第一個分片時開始計數,當收到第N個數據報文時該數據報仍沒有重組完成,則認為該數據報重組失敗,需要將已收上來的分片釋放。
在實現上,計數重組法與無符號數的計數溢出原理相結合,極大地提高了重組效率,系統(tǒng)聲明一無符號全局變量作為全局計數器,每收到一個IP報文,該計數器加1。當收到數據報D的第一個分片frag1時,若此時全局計數器的值為n,則初始化m對應的重組計數器基值為(0-n),之后在每次收到IP報文時,將全局計數器的當前值n1與其基值相加,獲取的值與設定的最大容限個數N比較,若大于N則認為數據重組失敗,否則繼續(xù)等待后續(xù)的分片。該算法具體實現原理如圖5所示。

2.5 與驅動掛接
協(xié)議棧若能實現正常通信,需要設備驅動與之配合,在一些稍高端的微處理器上,配有ETH外設,可實現ETH驅動與協(xié)議棧掛接,ETH驅動以BD(Buffer Descriptor)的方式管理以太數據的收發(fā)。為了提高數據傳輸效率,在數據接收方向BD采取替換方式以避免拷貝,接收流程如圖6所示;在數據發(fā)送方向,協(xié)議棧將數據封裝成ETH幀,掛接到發(fā)送BD上,啟動ETH控制器完成發(fā)送,在發(fā)送完成后釋放數據BUFFER。一些中低端的微控制器不支持ETH外設,若需要與UDPIP協(xié)議棧掛接,則必須實現虛擬的ETH驅動,底層物理傳輸可以承載于串口、SPI、GPIO等普遍存在的外設之上。虛擬驅動也需要提供類BD的管理模式,完成數據的發(fā)送、接收、緩存,由于物理承載的限制,要求通信的對端設備物理介質相同,否則需要通過硬件轉換電路實現不對等的物理設備間的ETH通信。

3 性能測試
協(xié)議棧的綜合性能取決于其接收方面的性能,因為數據接收流程要完成的工作相對于發(fā)送流程更為繁雜。將UDPIP協(xié)議棧與VXWORKS協(xié)議棧進行了性能對比測試,測試平臺為PPC85XX處理器,工作頻率為800 MHz,測試模型為發(fā)包儀器SmartBit與PPC85XX通過網線連接,ETH工作在千兆全雙工模式。SmartBit做為數據源向PPC發(fā)包,PPC應用程序接收到數據并處理。由于PPC硬件平臺處理能力較強,若應用程序調用recvfrom后不做任何處理,無論是Vxworks協(xié)議棧還是簡化UDPIP協(xié)議棧均能輕松達到單向900 Mb/s,區(qū)別在于CPU占用率不一樣。為了達到直觀的效果,測試用例采取附加應用程序處理數據,使CPU工作在滿負荷情況下,測試數據收發(fā)性能對比如表1所示。

UDPIP協(xié)議棧為實現更高的傳輸效率,同時兼容各種硬件平臺,優(yōu)化設計了協(xié)議棧BUFFER管理系統(tǒng),SOCKET接口模塊,采用簡潔快速的路由策略及重組機制,充分利用以太BD的特性,采取BUFFER替換方式完成ETH數據向協(xié)議棧的提交,盡可能減少數據拷貝。改進了標準BSD SOCKET接口的實現,既能很好地支持標準應用,又能夠大幅提高數據接收速率,兼容不同硬件平臺、操作系統(tǒng)平臺,甚至可以運行于無操作系統(tǒng)的低端MCU。在當前提倡三網融合的大環(huán)境下,電子終端種類日益增多,但IP化是電子終端的趨勢,也是三網融合實現的關鍵,相信UDPIP協(xié)議棧能夠滿足絕大多數中低端電子設備對IP傳輸的需求。
參考文獻
[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的端對端通訊的原理及實現[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
