LwIP协议栈的内部数据管理方法研究

2024-04-13 02:57颜晨陈翔孙云华
自动化与信息工程 2024年1期
关键词:数据存储数据管理

颜晨 陈翔 孙云华

本文引用格式:颜晨,陈翔,孙云华.LwIP协议栈的内部数据管理方法研究[J].自动化与信息工程,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作为轻量化的网络协议栈在嵌入式设备中应用广泛。该文研究LwIP协议栈的内部数据管理方法,以便更好地应用及开发新的协议栈。首先,介绍LwIP协议栈的数据存储方法,并与FreeRTOS存储方法进行对比;然后,针对网络设备传输能力不同造成的数据包分片问题,探讨LwIP协议栈组成完整数据包采用的数据管理方法;最后,研究LwIP协议栈在TCP层的软件设计思路。

关键词:LwIP协议栈;内存管理;数据管理;数据存储

中图分类号:TP316.8             文献标志码:A          文章编号: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  引言

隨着物联网的快速发展,智能设备让人们的生活更加便利、高效和智慧化。智能设备的正常运行需要网络协议栈的支持。LwIP作为轻量化的网络协议栈,可以在20 kB RAM和40 kB ROM的存储设备上运 行[1-3],硬件要求低,功能齐全,且开源免费,相较于其他轻量化的网络协议栈具有更广泛的应用前景[4]。

轻量化的网络协议栈基本可以实现TCP/IP功能,研究其数据管理方法既可以在开发其他协议栈时借鉴数据管理思路,又有助于处理数据传输方面的问题。

目前,国内外很少有文献全面地描述LwIP协议栈的数据管理方法。本文介绍LwIP协议栈的数据存储方法,并与FreeRTOS存储方法进行对比;分析LwIP协议栈IP层为收到完整的分片数据而设计的数据结构;阐述TCP层为接收窗口内的数据包而使用的挂载方式,并用分层结构揭示了TCP层发送数据时的存储方式。

1  LwIP协议栈的数据存储方法

因为嵌入式系统的内存空间有限,所以TCP/IP协议栈的缓冲区管理是协议实现的关键[5-7]。LwIP协议栈主要采用的动态内存池和动态内存堆[8]从本质上看都是从RAM中分配的数组。

动态内存池是根据LwIP协议栈需要的数据结构体来分配的不同大小数组,且每种池内的连续内存是单链表连接,各种池的基地址存放在一个数组内,方便索引,结构如图1所示。

LwIP协议栈有许多固定的数据结构,使用这些固定的数据结构空间时,动态内存池可快速地提供所需的内存地址。当数据结构的空间需回收时,动态内存池只要找到这种数据结构的动态内存池链表头,将数据结构的内存指针放进去即可。该方法无需进行地址的比较判断和内存合并,分配效率较高,不会产生碎片,适用于固定的数据结构管理。

动态内存堆是一个较大的数组,其大小可由用户定义,分配后的内存地址由双链表进行连接。为快速得到所需内存,需对内存的地址和大小进行对齐。双链表的节点记录了前后节点的位置,且节点不管是否使用都会出现在链表上。内存管理结构体采用used变量来标记该内存是否使用。当需要回收内存时,如果该内存前后没有空闲内存,只需要改变used变量值;如果该内存前后有空闲内存,除改变used变量值外,还需要合并前后的内存来减少内存碎片[9]。利用节点的前后指针能调整双链表的指针,从而合并空闲内存。

目前,FreeRTOS有5种内存堆管理机制可供用户选择[10-12],其中,heap_4.c的内存堆管理机制应用较为广泛。其采用最佳匹配算法和合并算法,利用单链表把未使用的内存地址连接起来。在取内存时,切割所需的内存后,若剩余的内存满足最小容量,从低地址开始查找,找到合适的位置后,重新放入空闲的内存链表中[13]。回收内存时也需从低地址开始查找合适的位置,并根据该内存的地址和大小,计算前后内存是否与该内存相邻,若相邻,则进行合并。

LwIP协议栈、FreeRTOS的内存合并方法分别如图2、3所示。

由图2、3可知:FreeRTOS内存管理结构简单(单链表),但当FreeRTOS取内存和回收内存时,除切割剩余的内存大小外,还需要把内存地址按从低到高的顺序插入空闲链表中,并计算其与前后内存是否相邻,若相邻则进行合并;而LwIP协议栈采用双链表,取内存时只需在链表内增加一个节点,回收内存时无需计算前后内存是否相邻。

2  IP层对数据包分片的接收处理

LwIP协议栈利用动态内存来存放接收的数据,并采用pbuf結构体进行管理。Pbuf结构体既能兼容各种类型的数据,又能避免LwIP协议栈各层之间拷贝数据[14-16]。网络中有不同类型的数据包分片,这些数据包分片可能不会按顺序到达LwIP协议栈。为此,LwIP协议栈设计了两条链表:一条链表挂载不同类型数据包分配的ip_reassdata结构体;另一条链表挂载同一个数据包内的分片数据。LwIP协议栈分片重装数据结构如图4所示。

对于排序数据包分片的管理,LwIP协议栈利用指针串起数据包分片,且数据包分片需携带相对原数据的偏移量来进行排序。LwIP协议栈没有额外占用内存申请变量记录上述数据,而是在pbuf中使用ip_reass_helper结构体,把IP层分片数据首部的前8个字节转换为下一个分片的指针next_pbuf、此分片相对原始数据的偏移量start和结束位置end。这样在排序过程中,节约了额外申请管理结构体的时间和空间。在排序完成后,只要把首个pbuf数据的首部复原,其他分片pbuf只要调整payload位置即可。这样IP层在提交给上层所需数据的同时,过滤了转换的字节。IP层处理完数据包分片后的pbuf链如图5所示。

3  TCP层数据处理方式

为确保收到的数据完整、准确,TCP层做了可靠的传输服务,包括超时重传、快速重传等。这些服务依赖于发送、接收数据的精细管理,要求数据不能丢失和错乱。

3.1  TCP层接收数据

在接收数据的过程中,IP层重点关注接收的数据包是否完整,而TCP层重点关注接收的数据包是否连续,因此,TCP层会对数据包中的数据进行编号。IP层提交pbuf数据时,TCP层利用tcp_seg结构体记录pbuf数据中的关键数据,且挂载pbuf数据;同时利用一条ooseq链表,按照序号顺序挂载tcp_seg结构体。tcp_seg结构体中数据包序号在TCP层接收窗口内。TCP层ooseq链表挂载结构如图6所示。

TCP层数据包接收示意图如图7所示。

由图7可知,若收到的数据包不是TCP层期望的下一个数据,但满足其接收范围时,会挂在ooseq链表上;若下一个数据既包含了TCP层期望的数据,又包含了ooseq链表上的数据,那么这个数据两头被截断,与ooseq链表上的数据组成TCP层期望的数据流交给应用层。

TCP层接收数据的方式与IP层组装数据包不同,IP层利用ip_reass_helper结构体记录数据结束位置end,为抛弃有重复字节的数据包分片提供了便利。TCP层利用序号和长度组装数据包,方便对重复字节进行截取并重组数据流。

3.2  TCP层发送数据

在发送数据时,TCP层为了尽可能多地发送符合要求的数据,利用tcp_seg来管理数据,通过unsend链表来挂载tcp_seg。因为应用层要发送的数据量不确定,为了在发送数据前尽可能多地装载数据和减少装载时间,设计了三层数据拷贝空间。

第一层,tcp_seg管理的数据量是通信对方可以接受的。

第二层,应用层把数据拷贝到LwIP协议栈时,协议栈会申请尽可能大的内存,内存大小是一条报文携带的最大数据量和一个tcp_seg携带的剩余数据量的最小值。当不需要数据拷贝时,则无需申请应用层的数据空间,也就没有第三层空间。

第三层,把应用层数据放入申请的数据包空间后所剩余的内存空间。

拷贝数据的空间分布如图8所示,不拷贝数据的空间分布如图9所示。

3.3  TCP层软件设计

在TCP层软件设计方面,LwIP协议栈采用了分批装载后再组装的方法。

1) 根据数据大小,分批装载最多分为三步:

第一步,占用第三层空间;

第二步,当数据存放空间不够时,pbuf申请占用第二层空间并存放数据;

第三步,当数据存放空间还不够时,tcp_seg和pbuf申请占用第一层空间存放数据。

2) 根据装载使用的空间,组装最多分为三步:

第一步,将数据存放在第三层空间;

第二步,连接pbuf;

第三步,连接tcp_seg。

该方法既适用于拷贝数据的情况,又适用于不拷贝数据的情况,且满足一条数据帧尽可能地多发数据的要求,也为下层整理好需要发送的数据,方便随时发送。在拷贝数据时,不用每次申请空间;不拷贝数据时,直接申请pbuf结构体来挂载合适的数据量。

4  结束语

本文以LwIP轻量化网络协议栈为研究对象,主要分析了其内部数据的管理方法,包括数据的存储方法、IP层对数据包分片的接收处理方法以及TCP层对数据的处理方法。从LwIP协议栈中揭示数据管理思想,希望可以加深对数据结构设计的理解,从而有助于LwIP协议栈的应用和新协议栈的开发。

参考文献

[1] DUNKELS A. Design and implementation of the LwIP TCP/IP stack[M]. Kista, Swedish Institute of Computer Science, 2001.

[2] 来爱华,卢军,游继安.基于LwIP协议的多点控制系统研究[J].湖北工程学院学报,2016,36(3):28-33.

[3] 张杰建,陈志裕,党书东,等.基于光纤以太网技术的电梯机房与轿厢间通信研究[J].机电工程技术,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] 鄧会敏,贺再红,谭怀亮.嵌入式协议栈缓冲区管理的简化实现方法[J].微计算机信息,2006,22(29):166-169.

[6] 苗大龙,李果,张广明,等.基于AT89C51RC的以太网数据采集器设计与实现[J].机床与液压,2011,39(2): 101-103;84.

[7] 李阳,范文慧,刘姝玉,等.大规模自组网动态时隙分配算法测试[J].中国测试,2023,49(10):34-39.

[8] 蔡雄飞,王新华,郭淑琴.嵌入式TCP/IP协议LwIP的内存管理机制研究[A].浙江省信号处理学会.浙江省信号处理学会2012学术年会论文集[C].浙江省信号处理学会,2012:4.

[9] SUNG W. Memory management method in embedded system: U.S. Patent 9,317,425[P]. 2016-4-19.

[10] 刘火良,杨森. FreeRTOS内核实现与应用开发实战指南(基于STM32)[M].北京:机械工业出版社,2019.

[11] 彭小松,关叶佳,王楚虹.仿真人手同步远程控制机械手设计[J].机电工程技术,2021,50(6):151-154.

[12] 安嘉强,汤晓华,刘美莲,等.基于ARM-MCX514的机器人-数控协同系统运动控制器设计[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] 朱升林.嵌入式网络那些事[M].北京:中国水利水电出版社, 2012.

[15] 薛建彬,郭燕波,许洋,等.LwIP在微控制系统中的移植与应用[J].数字技术与应用,2016(10):2.

[16] 胡畔,聂祺昕,刘晓强,等.基于离散域采样数据模型的电力移动终端边缘节点数据采集系统设计[J].中国测试,2022, 48(8):144-149.

作者简介:

颜晨,男,1992年生,硕士研究生,工程师,主要研究方向:嵌入式系统及通信网络。E-mail: hhyanchen@qq.com

猜你喜欢
数据存储数据管理
企业级BOM数据管理概要
定制化汽车制造的数据管理分析
海洋环境数据管理优化与实践
CTCS-2级报文数据管理需求分析和实现
列控数据管理平台的开发
大数据时代档案信息建设的认识和实践
开源数据库数据存储的实现路径分析
基于Android开发的APP数据存储研究
哈希算法在物联网数据存储中的应用
大型在线式UPS及监控系统在中控机房的应用