LWIP中零拷贝技术的研究与应用

合集下载

第九章 LwIP及其网络编程应用实例

第九章 LwIP及其网络编程应用实例
根据IP数据报的协议字段,LwIP决定将该数据报传给上层(运输 层)还是传给本层。
如果IP净荷中承载的是ICMP协议,则本层的icmp_input( )函数将 会调用。
当不论是上层还是本层有数据需要从网际层发送出去时
LwIP将会调用ip_output( )发送数据,或者先调用ip_route( ) 找到一个合适的网络接口再调用ip_output_if( )发送数据。

整体调用关 系
应用程序
应 用

图给出了LwIP的整体调 用关系,基本上涵盖了 LwIP的主要功能模块和 绝大部分的函数调用。
tcp_receive() tcp_process()
tcp_input()
tcp_write() tcp_enqueue() tcp_output()
udp_send()
icmp_input()
网 际 层
ip_output()
ip_input()

netif->output()
LwIP源码的文件组织
LwIP文件目录的组织结构如图所示,其源代码全 部位于目录src下。
src目录下一般有5个子目录
LwIP提供的api子目录、core子目录、include子目录 和netif子目录
需用户自己创建的arch目录。
lwip
src
api
arch
core
include
netif
LwIP介绍
LwIP(Light Weight Internet Protocol)是 瑞典计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等 人开发的一套用于嵌入式系统的开源 TCP/IP协议栈。

Linux 中的零拷贝技术

Linux 中的零拷贝技术

Linux 中的零拷贝技术概述黄晓晨, 软件工程师, IBM黄晓晨,IBM system Z 自动化技术支持软件工程师。

冯瑞, 软件工程师, IBM简介:本系列由两篇文章组成,介绍了当前用于Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景。

本文是本系列文章的第一部分,主要是介绍一些零拷贝技术的相关背景知识,简要概述了Linux 为什么需要零拷贝技术以及Linux 中都有哪几种零拷贝技术。

引言传统的Linux 操作系统的标准I/O 接口是基于数据拷贝操作的,即I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。

这样做最大的好处是可以减少磁盘I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘I/O 操作。

但是数据传输过程中的数据拷贝操作却导致了极大的CPU 开销,限制了操作系统有效进行数据传输操作的能力。

零拷贝(zero-copy )这种技术可以有效地改善数据传输的性能,在内核驱动程序(比如网络堆栈或者磁盘存储驱动程序)处理I/O 数据的时候,零拷贝技术可以在某种程度上减少甚至完全避免不必要CPU 数据拷贝操作。

现代的CPU 和存储体系结构提供了很多特征可以有效地实现零拷贝技术,但是因为存储体系结构非常复杂,而且网络协议栈有时需要对数据进行必要的处理,所以零拷贝技术有可能会产生很多负面的影响,甚至会导致零拷贝技术自身的优点完全丧失。

为什么需要零拷贝技术如今,很多网络服务器都是基于客户端- 服务器这一模型的。

在这种模型中,客户端向服务器端请求数据或者服务;服务器端则需要响应客户端发出的请求,并为客户端提供它所需要的数据。

随着网络服务的逐渐普及,video 这类应用程序发展迅速。

当今的计算机系统已经具备足够的能力去处理video 这类应用程序对客户端所造成的重负荷,但是对于服务器端来说,它应付由video 这类应用程序引起的网络通信量就显得捉襟见肘了。

LwIP在嵌入式系统中的应用

LwIP在嵌入式系统中的应用

0引言嵌入式Internet是近几年随着嵌入式系统的广泛应用和计算机网络技术的发展而发展起来一项新兴概念和技术。

随着Internet的发展,各种设备都产生了连接性的需求,从冰箱到电表,似乎所有电器都需要连入互联网。

通过为现有嵌入式系统增加因特网接入能力来扩展其功能,以Internet为介质实现信息交互的过程,这就产生了嵌入式Internet技术。

由于嵌入式系统自身资源的限制,处理能力不如台式机强,而台式机上的TCP/IP的复杂性,使得处理通信协议成为嵌入式系统接入Internet的关键,也是嵌入式系统接入Internet的难点之一。

LwIP是一套用于嵌入式系统的开放源码的轻型TCP/IP协议栈,它实现了较为完备的IP、ICMP、UDP、TCP协议,具有超时时间估计、快速恢复和重发、窗口调整等功能。

LwIP在保持协议主要功能的基础上减少对RAM和ROM的占用,一般它只需要几十K的RAM和40K 左右的ROM就可以运行,很适合同μC/OS-II相配合用在嵌入式系统中。

1μC/OS-II操作系统的移植μC/OS-II是一个专门用于嵌入式系统的实时操作系统,根据用户需要可以方便的进行移植、剪裁。

对于μC/OS-II操作系统的移植主要是对以下几个文件进行修改:1.1OS_CPU.H文件对于这个文件的修改主要包含三部分内容:1)由于不同的处理器有不通的字长,所以在这个文件中定义了与编译器相关的数据类型;2)设定了堆栈的单位,以及堆栈的增长方向;3)定义了中断开关的宏以及任务切换的宏。

1.2OS_CPU_C.C文件文件包含一个OSTaskStkInit()函数和若干hook函数,OSTaskStkInit()在创建任务时被OSTaskCreate()或OSTaskCreateExt()调用来初始化任务的堆栈结构。

系统hook函数在没有特殊需求的情况下只需要将其都实现为空函数即可。

1.3OS_CPU_A.ASM文件文件中包含了OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()四个函数。

零拷贝技术及其实现的研究

零拷贝技术及其实现的研究

零拷贝技术及其实现的研究
可向民;龚正虎;夏建东
【期刊名称】《计算机工程与科学》
【年(卷),期】2000(022)005
【摘要】零拷贝(zero-copy)是实现主机或路由器等设备高速网络接口的主要技术.零拷贝技术通过减少或消除关键通信路径影响速度的操作,降低数据传输的操作系统开销和协议处理开销,从而有效提高通信性能,实现高速数据传输.
【总页数】5页(P17-20,24)
【作者】可向民;龚正虎;夏建东
【作者单位】国防科技大学计算机学院;国防科技大学计算机学院;国防科技大学计算机学院
【正文语种】中文
【中图分类】TP393
【相关文献】
1.基于零拷贝的网络数据捕获技术的研究与实现 [J], 张珂;权义宁
2.Linux平台下基于Intel千兆网卡的零拷贝技术的研究与实现 [J], 刘峰;黄凯明;黎忠文
3.基于IXP2400的多播数据包零拷贝技术的实现 [J], 陈杰;李晓勇
4.光纤通道交换网络接口卡的零拷贝技术研究与实现 [J], 许伟;冯萍;郭海山
5.基于RTL8169网卡的零拷贝技术研究与实现 [J], 刘靖龙;刘颖;张思东
因版权原因,仅展示原文概要,查看原文内容请购买。

零拷贝技术在网络分析工具中的应用

零拷贝技术在网络分析工具中的应用
n t r a d t h mo a e r g a c r a c s ie t y DM A,S a y a s sn t r r t c l,a d ewo k c o t e me r t tus rp o r m al c e s dr c l b r y h y O t tb p s e ewo k p o o o s n h rdu e etme fd t c p . sn e d s rp o ig o A u e ,n t o k c d a d u e r g a a r e c st i so aa O y By u i g t e c it rrn fDM h h bt r e i w r a s rp o r r n m c n wo k
wto t olint acs esae e r. F Z R C P ayt s dt npat ypc ae t pooo i u c ls ces r dm mo P — E O O Y i ue n a sl ak gdi o rtcl h io o h t h y ss o a r n b n
_
为 了提供 网络监视 、安全 、流量分析和 预警等服
当报文到达 网卡时 ,网卡通过 DMA 方式将其传送到
网卡驱动 的缓冲环 中,并在完成 D MA 传送 时产生一
务 ,网络 分析 工具需要对 网络数据进行 实时的抓包存 取 。在 大流 量网络数据 的情况下 ,不恰 当的报文捕获 技术会造 成数据包延迟 ,甚至丢包现象 ,大大影响 网 络分析 工具的性能 。因此 ,报文捕获 技术往 往成为 网 络分析 工具的性能瓶颈 ,是各种 网络分析 工具中的关
明,该方法对 随机长度 的报文捕获速率可达 9 0 / 0 Mbs以上 ,与 l p a 相 比较为 明显地改善 了报文捕获的能力。 i cp b

TCP_IP协议的零拷贝和简化实现

TCP_IP协议的零拷贝和简化实现

摘 要:对嵌入式数据采集系统与 PC 间通过以太网的数据通讯进行了研究。这类嵌入式系统与 PC 配置于同一网
段,数据包的大小比较固定,但是要求传输速度快,系统资源占用率小。通过在网卡驱动程度程序中直接使用简化的
MBUF 结构,实现了发送和接收数据的零拷贝,减少了 CPU 占用率。通过简化 IP 层协议和实现其它协议层中最基本
struct pcb{ //for TCP Uint16 fsm;//表示连接的状态,具体参见图 3。 pMbuf pRcvBuf;//接受到的数据的链表头部 pMbuf pSndBuf;//已经发送但还没有收到正确 回答的链表 Uint16 fPort;//端口号 Uint16 lPort; Uint32 fAddr;//IP 地址 Uint32 lAddr; Uint16 fmacAddr0;//MAC 地址 Uint16 fmacAddr1; Uint16 fmacAddr2; Uint16 lmacAddr0; Uint16 lmacAddr1; Uint16 lmacAddr2; //below are used in TCP level Uint32 seqNum;//sequence number Uint32 ackNum;//acknowledgement number Uint16 rcvWinSize;//receive window size Uint16 timeOut;//超时重发 } 结构成员 fsm 表示了 TCP 连接所处的几种不 同的状态,状态变迁简图如图 3 所示。 3.3 PCB 的使用 应用系统为 TCP 协议控制块( PCB)定义一个全 局变量。初始化时候设置本地 IP 地址,MAC 地址和端 口号。在三次握手的过程中,在 PCB 中设置远程的 MAC 地址,IP 地址,端口号,初始的序号和应答号等。 链接建立以后,发送和接收到数据包时,就根 据情况修改 PCB 中链接状态,发送序号和应答号, 以及 MBUF 链表等。根 PCB 中的控制信息来实现数 据的可靠传递。

剖析linux下的零拷贝技术

剖析linux下的零拷贝技术

剖析linux下的零拷贝技术背景大多数的网络服务器是基于server-client模式的。

在这当中,下载是一个很常见的功能。

此时服务器端需要将主机磁盘上的文件发送到客户端上去。

传统的Linux操作系统的标准I/O接口是基于数据拷贝操作的,即I/O操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。

那么传统的I/O操作过程是咋样的呢?(下面是具体说明,以read和write为例)在执行read操作时,操作系统首先会检查,文件内容是否缓存在内核缓冲区,如果在内核缓冲区,则不用去磁盘中读取文件,而是直接将内核缓冲区的内容拷贝到用户空间缓冲区中去。

如果不是,操作系统则首先将磁盘上的数据拷贝的内核缓冲区(DMA),然后再把内核缓冲区上的内容拷贝到用户缓冲区中。

接下来,write系统调用再把用户缓冲区的内容拷贝到网络堆栈相关的内核缓冲区中,最后再往对方的sockfd中些数据。

并且在这个过程中还涉及到了四次的上下文切换。

那传统的I/O操作会带来什么问题呢?在高速网络中,大量传统的I/O操作导致的数据拷贝工作会占用CPU 时间片,同时也需要占用额外的内存带宽。

使cpu将大多数的时间用于I/O操作上,从而无法处理其他的任务,很大程度上影响了系统的性能,使服务器成为性能瓶颈。

而本身我们可以看出:很多数据复制操作并不是真正需要的。

所以可以消除一些复制操作以减少开销并提高性能。

这就引出了我们今天要介绍的“零拷贝”技术。

概念零拷贝(Zero-copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。

这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。

零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率。

而且,零拷贝技术减少了用户进程地址空间和内核地址空间之间因为上下文切换而带来的开销。

lwip原理

lwip原理

lwip原理lwip原理是指轻量级IP协议栈(Lightweight IP),是一种适用于嵌入式系统的TCP/IP协议栈。

本文将介绍lwip原理的基本概念、工作流程和应用场景。

一、基本概念lwip原理基于TCP/IP协议栈,是一种开源的网络协议栈。

它具有轻量级、高效性和可移植性的特点,适用于嵌入式系统的资源有限环境。

lwip原理提供了TCP/IP协议栈中的网络层和传输层功能,支持IP、ICMP、UDP和TCP等协议。

二、工作流程lwip原理的工作流程包括网络接口驱动、协议栈处理和应用程序接口。

1. 网络接口驱动网络接口驱动负责与硬件设备进行通信,包括数据的发送和接收。

它提供了与硬件设备的接口函数,通过这些函数将数据传输到网络中或接收网络中的数据。

2. 协议栈处理协议栈处理是lwip原理的核心部分,它包括网络层和传输层的处理。

网络层处理主要负责IP数据包的路由和转发,通过路由表确定数据包的下一跳地址。

传输层处理主要负责数据的可靠传输,包括UDP和TCP协议的处理。

在网络层和传输层之间,lwip原理使用了一个缓冲区来存储数据包。

当数据包到达网络层时,lwip原理会根据目的地址查询路由表,确定数据包的下一跳地址,并将数据包传递给传输层进行处理。

在传输层,lwip原理根据协议类型选择相应的协议处理函数进行处理,如UDP协议或TCP协议。

3. 应用程序接口应用程序接口是lwip原理与应用程序之间的接口,应用程序可以通过这个接口进行网络通信。

lwip原理提供了一系列的API函数,应用程序可以调用这些函数来发送和接收数据。

通过应用程序接口,应用程序可以实现各种网络应用,如Web服务器、FTP服务器等。

三、应用场景lwip原理适用于嵌入式系统中的网络通信应用。

它具有资源占用少、效率高的特点,适用于资源有限的嵌入式系统。

以下是lwip原理的一些应用场景:1. 物联网设备随着物联网的发展,越来越多的设备需要进行网络通信。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

收稿日期:2017-07-07 修回日期:2017-11-15 网络出版时间:2018-02-24基金项目:陕西省重大科技创新专项资助项目(2010ZKC 02-08)作者简介:赵成青(1990-),男,硕士研究生,研究方向为嵌入式系统开发与设计;李宥谋,教授,研究方向为集成电路设计㊁嵌入式系统开发与设计㊂网络出版地址:http :// /kcms /detail /61.1450.TP.20180224.1521.066.htmlLWIP 中零拷贝技术的研究与应用赵成青,李宥谋,刘永斌,王 涛(西安邮电大学,陕西西安710000)摘 要:LWIP 是一种轻量级的TCP /IP 协议栈㊂在运行过程中占用少量的资源,主要应用在低端的嵌入式系统㊂文中从物理层到应用层,分三个层次分析了LWIP 协议栈的数据传递过程㊂分别是物理层到协议栈内部的数据传递过程㊁协议栈内部本身的数据传递过程㊁协议栈和外部应用程序数据的传递过程㊂而数据在协议栈内部传递时,通过pbuf 缓冲包在各层之间传递数据包的地址指针已经实现了数据在协议栈内部各层之间的零拷贝传递㊂提出了在物理网卡和LWIP 协议栈传递数据㊁外部应用程序和LWIP 协议栈传递数据时的改进方法,避免了数据的两次拷贝,从而实现了数据从物理层直达应用层,提高了系统的传输效率和并发性能㊂测试结果表明,数据传输速率从未优化的2.04MB /s 提升到9.8MB /s,已接近网卡性能极限㊂关键词:分层;内存映射;指针传递;零拷贝;IPC 方式中图分类号:TP216 文献标识码:A 文章编号:1673-629X (2018)07-0182-05doi:10.3969/j.issn.1673-629X.2018.07.039Research and Application of Zero Copy Technology in LWIPZHAO Cheng -qing ,LI You -mou ,LIU Yong -bin ,WANG Tao(Xi ’an University of Posts and Telecommunications ,Xi ’an 710000,China )Abstract :LWIP ,a lightweight TCP /IP stack ,occupies a small amount of resources during the operation and is mainly used in low -end embedded systems.From the physical layer to the application layer ,the data transfer process of the LWIP protocol stack is analyzed in three levels which are the data transfer process from the physical layer to the protocol stack ,the data transfer process inside the protocol stack ,and the data transfer between the protocol stack and the external application program.When the data is passed inside the protocol stack ,the address pointer of the data packet is transmitted between the layers through the pbuf buffer packet ,and the data has been trans⁃mitted by zero copy between the layers of the protocol stack.We propose an improved method to transfer data between the physical net⁃work card and the LWIP protocol stack ,the external application program and the LWIP protocol stack ,so as to avoid the two copy of the data.The system realizes the direct application of data from the physical layer to the application layer ,and improves the transmission effi⁃ciency and the concurrent performance of the system.Test shows that the rate of data transmission has been optimized from 2.04MB /s to 9.8MB /s ,which is close to the network card performance limit.Key words :layered ;memory mapping ;pointer passing ;zero copy ;IPC mode0 引 言LWIP 是瑞典计算机科学院(SICS )的AdamDunkels 开发的用于嵌入式系统的开源TCP /IP 协议栈[1]㊂LWIP 的含义是轻量级的TCP /IP 协议,专注于减少资源消耗㊂嵌入式网络传输系统由于成本资源的限制,往往采用简化的TCP /IP 协议㊂文中通过研究㊁分析常用的嵌入式网络协议栈LWIP 的结构,在物理层和应用层提出了提高系统传输效率的改进方法㊂在小型嵌入式系统中,LWIP 的实现基于上层协议已明确知道下层协议所使用的数据结构的特点[2]㊂它会假设各层间的部分数据结构和实现原理在其他层是可见的㊂在数据包递交过程中,各层协议可以通过指针直接指向数据包中其他层次的字段㊂所以上层可直接使用取地址计算得到下层中的数据,这不仅使整个协议栈对数据包的操作更加灵活,而且避免了LWIP 协议栈内部数据递交时的复制㊂但是,这仅仅第28卷 第7期2018年7月 计算机技术与发展COMPUTER TECHNOLOGY AND DEVELOPMENT Vol.28 No.7July 2018是在LWIP协议栈内部实现数据的零拷贝㊂在物理网卡向协议栈传递数据时和协议栈向应用程序传递数据时,还是存在两次消耗较大的数据拷贝过程㊂所以,文中提出在网卡接收数据时让LWIP内核存储区指针直接指向物理网卡的寄存器地址的方法,避免了物理网卡数据到LWIP协议栈缓冲区数据的拷贝[3]㊂在应用层,提出了利用μcos操作系统的邮箱机制,避免了多个外部应用程序和协议栈内核交互时的数据拷贝[4],从而实现了从物理层到应用层真正的数据零拷贝,并且提高了系统的并发性㊂1 物理网卡到LWIP协议栈数据的传递在嵌入式系统中应用比较广泛的是MicroChip公司的ENC28J60网卡㊂在网卡驱动函数接收数据包时,网卡驱动函数首先向网卡发送数据包传送指令,此时网卡会把BNRY(边界寄存器)处的一个网卡格式的数据包数据一次性全部发送到DMA端口,此时网卡驱动函数会在DMA端口读取所有字节数据后,网卡会自动将BNRY(边界寄存器)值调整为下一个数据包地址,以准备下一次读取所有字节数据㊂然后将接收到的数据封装成LWIP熟悉的格式并且写到缓冲区中,这个过程涉及到数据到拷贝[5]㊂在ENC28J60网卡中接收缓冲器由一个硬件管理的循环FIFO构成㊂ERXST表示接收缓冲区起始地址,ERXNDH表示接收缓冲区结束地址[6]㊂如图1所示,通过把网卡相关的寄存器映射到LWIP内核内存空间,就可以直接对网卡寄存器进行操作,避免了物理网卡到LWIP 内核空间的数据拷贝㊂然后封装成LWIP内核能够识别的pbuf类型的数据包结构,在LWIP内核中由low_ level_input()函数完成这个功能㊂通过ehternetif_in⁃put()函数解析该数据包的类型,然后将该数据包指针递交给相应的上层㊂图1 网卡内部寄存器指针映射2 LWIP协议层间数据传递在网卡接收数据时,需要申请一个数据包,然后将网卡中的数据填入数据包中㊂发送数据包时,协议栈的某层中会申请一个pbuf,并将相应的数据装入到数据区域,同时相关的协议首部信息也会被填写到pbuf 的预留数据区域中[7]㊂数据包申请函数有两个重要参数,一个是想申请的数据包pbuf类型,另一个重要参数是该数据包是在协议栈中哪一层被申请的,分配函数会根据这个层次的不同,在pbuf数据区域前为相应的协议预留出首部空间,这就是offset值㊂总的来说, LWIP定义了四个层次,当数据包申请时,所处的层次不同,会导致预留空间的offset值不同[8]㊂层次定义时通过一个枚举类型pbuf_layer:Typedef enum{PBUF_TRANSPORT,//传输层PBUF_IP,//网络层PBUF_LINK,//链路层PBUF_RAW,//原始层}pbuf_layer;上面的结构体中除了定义枚举类型pbuf_layer来表示各个网络协议层的名称外,还定义了两个宏: PBUF_TRANSPORT_HLEN和PBUF_IP_HLEN㊂前者是典型的TCP报文首部长度,而后者是典型的不带任何选项字段的IP首部长度㊂代码如下所示:Switch(layer){Case PBUF_TRANSPORT:Offset=PBUF_LINK_HLEN+PBUF_IP_HLEN+PBUF_ TRASNSPORT_HLEN;Case PBUF_IP:Offset=PBUF_LINK_HLEN+PBUF_IP_HLEN;Case PBUF_LINK:Offset=PBUF_LINK_HLEN;Case PBUF_LINK:Offset=0;在LWIP的数据包管理函数pbuf.c中,首先根据数据包申请时传入的协议层参数,计算需要在pbuf数据区签预留的长度offset值,然后根据pbuf的类型进行实际申请㊂Pbuf_pooll类型申请最复杂[9],因为可能需要几个pool连接在一起,以此来满足用户的空间需求㊂限于篇幅,对LWIP内存分配机制不做深入研究; pbuf_ref和pbuf_rom类型申请最简单,它们只是在内存MEMEP_PBUF中分配一个pbuf结构空间,然后初始化相关字段,注意这两种类型的payload指针需要用户自行设置,通常在调用完函数pbuf_alloc后,调用者需要将payload指向某个数据区㊂在原始层以太网驱动中:P=pbuf_alloc(PBUF_RAW,recvlen,PBUF_RAM);这个调用语句申请了一个PBUF_RAM类型的pbuf,且其申请的协议层为PBUF_RAW,所以pbuf_al⁃loc函数不会在数据区前预留出任何首部空间;通过使用p->payload,就可以实现对pbuf中数据区的读取或㊃381㊃ 第7期 赵成青等:LWIP中零拷贝技术的研究与应用者写入操作了㊂在传输层TCP层: P=pbuf_alloc(PBUF_RAW,recvlen,PBUF_RAM);它告诉数据包分配函数使用PBUF_RAM类型的pbuf,且数据前应该预留一部分的首部空间㊂由于这里是PBUF_TRANSPORT层,所以预留空间将有54个字节,即TCP首部长度的20个字节㊁IP数据包首部长度的20个字节以及以太网帧首部长度的14字节㊂当数据包往下层递交,各层协议就直接操作这些预留空间的数据,以实现数据首部的填写,这样就避免了数据的拷贝㊂3 LWIP软件与用户程序间的数据传递3.1 用户缓冲数据结构协议栈API实现时,也为用户提供了数据包管理函数,可以完成数据包内存申请㊁释放㊁数据拷贝等任务㊂无论是UDP还是TCP连接,当协议栈接收到数据包后,会将数据封装在一个netbuf中,并递交给应用程序[10]㊂在发送数据时,不同类型的连接将导致不同的数据处理方式㊂对于TCP连接,内核会根据用户提供待发送数据的起始数据和长度,自动将数据封装在合适的数据包中,然后放入发送队列;对于UDP,用户需要手动将数据封装在netbuf中,通过调用发送函数,内核直接发送数据包中的数据段㊂应用程序使用netbuf结构来描述㊁组装数据包,该结构只是对内核pbuf的简单封装,是用户应用程序和协议栈共享的㊂外部应用程序可以使用该结构来管理发送数据㊁接收数据的缓冲区㊂netbuf是基于pbuf实现的,其结构如以下代码所示:Struct netbuf{Struct pbuf*p,*ptr;Ip_addr_t*addr;U16_t port;}其中,netbuf相当于一个数据首部,保存数据的字段是p,它指向pbuf链表首部,ptr指向链表中的其他位置,addr表示IP地址,port表示端口号㊂netbuf是应用程序描述待发送数据和已接收数据的基本结构,引入netbuf结构看似会让应用程序更加繁杂,但实际上内核为应用程序提供了API,通过共享一个netbuf结构(如图2所示),两部分API就能实现对数据包的共同处理,避免了数据拷贝㊂图2 用户缓冲区结构3.2 操作数据缓冲区指针与BSD相同,LWIP协议栈API也对网络连接进行了抽象㊂但它们之间的抽象存在一定的差别:BSD 实现了更高级别的抽象,用户可以像操作文件那样来操作一个网络连接;LWIP中,API只能实现较低级别的抽象,用户操作的仅仅是一个网络连接,而不是文件㊂在BSD中,应用程序处理的网络数据都处于一片连续的存储区域中,可以使用户对数据的处理更加方便㊂在LWIP中,若API使用上述数据存储机制可能会导致很大的缺陷,因为LWIP中网络数据都存储在pbuf中,如果要实现存储在连续的存储区的话,需要将所有pbuf数据拷贝到这个连续的存储中,这将造成数据的拷贝㊂为了避免数据拷贝以后再递交给用户,需要直接操作pbuf的一些方法,而LWIP中恰恰提供了这些方法㊂比如通过netbuf_next()可以修改数据指针指向下一个数据段,如果返回值为0,表示netbuf 中还存在数据段,大于0说明指针已经指向netbuf中的最后一个数据段了,小于0表明netbuf中已经没有数据段了㊂当用户未调用netbuf_next()函数的情况下,ptr和p都默认指向第一个pbuf㊂通过netbuf_next()对协议栈和应用程序共同缓冲区指针的调整和读取,避免了应用程序和数据以及内核栈的拷贝㊂4 应对多个外部应用程序的指针传递在单独运行LWIP时,用户应用程序和协议栈内核处于同一进程中,用户程序通过回调的方式进行㊂这样,用户程序和协议栈内核出现了相互制约的关系,因为用户程序执行的时候,内核一直处于等待状态,内核需要等待用户函数返回一个处理结果再继续执行㊂如果用户执行计算量很大,执行时间很长,则协议栈代码就一直得不到执行,协议栈接收,处理数据包效率会受到直接的影响㊂最严重的结果是,如果发送方速度很快,则协议栈会因为来不及处理而出现丢包的情况㊂为了设计多进程外部应用程序,将LWIP移植到㊃481㊃ 计算机技术与发展 第28卷μcos操作系统下,让LWIP内核作为操作系统的一个任务运行[11]㊂LWIP协议栈设计时,提供了协议栈与操作系统之间函数的接口㊂协议栈API由两部分组成㊂一部分提供给应用程序,一部分提供给协议栈内核㊂应用程序和协议栈内核通过进程间通信机制进行通信和同步[12]㊂使用到的进程通信机制包括了以下三种[13]:(1)邮箱,例如内核邮箱mbox㊁连接上接收数据的邮箱recvmbox;(2)信号量,例如op_completed,用于两部分API 同步;(3)共享内存,例如内核消息结构tcp_msg㊁API 消息内容api_msg等[14]㊂两部分API间的关系如图3所示㊂API设计的主要思想是让应用程序成为一个单独的进程;而协议栈也成为一个单独的进程㊂用户进程只负责数据的计算等其他工作,协议栈进程仅仅负责通信工作㊂两部分进程之间使用三种IPC方式中的邮箱和信号量集,内核进程可以直接将数据递交到应用程序邮箱中,然后继续执行,不必阻塞等待,邮箱对于应用程序来说就像一个输入队列,提高了系统的实时性[15]㊂图3 两部分独立进程间的通信 全局邮箱mbox在协议栈初始化时建立,用于内核进程tcpip_thread接收消息㊂内核进程通过共享内存的方式与协议栈的其他各个模块进行通信,它从邮箱中获得的是一个指向消息结构的指针㊂函数tcp_ input在内存池中为系统消息结构申请空间,并根据消息类型初始化结构中的相关字段,把内核消息封装在tcp_msg结构中,最后将消息投递到系统邮箱中等待内核进程tcpip_thread处理㊂tcpip_thread使用从邮箱中获得的指针指定到对应内存地址处读取消息内容,从而避免了两个进程间通信的数据的拷贝㊂5摇性能测试对比及其应用在局域网内,对ARM开发板STM32F103VET6-EV上基于无操作系统和移植了μcos操作系统的LWIP两种方法编写的UDP服务器进行数据吞吐能力的测试,以此来估算网卡及整个板子的网络处理性能及对比无操作系统模拟层和在操作系统模拟层下编写的UDP服务器性能的差别㊂在Windows主机上运行iperf软件来测试服务器的数据吞吐能力㊂如图4(a)所示,在软件上选择UDP 协议,设置好服务器IP地址(192.168.1.230)和端口号(5000)后,单击start iperf,软件开始对服务器性能进行测试㊂从图4(a)可以看出,服务器的上下行带宽都可以维持在9800kb/s左右,很接近ENC28J60网卡的处理值上线10M/s㊂在操作系统模拟层下基于LWIP零拷贝技术编写的UDP服务器,板子的网络处理性能达到最优㊂从图4(b)可以看出,基于无操作系统模拟层下编程的服务器在客户端连续发送大量数据图4 UDP性能测试㊃581㊃ 第7期 赵成青等:LWIP中零拷贝技术的研究与应用时导致丢包情况,严重情况下甚至出现死机的情况㊂6摇结束语综上所述,在应对多个外部应用程序的情况下,无操作系统模拟层的UDP 服务器编程,虽然避免了数据的拷贝,但是无法应对多个外部应用程序㊂所以将LWIP 移植到μcos 操作系统下,不仅减少了内存开销,而且能够应对多个外部应用程序㊂文中的研究成果已经成功应用于嵌入式网管系统项目并实际运行,不仅提高了基于STM 32平台μcos 操作系统下测量仪器代理模块的传输效率,提高了系统的实时性,而且节约了内存开销㊂参考文献:[1] CAROFIGLIO G ,MUSCARIELLO L.On the impact of TCPand per -flow scheduling on internet performance [J ].IEEE /ACM Transactions on Networking ,2012,20(2):52-56.[2] SHERWANI S A ,KHIYAL M S H.Real -time scheduler fortransport protocols [J ].Information Technology Journal ,2007,6(3):376-379.[3] LI Jinlei ,ZHENG Wengang ,SHEN Changjun ,et al.Applica⁃tion of modbus protocol based on μC /TCPIP in water savingirrigation in facility agricultural [C ]//International confer⁃ence on computer and computing technologies in agriculture.[s.l.]:[s.n.],2014.[4] SCHIEPEK G ,AICHHORN W.Real -time monitoring ofpsychotherapeutic change processes [J ].Psychotherapie ,Psy⁃chosomatik ,Medizinische Psychologie ,2013,63(1):39-47.[5] 陈 实,武 杰.一种基于以太网的嵌入式数据传输速率优化方法研究[J ].微型机与应用,2015,34(4):64-66.[6] 张庆辉,马延立.STM 32F 103VET 6和ENC 28J 60的嵌入式以太网接口设计[J ].单片机与嵌入式系统应用,2012(9):23-25.[7] 张 齐,劳炽元.轻量级协议栈LWIP 的分析与改进[J ].计算机工程与设计,2010,31(10):2169-2171.[8] 蔡雄飞,王新华,郭淑琴.嵌入式TCP /IP 协议LWIP 的内存管理机制研究[J ].杭州电子科技大学学报,2012,32(4):118-121.[9] 付晓军,夏应清,何 轩.嵌入式LWIP 协议栈的内存管理[J ].电子技术应用,2006,32(3):56-58.[10]李茂正.嵌入式系统中实现网络协议[D ].南京:南京大学,2011.[11]苏勇辉.基于ARM 微处理器TCP /IP 协议栈LwIP 实现[J ].国外电子测量技术,2009,28(10):76-78.[12]MOLAY B.Unix /Linux 编程实践教程[M ].杨宗源,黄海涛,译.北京:清华大学出版社,2004:464-475.[13]LABROSSE J J.嵌入式实时操作系统μC /OS -II [M ].邵贝贝,译.北京:航空航天大学出版社,2012:143-150.[14]STEINKE R C ,NUTT G J.A unified theory of shared mem⁃ory consistency [J ].Journal of the ACM ,2004,51(5):800-849.[15]任 哲.嵌入式实时操作系统μC /OS -II 原理及应用[M ].北京:航空航天大学出版社,2005:133-139.(上接第181页) 网络性能比较[J ].中国卫生统计,2013,30(2):173-176.[4] 卢辉斌,李丹丹,孙海艳.PSO 优化BP 神经网络的混沌时间序列预测[J ].计算机工程与应用,2015,51(2):224-229.[5] 游丹丹,陈福集.基于改进粒子群和BP 神经网络的网络舆情预测研究[J ].情报杂志,2016,35(8):156-161.[6] 张宝堃,张宝一.基于BP 神经网络的非线性函数拟合[J ].电脑知识与技术,2012,8(27):6579-6583.[7] BUSCEMA M.Back propagation neural networks [J ].Sub⁃stance Use &Misuse ,1998,33(2):233-270.[8] 范广坡,余学飞,卢广文,等.改进PSO -BP 算法的压力导丝温度及非线性补偿研究[J ].自动化仪表,2016,37(6):16-20.[9] 崔东文.多隐层BP 神经网络模型在径流预测中的应用[J ].水文,2013,33(1):68-73.[10]JIAN Huajiang ,BU Yunsheng ,LI Xionggong ,et al.PSO al⁃gorithm based task allocation in dynamic virtual enterprise [J ].Advanced Materials Research ,2011,189-193:2572-2576.[11]朱小明,张慧斌.PSO 算法的稳定性分析及算法改进[J ].计算机科学,2013,40(3):275-278.[12]涂娟娟.PSO 优化神经网络算法的研究及其应用[D ].镇江:江苏大学,2013.[13]LIU Lilan ,HU Rongsong ,HU Xiangping ,et al.A hybridPSO -GA algorithm for job shop scheduling in machine tool production [J ].International Journal of Production Research ,2015,53(19):5755-5781.[14]梅金平,张士兵,王海莲.基于PSO -GA 算法的多用户OFDM 系统资源分配[J ].电视技术,2014,38(1):115-119.[15]崔宝才.基于GA 改进BP 神经网络网络异常检测方法[J ].现代电子技术,2016,39(3):90-93.[16]马福祥,马秀娟.一种基于二次变异策略的改进型遗传算法[J ].计算机工程与应用,2014,50(13):62-65.[17]SRINIVAS M ,PATNAIK L M.Adaptive probabilities ofcrossover and mutation in genetic algorithms [J ].IEEE Transactions on Systems ,Man ,and Cybernetics ,1994,24(4):656-667.㊃681㊃ 计算机技术与发展 第28卷。

相关文档
最新文档