摘 要: 基于以太網的嵌入式數據傳輸系統在許多領域被普遍采用,系統的傳輸效率需要提高。基于ARM Cortex-M4內核和常用的嵌入式網絡協議棧LwIP,針對點對點數據傳輸的特點,采用了零數據拷貝技術并對UDP協議加以優化改進,大大提高了傳輸性能。測試結果表明,數據傳輸的速率從未優化的2.03 MB/s提升到9.80 MB/s,已接近百兆以太網的極限。同時引入ACK回應機制保障了UDP數據傳輸的可靠性。
關鍵詞: STM32F407;LwIP/UDP;零數據拷貝;ACK
0 引言
基于以太網的嵌入式數據傳輸系統由于其結構靈活、通用性強、傳輸速度快、傳輸距離遠等特點,在許多應用領域都發揮著重要的作用[1]。但由于嵌入式系統本身的結構[1]以及網絡協議棧的限制[2],網絡數據傳輸的效率不高,遠遠達不到以太網傳輸的理論帶寬。一方面通過改進嵌入式系統的硬件結構,如利用FPGA并行處理的優勢[2],可以大大提高數據傳輸的效率;另一方面,通過分析并改進嵌入式網絡協議棧,也可以提高網絡數據傳輸的速度[3]。
嵌入式網絡傳輸系統由于成本資源的限制,往往采用簡化的網絡傳輸協議TCP/IP協議。LwIP協議棧是TCP/IP協議的一種簡化版本,專門針對嵌入式系統開發,專注于減少資源消耗,對性能優化卻比較少,效率不是很高[4]。
本文通過研究、分析常用的嵌入式網絡協議棧LwIP的結構[4],針對簡單的點對點傳輸網絡環境,提出一種簡單、靈活、高效的基于UDP協議的嵌入式數據傳輸效率的優化方法。
1 系統結構和協議棧分析及改進
系統以嵌入式微處理器STM32F407為核心,使用輕型網絡傳輸協議棧LwIP實現百兆以太網傳輸數據。考慮到嵌入式系統的處理速度和資源限制,為保證高效的數據傳輸,選擇更高效的UDP協議[5]。對于數據傳輸的可靠性,提出基于ACK回應的機制來改善。
1.1 系統硬件結構
選擇意法半導體的微處理器STM32F407作為系統的核心。它采用專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARMCortex-M4內核,時鐘頻率達到168 MHz,具有專門的網絡MAC層接口和專用于網絡的DMA通道,外加PHY芯片和網絡接口,通過網線就可以實現網絡傳輸。
1.2 LwIP協議棧結構
LwIP協議棧是基于分層的方式設計的,包括應用層、IP層、傳輸層等,每一層的協議都代表一個獨立的模塊,但是為了最小限度地使用系統資源,模塊間使用松散的通信機制,通過共享內存來實現通信[6]。
LwIP協議棧設置了一個各層共享的內存空間——網絡數據包緩沖區,數據分組存在一個確定的緩沖區Data buff中,在層與層之間打包與解包的過程中傳遞的只是這個緩沖區的地址payload,只有當數據要被發送至PHY或被應用程序取走時才會通過數據拷貝來實現。LwIP協議棧使用pbuf來管理這個包緩沖區,從而實現在協議棧各層之間數據包的零拷貝。pbuf結構如圖1所示,包括包的信息、標志、地址等,payload指針指向包緩沖區Data buff。
1.3 系統網絡傳輸過程分析
整個數據通路如圖2所示。
下面就LwIP協議棧UDP數據包的發送過程做詳細的分析。應用程序要利用UDP協議發送數據,先要建立UDP會話結構體udp_pcb,綁定本地IP地址與端口。由于udp_pcb結構體本身很小,且在已分配好的內存中,因此這一步執行很快。
接下來,分配并建立pbuf,然后將待發送數據拷貝至pbuf緩沖區中。這個過程其實是將數據從應用層傳遞至網絡層的過程,這是第一次較大數據量的內存拷貝,占用了很多系統資源,降低了系統的性能。
至此,發送前基本工作準備完畢,接下來發送網絡數據包。先要在網絡接口netif全局鏈表中查找網絡信息包將被傳輸至哪一個網絡接口。由于本系統是簡單的點對點網絡環境,系統也只有一個默認網絡接口,因此此步驟可以省去。
然后進入UDP協議傳輸層,生成UDP數據包頭;再轉入IP層,生成IP層包頭。這兩個過程不涉及數據拷貝,待發送網絡數據包一直存儲在pbuf中,UDP包頭和IP包頭通過指針和數據包連接在一起。
生成IP包以后,需要通過DMA(Direct Memory Access)將IP包發送到鏈路層MAC控制器的FIFO中然后發送出去。這個過程中涉及第二次大的內存拷貝,要把pbuf里的IP包拷貝到DMA控制器的發送緩存中。
上面分析了嵌入式LwIP協議棧收發網絡數據包的過程,包括數據由應用程序傳至協議棧pbuf緩沖包(API_to_Pbuf)和從pbuf緩沖包轉移到以太網DMA緩沖區(Pbuf_to_DMA)時的兩次大的數據拷貝過程,數據由DMA傳輸至MAC控制器的FIFO(DMA_to_FIFO)中,還有一些內存分配、打包解包及由于考慮協議棧的通用性而導致的多余開銷(Others)。
測試利用系統內部定時器完成,傳輸1 KB的數據包,上述4個部分開銷的測試結果如表1所示。
如圖3所示,最大的開銷就在兩次大的數據拷貝過程,占到整個開銷的73%。有很多關于TCP/IP協議零拷貝的研究[7],但多數對零拷貝的研究都是基于避免用戶空間與系統空間,與本系統存在的問題不太相同。其實,LwIP協議棧通過pbuf緩沖包在各層之間傳遞數據包的地址指針已經實現了協議棧內部的零拷貝技術,但對于協議棧與應用程序之間的數據拷貝并沒有過多考慮。
1.4 LwIP協議棧改進
基于以上的分析,對于本系統這樣一個簡單網絡環境,只需實現網絡的點對點通信,同時只傳輸固定格式的數據包,所以可以考慮讓網絡接口DMA控制器的數據緩存與協議棧pbuf緩沖包實現內存共享,達到真正的零數據拷貝。為了實現DMA控制器的數據緩存與協議棧pbuf緩沖包共享內存,將pbuf緩存包分配成PBUF_ROM類型,將pbuf緩存包的payload指針指向DMA數據緩存的地址。DMA控制器的數據緩存由系統分配,是一組連續的固定的內存空間。本系統傳輸固定大小和格式的數據包,并只設置一個DMA緩存,使得數據包被系統接收以后不至于分散在多個DMA緩存中,否則將造成多個DMA緩存地址不連續而無法與緩沖包共享內存。對于數據包頭的問題,由于本系統明確是UDP協議傳輸,且是點對點固定節點的網絡傳輸,可以在網絡傳輸前即將包頭設定完畢并保存下來,當進行網絡傳輸時直接應用這個固定包頭(其中UDP包頭8 B、IP包頭20 B、MAC幀頭14 B)即可。
同樣通過系統的定時器測試4個部分的開銷,測試結果如表2所示。
從測試結果來看,經改進的主要開銷是數據由DMA搬運到MAC控制器的FIFO的過程,避免了兩次大的內存拷貝,實現了數據零拷貝,大大提升傳輸效率,傳輸速度可以達到,接近百兆網的極限。
2 基于ACK機制的UDP可靠傳輸
UDP協議是一種無連接的傳輸層協議,發送端把數據發送出去以后并不關心接收端是否接收到了數據,所以雖然它效率高,但并不可靠。很多文獻都討論過改進UDP協議的可靠性[8],下面提出一種提高UDP協議傳輸可靠性的簡易方法,在占用較少系統資源的前提下,盡量保證系統的傳輸性能和可靠性。
TFTP是一種基于ACK包回應機制的簡單協議,其基本思想是:發送一個UDP包以后,等收到ACK包回應才發送下一個UDP包;在一定時間內,如果沒有收到ACK包,即重新發送此包。這種方法固然可以改善數據的可靠傳輸,但每發送一個UDP包都多了一個ACK包回應的開銷,降低了傳輸性能。
基于ACK機制,本文提出兩點改進來改善UDP傳輸的可靠性:一方面,針對點對點的網絡傳輸應用,基于數據零拷貝,改進LwIP/UDP協議棧;另一方面,為了提高ACK機制的效率,發送N個數據包才回應一個ACK包。發送端每次發送N個數據包,并將這N個包緩存起來,在規定時間內,如果未收到ACK回應包即重傳這N個包。雖然UDP協議存在誤碼,但誤碼率不高,因一個UDP包丟失而造成N個包都需重傳所造成的額外開銷并不明顯。具體實現時,需要區分ACK包和DATA包,發送數據前需在UDP包末尾追加ACK標識和NUM序號,DATA包則在UDP數據包末尾追加DATA標識和NUM序號。
收發兩端的傳輸流程如圖4所示。發送開始以后,發送端每次發送N個數據包,發送完馬上開始超時計時,等待ACK包回應;接收端接收并解析數據包,判斷一次傳輸是否完成(NUM%N為零即代表傳輸了N個包),完成即生成并發送ACK響應包;發送端收到ACK響應包后再發送下一組N個數據包,如果超時,重新發送上一組的N個數據包。
當每次只傳輸1個數據包時,各部分開銷分布如表3所示,采用改進的LwIP/UDP協議,UDP部分主要開銷還是DMA_to_FIFO及其他打包解包等過程;采用ACK機制,增加了一次ACK包的生成與傳輸(Process_ACK)、兩次ACK包的解析及檢錯重傳所造成的額外開銷(Others)。
采用每N個包發一次ACK響應包,減少Process_ACK的開銷,提高了傳輸效率。不同單次發送數據包數下的傳輸速率如圖5所示,ACK機制各部分開銷比重如圖6所示。從圖5看出,隨著N的增大傳輸速率逐漸增大,但是當N增加到12以后,速率增加趨于平緩。而從圖6可以看出,N的增加只會減少處理ACK響應時間(Process_ACK包括生成并發送ACK包),其他3個部分耗時不會減少,故存在一個極限的速率。
這種改進方法比較簡單,考慮到等待重發等因素的影響,實際的傳輸速率還要降低一些。但其效率確實顯著提高,而且通過選擇單次傳輸數據包個數N的大小,可以靈活地調整傳輸效率、改善傳輸的可靠性。
3 結論
本文詳細分析、測試嵌入式網絡LwIP/UDP協議的數據傳輸過程,針對點對點的簡單網絡傳輸,基于零數據拷貝的思想,改進了LwIP/UDP協議,明顯提升了傳輸的性能,數據傳輸的速率從未優化的2.03 MB/s提升到 9.80 MB/s,已接近百兆以太網的極限。另外,通過引入改進的ACK機制,改善了傳輸的可靠性,實現了一種通用高效靈活的網絡傳輸優化方法。
參考文獻
[1] 王琳,商周,王學偉.數據采集系統的發展與應用[J].電測與儀表,2004,41(464):4-8.
[2] 姚雪,楊光,張祥.嵌入式數據傳輸系統速度優化方法[J].微計算機應用,2011,32(3):59-63.
[3] 段之昱,趙昭旺.嵌入式系統網絡數據傳輸性能研究[J].天文研究與技術,2007,4(3):266-275.
[4] 孫樂鳴,江來,代鑫.嵌入式TCP/IP協議棧LWIP的內部結構探索與研究[J].電子元器件應用,2008,10(3):79-81.
[5] 徐鑫,曹奇英.基于LwIP協議棧的UDP協議分析與優化[J].計算機應用與軟件,2011,28(3):246-249.
[6] ADAM D. Design and implementation of the LwIP TCP/IP stack[M]. Swedish Institute of Computer Science, 2001.
[7] 王小峰,時向泉,蘇金樹.一種TCP/IP卸載的數據零拷貝傳輸方法[J].計算機工程與科學,2008,30(2):135-138.
[8] 李國,鞏光志,王冬冬.一種提高UDP可靠性的數據傳輸方法研究[J].中國民航大學學報,2012,30(1):41-45.