摘 要: 基于以太网的嵌入式数据传输系统在许多领域被普遍采用,系统的传输效率需要提高。基于ARM Cortex-M4内核和常用的嵌入式网络协议栈LwIP,针对点对点数据传输的特点,采用了零数据拷贝技术并对UDP协议加以优化改进,大大提高了传输性能。测试结果表明,数据传输的速率从未优化的2.03 MB/s提升到9.80 MB/s,已接近百兆以太网的极限。同时引入ACK回应机制保障了UDP数据传输的可靠性。
关键词:STM32F407;LwIP/UDP;零数据拷贝;ACK
0 引言
基于以太网的嵌入式数据传输系统由于其结构灵活、通用性强、传输速度快、传输距离远等特点,在许多应用领域都发挥着重要的作用[1]。但由于嵌入式系统本身的结构[1]以及网络协议栈的限制[2],网络数据传输的效率不高,远远达不到以太网传输的理论带宽。一方面通过改进嵌入式系统的硬件结构,如利用FPGA并行处理的优势[2],可以大大提高数据传输的效率;另一方面,通过分析并改进嵌入式网络协议栈,也可以提高网络数据传输的速度[3]。
嵌入式网络传输系统由于成本资源的限制,往往采用简化的网络传输协议TCP/IP协议。LwIP协议栈是TCP/IP协议的一种简化版本,专门针对嵌入式系统开发,专注于减少资源消耗,对性能优化却比较少,效率不是很高[4]。
本文通过研究、分析常用的嵌入式网络协议栈LwIP的结构[4],针对简单的点对点传输网络环境,提出一种简单、灵活、高效的基于UDP协议的嵌入式数据传输效率的优化方法。
1 系统结构和协议栈分析及改进
系统以嵌入式微处理器STM32F407为核心,使用轻型网络传输协议栈LwIP实现百兆以太网传输数据。考虑到嵌入式系统的处理速度和资源限制,为保证高效的数据传输,选择更高效的UDP协议[5]。对于数据传输的可靠性,提出基于ACK回应的机制来改善。
1.1 系统硬件结构
选择意法开云棋牌官网在线客服的微处理器STM32F407作为系统的核心。它采用专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M4内核,时钟频率达到168 MHz,具有专门的网络MAC层接口和专用于网络的DMA通道,外加PHY芯片和网络接口,通过网线就可以实现网络传输。
1.2 LwIP协议栈结构
LwIP协议栈是基于分层的方式设计的,包括应用层、IP层、传输层等,每一层的协议都代表一个独立的模块,但是为了最小限度地使用系统资源,模块间使用松散的通信机制,通过共享内存来实现通信[6]。
LwIP协议栈设置了一个各层共享的内存空间——网络数据包缓冲区,数据分组存在一个确定的缓冲区Data buff中,在层与层之间打包与解包的过程中传递的只是这个缓冲区的地址payload,只有当数据要被发送至PHY或被应用程序取走时才会通过数据拷贝来实现。LwIP协议栈使用pbuf来管理这个包缓冲区,从而实现在协议栈各层之间数据包的零拷贝。pbuf结构如图1所示,包括包的信息、标志、地址等,payload指针指向包缓冲区Data buff。
1.3 系统网络传输过程分析
整个数据通路如图2所示。
下面就LwIP协议栈UDP数据包的发送过程做详细的分析。应用程序要利用UDP协议发送数据,先要建立UDP会话结构体udp_pcb,绑定本地IP地址与端口。由于udp_pcb结构体本身很小,且在已分配好的内存中,因此这一步执行很快。
接下来,分配并建立pbuf,然后将待发送数据拷贝至pbuf缓冲区中。这个过程其实是将数据从应用层传递至网络层的过程,这是第一次较大数据量的内存拷贝,占用了很多系统资源,降低了系统的性能。
至此,发送前基本工作准备完毕,接下来发送网络数据包。先要在网络接口netif全局链表中查找网络信息包将被传输至哪一个网络接口。由于本系统是简单的点对点网络环境,系统也只有一个默认网络接口,因此此步骤可以省去。
然后进入UDP协议传输层,生成UDP数据包头;再转入IP层,生成IP层包头。这两个过程不涉及数据拷贝,待发送网络数据包一直存储在pbuf中,UDP包头和IP包头通过指针和数据包连接在一起。
生成IP包以后,需要通过DMA(Direct Memory Access)将IP包发送到链路层MAC控制器的FIFO中然后发送出去。这个过程中涉及第二次大的内存拷贝,要把pbuf里的IP包拷贝到DMA控制器的发送缓存中。
上面分析了嵌入式LwIP协议栈收发网络数据包的过程,包括数据由应用程序传至协议栈pbuf缓冲包(API_to_Pbuf)和从pbuf缓冲包转移到以太网DMA缓冲区(Pbuf_to_DMA)时的两次大的数据拷贝过程,数据由DMA传输至MAC控制器的FIFO(DMA_to_FIFO)中,还有一些内存分配、打包解包及由于考虑协议栈的通用性而导致的多余开销(Others)。
测试利用系统内部定时器完成,传输1 KB的数据包,上述4个部分开销的测试结果如表1所示。
如图3所示,最大的开销就在两次大的数据拷贝过程,占到整个开销的73%。有很多关于TCP/IP协议零拷贝的研究[7],但多数对零拷贝的研究都是基于避免用户空间与系统空间,与本系统存在的问题不太相同。其实,LwIP协议栈通过pbuf缓冲包在各层之间传递数据包的地址指针已经实现了协议栈内部的零拷贝技术,但对于协议栈与应用程序之间的数据拷贝并没有过多考虑。
1.4 LwIP协议栈改进
基于以上的分析,对于本系统这样一个简单网络环境,只需实现网络的点对点通信,同时只传输固定格式的数据包,所以可以考虑让网络接口DMA控制器的数据缓存与协议栈pbuf缓冲包实现内存共享,达到真正的零数据拷贝。为了实现DMA控制器的数据缓存与协议栈pbuf缓冲包共享内存,将pbuf缓存包分配成PBUF_ROM类型,将pbuf缓存包的payload指针指向DMA数据缓存的地址。DMA控制器的数据缓存由系统分配,是一组连续的固定的内存空间。本系统传输固定大小和格式的数据包,并只设置一个DMA缓存,使得数据包被系统接收以后不至于分散在多个DMA缓存中,否则将造成多个DMA缓存地址不连续而无法与缓冲包共享内存。对于数据包头的问题,由于本系统明确是UDP协议传输,且是点对点固定节点的网络传输,可以在网络传输前即将包头设定完毕并保存下来,当进行网络传输时直接应用这个固定包头(其中UDP包头8 B、IP包头20 B、MAC帧头14 B)即可。
同样通过系统的定时器测试4个部分的开销,测试结果如表2所示。
从测试结果来看,经改进的主要开销是数据由DMA搬运到MAC控制器的FIFO的过程,避免了两次大的内存拷贝,实现了数据零拷贝,大大提升传输效率,传输速度可以达到,接近百兆网的极限。
2 基于ACK机制的UDP可靠传输
UDP协议是一种无连接的传输层协议,发送端把数据发送出去以后并不关心接收端是否接收到了数据,所以虽然它效率高,但并不可靠。很多文献都讨论过改进UDP协议的可靠性[8],下面提出一种提高UDP协议传输可靠性的简易方法,在占用较少系统资源的前提下,尽量保证系统的传输性能和可靠性。
TFTP是一种基于ACK包回应机制的简单协议,其基本思想是:发送一个UDP包以后,等收到ACK包回应才发送下一个UDP包;在一定时间内,如果没有收到ACK包,即重新发送此包。这种方法固然可以改善数据的可靠传输,但每发送一个UDP包都多了一个ACK包回应的开销,降低了传输性能。
基于ACK机制,本文提出两点改进来改善UDP传输的可靠性:一方面,针对点对点的网络传输应用,基于数据零拷贝,改进LwIP/UDP协议栈;另一方面,为了提高ACK机制的效率,发送N个数据包才回应一个ACK包。发送端每次发送N个数据包,并将这N个包缓存起来,在规定时间内,如果未收到ACK回应包即重传这N个包。虽然UDP协议存在误码,但误码率不高,因一个UDP包丢失而造成N个包都需重传所造成的额外开销并不明显。具体实现时,需要区分ACK包和DATA包,发送数据前需在UDP包末尾追加ACK标识和NUM序号,DATA包则在UDP数据包末尾追加DATA标识和NUM序号。
收发两端的传输流程如图4所示。发送开始以后,发送端每次发送N个数据包,发送完马上开始超时计时,等待ACK包回应;接收端接收并解析数据包,判断一次传输是否完成(NUM%N为零即代表传输了N个包),完成即生成并发送ACK响应包;发送端收到ACK响应包后再发送下一组N个数据包,如果超时,重新发送上一组的N个数据包。
当每次只传输1个数据包时,各部分开销分布如表3所示,采用改进的LwIP/UDP协议,UDP部分主要开销还是DMA_to_FIFO及其他打包解包等过程;采用ACK机制,增加了一次ACK包的生成与传输(Process_ACK)、两次ACK包的解析及检错重传所造成的额外开销(Others)。
采用每N个包发一次ACK响应包,减少Process_ACK的开销,提高了传输效率。不同单次发送数据包数下的传输速率如图5所示,ACK机制各部分开销比重如图6所示。从图5看出,随着N的增大传输速率逐渐增大,但是当N增加到12以后,速率增加趋于平缓。而从图6可以看出,N的增加只会减少处理ACK响应时间(Process_ACK包括生成并发送ACK包),其他3个部分耗时不会减少,故存在一个极限的速率。
这种改进方法比较简单,考虑到等待重发等因素的影响,实际的传输速率还要降低一些。但其效率确实显著提高,而且通过选择单次传输数据包个数N的大小,可以灵活地调整传输效率、改善传输的可靠性。
3 结论
本文详细分析、测试嵌入式网络LwIP/UDP协议的数据传输过程,针对点对点的简单网络传输,基于零数据拷贝的思想,改进了LwIP/UDP协议,明显提升了传输的性能,数据传输的速率从未优化的2.03 MB/s提升到 9.80 MB/s,已接近百兆以太网的极限。另外,通过引入改进的ACK机制,改善了传输的可靠性,实现了一种通用高效灵活的网络传输优化方法。
参考文献
[1] 王琳,商周,王学伟.数据采集系统的发展与应用[J].电测与仪表,2004,41(464):4-8.
[2] 姚雪,杨光,张祥.嵌入式数据传输系统速度优化方法[J].微计算机应用,2011,32(3):59-63.
[3] 段之昱,赵昭旺.嵌入式系统网络数据传输性能研究[J].天文研究与技术,2007,4(3):266-275.
[4] 孙乐鸣,江来,代鑫.嵌入式TCP/IP协议栈LWIP的内部结构探索与研究[J].电子元器件应用,2008,10(3):79-81.
[5] 徐鑫,曹奇英.基于LwIP协议栈的UDP协议分析与优化[J].计算机应用与软件,2011,28(3):246-249.
[6] ADAM D. Design and implementation of the LwIP TCP/IP stack[M]. Swedish Institute of Computer Science, 2001.
[7] 王小峰,时向泉,苏金树.一种TCP/IP卸载的数据零拷贝传输方法[J].计算机工程与科学,2008,30(2):135-138.
[8] 李国,巩光志,王冬冬.一种提高UDP可靠性的数据传输方法研究[J].中国民航大学学报,2012,30(1):41-45.