CN101304373B - 一种实现局域网内高效传输大块数据的方法及系统 - Google Patents

一种实现局域网内高效传输大块数据的方法及系统 Download PDF

Info

Publication number
CN101304373B
CN101304373B CN2008100680940A CN200810068094A CN101304373B CN 101304373 B CN101304373 B CN 101304373B CN 2008100680940 A CN2008100680940 A CN 2008100680940A CN 200810068094 A CN200810068094 A CN 200810068094A CN 101304373 B CN101304373 B CN 101304373B
Authority
CN
China
Prior art keywords
data
request
kernel
packet
user
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN2008100680940A
Other languages
English (en)
Other versions
CN101304373A (zh
Inventor
王魏强
孙福清
程宁
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Jiangsu Yongding Communications Co ltd
Original Assignee
ZTE Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by ZTE Corp filed Critical ZTE Corp
Priority to CN2008100680940A priority Critical patent/CN101304373B/zh
Publication of CN101304373A publication Critical patent/CN101304373A/zh
Application granted granted Critical
Publication of CN101304373B publication Critical patent/CN101304373B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Data Exchanges In Wide-Area Networks (AREA)

Abstract

本发明公开了一种实现局域网内高效传输大块数据的方法及系统,用于一服务器端与客户端的连接,所述服务器端与客户端连接所用网卡支持DMA功能和SG功能;其方法包括步骤:所述客户端向服务器端发送数据请求;所述服务器端接收数据请求后,所述服务器端进行数据准备,并向客户端发送数据应答;所述客户端接收服务器端的数据应答;上述数据传输利用网卡的SG功能,采用头部和载荷分离的数据包发送。本发明方法由于重新定义了数据发送消息sendmsg和数据应答消息recvmsg的系统调用,同时增加了协议栈对数据请求帧和数据应答帧的特殊处理流程,实现了局域网内传输大块数据时的低CPU消耗和高系统处理能力。

Description

一种实现局域网内高效传输大块数据的方法及系统 
技术领域
本发明涉及一种计算机应用领域的网络通信方法及系统,具体涉及的是一种基于Linux的网络协议栈实现局域网内高效传输大块数据的方法及系统。 
背景技术
在现有技术的Linux操作系统中,常常通过网络套接字使用系统调用接收和发送网络数据包。在数据包的接收过程中,需要通过接收系统调用陷入内核态,将网卡接收的数据包从内核接收缓存拷贝到用户缓冲区;在数据包的发送过程中,又需要通过发送系统调用陷入内核态,将用户待发送的数据包从用户缓冲区拷贝到内核发送缓存并发送出去。 
为了减少用户程序收发数据包过程中出现的拷贝操作,出现了零拷贝技术。零拷贝技术的基本思想是:数据包在网卡与用户进程空间之间传递的过程中,避免数据拷贝,降低CPU的消耗。零拷贝技术主要利用了内存映射技术和DMA(Direct Memory Access,直接内存存取)传输技术:接收时,数据包直接从网卡DMA到内核空间,用户进程通过内存映射获得网络数据;发送时,数据包直接从用户空间缓冲区DMA到网卡。 
在基于Linux操作系统的网络应用中,常常需要将大块数据在网络上进行传输。当在网络客户端和服务器端之间传输大块数据时,大块数据要在不同的系统空间中进行多次传递,传递流程主要包括以下几个部分: 
客户端发送数据请求:客户端根据应用需要,向服务器端发送数据请求; 
服务器端接收数据请求:服务器端接收到客户端的数据请求之后,准备客户端所需要的数据块; 
服务器端发送数据应答:服务器端将数据块按一定的方式进行组织,封装成适合网络传输的一批数据应答包,向客户端发送数据应答; 
客户端接收数据应答:客户端接收到服务器端的数据应答之后,对应答数据进行重排整理,最终获得客户端所需要的数据块。 
在这种方式下,除了网络数据收发需要消耗系统资源外,服务器端将数据块封装成一系列的数据应答包、客户端将这一系列的数据应答包组织成数据块,这些数据组织操作都需要进行额外的数据拷贝。 
对于这类应用而言,即使采用零拷贝技术,也不能够避免由于数据组织而需要进行的多次数据拷贝。此外,目前的零拷贝技术还存在以下一些限制:首先,零拷贝的基本功能是在网卡驱动中实现的,往往需要对网卡驱动进行大量修改,这就增大了零拷贝对网卡驱动的依赖;其次,网卡驱动采用零拷贝技术后,从该网卡收发的任何数据包都将不再经过Linux协议栈的处理,而只能通过专门的收发接口直接与用户进程交互,这就限制了网卡的使用范围和使用方式。 
大块数据传输过程中的开销主要产生在用户程序、操作系统、网卡驱动等不同层次的数据组织、数据拷贝和数据传输上。如何有效地减少数据拷贝的次数,增强系统的兼容能力,对于降低CPU的消耗和提高系统的处理能力,具有至关重要的影响。 
而现有技术在大块数据传输过程中的CPU消耗太高,系统处理能力受到限制,因此,需要改进和发展。 
发明内容
本发明的目的在于提出一种基于Linux的网络协议栈实现局域网内高效传输大块数据的方法及系统,在不影响Linux系统原有网络协议栈的情况下,以尽量减少网络处理引起的CPU消耗,提高系统的处理能力。 
为实现上述目的,本发明的技术方案包括: 
一种实现局域网内高效传输大块数据的方法,其包括以下步骤: 
A、客户端向服务器端发送数据请求; 
B、所述服务器端接收数据请求后,所述服务器端进行数据准备,并向客户端发送大块数据应答,利用网卡的直接内存存取DMA功能和分散/汇聚SG功能,采用头部和载荷分离的方式实现零拷贝的数据发送; 
C、所述客户端接收服务器端的大块数据应答,利用数据包中携带的用户缓冲区地址信息,将数据包的载荷写入对应的用户缓冲区。 
所述的方法,其中,所述步骤A还包括: 
A1、客户端用户程序根据数据请求的帧结构,分配用户缓冲区并填充数据请求包,向服务器端用户程序请求大块数据; 
A2、所述客户端用户程序通过网络套接字调用数据发送的接口陷入内核态,进入数据请求包发送流程。 
所述的方法,其中,所述步骤A还包括: 
A3、协议栈内核模块验证数据请求帧结构的合法性,如果数据请求帧结构合法,则继续执行;如果数据请求帧结构不合法,则返回帧错误; 
A4、协议栈内核模块对控制缓冲区和数据缓冲区地址进行变换,将客户端用户程序提供的进程虚拟地址转换为物理内存地址,并存储在该网络套接字相关的内核数据结构中,同时锁定相关物理内存; 
A5、在网络套接字相关的内核数据结构中,记录数据请求索引,并设置数据请求标志为工作状态; 
A6、协议栈内核模块发送接口通过网卡驱动模块以DMA方式直接发送用户缓冲区的数据请求帧。 
所述的方法,其中,所述步骤B还包括: 
B11、所述服务器端用户程序通过网络套接字调用数据接收接口陷入内核态,进入数据请求包接收流程; 
B12、协议栈内核模块检查该套接字的内核接收队列上是否有数据请求,如果有数据请求,则将该数据请求从内核接收队列上取下,并将请求数据包的内容从内核态缓冲区中拷贝到用户态缓冲区中,释放该内核态缓冲区;如果没有数据请求,则服务器端用户程序阻塞在该套接字的内核接收队列上,等到内核接收函数收到数据请求包时唤醒。 
所述的方法,其中,所述步骤B还包括: 
B21、所述服务器端用户程序根据数据请求包中具体应用定义的数据结构,准备客户端请求的大块数据,存放在连续的用户缓冲区内,根据数据应答帧结构填充数据应答包; 
B22、所述服务器端用户程序通过网络套接字调用数据发送接口陷入内核态,进入数据应答包发送流程。 
所述的方法,其中,所述步骤B还包括: 
B23、协议栈内核模块验证数据应答帧结构的合法性,如果数据应答帧结构合法,则继续执行;如果数据应答帧结构不合法,则返回结构错误; 
B24、协议栈内核模块通过网卡驱动模块以DMA方式直接发送数据应答帧。 
所述的方法,其中,所述步骤C还包括: 
C1、所述客户端用户程序通过网络套接字调用数据接收接口陷入内核态,进入数据应答包接收流程; 
C2、协议栈内核模块检查该套接字上是否设置了数据请求标志,如果设置了数据请求标志,则等待内核接收函数调用模块的内核接收函数完成数据包的接收时唤醒;如果没有设置数据请求标志,则直接返回错误; 
C3、如果超时时间到,用户程序仍然没有被唤醒,则清除数据请求标志,返回超时错误并退出;如果在超时之前,协议栈模块已经接受完所有的数据包,则设置数据请求标志为完成状态,完成后正常返回。 
所述的方法,其中,所述步骤C3中的协议栈模块处理过程包括: 
网卡驱动模块接收到以太网数据包后,送给协议栈模块进行分析处理,所述协议栈模块根据以太网协议类型检查是否有网络套接字来接收该数据包,如果有则将数据包交给该网络套接字的内核接收函数进行处理;所述内核接收函数根据数据包的类型进行以下处理: 
如果是数据请求包,则将该数据请求包挂在该套接字的内核接收队列上,并唤醒可能阻塞在该套接字的内核接收队列上的用户程序; 
如果是数据应答包,则根据是否设置了数据请求标志进行不同的处理:如果设置了数据请求标志,检验数据应答包中的索引字段是否与请求索引一致,如果一致就根据数据应答包中的存放物理地址和存放数据长度进行写内存操作,如果不一致就将数据包直接丢弃;如果没有设置数据请求标志如果是数据应答包,则根据是否设置了数据请求标志进行不同的处理:如果设置了数据请求标志,检验数据应答包中的索引字段是否与请求索引一致,如果一致就根据数据应答包中的存放物理地址和存放数据长度进行写内存操作,如果不一致就将数据包直接丢弃;如果没有设置数据请求标志,就将数据包直接丢弃; 
,就将数据包直接丢弃; 
如果既不是数据请求包,也不是数据应答包,则将数据包直接丢弃。 
一种实现局域网内高效传输大块数据的系统,基于Linux的网络协议栈,包括一服务器端和一客户端,其中,还包括一协议栈内核模块,通过创建相应的套接字用于所述服务器端与客户端的连接,所述服务器端与客户端连接所用网卡支持DMA功能和SG功能;所述客户端向服务器端发送数据请求;所述服务器端向客户端的大块数据应答发送采用头部和载荷分离的方式实现零拷贝的数据发送;所述客户端对所述服务器端的大块数据应答接收利用数据包中携带的用户缓冲区地址信息,将数据包的载荷写入对应的用户缓冲区; 
其中,所述客户端向服务器端发送数据请求,具体包括: 
A1、客户端用户程序根据数据请求的帧结构,分配用户缓冲区并填充数据请求包,向服务器端用户程序请求大块数据; 
A2、所述客户端用户程序通过网络套接字调用数据发送的接口陷入内核态,进入数据请求包发送流程; 
A3、协议栈内核模块验证数据请求帧结构的合法性,如果数据请求帧结构合法,则继续执行;如果数据请求帧结构不合法,则返回帧错误; 
A4、协议栈内核模块对控制缓冲区和数据缓冲区地址进行变换,将客户端用户程序提供的进程虚拟地址转换为物理内存地址,并存储在该网络套接字相关的内核数据结构中,同时锁定相关物理内存; 
A5、在网络套接字相关的内核数据结构中,记录数据请求索引,并设置数据请求标志为工作状态; 
A6、协议栈内核模块发送接口通过网卡驱动模块以DMA方式直接发送用户缓冲区的数据请求帧。 
所述的系统,其中,所述客户端向服务器端的数据请求发送采用头部和载荷分离的方式实现零拷贝的数据发送。 
本发明所提供的实现局域网内高效传输大块数据的方法及系统,由于充分利用了网卡的DMA功能和SG(Scatter/Gather,分散/汇聚)功能,重新定义了数据发送消息sendmsg和数据应答消息recvmsg的系统调用,同时增加了协议栈对数据请求帧和数据应答帧的特殊处理流程,实现了局域网内有效传输大块数据时的低CPU消耗和高系统处理能力。 
附图说明
图1是本发明方法和系统在网络应用中通过网络套接字进行局域网内大块数据传输的示意图; 
图2所示为本发明方法实现的协议栈内核模块在系统中位置示意图。 
具体实施方式
以下结合附图,将对本发明的各较佳实施例进行更为详细的说明。 
本发明方法的硬件环境要求网卡具有DMA功能和SG(Scatter/Gather,分散/汇聚)功能,软件环境为网络功能正常的Linux内核。本发明的核心发明点在于:该网络协议栈利用内核模块机制实现,模块的加载和卸载都不会影响Linux内核原有的网络协议栈,同时要求网卡支持DMA功能和SG功能,由于本发明方法的网卡支持SG功能,通过在其网络协议栈传输的数据采用了头部和载荷分离的方式实现零拷贝的数据发送;该网络协议栈同时定义了协议所用的以太网帧结构,包括数据请求帧和数据应答帧,其中数据请求帧结构包含下列字段:接收应答控制消息的缓冲区指针和长度,接收应答数据的缓冲区指针和长度,以及应用特定的请求控制消息等字段;数据应答帧包含下列字段:应答数据包总个数、应答数据包索引值,以及应用特定的控制消息/数据等字段。该网络协议栈给用户进程提供的套接字编程接口,主要包括socket、close、sendmsg、recvmsg等系统调用, 其中socket用于创建套接字,close用于关闭套接字,sendmsg用于实现数据发送,recvmsg用于实现数据接收。 
为了实现有效传输大块数据的目的,本发明方法在原有Linux内核的基础上创建了基于AF_DATALINK网络套接字类型的datalink网络协议栈。该协议栈给用户进程提供AF_DATALINK类型的套接字编程接口,包括socket、close、sendmsg、recvmsg等系统调用,其中socket系统调用用于创建套接字,close系统调用用于关闭套接字,sendmsg系统调用用于数据发送,recvmsg系统调用用于数据接收。 
所述数据发送消息sendmsg和数据应答消息recvmsg的现有技术系统调用标准语义不能够实现本发明的功能,本发明方法必须对其进行重新定义,下面给出本发明sendmsg和recvmsg系统调用的函数原型: 
ssize_t sendmsg(int sd,const struct msghdr*msg,int flags); 
ssize_t recvmsg(int sd,const struct msghdr*msg,int flags); 
其中sd是使用socket系统调用创建的AF_DATALINK网络套接字,msg的类型定义如下所示: 
struct msghdr{ 
  void          *msg_name; 
  socklen_t       msg_namelen; 
  struct iovec    *msg_iov; 
  int             msg_iovlen; 
  void            *msg_control; 
  socklen_t       msg_controllen; 
  int             msg_flags; 
flags是用于区分请求相关操作/应答相关操作的标记,为简化后面的描 述,定义宏O_FS_REQ用于表示请求相关操作,宏O_FS_ACK用于表示应答相关操作。 
通过上述套接字编程接口,使用请求应答模式可进行局域网内大块数据传输的流程,如图1所示,其中sendmsg(O_FS_REQ)表示客户端向服务器端发送数据请求,recvmsg(O_FS_REQ)表示服务器端等待接收客户端发送的数据请求,sendmsg(O_FS_ACK)表示服务器端向用户发送数据应答,recvmsg(O_FS_ACK)表示客户端等待接收服务器端的数据应答。 
所述客户端使用sendmsg(sd,msg,O_FS_REQ)系统调用向服务器端发送数据请求,基本步骤为: 
(1.1)客户端用户程序根据数据请求帧结构,分配用户缓冲区并填充数据请求包,向服务器端用户程序请求大块数据。其中数据请求帧结构中的以太网协议类型为服务器端使用的以太网协议类型,sd为创建的datalink网络套接字,msg指向数据请求帧;msg使用了msg_iov和msg_iovlen字段,指向一个描述了数据请求帧的struct iovec结构,其它字段置空。 
(1.2)客户端用户程序通过datalink网络套接字调用sendmsg()接口陷入内核态。根据系统调用提供的O_FS_REQ标志,进入数据请求包发送流程。 
(1.3)datalink协议栈内核模块验证数据请求帧结构的合法性。如果数据请求帧结构合法,则继续执行;如果数据请求帧结构不合法,则返回帧错误。 
(1.4)datalink协议栈内核模块对控制缓冲区和数据缓冲区地址进行变换,将客户端用户程序提供的进程虚拟地址转换为物理内存地址,并存储在该datalink网络套接字相关的内核数据结构中。同时锁定相关物理内存,防止这些内存页面被交换出去,保证收到服务器端的应答数据包时能够及时的写入接收内存中。 
(1.5)在datalink网络套接字相关的内核数据结构中,记录数据请求索引,并设置数据请求标志为工作状态,以便接收数据应答时能够进行索引校验和状态校验。 
(1.6)datalink协议栈内核模块发送接口通过网卡驱动模块以DMA方式直接发送用户缓冲区的数据请求帧。 
所述服务器端使用recvmsg(sd,msg,O_FS_REQ)系统调用接收数据请求,其基本步骤包括: 
(2.1)服务器端用户程序通过datalink网络套接字调用recvmsg()接口陷入内核态。根据系统调用提供的O_FS_REQ标志,进入数据请求包接收流程。其中,sd为创建的datalink网络套接字,msg指向一个空闲的用户缓存区;msg使用了msg_iov和msg_iovlen字段,包含一个struct iovec结构,指向空闲的用户缓存区,用于存放接收到的数据请求帧,其它字段置空。 
(2.2)datalink协议栈内核模块检查该套接字的内核接收队列上是否有数据请求。如果有数据请求,则将该数据请求从内核接收队列上取下,并将请求数据包的内容从内核态缓冲区中拷贝到用户态缓冲区中,并释放该内核态缓冲区;如果没有数据请求,则服务器端用户程序阻塞在该套接字的内核接收队列上,等到内核接收函数收到数据请求包时唤醒。 
所述服务器端使用sendmsg(sd,msg,O_FS_ACK)系统调用向客户端发送数据应答,其基本步骤包括: 
(3.1)所述服务器端用户程序首先根据数据请求包中具体应用定义的数据结构,准备客户端请求的大块数据,存放在连续的用户缓冲区内,然后根据数据应答帧结构填充数据应答包,其中以太网协议类型为客户端使用的类型,数据请求索引为对应数据请求包中的数据请求索引,数据包总个数为此次应答包总共发送的数据包数目,数据包索引值为本应答包的序号值。对每个应答数据包,提供两部分缓冲区,一部分包含数据应答包头部,另一部分包含数据应答包数据。其中,sd为创建的datalink网络套接字, msg指向一组应答数据包;msg使用了msg_iov和msg_iovlen字段指向应答包数据,msg_control和msg_controllen字段指向应答包头部,其它字段置空。 
(3.2)服务器端用户程序通过datalink网络套接字调用sendmsg()接口陷入内核态。根据系统调用提供的O_FS_ACK标志,进入数据应答包发送流程,一次sendmsg()系统调用发送一批应答包。 
(3.3)datalink协议栈内核模块验证数据应答帧结构的合法性。如果数据应答帧结构合法,则继续执行;如果数据应答帧结构不合法,则返回结构错误。 
(3.4)datalink协议栈内核模块通过网卡驱动模块以DMA方式直接发送数据应答帧。实际发送时,对于每一个待发送的应答数据包,利用网卡的SG功能,将头部和数据分别与网卡的发送缓冲区建立DMA映射关系,完成应答数据的零拷贝发送。 
所述客户端通过recvmsg(sd,msg,O_FS_ACK)系统调用接收服务器端的数据应答的步骤包括: 
(4.1)客户端用户程序通过datalink网络套接字调用recvmsg()接口陷入内核态。根据系统调用提供的O_FS_ACK标志,进入数据应答包接收流程。其中,sd为创建的datalink网络套接字,msg指向一个超时时间值;msg使用了msg_iov和msg_iovlen字段,包含一个时间结构,指示操作超时时间间隔,其它字段置空。 
(4.2)datalink协议栈内核模块检查该套接字上是否设置了数据请求标志。如果设置了数据请求标志,说明已经发出了数据请求,则带超时的阻塞在内核等待队列上,等待内核接收函数调用模块的内核接收函数完成数据包的接收时唤醒;如果没有设置数据请求标志,说明还没有发出数据请求,则直接返回错误。 
(4.3)如果超时时间到,用户程序仍然没有被唤醒,说明请求的数据包还没有全部收到,则需要清除数据请求标志,完成后返回超时错误并退出。 
(4.4)如果在超时之前,协议栈模块已经接受完所有的数据包,则设置数据请求标志为完成状态,完成后正常返回。 
所述协议栈模块处理接收到的数据请求帧和数据应答帧,其基本步骤包括: 
(5.1)网卡驱动模块接收到以太网数据包后,送给协议栈进行分析处理。协议栈根据以太网协议类型检查是否有datalink网络套接字来接收该数据包,如果有则将数据包交给该datalink网络套接字的内核接收函数进行处理。 
(5.2)datalink的内核接收函数根据数据包的类型进行相应的处理; 
A)如果是数据请求包,则将该数据请求包挂在该套接字的内核接收队列上,并唤醒可能阻塞在该套接字的内核接收队列上的用户程序。 
B)如果是数据应答包,则根据是否设置了数据请求标志进行不同的处理。如果设置了数据请求标志,检验数据应答包中的索引字段是否与请求索引一致,如果一致就根据数据应答包中的存放物理地址和存放数据长度进行写内存操作,如果不一致就将数据包直接丢弃;如果没有设置数据请求标志,就将数据包直接丢弃。 
C)如果既不是数据请求包,也不是数据应答包,则将数据包直接丢弃。 
本发明方法充分利用了网卡的DMA功能和SG功能,重新定义了sendmsg和recvmsg系统调用,同时增加了协议栈对数据请求帧和数据应答帧的特殊处理流程,实现了局域网内有效传输大块数据的目的。与Linux内核现有的网络协议栈相比,本发明方法主要具有以下特点: 
(1)利用了网卡的SG功能,实现了头部和载荷分离的数据包的发送,减少了将大块数据进行打包过程中所需的一次数据拷贝操作。 
(2)利用了网卡的DMA功能,实现了网卡驱动模块直接使用用户缓冲区进行数据包的发送,减少了将数据块从用户空间拷贝到内核空间所需的一次数据拷贝操作。 
(3)采用了批量发送技术,实现了一次系统调用就能够发送一批数据包的功能,避免了发送一个数据包就需要一次系统调用的情况,减少了发送大块数据时系统调用的开销。 
(4)采用了数据包中携带相关内存地址的方案,实现了内核收包后就直接写入相应的用户缓冲区,减少了将接收到的大块数据从内核空间拷贝到用户空间再重新组织的一次数据拷贝操作。 
(5)采用了请求应答模式进行服务器端和客户端之间的通信方式,在进行一次大块数据传输过程中,在客户端仅有两次系统调用,一次数据拷贝;在服务器端仅有两次系统调用,没有数据拷贝。 
本发明实现局域网内高效传输大块数据的系统,如图2所示,基于Linux的网络协议栈,设置包括一服务器端和一客户端,本发明系统的改进点在于提供一协议栈内核模块,改进网络协议栈,通过创建相应的套接字用于所述服务器端与客户端的连接。 
所述服务器端或所述客户端的结构实现如图2所示,其硬件设备主要是网卡,在系统的软件实现中,基于硬件设备实现了内核空间和用户空间,在用户空间中由用户进程实现了用户接收缓冲区和用户发送缓冲区;所述用户接收缓冲区通过从网卡接收来的数据包,由网卡驱动支持的DMA功能,将数据接收到在内核空间实现的网络协议栈内核接收缓冲区内。 
通过recvmsg接收系统调用可将所述内核接收缓冲区内的数据包经过一次数据拷贝后发送到用户接收缓冲区内。在发送数据时,由用户发送缓冲区内的数据包,通过sendmsg发送系统调用,对用户发送缓冲区内的数据包向所述网络协议栈的内核发送缓冲区进行用户页面映射,从而避免对 发送数据包的一次拷贝,然后由网卡驱动的DMA功能之间从所述内核发送缓冲区通过网卡向外发送。 
在本发明系统及方法中,在发送数据或接收数据过程中,由于网卡具有SG功能,数据包在进行准备过程中,在缓冲区中采用了头部和载荷分离的方式以实现零拷贝的数据发送,从而降低了数据处理对系统资源的消耗,提高了处理效率。 
上述发送和接收过程在所述服务器端和所述客户端是一样的,但在所述客户端向所述服务器端发送数据请求时,也可以采用对数据包头部和载荷分离的方式实现零拷贝的数据发送。 
本发明所述服务器端与所述客户端连接所用的网卡支持DMA功能和SG功能;所述服务器端向客户端发送大块数据应答时,采用头部和载荷分离的方式实现零拷贝的数据发送;所述客户端对所述服务器端的大块数据应答接收利用数据包中携带的用户缓冲区地址信息,将数据包的载荷写入对应的用户缓冲区。 
综上,本发明实现局域网内高效传输大块数据的方法及系统,在大块数据传输时减少了网络处理引起的CPU消耗,提高了系统的处理能力。 
应当理解的是,上述针对本发明较佳实施例的描述较为具体,并不能因此而认为是对本发明专利保护范围的限制,本发明的专利保护范围应以所附权利要求为准。 

Claims (8)

1.一种实现局域网内高效传输大块数据的方法,其特征在于,包括以下步骤:
A、客户端向服务器端发送数据请求;
B、所述服务器端接收数据请求后,所述服务器端进行数据准备,并向客户端发送大块数据应答,利用网卡的直接内存存取DMA功能和分散/汇聚SG功能,采用头部和载荷分离的方式实现零拷贝的数据发送;
C、所述客户端接收服务器端的大块数据应答,利用数据包中携带的用户缓冲区地址信息,将数据包的载荷写入对应的用户缓冲区;
其中,所述步骤A具体包括:
A1、客户端用户程序根据数据请求的帧结构,分配用户缓冲区并填充数据请求包,向服务器端用户程序请求大块数据;
A2、所述客户端用户程序通过网络套接字调用数据发送的接口陷入内核态,进入数据请求包发送流程;
A3、协议栈内核模块验证数据请求帧结构的合法性,如果数据请求帧结构合法,则继续执行;如果数据请求帧结构不合法,则返回帧错误;
A4、协议栈内核模块对控制缓冲区和数据缓冲区地址进行变换,将客户端用户程序提供的进程虚拟地址转换为物理内存地址,并存储在该网络套接字相关的内核数据结构中,同时锁定相关物理内存;
A5、在网络套接字相关的内核数据结构中,记录数据请求索引,并设置数据请求标志为工作状态;
A6、协议栈内核模块发送接口通过网卡驱动模块以DMA方式直接发送用户缓冲区的数据请求帧。
2.根据权利要求1所述的方法,其特征在于,所述步骤B还包括:
B11、所述服务器端用户程序通过网络套接字调用数据接收接口陷入内核态,进入数据请求包接收流程;
B12、协议栈内核模块检查该套接字的内核接收队列上是否有数据请求,如果有数据请求,则将该数据请求从内核接收队列上取下,并将请求数据包的内容从内核态缓冲区中拷贝到用户态缓冲区中,释放该内核态缓冲区;如果没有数据请求,则服务器端用户程序阻塞在该套接字的内核接收队列上,等到内核接收函数收到数据请求包时唤醒。
3.根据权利要求2所述的方法,其特征在于,所述步骤B还包括:
B21、所述服务器端用户程序根据数据请求包中具体应用定义的数据结构,准备客户端请求的大块数据,存放在连续的用户缓冲区内,根据数据应答帧结构填充数据应答包;
B22、所述服务器端用户程序通过网络套接字调用数据发送接口陷入内核态,进入数据应答包发送流程。
4.根据权利要求3所述的方法,其特征在于,所述步骤B还包括:
B23、协议栈内核模块验证数据应答帧结构的合法性,如果数据应答帧结构合法,则继续执行;如果数据应答帧结构不合法,则返回结构错误;
B24、协议栈内核模块通过网卡驱动模块以DMA方式直接发送数据应答帧。
5.根据权利要求4所述的方法,其特征在于,所述步骤C还包括:
C1、所述客户端用户程序通过网络套接字调用数据接收接口陷入内核态,进入数据应答包接收流程;
C2、协议栈内核模块检查该套接字上是否设置了数据请求标志,如果设置了数据请求标志,则等待内核接收函数调用模块的内核接收函数完成数据包的接收时唤醒;如果没有设置数据请求标志,则直接返回错误;
C3、如果超时时间到,用户程序仍然没有被唤醒,则清除数据请求标志,返回超时错误并退出;如果在超时之前,协议栈模块已经接受完所有的数据包,则设置数据请求标志为完成状态,完成后正常返回。
6.根据权利要求5所述的方法,其特征在于,所述步骤C3中的协议栈模块处理过程包括:
网卡驱动模块接收到以太网数据包后,送给协议栈模块进行分析处理,所述协议栈模块根据以太网协议类型检查是否有网络套接字来接收该数据包,如果有则将数据包交给该网络套接字的内核接收函数进行处理;所述内核接收函数根据数据包的类型进行以下处理:
如果是数据请求包,则将该数据请求包挂在该套接字的内核接收队列上,并唤醒可能阻塞在该套接字的内核接收队列上的用户程序;
如果是数据应答包,则根据是否设置了数据请求标志进行不同的处理:如果设置了数据请求标志,检验数据应答包中的索引字段是否与请求索引一致,如果一致就根据数据应答包中的存放物理地址和存放数据长度进行写内存操作,如果不一致就将数据包直接丢弃;如果没有设置数据请求标志,就将数据包直接丢弃;
如果既不是数据请求包,也不是数据应答包,则将数据包直接丢弃。
7.一种实现局域网内高效传输大块数据的系统,基于Linux的网络协议栈,包括一服务器端和一客户端,其特征在于,还包括一协议栈内核模块,通过创建相应的套接字用于所述服务器端与客户端的连接,所述服务器端与客户端连接所用网卡支持DMA功能和SG功能;所述客户端向服务器端发送数据请求;所述服务器端向客户端的大块数据应答发送采用头部和载荷分离的方式实现零拷贝的数据发送;所述客户端对所述服务器端的大块数据应答接收利用数据包中携带的用户缓冲区地址信息,将数据包的载荷写入对应的用户缓冲区;
其中,所述客户端向服务器端发送数据请求,具体包括:
A1、客户端用户程序根据数据请求的帧结构,分配用户缓冲区并填充数据请求包,向服务器端用户程序请求大块数据;
A2、所述客户端用户程序通过网络套接字调用数据发送的接口陷入内核态,进入数据请求包发送流程;
A3、协议栈内核模块验证数据请求帧结构的合法性,如果数据请求帧结构合法,则继续执行;如果数据请求帧结构不合法,则返回帧错误;
A4、协议栈内核模块对控制缓冲区和数据缓冲区地址进行变换,将客户端用户程序提供的进程虚拟地址转换为物理内存地址,并存储在该网络套接字相关的内核数据结构中,同时锁定相关物理内存;
A5、在网络套接字相关的内核数据结构中,记录数据请求索引,并设置数据请求标志为工作状态;
A6、协议栈内核模块发送接口通过网卡驱动模块以DMA方式直接发送用户缓冲区的数据请求帧。
8.根据权利要求7所述的系统,其特征在于,所述客户端向服务器端的数据请求发送采用头部和载荷分离的方式实现零拷贝的数据发送。
CN2008100680940A 2008-06-25 2008-06-25 一种实现局域网内高效传输大块数据的方法及系统 Expired - Fee Related CN101304373B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2008100680940A CN101304373B (zh) 2008-06-25 2008-06-25 一种实现局域网内高效传输大块数据的方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2008100680940A CN101304373B (zh) 2008-06-25 2008-06-25 一种实现局域网内高效传输大块数据的方法及系统

Publications (2)

Publication Number Publication Date
CN101304373A CN101304373A (zh) 2008-11-12
CN101304373B true CN101304373B (zh) 2011-03-02

Family

ID=40114089

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2008100680940A Expired - Fee Related CN101304373B (zh) 2008-06-25 2008-06-25 一种实现局域网内高效传输大块数据的方法及系统

Country Status (1)

Country Link
CN (1) CN101304373B (zh)

Families Citing this family (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102375789B (zh) * 2010-08-09 2014-05-28 中标软件有限公司 一种通用网卡非缓存的零拷贝方法及零拷贝系统
CN102638487B (zh) * 2011-03-02 2015-09-16 中国科学院地质与地球物理研究所 大型遥测地震仪高性能数据传输方法
CN103166994A (zh) * 2011-12-14 2013-06-19 腾讯科技(深圳)有限公司 获取网络数据的方法及装置
CN103838513A (zh) * 2012-11-22 2014-06-04 深圳市中兴微电子技术有限公司 内存读写的动态控制方法及装置
CN103176855A (zh) * 2013-03-15 2013-06-26 中兴通讯股份有限公司 消息交互处理方法及装置
CN104811391B (zh) * 2014-01-24 2020-04-21 中兴通讯股份有限公司 数据包的处理方法、装置及服务器
CN105677597A (zh) * 2014-11-20 2016-06-15 中兴通讯股份有限公司 数据写入方法及装置
CN106302372A (zh) * 2015-06-12 2017-01-04 中兴通讯股份有限公司 网络媒体流收包方法、装置及系统
CN105187506A (zh) * 2015-08-12 2015-12-23 深圳市广和通无线股份有限公司 无线通讯模块的数据上传方法
CN105245271B (zh) * 2015-10-27 2019-12-13 航天恒星科技有限公司 卫星通信网络加速装置以及方法
CN106850565B (zh) * 2016-12-29 2019-06-18 河北远东通信系统工程有限公司 一种高速的网络数据传输方法
CN106657365B (zh) * 2016-12-30 2019-12-17 清华大学 一种基于rdma的高并发数据传输方法
CN107678987B (zh) * 2017-10-10 2021-06-29 郑州云海信息技术有限公司 一种dma传输的方法、装置及设备
CN110011933B (zh) * 2018-01-05 2021-05-18 华为技术有限公司 发送数据包的方法、装置及计算机可读存储介质
CN111698274B (zh) 2019-03-15 2021-11-19 华为技术有限公司 数据处理方法及装置
CN110083468A (zh) * 2019-05-05 2019-08-02 Oppo广东移动通信有限公司 一种数据传输方法、电子装置和存储介质
CN111447046B (zh) * 2020-03-26 2023-04-25 广州市百果园信息技术有限公司 业务数据传输方法、装置、设备和存储介质
CN112905357A (zh) * 2021-01-27 2021-06-04 清华大学 一种数据读取方法、系统、电子设备及存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101063963A (zh) * 2006-04-26 2007-10-31 韩国电子通信研究院 数据零拷贝文件的移动方法
CN101135980A (zh) * 2006-08-29 2008-03-05 飞塔信息科技(北京)有限公司 一种基于Linux操作系统实现零拷贝的装置和方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101063963A (zh) * 2006-04-26 2007-10-31 韩国电子通信研究院 数据零拷贝文件的移动方法
CN101135980A (zh) * 2006-08-29 2008-03-05 飞塔信息科技(北京)有限公司 一种基于Linux操作系统实现零拷贝的装置和方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Hai Jin 等.Lightweight Messages:True Zero-Copy Communicaiton for Commodity Gigabit Ethernet.《IFIP International Federation for Information Processing》.2006,153-162.
Hai Jin等.Lightweight Messages:True Zero-Copy Communicaiton for Commodity Gigabit Ethernet.《IFIP International Federation for Information Processing》.2006,153-162. *

Also Published As

Publication number Publication date
CN101304373A (zh) 2008-11-12

Similar Documents

Publication Publication Date Title
CN101304373B (zh) 一种实现局域网内高效传输大块数据的方法及系统
CN101340574B (zh) 一种实现零拷贝发送流媒体数据的方法及系统
US7089289B1 (en) Mechanisms for efficient message passing with copy avoidance in a distributed system using advanced network devices
CN101827072B (zh) 执行分段卸载的方法和网络装置
US6799200B1 (en) Mechanisms for efficient message passing with copy avoidance in a distributed system
US9176911B2 (en) Explicit flow control for implicit memory registration
US5884313A (en) System and method for efficient remote disk I/O
US6070194A (en) Using an index and count mechanism to coordinate access to a shared resource by interactive devices
US5721955A (en) System for transferring portion of data to host from buffer if size of packet is greater than first threshold value but less than second threshold value
WO2010015142A1 (zh) 一种实现零拷贝发送流媒体数据的方法及系统
US20050188105A1 (en) Shared memory and high performance communication using interconnect tunneling
US20040213243A1 (en) Transmission components for processing VLAN tag and priority packets supported by using single chip's buffer structure
US9584628B2 (en) Zero-copy data transmission system
CN113742269B (zh) 用于epa设备的数据传输方法、处理设备和介质
CN108090003A (zh) 一种基于零拷贝的提升web服务器性能的方法、系统
CN104219247A (zh) 一种无线多媒体传感器网络接入ip网络的方法
KR101559089B1 (ko) 장치의 컴포넌트들 간에 메모리 자원들을 공유하기 위한 통신 프로토콜
CN113127139B (zh) 一种基于数据面开发套件dpdk的内存分配方法和装置
US20070011386A1 (en) Usb host controller with memory for transfer descriptors
US5923852A (en) Method and system for fast data transmissions in a processing system utilizing interrupts
CN100486248C (zh) 一种实时环境下的零拷贝通信方法
CN104102550A (zh) 一种多主机进程间通信的方法
US6654865B2 (en) Netbufs: communication protocol packet buffering using paged memory management
CN110971621B (zh) 基于sdio接口的嵌入式多cpu互联电路、互联方法及驱动方法
WO2020051505A1 (en) Application-transparent near-memory processing architecture with memory channel network

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
ASS Succession or assignment of patent right

Owner name: JIANGSU YONGDING COMMUNICATION CO., LTD.

Free format text: FORMER OWNER: ZTE CORPORATION

Effective date: 20150706

C41 Transfer of patent application or patent right or utility model
C53 Correction of patent of invention or patent application
CB03 Change of inventor or designer information

Inventor after: Wang Weiqiang

Inventor after: Sun Fuqing

Inventor after: Cheng Ning

Inventor after: Mo Siming

Inventor before: Wang Weiqiang

Inventor before: Sun Fuqing

Inventor before: Cheng Ning

COR Change of bibliographic data

Free format text: CORRECT: INVENTOR; FROM: WANG WEIQIANG SUN FUQING CHENG NING TO: WANG WEIQIANG SUN FUQING CHENG NING MO SIMING

TR01 Transfer of patent right

Effective date of registration: 20150706

Address after: Wujiang District of Suzhou City, Jiangsu province 215000 Lili town Yuexiu Road No. 888

Patentee after: JIANGSU YONGDING COMMUNICATIONS Co.,Ltd.

Address before: 518057 Nanshan District Guangdong high tech Industrial Park, South Road, science and technology, ZTE building, Ministry of Justice

Patentee before: ZTE Corp.

CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20110302

CF01 Termination of patent right due to non-payment of annual fee