基于LwIP协议栈的UDP协议分析与优化
徐鑫;曹奇英
【摘 要】近年来,LwIP协议栈已经在嵌入式系统上得到了广泛的应用,但由于嵌入式处理器性能及实时操作系统效率的影响,应用于嵌入式上的LwIP协议栈的实测性能和理论值之间一直存在较大差距.分析了UDP协议的结构,并在富士通H60高清机顶盒(ARM11体系架构、100M以太网控制器)平台下,通过调用精确到1us的系统时钟,测量了UDP协议接收1KB报文的每个环节所用时间,发现制约UDP协议性能的主要瓶颈之一是内存拷贝,最后,针对内存拷贝给出了一个优化算法.经测试,整体效率提高了32%.%In recent years, LwIP protocol stack has been widely used in embedded systems. However, because of the impacts of embedded processor performance and RTOS efficiency, the measured performance of LwIP protocol stack applied in embedded system is actually far below the theoretical value. In this paper we analyse the structure of UDP protocol, and measure on Fujitsu H60 HD Set Top Box ( ARM11 architecture and 100M Ethernet controller) platform the time cost of every link when receiving 1 KB message by UDP protocol through revoking a system timer with 1 us accuracy. It is fou
nd that one of the most time-consuming parts turned out to be the memory copy, so an optimised algorithm for memory copy is finally given. According to the final test, the overall system efficiency increased 32%.
【期刊名称】《计算机应用与软件》
【年(卷),期】2011(028)003
【总页数】4页(P246-249)
【关键词】LwIP;嵌入式系统;UDP协议;优化
【作 者】徐鑫;曹奇英
【作者单位】东华大学计算机科学与技术学院,上海,201620;东华大学计算机科学与技术学院,上海,201620
【正文语种】中 文
0 引 言
随着嵌入式处理器速度的飞速提高和成本的不断降低,嵌入式系统在生活中的应用已经越来越广泛,与此同时,网络技术和嵌入式的紧密结合也成为了一种发展的趋势[1],各种用于嵌入式系统的小型协议栈应运而生,如uC/IP、uIP、LwIP、TinyTCP等,这几种协议栈都派生于BSD TCP/IP[2]。uC/IP协议栈带身份验证和报头压缩,支持的PPP协议,支持IP/TCP/UDP协议,可实现的网络功能较为强大,并可裁减,代码体积在 40KB左右。LwIP[3]是瑞士计算机科学院的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈,相对于u IP。LwIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。支持多网络接口下的IP转发,支持ICMP协议,包括UDP(用户数据报)协议、阻塞控制、RTT估算[4]和快速恢复、快速转发的TCP协议,提供专门的内部回调接口(Raw API)用于提高应用程序性能,并提供了可选择的Berkeley接口API,代码体积在30KB左右。其余两种协议TinyTCP和uIP[5]都是功能比较有限,但体积非常小的TCP/IP协议,编译过的大小,通常都在几KB,非常适合在低端系统上使用。
目前大部分嵌入式处理器的MIPS仍然较低,且实时操作系统在任务调度和线程通讯时也会消耗一定的时间,所以LwIP协议栈在嵌入式系统上的实际性能表现远不能达到理论值。事实上,UDP协议实测性能仅能达到理论值的 12%左右[6]。
本文简要介绍了LwIP协议栈中的UDP协议结构,并以富士通H 60机顶盒(ARM11体系架构、100M片内网络控制器)为测试平台,通过TIMER计时器,在循环收发1KB UDP数据报的过程中,测量接收数据报时,每一个环节所需要的时间,进行统计后得到协议中时间消耗多的环节,并以此为依据给出了一个优化方案。最后进行了优化前和优化后的性能对比测试。
1 Lw IP协议栈中UDP协议简介
UDP协议即用户数据报协议,是一个面向数据报的简单运输层协议,协议分为四层、应用层、传输层,网络层和网络接口层。结构如图 1所示。
图1 UDP协议框架
图中左侧是发送流程,右侧是接收流程。从上到下依次是协议的四层。
如果把整个接收过程按照靠近应用层和靠近驱动层划分为两大部分,那么他们之间将被一个邮箱隔开,上层是可以直接被用户调用的 API,它等待下层发来的消息,下层响应网络中断,接收原始的数据包,并把经过处理的数据向上传递,最后通过邮箱发送给API,形成一个完整的数据接收过程。
可供用户调用的API为lwip_recvfrom函数、lwip_recvfrom函数流程如图 2所示。
图2 lwip_recvfrom内部结构
在net_conn_recv线程中,系统会等待邮箱发来的消息。消息到来后,调用netbu f_copy_partial进行一次数据拷贝,把接收到的内容拷贝到事先开辟好的内存块中。默认使用的是 C库中自带的memcpy函数。
当网卡中断到来时,系统的中断处理函数会调用low_level_ input_callback,此回调函数将调用ethif_fapi_input,ethif_fapi_input是富士通H 60芯片的网络控制器API函数,这个函数将完成对数据的读入工作,但它并不是LwIP协议栈的一部分。在ethif_fapi_input中调用的low_level_input函数负责具体的物理层的数据读入工作(low_level_input是LwIP库提供的程序框架,用户可以直接在这个框架内扩充,也可以调用网络芯片驱动程序来完成数据读入)。在此步骤后,要进行一次内存拷贝,把数据从缓冲区拷贝到pBuf里,使用的也是C库自带的memcpy函数。最后,系统将判断数据报所属的协议类型,并一层层把pBuf指针向上传递,直到API_EVENT唤醒相应的应用层进程。其流程关系如图 3所示。
图3 数据接收流程
由于UDP数据报属于IP层,故该数据报被传递到ip_input函数,ip_input在对包头和校验和进行处理后,将把目的IP地址和本机 IP地址进行对比,不同则丢弃数据报,相同则继续判断此数据报属于哪种更上层的协议。最终数据报被传递给udp_ input。udp_input经过对数据报进行端口号的提取、校验和的计算后调用pcb->recv,把经过处理的数据传递给回调函数recv_ udp,recv_udp调用API_EVENT通过信号量机制唤醒等待中的应用程序进程。
2 UDP协议接收端测试
2.1 硬件环境
SERVER端 惠普DX2710商用PC(10/100兆自适应网卡);tcp ip协议分析及应用
CLIENT端 Fujitsu H 60机顶盒(ARM11体系架构,100M网络控制器,128M DDR RAM)。
2.2 软件环境
本测试使用Kai Uwe Rommel编写的netio1.26。此程序可以通过指定的协议(UDP/TCP),循环收发指定大小的数据包,以测量网络吞吐量。每次发送的时间由INTERVAL宏定义。发送结束
后可进行发送速率统计。选用这个测试程序的一个重要原因是程序使用C语言编写,方便移植到ARM上运行。
PC端在cygwin2.510.2.2环境下编译后,运行./netio–s,程序即进入网络监听状态。
嵌入式端netio将使用已经移植到机顶盒上的Lw IP库进行网络I/O操作。其使用的操作系统为富士通的实时操作系统FAMOS。此操作系统支持邮箱操作(mail_queue)、信号量(semaphore)操作,采用时间片轮转调度。软件编译调试环境为GNUARM-3.4。
2.3 测量方法
富士通H 60机顶盒主控芯片采用ARM 11体系架构,并提供完备的API。系统提供三种精度的计时器,分别为1s、1ms、1us。由于实测接收速率约为 1450KB/s,故计算得到每接收1KB数据报耗时约为690us,因此采用1us的计时精度可以满足测量需求。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。