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