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

文档序号:7688698阅读:229来源:国知局
专利名称:一种实现局域网内高效传输大块数据的方法及系统的制作方法
技术领域
本发明涉及一种计算机应用领域的网络通信方法及系统,具体涉及的
是一种基于Linux的网络协议栈实现局域网内高效传输大块数据的方法及 系统。
背景技术
在现有技术的Linux操作系统中,常常通过网络套接字使用系统调用 接收和发送网络数据包。在数据包的接收过程中,需要通过接收系统调用 陷入内核态,将网卡接收的数据包从内核接收緩存拷贝到用户缓冲区;在 数据包的发送过程中,又需要通过发送系统调用陷入内核态,将用户待发 送的数据包从用户緩冲区净S贝到内核发送緩存并发送出去。
为了减少用户程序收发数据包过程中出现的拷贝操作,出现了零拷贝 技术。零拷贝技术的基本思想是数据包在网卡与用户进程空间之间传递 的过程中,避免数据拷贝,降低CPU的消耗。零拷贝技术主要利用了内存 映射4支术和DMA (Direct Memory Access ,直接内存存取)传输技术 接收时,数据包直接从网卡DMA到内核空间,用户进程通过内存映射获得 网络数据;发送时,数据包直接从用户空间緩冲区DMA到网卡。
在基于Linux操作系统的网络应用中,常常需要将大块数据在网络上 进行传输。当在网络客户端和服务器端之间传输大块数据时,大块数据要 在不同的系统空间中进行多次传递,传递流程主要包括以下几个部分
客户端发送数据请求客户端根据应用需要,向服务器端发送数据请服务器端接收数据请求服务器端接收到客户端的数据请求之后,准 备客户端所需要的数据块;
服务器端发送数据应答服务器端将数据块按一定的方式进行组织, 封装成适合网络传输的一批数据应答包,向客户端发送数据应答;
客户端接收数据应答客户端接收到服务器端的数据应答之后,对应 答数据进行重排整理,最终获得客户端所需要的数据块。
在这种方式下,除了网络数据收发需要消耗系统资源外,服务器端将 数据块封装成一系列的数据应答包、客户端将这一系列的数据应答包组织 成数据块,这些数据组织操作都需要进行额外的数据拷贝。
对于这类应用而言,即使釆用零拷贝技术,也不能够避免由于数据组 织而需要进行的多次数据拷贝。此外,目前的零拷贝技术还存在以下一些 限制首先,零拷贝的基本功能是在网卡驱动中实现的,往往需要对网卡 驱动进行大量修改,这就增大了零拷贝对网卡驱动的依赖;其次,网卡驱 动采用零拷贝技术后,从该网卡收发的任何数据包都将不再经过Linux协议 栈的处理,而只能通过亏门的收发接口直接与用户进程交互,这就限制了 网卡的使用范围和使用方式。
大块数据传输过程中的开销主要产生在用户程序、操作系统、网卡驱 动等不同层次的数据组织、数据拷贝和数据传输上。如何有效地减少数据 拷贝的次数,增强系统的兼容能力,对于降低CPU的消耗和提高系统的处 理能力,具有至关重要的影响。
而现有技术在大块数据传输过程中的CPU消耗太高,系统处理能力受 到限制,因此,需要改进和发展
发明内容
本发明的目的在于提出一种基于Linux的网络协议栈实现局域网内高 效传输大块数据的方法及系统,在不影响Linux系统原有网络协议栈的情况 下,以尽量减少网络处理引起的CPU消耗,提高系统的处理能力。
为实现上述目的,本发明的技术方案包括
一种实现局域网内高效传输大块数据的方法,其包括以下步骤
A、 客户端向服务器端发送数据请求;
B、 所述服务器端接收数据请求后,所述服务器端进行数据准备,并向 客户端发送大块数据应答,利用网卡的直接内存存取DMA功能和^t/ 汇聚SG功能,采用头部和载荷分离的方式实现零拷贝的数据发送;
C、 所iijl户端接收服务器端的大块数据应答,利用数据包中携带的用 户緩冲区地址信息,将数据包的载荷写入对应的用户緩冲区。
所述的方法,其中,所述步骤A还包括
Al、客户端用户程序根据数据请求的帧结构,分配用户緩沖区并填充 数据请求包,向月l务器端用户程序请求大块数据;
A2、所i^户端用户程序通过网络套接字调用数据发送的接口陷入内 核态,进入数据请求包发送流程。
所述的方法,其中,所述步骤A还包括
A3、协议栈内核模块验证数据请求帧结构的合法性,如果数据请求帧 结构合法,则继续执行;如果数据请求帧结构不合法,则返回帧错误;
A4、协议栈内核模块对控制緩冲区和数据緩冲区地址进行变换,将客 户端用户程序提供的进程虚拟地址转换为物理内存地址,并存储在该网络 套接字相关的内核数据结构中,同时锁定相关物理内存;
A5、在网络套接字相关的内核数据结构中,记录数据请求索引,并设 置数据请求标志为工作状态;
A6、协议栈内核模块发送接口通过网卡驱动模块以DMA方式直接发 送用户緩冲区的数据请求帧。所述的方法,其中,所述步骤B还包括
B11 、所述服务器端用户程序通过网络套接字调用数据接收接口陷入内 核态,ii^数据请求包接收流程;
B12、协议栈内核模块检查该套接字的内核接收队列上是否有数据请 求,如果有数据请求,则将该数据请求从内核接收队列上取下,并将请求 数据包的内容从内核态緩冲区中拷贝到用户态緩冲区中,释放该内核态緩 冲区;如果没有数据请求,则服务器端用户程序阻塞在该套接字的内核接 收队列上,等到内核接收函数收到数据请求包时唤醒。
所述的方法,其中,所述步骤B还包括
B21 、所述服务器端用户程序根据数据请求包中具体应用定义的数据结 构,准备客户端请求的大块数据,存放在连续的用户緩沖区内,根据数据 应答帧结构填充数据应答包;
B22、所述服务器端用户程序通过网络套接字调用数据发送接口陷入内 核态,进入数据应答包发送流程。 '
所述的方法,其中,所述步骤B还包括
B23、协议栈内核模块验证数据应答帧结构的合法性,如果数据应答帧 结构合法,则继续执行;如果数据应答帧结构不合法,则返回结构错误;
B24、协议栈内核模块通过网卡驱动才莫块以DMA方式直接发送数据应 答帧。
所述的方法,其中,所述步骤C还包括
Cl、所述客户端用户程序通过网络套接字调用数据接收接口陷入内核 态,进入数据应答包接收流程;
C2、协议栈内核模块检查该套接字上是否设置了数据请求标志,如果-设置了数据请求标志,则等待内核接收函数调用模块的内核接收函数完成 数据包的接收时唤醒;如果没有设置数据请求标志,则直接返回错误;C3、如果超时时间到,用户程序仍然没有被唤醒,则清除数据请求标 志,返回超时错误并退出;如果在超时之前,协议栈模块已经接受完所有 的数据包,则设置数据请求标志为完成状态,完成后正常返回。
所述的方法,其中,所述步骤C3中的协议栈模块处理过程包括
网卡驱动模块接收到以太网数据包后,送给协议栈模块进行分析处理, 所述协议栈模块根据以太网协议类型检查是否有网络套接字来接收该数据 包,如果有则将数据包交给该网络套接字的内核接收函数进行处理;所述 内核接收函数根据数据包的类型进行以下处理
如果是数据请求包,则将该数据请求包挂在该套接字的内核接收队列 上,并唤醒可能阻塞在该套接字的内核接收队列上的用户程序;
如果是数据应答包,则根据禾否设置了数据请求标志进行不同的处理 如果设置了数据请求标志,检验数据应答包中的索引字段是否与请求索引 一致,如果一致就根据数据应答包中的存放物理地址和存放数据长度进行 写内存操作,如果不一致就将数据包直接丟弃;如果没有设置数据请求标 志,就将数据包直接丢弃;
如果既不是数据请求包,也不是数据应答包,则将数据包直接丢弃。
一种实现局域网内高效传输大块数据的系统,基于Linux的网络协议 栈,包括一服务器端和一客户端,其中,还包括一协议栈内核模块,通过 创建相应的套接字用于所述服务器端与客户端的连接,所述服务器端与客 户端连接所用网卡支持DMA功能和SG功能;所述服务器端向客户端的大 块数据应答发送采用头部和载荷分离的方式实现零拷贝的数据发送;所述 客户端对所述服务器端的大块数据应答接收利用数据包中携带的用户緩冲 区地址信息,将数据包的载荷写入对应的用户緩冲区。
所述的系统,其中,所述客户端向服务器端的数据请求发送采用头部 和载荷分离的方式实现零拷贝的数据发送。本发明所提供的实现局域网内高效传输大块数据的方法及系统,由于
充分利用了网卡的DMA功能和SG ( Scatter/Gather, ^/汇聚)功能,重 新定义了数据发送消息sendmsg和数据应答消息recvmsg的系统调用,同时 增加了协议栈对数据请求帧和数据应答帧的特殊处理流程,实现了局域网 内有效传输大块数据时的低CPU消耗和高系统处理能力。


图1是本发明方法和系统在网络应用中通过网络套接字进行局域网内 大块数据传输的示意图2所示为本发明方法实现的协议栈内核模块在系统中位置示意图。
具体实施例方式
以下结合附图,将对本发明的各较佳实施例进行更为详细的说明。 本发明方法的硬件环境要求网卡具有DMA功能和SG ( Scatter/Gather, ^ft/汇聚)^能,软件环境为网络功能正常的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是4吏用socket系统调用创建的AF—DATALINK网络套接字,msg的 类型定义如下所示 struct msghdr {
void*msg—name;
socklen一tmsg一namelen;
struct iovec*msg_iov;
intmsg一iovlen;
void*msg_control;
sodden—tmsg—controllen;
intmsg_flags;
flags是用于区分请求相关操作/应答相关操作的标记,为简化后面的描述,定义宏0_FS_REQ用于表示请求相关操作,宏0—FS一ACK用于表示应 答相关操作。
通过上述套接字编程接口 ,使用请求应答模式可进行局域网内大块数 据传输的流程,如图1所示,其中sendmsg(CLFS一REQ)表示客户端向服务 器端发送数据请求,recvmsg(0_FS—REQ)表示服务器端等待接M户端发送 的数据请求,sendmsg(CLFS一ACK)表示服务器端向用户发送数据应答, recvmsg(O一FS一ACK)表示客户端等待接收服务器端的数据应答。
所i^户端使用sendmsg(sd, msg, O—FS—REQ)系统调用向服务器端发 送数据请求,基本步骤为
(1.1)客户端用户程序根据数据请求帧结构,分配用户緩冲区并填充 数据请求包,向服务器端用户程序请求大块数据。其中数据请求帧结构中 的以太网协议类型为服务器端使用的以太网协议类型,sd为创建的datalink 网络套接字,msg指向数据请求帧;msg使用了 msg—iov和msg_iovlen字 段,指向一个描述了数据请求帧的struct iovec结构,其它字段置空。
(1.2 )客户端用户程序通过datalink网络套接字调用sendmsg(辨口陷' 入内核态。根据系统调用提供的OJFS—REQ标志,iiX数据请求包发送流 程。
(1.3 ) datalink协议栈内核模块^iE数据请求帧结构的合法性。如果数 据请求帧结构合法,则继续执行;如果数据请求帧结构不合法,则返回帧 错误。
(1.4) datalink协议栈内核模块对控制緩冲区和数据緩冲区地址进行变 换,将客户端用户程序提供的进程虛拟地址转换为物理内存地址,并存储 在该datalink网络套接字相关的内核数据结构中。同时锁定相关物理内存, 防止这些内存页面被交换出去,保证收到服务器端的应答数据包时能够及 时的写入接收内存中。(1.5) 在datalink网络套接字相关的内核数据结构中,记录数据请求 索引,并设置数据请求标志为工作状态,以便接收数据应答时能够进行索 引校验和状态校验。
(1.6) datalink协议栈内核模块发送接口通过网卡驱动模块以DMA方 式直接发送用户緩沖区的数据请求帧。
所述服务器端使用recvmsg(sd, msg, OJFS—REQ)系统调用接收数据请 求,其基本步骤包括
(2.1) 服务器端用户程序通过datalink网络套接字调用recvmsg()接口 陷入内核态。根据系统调用提供的O一FS一REQ标志,ii7v数据请求包接收 流程。其中,sd为创建的datalink网络套接字,msg指向一个空闲的用户緩 存区;msg4吏用了 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网络套接字调用sendmsgO接口 陷入内核态。根据系统调用提供的0—FS一ACK标志,进入数据应答包发送 流程, 一次sendmsg()系统调用发送一批应答包。
(3.3 ) datalink协议栈内核模块验证数据应答帧结构的合法性。如果数 据应答帧结构合法,则继续执行;如果数据应答帧结构不合法,则返回结 构错误。
(3.4) datalink协议栈内核模块通过网卡驱动模块以DMA方式直接发 送数据应答帧,实际发送时,对于每一个待发送的应答数据包,利用网卡 的SG功能,将头部和翁:据分别与网卡的发送緩冲区建立DMA映射关系, 完成应答数据的零拷贝发送。
所i^户端通过recvmsg(sd, msg, O—FS—ACK)系统调用接收服务器端 的数据应答的步骤'包括
(4.1) 客户端用户程序通过datalink网络套接字调用recvmsg(傳口陷 入内核态。根据系统调用提供的0_ 8_八0(:标志,进入数据应答包接收流 程。其中,sd为创建的datalink网络套接字,msg指向一个超时时间值; msg使用了 msg—iov和msg—iovlen字段,包含一个时间结构,指示操作超 时时间间隔,其它字段置空。
(4.2) datalink协议栈内核模块检查该套接字上是否设置了数据请求标 志。如果设置了数据请求标志,说明已经发出了数据请求,则带超时的阻 塞在内核等待队列上,等待内核接收函数调用模块的内核接收函数完成数 据包的接收时唤醒;如果没有设置数据请求标志,说明还没有发出数据请 求,则直接返回错误。(4.3) 如果超时时间到,用户程序仍然没有被唤醒,说明请求的数据 包还没有全部收到,则需要清除数据请求标志,完成后返回超时错误并退 出。
(4.4) 如果在超时之前,协议栈模块已经接受完所有的数据包,则设 置数据请求标志为完成状态,完成后正常返回。
所述协议栈;f莫块处理接收到的数据请求帧和数据应答帧,其基本步骤 包括
(5.1) 网卡驱动模块接收到以太网数据包后,送给协议栈进行分析处 理。协议栈根据以太网协议类型检查是否有datalink网络套接字来接收该数 据包,如果有则将数据包交给该datalink网络套接字的内核接收函数进行处 理。
(5.2) datalink的内核接收函数根据数据包的类型进行相应的处理;
A) 如果是数据请求包,则将该数据请求包挂在该套接字的内核接收队 列上,并唤醒可能阻塞在该套接字的内核接收队列上的用户程序。
B) 如果是数据应答包,则根据是否设置了数据请求标志进行不同的处 理。如果设置了数据请求标志,检验数据应答包中的索引字段是否与请求 索引一致,如果一致就根据数据应答包中的存放物理地址和存放数据长度 进行写内存操作,如果不一致就将数据包直接丟弃;如果没有设置数据请 求标志,就将数据包直接丟弃。
C) 如果既不是数据请求包,也不是数据应答包,则将数据包直接丢弃。 本发明方法充分利用了网卡的DMA功能和SG功能,重新定义了
sendmsg和recvmsg系统调用,同时增加了协议栈对数据请求帧和数据应答 帧的特殊处理流程,实现了局域网内有效传输大块数据的目的。与Linux 内核现有的网络协议栈相比,本iC明方法主要具有以下特点
(1)利用了网卡的SG功能,实现了头部和载荷分离的数据包的发送, 减少了将大块数据进行打包过程中所需的 一次数据拷贝操作。(2 )利用了网卡的DMA功能,实现了网卡驱动模块直接使用用户緩冲 区进行数据包的发送,减少了将数据块从用户空间拷贝到内核空间所需的 一次数据拷贝操作。
(3) 采用了批量发送技术,实现了一次系统调用就能够发送一批数据 包的功能,避免了发送一个数据包就需要一次系统调用的情况,减少了发 送大块数据时系统调用的开销。
(4) 采用了数据包中携带相关内存地址的方案,实现了内核收包后就 直接写入相应的用户緩冲区,减少了将接收到的大块数据从内核空间拷贝 到用户空间再重新组织的一次数据拷贝操作。
(5) 采用了请求应答模式进行服务器端和客户端之间的通信方式,在 进行一次大块数据传输过程中,在客户端仅有两次系统调用, 一次数据拷 贝;在服务器端仅有两次系统调用,没有数据拷贝。
本发明实现局域网内高效传输大块数据的系统,如图2所示,基于 Linux的网络协议栈,设置包括一服务器端和一客户端,本发明系统的改进 点在于提供一协议栈内核模块,改进网络协议栈,通过创建相应的套接字 用于所述服务器端与客户端的连接。
所述月良务器端或所述客户端的结构实现如图2所示,其硬件设备主要 是网卡,在系统的软件实现中,基于硬件设备实现了内核空间和用户空间, 在用户空间中由用户进程实现了用户接收緩冲区和用户发送緩冲区;所述 用户接收緩冲区通过从网卡接收来的数据包,由网卡驱动支持的DMA功 能,将数据接收到在内核空间实现的网络协议栈内核接收緩冲区内。
通过recvmsg接收系统调用可将所述内核接收緩冲区内的数据包经过 一次数据拷贝后发送到用户接收緩冲区内。在发送数据时,由用户发送緩 冲区内的数据包,通过sendmsg发送系统调用,对用户发送緩冲区内的数 据包向所述网络协议栈的内核发送緩冲区进行用户页面映射,从而避免对发送数据包的一次拷贝,然后由网卡驱动的DMA功能之间从所述内核发送 緩冲区通过网卡向外发送。
在本发明系统及方法中,在发送数据或接收数据过程中,由于网卡具 有SG功能,数扭包在进行准备过程中,在緩冲区中采用了头部和载荷分离 的方式以实现零拷贝的数据发送,从而降低了数据处理对系统资源的消耗, 提高了处理效率。
上述发送和接收过程在所述服务器端和所述客户端是一样的,但在所 述客户端向所述服务器端发送数据请求时,也可以采用对数据包头部和载 荷分离的方式实现零拷贝的数据发送。
本发明所述服务器端与所述客户端连接所用的网卡支持DMA功能和 SG功能;所述服务器端向客户端发送大块数据应答时,采用头部和载荷分 离的方式实现零拷贝的数据发送;所述客户端对所述服务器端的大块数据 应答接收利用数据包中携带的用户緩冲区地址信息,将数据包的载荷写入 对应的用户緩冲区。
综上,本发明实现局域网内高效传输大块数据的方法及系统,在大块数 据传输时减少了网络处理引起的CPU消耗,提高了系统的处理能力。
应当理解的是,上述针对本发明较佳实施例的描述较为具体,并不能因 此而认为是对本发明专利保护范围的限制,本发明的专利保护范围应以所 附权利要求为准。
权利要求
1、一种实现局域网内高效传输大块数据的方法,其特征在于,包括以下步骤A、客户端向服务器端发送数据请求;B、所述服务器端接收数据请求后,所述服务器端进行数据准备,并向客户端发送大块数据应答,利用网卡的直接内存存取DMA功能和分散/汇聚SG功能,采用头部和载荷分离的方式实现零拷贝的数据发送;C、所述客户端接收服务器端的大块数据应答,利用数据包中携带的用户缓冲区地址信息,将数据包的载荷写入对应的用户缓冲区。
2、 根据权利要求1所述的方法,其特征在于,所述步骤A还包括 Al、客户端用户程序根据数据请求的帧结构,分配用户緩冲区并填充数据请求包,向服务器端用户程序请求大块数据;A2、所ii^户端用户程序通过网络套接字调用数据发送的接口陷入内 核态,ii^数据请求包发送流程。
3、 根据权利要求2所述的方法,其特征在于,所述步骤A还包括 A3、协议栈内核模块验证数据请求帧结构的合法性,如果数据请求帧结构合法,则继续执行;如果数据请求帧结构不合法,则返回帧错误;A4、协议栈内核模块对控制緩冲区和数据緩冲区地址进行变换,将客户端用户程序提供的进程虚拟地址转换为物理内存地址,并存储在该网络套接字相关的内核数据结构中,同时锁定相关物理内存;A5、在网络套接字相关的内核数据结构中,记录数据请求索引,并设置数据请求标志为工作状态;A6、协议栈内核模块发送接口通过网卡驱动模块以DMA方式直接发送用户緩冲区的数据请求帧。
4、 根据权利要求3所述的方法,其特征在于,所述步骤B还包括B11 、所述服务器端用户程序通过网络套接字调用数据接收接口陷入内 核态,iiX数据请求包接收流程;B12、协议栈内核模块检查该套接字的内核接收队列上是否有数据请 求,如果有数据请求,则将该数据请求从内核接收队列上取下,并将请求 数据包的内容从内核态緩冲区中拷贝到用户态緩冲区中,释放该内核态緩 冲区;如果没有数据请求,则服务器端用户程序阻塞在该套接字的内核接 收队列上,等到内核接收函数收到数据请求包时唤醒。
5、 根据权利要求4所述的方法,其特征在于,所述步骤B还包括 B21 、所述服务器端用户程序根据数据请求包中具体应用定义的数据结构,准备客户端请求的大块数据,存放在连续的用户緩冲区内,根据数据 应答帧结构填充数据应答包;B22、所述服务器端用户程序通过网络套接字调用数据发送接口陷入内 核态,i^v数据应答包发送流程。
6、 根据权利要求5所述的方法,其特征在于,所述步骤B还包括 B23、协议栈内核模块验证数据应答帧结构的合法性,如果数据应答帧结构合法,则继续执行;如果数据应答帧结构不合法,则返回结构错误;B24、协议栈内核模块通过网卡驱动模块以DMA方式直接发送数据应 答帧。
7、 根据权利要求6所述的方法,其特征在于,所述步骤C还包括 Cl、所^户端用户程序通过网络套接字调用数据接收接口陷入内核态,进入数据应答包接收流程;C2、协议栈内核模块检查该套接字上是否设置了数据请求标志,,如果 设置了数据请求标志,则等待内核接收函数调用模块的内核接收函数完成 数据包的接收时唤醒;如果没有设置数据请求标志,则直接返回错误;C3、如果超时时间到,用户程序仍然没有被唤醒,则清除数据请求标 志,返回超时错误并退出;如果在超时之前,协议栈模块已经接受完所有 的数据包,则设置数据请求标志为完成状态,完成后正常返回。
8、 根据权利要求7所述的方法,其特征在于,所述步骤C3中的协议 栈模块处理过程包括网卡驱动模块接收到以太网数据包后,送给协议栈模块进行分析处理, 所述协议栈模块根据以太网协议类型检查是否有网络套接字来接收该数据 包,如果有则将数据包交给该网络套接字的内核接收函数进行处理;所述 内核接收函数根据数据包的类型进行以下处理如果是数据请求包,则将该数据请求包挂在该套接字的内核接收队列 上,并唤醒可能阻塞在该套接字的内核接收队列上的用户程序;如果是数据应答包,则根据是否设置了数据请求标志进行不同的处理 如果设置了数据请求标志,检验数据应答包中的索引字段是否与请求索引 一致,如果一致就根据数据应答包中的存放物理地址和存放数据长度进行 写内存操作,如果不一致就将数据包直接丢弃;如果没有设置数据请求标 志,就将数据包直接丢弃;如果既不是数据请求包,也不是数据应答包,则将数据包直接丢弃。
9、 一种实现局域网内高效传输大块数据的系统,基于Linux的网络协 议栈,包括一服务器端和一客户端,其特征在于,还包括一协议栈内核模 块,通过创建相应的套接字用于所述服务器端与客户端的连接,所述服务 器端与客户端连接所用网卡支持DMA功能和SG功能;所述服务器端向客 户端的大块数据应答发送采用头部和载荷分离的方式实现零拷贝的数据发 送;所述客户端对所述服务器端的大块数据应答接收利用数据包中携带的 用户緩冲区地址信息,将数据包的载荷写入对应的用户緩冲区。
10、根据权利要求9所述的系统,其特征在于,所#户端向服务器 端的数据请求发送采用头部和载荷分离的方式实现零拷贝的数据发送。
全文摘要
本发明公开了一种实现局域网内高效传输大块数据的方法及系统,用于一服务器端与客户端的连接,所述服务器端与客户端连接所用网卡支持DMA功能和SG功能;其方法包括步骤所述客户端向服务器端发送数据请求;所述服务器端接收数据请求后,所述服务器端进行数据准备,并向客户端发送数据应答;所述客户端接收服务器端的数据应答;上述数据传输利用网卡的SG功能,采用头部和载荷分离的数据包发送。本发明方法由于重新定义了数据发送消息sendmsg和数据应答消息recvmsg的系统调用,同时增加了协议栈对数据请求帧和数据应答帧的特殊处理流程,实现了局域网内传输大块数据时的低CPU消耗和高系统处理能力。
文档编号H04L1/16GK101304373SQ20081006809
公开日2008年11月12日 申请日期2008年6月25日 优先权日2008年6月25日
发明者孙福清, 王魏强, 宁 程 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1