APP下载

轻量级TCP/IP协议栈机制分析与优化

2015-01-06袁中书

计算机工程 2015年2期
关键词:调用队列校验

袁中书,陆 阳

(合肥工业大学计算机与信息学院,合肥230009)

轻量级TCP/IP协议栈机制分析与优化

袁中书,陆 阳

(合肥工业大学计算机与信息学院,合肥230009)

轻量级TCP/IP协议栈(LwIP)主要应用于资源受限的嵌入式设备。为满足嵌入式设备对实时性的要求,分析LwIP的内部机制,对其进行性能瓶颈分析,并根据分析结果设计、实施LwIP的实时性和优先级管理优化方案。LwIP的主要性能瓶颈是内存拷贝和校验过程,据此给出优化后的内存拷贝算法和校验算法。为满足紧急数据对更高优先级的要求,给出LwIP协议栈优先级管理机制,能够确保高优先级标记的紧急数据包优先传输于普通数据包。实验结果表明,该优化方法可以显著提高LwIP的实时性能。

轻量级TCP/IP协议栈;嵌入式;实时性;优化;优先级;等待队列

1 概述

随着嵌入式系统在工业控制领域的广泛应用和发展,以及控制系统的网络化发展趋势,嵌入式系统的网络特性越来越受到重视[1]。基于这种趋势,一些专门运行于嵌入式设备的TCP/IP协议栈应运而生,比较成熟的开源协议栈主要有LwIP、uIP、μC/ IP、TinyTcp等[2-3]。这些嵌入式协议栈均派生自BSD TCP/IP[4],实现了其最基本的通信功能。轻量级TCP/IP协议栈(Lightweight TCP/IP protocol stack,LwIP)[5]是一套用于嵌入式系统的开源TCP/ IP协议栈。LwIP可以移植到多种嵌入式操作系统上,如Linux,μCOS等,也可以在缺乏操作系统的裸机上独立运行。LwIP的主要目标是在保持TCP/IP协议主要功能的基础上减少存储器使用量和代码尺寸,以便适应资源有限的嵌入式环境[6]。为了满足嵌入式应用对TCP/IP协议栈实时性的要求,本文将在实验分析的基础上,给出LwIP协议栈实时优化方案,并对优化结果进行实验验证。

2 LwIP分析

2.1 LwIP与嵌入式系统的关系

为了提高可移植性,LwIP在协议栈和操作系统之间增加了一个操作系统模拟层[7]。操作系统模拟层使用统一的接口提供定时器、进程同步及消息传递机制等诸如此类的系统服务。消息传递通过一个被称作邮箱的机制来实现,投递到邮箱的消息被操作系统模拟层放到队列中直至其他进程将它们取出[8]。LwIP将所有协议驻留在同一个进程,应用程序既可以驻留在LwIP的进程中,也可以使用一个单独的进程[9]。应用程序与协议栈通信可以采用2种方式:(1)函数调用;(2)使用LwIP提供的API通过操作系统的邮箱等进行通信。

2.2 LwIP模块架构

LwIP的设计与实现采用了分层的结构,每层协议都作为一个独立的模块来实现,层与层之间通过接口函数进行通信[10-11]。LwIP主要由IP,ICMP, UDP和TCP模块组成[12],这些模块完成通信功能。除此之外,LwIP还包含一些辅助模块,例如操作系统模拟层、内存管理系统等[13]。

TCP协议为传输层协议,它为应用层提供可靠的面向连接的数据流服务[14]。TCP主要由6个函数组成,其中,tcp_write(),tcp_enqueue()与tcp_ output()对TCP输出过程进行处理,tcp_input(), tcp_process()与tcp_receive()对TCP输入过程进行处理。

UDP协议为应用层提供不可靠的无连接数据报服务[15]。发送UDP数据时,应用程序调用udp_ send()函数,该函数调用udp_output()完成udp头部添加等操作,然后数据被移交给ip_output_if(),进入IP层。接收时,IP层调用udp_input()函数检查UDP头部,找到对应的UDP PCB[16],然后调用recv()函数,通知应用层做进一步处理。

2.3 LwIP数据处理

以TCP协议发送数据过程为例详细分析LwIP数据处理流程。发送数据时,应用程序调用LwIP API接口函数LwIP_write(),LwIP_write()函数进一步调用LwIP提供给内嵌应用程序使用的API函数netconn_write()。该函数负责POST一个发送数据包消息到邮箱。

当协议栈接收到该消息时,调用tcp_write()函数,tcp_write()将控制权交给tcp_enqueue()。tcp_ enqueue()函数将应用程序数据拷贝到协议栈内部缓冲区,对发送数据进行分割与编号,封装进pbuf,然后调用tcp_output()检查当前窗口是否还有空间存放更多的数据,填充剩余TCP报头字段,计算TCP校验和,最后使用ip_output()发送报文段。

ip_output()函数使用ip_route()查找适当的网络接口来传送数据包。外发网络接口确定后,数据包传给ip_output_if()进行IP头字段的填充以及IP校验和的计算,然后调用netif->output()函数(协议栈初始化时,该函数被初始化为low_level_ output()函数)进行数据包的物理层发送。在low_ level_output()中,pbuf中的数据被拷贝到发送缓冲区,默认使用的是C库的memcpy()函数,接着调用驱动函数发送数据。数据发送流程如图1所示。

图1 TCP协议数据发送流程

3 性能瓶颈分析

3.1 分析工具

Linux平台上比较典型的性能分析工具是gprof[17]。gprof通过在编译时在函数入口处插入计数器,来收集每个函数的被调用次数以及函数占用时间[18],进而找出程序中比较耗时的模块。

3.2 测量方法

在PC机上运行TCP/IP调试工具NetAssist作为TCP服务端,接受客户端的连接。在嵌入式Linux平台下使用LwIP协议栈编写TCP客户端与服务端建立连接并发送数据,每次发送1000个数据包,每个包1024 Byte。客户端程序总共运行10次。

3.3 测量结果

使用gprof工具分析10次运行结果,得到各函数占用时间统计结果如图2所示。

图2 各函数占用时间

3.4 结果分析

在发送数据过程中,进行了2次内存拷贝:函数tcp_enqueue()调用MEMCPY()(默认采用C库memcpy()函数实现)将应用程序数据拷贝到LwIP协议栈缓冲区;函数low_level_output()调用memcpy()将pbuf中的数据拷贝到发送缓冲区。2次内存拷贝耗时百分比分别为20%和16%,占总时间的36%。可见,内存拷贝是制约LwIP协议栈实时性性能的瓶颈之一。

函数ethernet_send()调用驱动程序将发送缓冲区中的数据写入Tx队列,进而完成物理层的数据发送,其性能取决于驱动程序的效率以及网络控制器的硬件性能。

API_EVENT通过信号量机制唤醒LwIP协议栈进程,占总时间的20%,其性能取决于操作系统对信号量机制的实现方式。

函数inet_chksum_pseudo()负责TCP包头字段的校验;inet_chksum()负责IP报文头字段的校验。2次校验过程占总时间的11%,其效率与其本身算法实现方式以及CPU运算速度相关。

函数netconn_connect()负责与服务端建立连接,占总时间的5%,邮箱操作占总时间的4%,其余代码的执行占总时间的12%。

4 优化方法

4.1 内存拷贝算法优化

根据特定的体系架构,使用相应的汇编指令可以有效优化内存拷贝算法。本文的LwIP协议栈运行于ARM体系架构下的嵌入式Linux平台。ARM指令集中LDM(批量加载)和STM(批量存储)指令可以实现在一组寄存器和一块连续的内存单元之间传送数据[19]。使用LDM/STM指令传送内存数据对访问的目标内存地址以及数据长度有限制,目标内存地址必须按字对齐,数据长度必须是一次传送字节数的整数倍。缓冲区内存地址通常都是按字对齐的,而数据长度则因应用而异。当数据长度不是LDM/STM一次传送字节数的整数倍时,可以先使用LDM/STM指令进行块数据传送,多余的字节使用LDRB/STRB指令传送。程序流程如图3所示。

图3 ARM汇编指令内存拷贝流程

算法主要代码如下:

算法ARM汇编指令内存拷贝算法

4.2 校验算法优化

在LwIP中,校验函数inet_chksum_pseudo()与inet_chksum()都是通过循环调用LwIP协议栈内置校验函数LwIP_standard_chksum()实现的。LwIP_ standard_chksum()有3种不同的实现方式,可以通过对宏LwIP_CHKSUM_ALGORITHM定义不同的值来选择合适的校验算法。3种校验算法复杂度依次降低,校验强度也依次减弱。

LwIP默认选择第1种校验算法。该算法计算每个字节的校验和,校验强度高,但比较耗时。基于协议栈对实时性的要求,本文选择第3种校验算法。该算法使用循环展开的校验方式,对数据包头部和尾部字节进行特殊处理,并在一次内循环的校验过程中,同时对8个字节的校验和进行计算,大大提高了校验效率。

4.3 优先级管理机制

在实时性有严格要求的应用中,往往出现特定的紧急数据(比如警示信息等)需要以更高的优先级发送到网络上的情况,但LwIP并没有提供这样的传输机制。基于这种需求,本文通过在LwIP协议栈IP层定义紧急数据等待队列和普通数据等待队列的方式,建立了LwIP协议栈优先级管理机制。当应用程序使用带有优先级参数的发送函数发送数据时,数据被提交到IP层,通过测试DSCP字段获得数据包的优先级,进而将数据包指针放到对应的等待队列。当网络接口层发送函数空闲时,优先发送紧急队列中的数据包,紧急队列为空再发送普通队列中的数据包。

优先级管理机制主要采用一个互斥信号量eth_ available和一对等待队列emergency_wait_queue与common_wait_queue实现。等待队列通过循环队列方式实现,如图4所示,C语言描述如下:

图4 等待队列

互斥信号量eth_available分别用于函数ip_ output()与low_level_output(),为0表示网络接口层发送函数正忙,为1表示空闲。函数ip_output()调用ip_output_if()发送数据之前对eth_available进行PEND操作;函数low_level_output()调用底层驱动发送数据帧之后对eth_available进行POST操作。

当数据进入IP层时,函数ip_output()通过检查参数tos确定数据的优先级,根据数据优先级将数据包指针放到对应的等待队列的rear处,然后通过PEND eth_available测试当前网络接口层发送函数状态。如果空闲,则检查紧急队列是否为空,如果不为空,则发送紧急队列中head处数据包,如果为空则发送普通队列中head处数据包;如果网络接口层发送函数正忙,则将进程挂起,等待唤醒。LwIP优先级管理机制流程如图5所示。

图5 LwIP优先级管理机制流程

5 实验与分析

测试目的:对比LwIP优化前响应速度,优化后普通数据响应速度以及优化后紧急数据响应速度。

测试平台:PC端搭载Windows XP操作系统,运行TCP/IP调试工具NetAssist;开发板搭载嵌入式Linux操作系统,以优化前后的LwIP作为TCP/IP协议栈,运行测试程序。

测试方法:在不同的网络负载下,测试程序向PC端发送数据包,通过记录应用程序调用协议栈发送函数以及驱动程序在物理层发出数据2个时刻的系统时间来计算LwIP协议栈响应时间。网络负载大小由测试程序发送数据包的频率控制。测试程序以固定的频率向PC上的服务端发送数据包,数据包大小为1024 Byte,一次会话发送1000个数据包,通过对每个数据包的响应时间进行算数平均得到协议栈平均响应时间。在发送普通数据的过程中随机插入紧急数据并对其响应时间进行测试可以得到优化后的LwIP紧急数据的响应时间。

测试结果:测试结果如表1所示,结果对比如图6所示。

表1 LwIP协议栈响应时间μs

图6 LwIP协议栈响应时间对比

测试结果显示,在相同的网络负载情况下,优化后的LwIP协议栈比优化前响应时间少12%~32%。网络负载较小时,LwIP优化前后的响应时间相差不大,约为12%;网络负载较大时,优化后的LwIP响应时间明显小于优化前,约为32%。此外,优化后的协议栈紧急数据的响应时间随网络负载的增加变化较小,可见紧急数据具有更高的优先级。

6 结束语

随着科技的发展,嵌入式系统和网络技术结合得越来越紧密,网络化将成为嵌入式设备的发展趋势。在此背景下,对嵌入式TCP/IP协议栈的性能进行优化,具有重要的意义。本文针对嵌入式系统对LwIP实时性的要求,通过实验分析协议栈性能瓶颈,采用3种优化方式,实现LwIP协议栈实时性能优化。

[1] 许 刚.基于ARM11的嵌入式视频采集系统设计[J].测控技术,2013,32(12):37-40.

[2] 王建平,周辰飞,朱程辉,等.一种ZigBee-TCP/IP无缝网关模型[J].合肥工业大学学报:自然科学版,2013, 36(9):1058-1062.

[3] 陈华兵.基于μC/OS-Ⅱ网络模块的扩展及任务调度算法的研究[D].武汉:武汉理工大学,2007.

[4] 郭传雄,郑少仁.对Linux操作系统中TCP/IP网络协议的IP层排队分析[J].计算机学报,2001,24(5): 860-865.

[5] 韩德强,杨淇善,王宗侠,等.基于μC/OS-Ⅲ的LwIP协议栈的移植与实现[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] 张 齐,劳炽元.轻量级协议栈LWIP的分析与改进[J].计算机工程与设计,2010,31(10):2169-2171.

[8] 周海瑞.嵌入式TCP/IP协议栈的设计与实现[D].西安:西北工业大学,2007.

[9] 孙鹤旭,邵 岩,邢关生,等.移动机器人网络的嵌入式Web系统设计[J].计算机工程,2013,39(9):134-136.

[10] 杨高峰,顾春华.基于LwIP的ICMP路由重定向改进[J].北京联合大学学报:自然科学版,2009,23(1): 39-42.

[11] 汤维维.数字机顶盒以太网接入的设计与实现[D].武汉:武汉理工大学,2008.

[12] 李良仁,彭雪峰.LwIP协议栈在NIOSⅡ系统中的移植[J].机电技术,2009,25(4):25-28.

[13] 张 洁,傅 明.LwIP协议栈在嵌入式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协议LwIP的内存管理机制研究[J].杭州电子科技大学学报, 2012,32(4):118-121.

[17] 孙晓颖,曾文艺.基于Gprof的函数调用顺序研究[J].微计算机信息,2010,26(12):121-124.

[18] 张惠臻,王 超,陈 雁.嵌入式软件性能分析方法研究与工具设计[J].计算机应用与软件,2013,30(10): 284-287.

[19] 魏 强,金 然,王清贤.基于中间汇编的缓冲区溢出检测模型[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协议栈机制分析与优化[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-),男,硕士研究生,主研方向:嵌入式系统;陆 阳,教授。

2014-02-27

:2014-03-26E-mail:yuanzhongshu_1988@163.com

猜你喜欢

调用队列校验
队列里的小秘密
基于多队列切换的SDN拥塞控制*
核电项目物项调用管理的应用研究
在队列里
LabWindows/CVI下基于ActiveX技术的Excel调用
炉温均匀性校验在铸锻企业的应用
丰田加速驶入自动驾驶队列
基于系统调用的恶意软件检测技术研究
大型电动机高阻抗差动保护稳定校验研究
基于加窗插值FFT的PMU校验方法