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