袁中書,陸 陽
(合肥工業(yè)大學計算機與信息學院,合肥230009)
輕量級TCP/IP協(xié)議棧機制分析與優(yōu)化
袁中書,陸 陽
(合肥工業(yè)大學計算機與信息學院,合肥230009)
輕量級TCP/IP協(xié)議棧(LwIP)主要應用于資源受限的嵌入式設備。為滿足嵌入式設備對實時性的要求,分析LwIP的內部機制,對其進行性能瓶頸分析,并根據分析結果設計、實施LwIP的實時性和優(yōu)先級管理優(yōu)化方案。LwIP的主要性能瓶頸是內存拷貝和校驗過程,據此給出優(yōu)化后的內存拷貝算法和校驗算法。為滿足緊急數據對更高優(yōu)先級的要求,給出LwIP協(xié)議棧優(yōu)先級管理機制,能夠確保高優(yōu)先級標記的緊急數據包優(yōu)先傳輸于普通數據包。實驗結果表明,該優(yōu)化方法可以顯著提高LwIP的實時性能。
輕量級TCP/IP協(xié)議棧;嵌入式;實時性;優(yōu)化;優(yōu)先級;等待隊列
隨著嵌入式系統(tǒng)在工業(yè)控制領域的廣泛應用和發(fā)展,以及控制系統(tǒng)的網絡化發(fā)展趨勢,嵌入式系統(tǒng)的網絡特性越來越受到重視[1]?;谶@種趨勢,一些專門運行于嵌入式設備的TCP/IP協(xié)議棧應運而生,比較成熟的開源協(xié)議棧主要有LwIP、uIP、μC/ IP、TinyTcp等[2-3]。這些嵌入式協(xié)議棧均派生自BSD TCP/IP[4],實現了其最基本的通信功能。輕量級TCP/IP協(xié)議棧(Lightweight TCP/IP protocol stack,LwIP)[5]是一套用于嵌入式系統(tǒng)的開源TCP/ IP協(xié)議棧。LwIP可以移植到多種嵌入式操作系統(tǒng)上,如Linux,μCOS等,也可以在缺乏操作系統(tǒng)的裸機上獨立運行。LwIP的主要目標是在保持TCP/IP協(xié)議主要功能的基礎上減少存儲器使用量和代碼尺寸,以便適應資源有限的嵌入式環(huán)境[6]。為了滿足嵌入式應用對TCP/IP協(xié)議棧實時性的要求,本文將在實驗分析的基礎上,給出LwIP協(xié)議棧實時優(yōu)化方案,并對優(yōu)化結果進行實驗驗證。
2.1 LwIP與嵌入式系統(tǒng)的關系
為了提高可移植性,LwIP在協(xié)議棧和操作系統(tǒng)之間增加了一個操作系統(tǒng)模擬層[7]。操作系統(tǒng)模擬層使用統(tǒng)一的接口提供定時器、進程同步及消息傳遞機制等諸如此類的系統(tǒng)服務。消息傳遞通過一個被稱作郵箱的機制來實現,投遞到郵箱的消息被操作系統(tǒng)模擬層放到隊列中直至其他進程將它們取出[8]。LwIP將所有協(xié)議駐留在同一個進程,應用程序既可以駐留在LwIP的進程中,也可以使用一個單獨的進程[9]。應用程序與協(xié)議棧通信可以采用2種方式:(1)函數調用;(2)使用LwIP提供的API通過操作系統(tǒng)的郵箱等進行通信。
2.2 LwIP模塊架構
LwIP的設計與實現采用了分層的結構,每層協(xié)議都作為一個獨立的模塊來實現,層與層之間通過接口函數進行通信[10-11]。LwIP主要由IP,ICMP, UDP和TCP模塊組成[12],這些模塊完成通信功能。除此之外,LwIP還包含一些輔助模塊,例如操作系統(tǒng)模擬層、內存管理系統(tǒng)等[13]。
TCP協(xié)議為傳輸層協(xié)議,它為應用層提供可靠的面向連接的數據流服務[14]。TCP主要由6個函數組成,其中,tcp_write(),tcp_enqueue()與tcp_ output()對TCP輸出過程進行處理,tcp_input(), tcp_process()與tcp_receive()對TCP輸入過程進行處理。
UDP協(xié)議為應用層提供不可靠的無連接數據報服務[15]。發(fā)送UDP數據時,應用程序調用udp_ send()函數,該函數調用udp_output()完成udp頭部添加等操作,然后數據被移交給ip_output_if(),進入IP層。接收時,IP層調用udp_input()函數檢查UDP頭部,找到對應的UDP PCB[16],然后調用recv()函數,通知應用層做進一步處理。
2.3 LwIP數據處理
以TCP協(xié)議發(fā)送數據過程為例詳細分析LwIP數據處理流程。發(fā)送數據時,應用程序調用LwIP API接口函數LwIP_write(),LwIP_write()函數進一步調用LwIP提供給內嵌應用程序使用的API函數netconn_write()。該函數負責POST一個發(fā)送數據包消息到郵箱。
當協(xié)議棧接收到該消息時,調用tcp_write()函數,tcp_write()將控制權交給tcp_enqueue()。tcp_ enqueue()函數將應用程序數據拷貝到協(xié)議棧內部緩沖區(qū),對發(fā)送數據進行分割與編號,封裝進pbuf,然后調用tcp_output()檢查當前窗口是否還有空間存放更多的數據,填充剩余TCP報頭字段,計算TCP校驗和,最后使用ip_output()發(fā)送報文段。
ip_output()函數使用ip_route()查找適當的網絡接口來傳送數據包。外發(fā)網絡接口確定后,數據包傳給ip_output_if()進行IP頭字段的填充以及IP校驗和的計算,然后調用netif->output()函數(協(xié)議棧初始化時,該函數被初始化為low_level_ output()函數)進行數據包的物理層發(fā)送。在low_ level_output()中,pbuf中的數據被拷貝到發(fā)送緩沖區(qū),默認使用的是C庫的memcpy()函數,接著調用驅動函數發(fā)送數據。數據發(fā)送流程如圖1所示。
圖1 TCP協(xié)議數據發(fā)送流程
3.1 分析工具
Linux平臺上比較典型的性能分析工具是gprof[17]。gprof通過在編譯時在函數入口處插入計數器,來收集每個函數的被調用次數以及函數占用時間[18],進而找出程序中比較耗時的模塊。
3.2 測量方法
在PC機上運行TCP/IP調試工具NetAssist作為TCP服務端,接受客戶端的連接。在嵌入式Linux平臺下使用LwIP協(xié)議棧編寫TCP客戶端與服務端建立連接并發(fā)送數據,每次發(fā)送1000個數據包,每個包1024 Byte??蛻舳顺绦蚩偣策\行10次。
3.3 測量結果
使用gprof工具分析10次運行結果,得到各函數占用時間統(tǒng)計結果如圖2所示。
圖2 各函數占用時間
3.4 結果分析
在發(fā)送數據過程中,進行了2次內存拷貝:函數tcp_enqueue()調用MEMCPY()(默認采用C庫memcpy()函數實現)將應用程序數據拷貝到LwIP協(xié)議棧緩沖區(qū);函數low_level_output()調用memcpy()將pbuf中的數據拷貝到發(fā)送緩沖區(qū)。2次內存拷貝耗時百分比分別為20%和16%,占總時間的36%。可見,內存拷貝是制約LwIP協(xié)議棧實時性性能的瓶頸之一。
函數ethernet_send()調用驅動程序將發(fā)送緩沖區(qū)中的數據寫入Tx隊列,進而完成物理層的數據發(fā)送,其性能取決于驅動程序的效率以及網絡控制器的硬件性能。
API_EVENT通過信號量機制喚醒LwIP協(xié)議棧進程,占總時間的20%,其性能取決于操作系統(tǒng)對信號量機制的實現方式。
函數inet_chksum_pseudo()負責TCP包頭字段的校驗;inet_chksum()負責IP報文頭字段的校驗。2次校驗過程占總時間的11%,其效率與其本身算法實現方式以及CPU運算速度相關。
函數netconn_connect()負責與服務端建立連接,占總時間的5%,郵箱操作占總時間的4%,其余代碼的執(zhí)行占總時間的12%。
4.1 內存拷貝算法優(yōu)化
根據特定的體系架構,使用相應的匯編指令可以有效優(yōu)化內存拷貝算法。本文的LwIP協(xié)議棧運行于ARM體系架構下的嵌入式Linux平臺。ARM指令集中LDM(批量加載)和STM(批量存儲)指令可以實現在一組寄存器和一塊連續(xù)的內存單元之間傳送數據[19]。使用LDM/STM指令傳送內存數據對訪問的目標內存地址以及數據長度有限制,目標內存地址必須按字對齊,數據長度必須是一次傳送字節(jié)數的整數倍。緩沖區(qū)內存地址通常都是按字對齊的,而數據長度則因應用而異。當數據長度不是LDM/STM一次傳送字節(jié)數的整數倍時,可以先使用LDM/STM指令進行塊數據傳送,多余的字節(jié)使用LDRB/STRB指令傳送。程序流程如圖3所示。
圖3 ARM匯編指令內存拷貝流程
算法主要代碼如下:
算法ARM匯編指令內存拷貝算法
4.2 校驗算法優(yōu)化
在LwIP中,校驗函數inet_chksum_pseudo()與inet_chksum()都是通過循環(huán)調用LwIP協(xié)議棧內置校驗函數LwIP_standard_chksum()實現的。LwIP_ standard_chksum()有3種不同的實現方式,可以通過對宏LwIP_CHKSUM_ALGORITHM定義不同的值來選擇合適的校驗算法。3種校驗算法復雜度依次降低,校驗強度也依次減弱。
LwIP默認選擇第1種校驗算法。該算法計算每個字節(jié)的校驗和,校驗強度高,但比較耗時?;趨f(xié)議棧對實時性的要求,本文選擇第3種校驗算法。該算法使用循環(huán)展開的校驗方式,對數據包頭部和尾部字節(jié)進行特殊處理,并在一次內循環(huán)的校驗過程中,同時對8個字節(jié)的校驗和進行計算,大大提高了校驗效率。
4.3 優(yōu)先級管理機制
在實時性有嚴格要求的應用中,往往出現特定的緊急數據(比如警示信息等)需要以更高的優(yōu)先級發(fā)送到網絡上的情況,但LwIP并沒有提供這樣的傳輸機制?;谶@種需求,本文通過在LwIP協(xié)議棧IP層定義緊急數據等待隊列和普通數據等待隊列的方式,建立了LwIP協(xié)議棧優(yōu)先級管理機制。當應用程序使用帶有優(yōu)先級參數的發(fā)送函數發(fā)送數據時,數據被提交到IP層,通過測試DSCP字段獲得數據包的優(yōu)先級,進而將數據包指針放到對應的等待隊列。當網絡接口層發(fā)送函數空閑時,優(yōu)先發(fā)送緊急隊列中的數據包,緊急隊列為空再發(fā)送普通隊列中的數據包。
優(yōu)先級管理機制主要采用一個互斥信號量eth_ available和一對等待隊列emergency_wait_queue與common_wait_queue實現。等待隊列通過循環(huán)隊列方式實現,如圖4所示,C語言描述如下:
圖4 等待隊列
互斥信號量eth_available分別用于函數ip_ output()與low_level_output(),為0表示網絡接口層發(fā)送函數正忙,為1表示空閑。函數ip_output()調用ip_output_if()發(fā)送數據之前對eth_available進行PEND操作;函數low_level_output()調用底層驅動發(fā)送數據幀之后對eth_available進行POST操作。
當數據進入IP層時,函數ip_output()通過檢查參數tos確定數據的優(yōu)先級,根據數據優(yōu)先級將數據包指針放到對應的等待隊列的rear處,然后通過PEND eth_available測試當前網絡接口層發(fā)送函數狀態(tài)。如果空閑,則檢查緊急隊列是否為空,如果不為空,則發(fā)送緊急隊列中head處數據包,如果為空則發(fā)送普通隊列中head處數據包;如果網絡接口層發(fā)送函數正忙,則將進程掛起,等待喚醒。LwIP優(yōu)先級管理機制流程如圖5所示。
圖5 LwIP優(yōu)先級管理機制流程
測試目的:對比LwIP優(yōu)化前響應速度,優(yōu)化后普通數據響應速度以及優(yōu)化后緊急數據響應速度。
測試平臺:PC端搭載Windows XP操作系統(tǒng),運行TCP/IP調試工具NetAssist;開發(fā)板搭載嵌入式Linux操作系統(tǒng),以優(yōu)化前后的LwIP作為TCP/IP協(xié)議棧,運行測試程序。
測試方法:在不同的網絡負載下,測試程序向PC端發(fā)送數據包,通過記錄應用程序調用協(xié)議棧發(fā)送函數以及驅動程序在物理層發(fā)出數據2個時刻的系統(tǒng)時間來計算LwIP協(xié)議棧響應時間。網絡負載大小由測試程序發(fā)送數據包的頻率控制。測試程序以固定的頻率向PC上的服務端發(fā)送數據包,數據包大小為1024 Byte,一次會話發(fā)送1000個數據包,通過對每個數據包的響應時間進行算數平均得到協(xié)議棧平均響應時間。在發(fā)送普通數據的過程中隨機插入緊急數據并對其響應時間進行測試可以得到優(yōu)化后的LwIP緊急數據的響應時間。
測試結果:測試結果如表1所示,結果對比如圖6所示。
表1 LwIP協(xié)議棧響應時間μs
圖6 LwIP協(xié)議棧響應時間對比
測試結果顯示,在相同的網絡負載情況下,優(yōu)化后的LwIP協(xié)議棧比優(yōu)化前響應時間少12%~32%。網絡負載較小時,LwIP優(yōu)化前后的響應時間相差不大,約為12%;網絡負載較大時,優(yōu)化后的LwIP響應時間明顯小于優(yōu)化前,約為32%。此外,優(yōu)化后的協(xié)議棧緊急數據的響應時間隨網絡負載的增加變化較小,可見緊急數據具有更高的優(yōu)先級。
隨著科技的發(fā)展,嵌入式系統(tǒng)和網絡技術結合得越來越緊密,網絡化將成為嵌入式設備的發(fā)展趨勢。在此背景下,對嵌入式TCP/IP協(xié)議棧的性能進行優(yōu)化,具有重要的意義。本文針對嵌入式系統(tǒng)對LwIP實時性的要求,通過實驗分析協(xié)議棧性能瓶頸,采用3種優(yōu)化方式,實現LwIP協(xié)議棧實時性能優(yōu)化。
[1] 許 剛.基于ARM11的嵌入式視頻采集系統(tǒng)設計[J].測控技術,2013,32(12):37-40.
[2] 王建平,周辰飛,朱程輝,等.一種ZigBee-TCP/IP無縫網關模型[J].合肥工業(yè)大學學報:自然科學版,2013, 36(9):1058-1062.
[3] 陳華兵.基于μC/OS-Ⅱ網絡模塊的擴展及任務調度算法的研究[D].武漢:武漢理工大學,2007.
[4] 郭傳雄,鄭少仁.對Linux操作系統(tǒng)中TCP/IP網絡協(xié)議的IP層排隊分析[J].計算機學報,2001,24(5): 860-865.
[5] 韓德強,楊淇善,王宗俠,等.基于μC/OS-Ⅲ的LwIP協(xié)議棧的移植與實現[J].電子技術應用,2013, 39(5):18-21.
[6] Dunkels A.Design and Implementation of the LwIP TCP/IPStack[D].Stockholm,Sweden:Swedish Institute of Computer Science,2001.
[7] 張 齊,勞熾元.輕量級協(xié)議棧LWIP的分析與改進[J].計算機工程與設計,2010,31(10):2169-2171.
[8] 周海瑞.嵌入式TCP/IP協(xié)議棧的設計與實現[D].西安:西北工業(yè)大學,2007.
[9] 孫鶴旭,邵 巖,邢關生,等.移動機器人網絡的嵌入式Web系統(tǒng)設計[J].計算機工程,2013,39(9):134-136.
[10] 楊高峰,顧春華.基于LwIP的ICMP路由重定向改進[J].北京聯合大學學報:自然科學版,2009,23(1): 39-42.
[11] 湯維維.數字機頂盒以太網接入的設計與實現[D].武漢:武漢理工大學,2008.
[12] 李良仁,彭雪峰.LwIP協(xié)議棧在NIOSⅡ系統(tǒng)中的移植[J].機電技術,2009,25(4):25-28.
[13] 張 潔,傅 明.LwIP協(xié)議棧在嵌入式Linux下的移植與實現[J].微計算機信息,2011,27(4):94-96.
[14] 馮彥君,孫利民,錢華林,等.MANET中TCP改進研究綜述[J].軟件學報,2005,16(3):434-444.
[15] Liu Guoping,Sun Jian,Zhao Yunbo.Design,Analysis and Real-time Implementation of Networked Predictive Control Systems[J].Acta Automatica Sinica,2013, 39(11):1769-1777.
[16] 蔡雄飛,王新華,郭淑琴.嵌入式TCP/IP協(xié)議LwIP的內存管理機制研究[J].杭州電子科技大學學報, 2012,32(4):118-121.
[17] 孫曉穎,曾文藝.基于Gprof的函數調用順序研究[J].微計算機信息,2010,26(12):121-124.
[18] 張惠臻,王 超,陳 雁.嵌入式軟件性能分析方法研究與工具設計[J].計算機應用與軟件,2013,30(10): 284-287.
[19] 魏 強,金 然,王清賢.基于中間匯編的緩沖區(qū)溢出檢測模型[J].計算機工程,2009,35(3):169-172.
編輯 顧逸斐
Analysis and Optimization of Lightweight TCP/IP Protocol Stack Mechanism
YUAN Zhongshu,LU Yang
(School of Computer and Information,Hefei University of Technology,Hefei 230009,China)
Lightweight TCP/IP protocol stack(LwIP)is mainly used in resource-constrained embedded devices.In order to meet the real-time requirement of the embedded device,this paper analyzes the internal mechanism of LwIP, conducts a performance bottleneck analysis by experimental measurements,and designs the optimization program of LwIP.The main performance bottlenecks of LwIP are memory copy and verification process.Accordingly,the optimized algorithms of memory copy and checksum are presented.Additionally,in order to meet the higher priority requirement of the urgent data,this paper presents the management mechanism of the priority,and ensures that the emergency packets take precedence over ordinary data packets.Experimental tests are presented to prove that these optimization methods improve the real-time performance of LwIP.
Lightweight TCP/IP protocol stack(LwIP);embedded;real-time;optimization;priority;wait queue
袁中書,陸 陽.輕量級TCP/IP協(xié)議棧機制分析與優(yōu)化[J].計算機工程,2015,41(2):317-321.
英文引用格式:Yuan Zhongshu,Lu Yang.Analysis and Optimization of Lightweight TCP/IP Protocol Stack Mechanism[J]. Computer Engineering,2015,41(2):317-321.
1000-3428(2015)02-0317-05
:A
:TP393
10.3969/j.issn.1000-3428.2015.02.061
安徽省科技攻關計劃基金資助重大項目(11010201011)。
袁中書(1988-),男,碩士研究生,主研方向:嵌入式系統(tǒng);陸 陽,教授。
2014-02-27
:2014-03-26E-mail:yuanzhongshu_1988@163.com