顏晨 陳翔 孫云華
本文引用格式:顏晨,陳翔,孫云華.LwIP協(xié)議棧的內(nèi)部數(shù)據(jù)管理方法研究[J].自動(dòng)化與信息工程,2024,45(1):18-22.
YAN Chen, CHEN Xiang, SUN Yunhua. Study on the internal data management methods of LwIP protocol stack[J]. Automation & Information Engineering, 2024,45(1):18-22.
摘要:LwIP作為輕量化的網(wǎng)絡(luò)協(xié)議棧在嵌入式設(shè)備中應(yīng)用廣泛。該文研究LwIP協(xié)議棧的內(nèi)部數(shù)據(jù)管理方法,以便更好地應(yīng)用及開發(fā)新的協(xié)議棧。首先,介紹LwIP協(xié)議棧的數(shù)據(jù)存儲(chǔ)方法,并與FreeRTOS存儲(chǔ)方法進(jìn)行對(duì)比;然后,針對(duì)網(wǎng)絡(luò)設(shè)備傳輸能力不同造成的數(shù)據(jù)包分片問題,探討LwIP協(xié)議棧組成完整數(shù)據(jù)包采用的數(shù)據(jù)管理方法;最后,研究LwIP協(xié)議棧在TCP層的軟件設(shè)計(jì)思路。
關(guān)鍵詞:LwIP協(xié)議棧;內(nèi)存管理;數(shù)據(jù)管理;數(shù)據(jù)存儲(chǔ)
中圖分類號(hào):TP316.8? ? ? ? ? ? ?文獻(xiàn)標(biāo)志碼:A? ? ? ? ? 文章編號(hào):1674-2605(2024)01-0003-05
DOI:10.3969/j.issn.1674-2605.2024.01.003
Study on the Internal Data Management Methods of LwIP Protocol Stack
YAN Chen? CHEN Xiang? SUN Yunhua
(China Key System & Integrated Circuit Co., Ltd., Wuxi 214072, China)
Abstract: LwIP is widely used as a lightweight network protocol stack in embedded devices. This article studies the internal data management methods of the LwIP protocol stack in order to better apply and develop new protocol stacks. Firstly, introduce the data storage method of the LwIP protocol stack and compare it with the FreeRTOS storage method; Then, in response to the data packet fragmentation problem caused by different transmission capabilities of network devices, explore the data management methods used to form a complete data packet using the LwIP protocol stack; Finally, study the software design approach of the LwIP protocol stack at the TCP layer.
Keywords: light weight IP (LwIP); memory management; data management; data storage
0? 引言
隨著物聯(lián)網(wǎng)的快速發(fā)展,智能設(shè)備讓人們的生活更加便利、高效和智慧化。智能設(shè)備的正常運(yùn)行需要網(wǎng)絡(luò)協(xié)議棧的支持。LwIP作為輕量化的網(wǎng)絡(luò)協(xié)議棧,可以在20 kB RAM和40 kB ROM的存儲(chǔ)設(shè)備上運(yùn) 行[1-3],硬件要求低,功能齊全,且開源免費(fèi),相較于其他輕量化的網(wǎng)絡(luò)協(xié)議棧具有更廣泛的應(yīng)用前景[4]。
輕量化的網(wǎng)絡(luò)協(xié)議棧基本可以實(shí)現(xiàn)TCP/IP功能,研究其數(shù)據(jù)管理方法既可以在開發(fā)其他協(xié)議棧時(shí)借鑒數(shù)據(jù)管理思路,又有助于處理數(shù)據(jù)傳輸方面的問題。
目前,國內(nèi)外很少有文獻(xiàn)全面地描述LwIP協(xié)議棧的數(shù)據(jù)管理方法。本文介紹LwIP協(xié)議棧的數(shù)據(jù)存儲(chǔ)方法,并與FreeRTOS存儲(chǔ)方法進(jìn)行對(duì)比;分析LwIP協(xié)議棧IP層為收到完整的分片數(shù)據(jù)而設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu);闡述TCP層為接收窗口內(nèi)的數(shù)據(jù)包而使用的掛載方式,并用分層結(jié)構(gòu)揭示了TCP層發(fā)送數(shù)據(jù)時(shí)的存儲(chǔ)方式。
1? LwIP協(xié)議棧的數(shù)據(jù)存儲(chǔ)方法
因?yàn)榍度胧较到y(tǒng)的內(nèi)存空間有限,所以TCP/IP協(xié)議棧的緩沖區(qū)管理是協(xié)議實(shí)現(xiàn)的關(guān)鍵[5-7]。LwIP協(xié)議棧主要采用的動(dòng)態(tài)內(nèi)存池和動(dòng)態(tài)內(nèi)存堆[8]從本質(zhì)上看都是從RAM中分配的數(shù)組。
動(dòng)態(tài)內(nèi)存池是根據(jù)LwIP協(xié)議棧需要的數(shù)據(jù)結(jié)構(gòu)體來分配的不同大小數(shù)組,且每種池內(nèi)的連續(xù)內(nèi)存是單鏈表連接,各種池的基地址存放在一個(gè)數(shù)組內(nèi),方便索引,結(jié)構(gòu)如圖1所示。
LwIP協(xié)議棧有許多固定的數(shù)據(jù)結(jié)構(gòu),使用這些固定的數(shù)據(jù)結(jié)構(gòu)空間時(shí),動(dòng)態(tài)內(nèi)存池可快速地提供所需的內(nèi)存地址。當(dāng)數(shù)據(jù)結(jié)構(gòu)的空間需回收時(shí),動(dòng)態(tài)內(nèi)存池只要找到這種數(shù)據(jù)結(jié)構(gòu)的動(dòng)態(tài)內(nèi)存池鏈表頭,將數(shù)據(jù)結(jié)構(gòu)的內(nèi)存指針放進(jìn)去即可。該方法無需進(jìn)行地址的比較判斷和內(nèi)存合并,分配效率較高,不會(huì)產(chǎn)生碎片,適用于固定的數(shù)據(jù)結(jié)構(gòu)管理。
動(dòng)態(tài)內(nèi)存堆是一個(gè)較大的數(shù)組,其大小可由用戶定義,分配后的內(nèi)存地址由雙鏈表進(jìn)行連接。為快速得到所需內(nèi)存,需對(duì)內(nèi)存的地址和大小進(jìn)行對(duì)齊。雙鏈表的節(jié)點(diǎn)記錄了前后節(jié)點(diǎn)的位置,且節(jié)點(diǎn)不管是否使用都會(huì)出現(xiàn)在鏈表上。內(nèi)存管理結(jié)構(gòu)體采用used變量來標(biāo)記該內(nèi)存是否使用。當(dāng)需要回收內(nèi)存時(shí),如果該內(nèi)存前后沒有空閑內(nèi)存,只需要改變used變量值;如果該內(nèi)存前后有空閑內(nèi)存,除改變used變量值外,還需要合并前后的內(nèi)存來減少內(nèi)存碎片[9]。利用節(jié)點(diǎn)的前后指針能調(diào)整雙鏈表的指針,從而合并空閑內(nèi)存。
目前,F(xiàn)reeRTOS有5種內(nèi)存堆管理機(jī)制可供用戶選擇[10-12],其中,heap_4.c的內(nèi)存堆管理機(jī)制應(yīng)用較為廣泛。其采用最佳匹配算法和合并算法,利用單鏈表把未使用的內(nèi)存地址連接起來。在取內(nèi)存時(shí),切割所需的內(nèi)存后,若剩余的內(nèi)存滿足最小容量,從低地址開始查找,找到合適的位置后,重新放入空閑的內(nèi)存鏈表中[13]?;厥諆?nèi)存時(shí)也需從低地址開始查找合適的位置,并根據(jù)該內(nèi)存的地址和大小,計(jì)算前后內(nèi)存是否與該內(nèi)存相鄰,若相鄰,則進(jìn)行合并。
LwIP協(xié)議棧、FreeRTOS的內(nèi)存合并方法分別如圖2、3所示。
由圖2、3可知:FreeRTOS內(nèi)存管理結(jié)構(gòu)簡單(單鏈表),但當(dāng)FreeRTOS取內(nèi)存和回收內(nèi)存時(shí),除切割剩余的內(nèi)存大小外,還需要把內(nèi)存地址按從低到高的順序插入空閑鏈表中,并計(jì)算其與前后內(nèi)存是否相鄰,若相鄰則進(jìn)行合并;而LwIP協(xié)議棧采用雙鏈表,取內(nèi)存時(shí)只需在鏈表內(nèi)增加一個(gè)節(jié)點(diǎn),回收內(nèi)存時(shí)無需計(jì)算前后內(nèi)存是否相鄰。
2? IP層對(duì)數(shù)據(jù)包分片的接收處理
LwIP協(xié)議棧利用動(dòng)態(tài)內(nèi)存來存放接收的數(shù)據(jù),并采用pbuf結(jié)構(gòu)體進(jìn)行管理。Pbuf結(jié)構(gòu)體既能兼容各種類型的數(shù)據(jù),又能避免LwIP協(xié)議棧各層之間拷貝數(shù)據(jù)[14-16]。網(wǎng)絡(luò)中有不同類型的數(shù)據(jù)包分片,這些數(shù)據(jù)包分片可能不會(huì)按順序到達(dá)LwIP協(xié)議棧。為此,LwIP協(xié)議棧設(shè)計(jì)了兩條鏈表:一條鏈表掛載不同類型數(shù)據(jù)包分配的ip_reassdata結(jié)構(gòu)體;另一條鏈表掛載同一個(gè)數(shù)據(jù)包內(nèi)的分片數(shù)據(jù)。LwIP協(xié)議棧分片重裝數(shù)據(jù)結(jié)構(gòu)如圖4所示。
對(duì)于排序數(shù)據(jù)包分片的管理,LwIP協(xié)議棧利用指針串起數(shù)據(jù)包分片,且數(shù)據(jù)包分片需攜帶相對(duì)原數(shù)據(jù)的偏移量來進(jìn)行排序。LwIP協(xié)議棧沒有額外占用內(nèi)存申請(qǐng)變量記錄上述數(shù)據(jù),而是在pbuf中使用ip_reass_helper結(jié)構(gòu)體,把IP層分片數(shù)據(jù)首部的前8個(gè)字節(jié)轉(zhuǎn)換為下一個(gè)分片的指針next_pbuf、此分片相對(duì)原始數(shù)據(jù)的偏移量start和結(jié)束位置end。這樣在排序過程中,節(jié)約了額外申請(qǐng)管理結(jié)構(gòu)體的時(shí)間和空間。在排序完成后,只要把首個(gè)pbuf數(shù)據(jù)的首部復(fù)原,其他分片pbuf只要調(diào)整payload位置即可。這樣IP層在提交給上層所需數(shù)據(jù)的同時(shí),過濾了轉(zhuǎn)換的字節(jié)。IP層處理完數(shù)據(jù)包分片后的pbuf鏈如圖5所示。
3? TCP層數(shù)據(jù)處理方式
為確保收到的數(shù)據(jù)完整、準(zhǔn)確,TCP層做了可靠的傳輸服務(wù),包括超時(shí)重傳、快速重傳等。這些服務(wù)依賴于發(fā)送、接收數(shù)據(jù)的精細(xì)管理,要求數(shù)據(jù)不能丟失和錯(cuò)亂。
3.1? TCP層接收數(shù)據(jù)
在接收數(shù)據(jù)的過程中,IP層重點(diǎn)關(guān)注接收的數(shù)據(jù)包是否完整,而TCP層重點(diǎn)關(guān)注接收的數(shù)據(jù)包是否連續(xù),因此,TCP層會(huì)對(duì)數(shù)據(jù)包中的數(shù)據(jù)進(jìn)行編號(hào)。IP層提交pbuf數(shù)據(jù)時(shí),TCP層利用tcp_seg結(jié)構(gòu)體記錄pbuf數(shù)據(jù)中的關(guān)鍵數(shù)據(jù),且掛載pbuf數(shù)據(jù);同時(shí)利用一條ooseq鏈表,按照序號(hào)順序掛載tcp_seg結(jié)構(gòu)體。tcp_seg結(jié)構(gòu)體中數(shù)據(jù)包序號(hào)在TCP層接收窗口內(nèi)。TCP層ooseq鏈表掛載結(jié)構(gòu)如圖6所示。
TCP層數(shù)據(jù)包接收示意圖如圖7所示。
由圖7可知,若收到的數(shù)據(jù)包不是TCP層期望的下一個(gè)數(shù)據(jù),但滿足其接收范圍時(shí),會(huì)掛在ooseq鏈表上;若下一個(gè)數(shù)據(jù)既包含了TCP層期望的數(shù)據(jù),又包含了ooseq鏈表上的數(shù)據(jù),那么這個(gè)數(shù)據(jù)兩頭被截?cái)?,與ooseq鏈表上的數(shù)據(jù)組成TCP層期望的數(shù)據(jù)流交給應(yīng)用層。
TCP層接收數(shù)據(jù)的方式與IP層組裝數(shù)據(jù)包不同,IP層利用ip_reass_helper結(jié)構(gòu)體記錄數(shù)據(jù)結(jié)束位置end,為拋棄有重復(fù)字節(jié)的數(shù)據(jù)包分片提供了便利。TCP層利用序號(hào)和長度組裝數(shù)據(jù)包,方便對(duì)重復(fù)字節(jié)進(jìn)行截取并重組數(shù)據(jù)流。
3.2? TCP層發(fā)送數(shù)據(jù)
在發(fā)送數(shù)據(jù)時(shí),TCP層為了盡可能多地發(fā)送符合要求的數(shù)據(jù),利用tcp_seg來管理數(shù)據(jù),通過unsend鏈表來掛載tcp_seg。因?yàn)閼?yīng)用層要發(fā)送的數(shù)據(jù)量不確定,為了在發(fā)送數(shù)據(jù)前盡可能多地裝載數(shù)據(jù)和減少裝載時(shí)間,設(shè)計(jì)了三層數(shù)據(jù)拷貝空間。
第一層,tcp_seg管理的數(shù)據(jù)量是通信對(duì)方可以接受的。
第二層,應(yīng)用層把數(shù)據(jù)拷貝到LwIP協(xié)議棧時(shí),協(xié)議棧會(huì)申請(qǐng)盡可能大的內(nèi)存,內(nèi)存大小是一條報(bào)文攜帶的最大數(shù)據(jù)量和一個(gè)tcp_seg攜帶的剩余數(shù)據(jù)量的最小值。當(dāng)不需要數(shù)據(jù)拷貝時(shí),則無需申請(qǐng)應(yīng)用層的數(shù)據(jù)空間,也就沒有第三層空間。
第三層,把應(yīng)用層數(shù)據(jù)放入申請(qǐng)的數(shù)據(jù)包空間后所剩余的內(nèi)存空間。
拷貝數(shù)據(jù)的空間分布如圖8所示,不拷貝數(shù)據(jù)的空間分布如圖9所示。
3.3? TCP層軟件設(shè)計(jì)
在TCP層軟件設(shè)計(jì)方面,LwIP協(xié)議棧采用了分批裝載后再組裝的方法。
1) 根據(jù)數(shù)據(jù)大小,分批裝載最多分為三步:
第一步,占用第三層空間;
第二步,當(dāng)數(shù)據(jù)存放空間不夠時(shí),pbuf申請(qǐng)占用第二層空間并存放數(shù)據(jù);
第三步,當(dāng)數(shù)據(jù)存放空間還不夠時(shí),tcp_seg和pbuf申請(qǐng)占用第一層空間存放數(shù)據(jù)。
2) 根據(jù)裝載使用的空間,組裝最多分為三步:
第一步,將數(shù)據(jù)存放在第三層空間;
第二步,連接pbuf;
第三步,連接tcp_seg。
該方法既適用于拷貝數(shù)據(jù)的情況,又適用于不拷貝數(shù)據(jù)的情況,且滿足一條數(shù)據(jù)幀盡可能地多發(fā)數(shù)據(jù)的要求,也為下層整理好需要發(fā)送的數(shù)據(jù),方便隨時(shí)發(fā)送。在拷貝數(shù)據(jù)時(shí),不用每次申請(qǐng)空間;不拷貝數(shù)據(jù)時(shí),直接申請(qǐng)pbuf結(jié)構(gòu)體來掛載合適的數(shù)據(jù)量。
4? 結(jié)束語
本文以LwIP輕量化網(wǎng)絡(luò)協(xié)議棧為研究對(duì)象,主要分析了其內(nèi)部數(shù)據(jù)的管理方法,包括數(shù)據(jù)的存儲(chǔ)方法、IP層對(duì)數(shù)據(jù)包分片的接收處理方法以及TCP層對(duì)數(shù)據(jù)的處理方法。從LwIP協(xié)議棧中揭示數(shù)據(jù)管理思想,希望可以加深對(duì)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的理解,從而有助于LwIP協(xié)議棧的應(yīng)用和新協(xié)議棧的開發(fā)。
參考文獻(xiàn)
[1] DUNKELS A. Design and implementation of the LwIP TCP/IP stack[M]. Kista, Swedish Institute of Computer Science, 2001.
[2] 來愛華,盧軍,游繼安.基于LwIP協(xié)議的多點(diǎn)控制系統(tǒng)研究[J].湖北工程學(xué)院學(xué)報(bào),2016,36(3):28-33.
[3] 張杰建,陳志裕,黨書東,等.基于光纖以太網(wǎng)技術(shù)的電梯機(jī)房與轎廂間通信研究[J].機(jī)電工程技術(shù),2023,52(7):263-267.
[4] XIAO fang, LIN chen, HONG Zhiyin. The measurement and control system of agricultural greenhouse based on network[J]. Adv Mat Res,2014,3181(926-930):1488-1492.
[5] 鄧會(huì)敏,賀再紅,譚懷亮.嵌入式協(xié)議棧緩沖區(qū)管理的簡化實(shí)現(xiàn)方法[J].微計(jì)算機(jī)信息,2006,22(29):166-169.
[6] 苗大龍,李果,張廣明,等.基于AT89C51RC的以太網(wǎng)數(shù)據(jù)采集器設(shè)計(jì)與實(shí)現(xiàn)[J].機(jī)床與液壓,2011,39(2): 101-103;84.
[7] 李陽,范文慧,劉姝玉,等.大規(guī)模自組網(wǎng)動(dòng)態(tài)時(shí)隙分配算法測試[J].中國測試,2023,49(10):34-39.
[8] 蔡雄飛,王新華,郭淑琴.嵌入式TCP/IP協(xié)議LwIP的內(nèi)存管理機(jī)制研究[A].浙江省信號(hào)處理學(xué)會(huì).浙江省信號(hào)處理學(xué)會(huì)2012學(xué)術(shù)年會(huì)論文集[C].浙江省信號(hào)處理學(xué)會(huì),2012:4.
[9] SUNG W. Memory management method in embedded system: U.S. Patent 9,317,425[P]. 2016-4-19.
[10] 劉火良,楊森. FreeRTOS內(nèi)核實(shí)現(xiàn)與應(yīng)用開發(fā)實(shí)戰(zhàn)指南(基于STM32)[M].北京:機(jī)械工業(yè)出版社,2019.
[11] 彭小松,關(guān)葉佳,王楚虹.仿真人手同步遠(yuǎn)程控制機(jī)械手設(shè)計(jì)[J].機(jī)電工程技術(shù),2021,50(6):151-154.
[12] 安嘉強(qiáng),湯曉華,劉美蓮,等.基于ARM-MCX514的機(jī)器人-數(shù)控協(xié)同系統(tǒng)運(yùn)動(dòng)控制器設(shè)計(jì)[J].機(jī)床與液壓,2020,48(3): 58-62
[13] HE Wei, HE Jianzhong. Analysis and improvement on FreeRTOS memory management mechanism[J]. Computer Engineering, 2010,36(10):67-69.
[14] 朱升林.嵌入式網(wǎng)絡(luò)那些事[M].北京:中國水利水電出版社, 2012.
[15] 薛建彬,郭燕波,許洋,等.LwIP在微控制系統(tǒng)中的移植與應(yīng)用[J].數(shù)字技術(shù)與應(yīng)用,2016(10):2.
[16] 胡畔,聶祺昕,劉曉強(qiáng),等.基于離散域采樣數(shù)據(jù)模型的電力移動(dòng)終端邊緣節(jié)點(diǎn)數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)[J].中國測試,2022, 48(8):144-149.
作者簡介:
顏晨,男,1992年生,碩士研究生,工程師,主要研究方向:嵌入式系統(tǒng)及通信網(wǎng)絡(luò)。E-mail: hhyanchen@qq.com