CN103905420B - 一种协议栈和应用程序间传输数据的方法及装置 - Google Patents
一种协议栈和应用程序间传输数据的方法及装置 Download PDFInfo
- Publication number
- CN103905420B CN103905420B CN201310657148.8A CN201310657148A CN103905420B CN 103905420 B CN103905420 B CN 103905420B CN 201310657148 A CN201310657148 A CN 201310657148A CN 103905420 B CN103905420 B CN 103905420B
- Authority
- CN
- China
- Prior art keywords
- data
- length
- tcp segment
- tcp
- burst
- 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.)
- Active
Links
Landscapes
- Communication Control (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明提供了一种协议栈和应用程序间传输数据的方法及装置;所述方法包括:接收应用程序发送给协议栈的单链表形式的第一数据;将所述第一数据中各数据块按照单链表的顺序依次映射到传输控制协议TCP段中,在一个TCP段中映射的数据块的长度小于或等于预定长度;所述映射是指将表示所述数据块在发送数据缓冲区中起止位置的信息写入所述TCP段;将映射得到的TCP段依次加入发送队列。本发明能够在协议栈和应用程序间传输数据的过程中避免复制,提高处理性能。
Description
技术领域
本发明涉及网络领域,尤其涉及一种协议栈和应用程序间传输数据的方法及装置。
背景技术
目前比较常用的专用协议栈大致分为两种,一种是以linux或者FreeBSD标准协议栈为基础的商用专有协议栈,另一种是遵守TCP协议栈标准,按照某种系统框架进行修改而得出的开源的轻量级协议栈,最常见的能够移植商用的就是LWIP协议栈。其他的协议栈类似OpenTCP这些开源的协议栈大多适用于理论研究以及协议栈教学使用,其实现虽然提出一些比较实用的技术和概念,但缺乏一些具体实现方案,商业化难度较大。
传统TCP协议栈在接收和发送数据的时候至少存在有三次数据内存复制,报文从网卡接收到内核空间需要一次复制,内核空间传递到用户空间需要一次复制,从用户空间把数据交给应用程序需要一次复制;发送的过程与之类似。现有各种协议栈基本都是考虑到兼容各种不同的应用程序,因此协议栈中的一些内存复制操作其实是不可避免的,而内存复制是会造成一定的性能下降的。
目前LWIP协议栈由于其资源消耗小,处理流程实现简洁而被广泛使用在嵌入式的数据处理终端上,例如图像采集终端,可视化监控终端设备上。
LWIP协议栈使用mbuf(存储器缓存)作为接收和发送数据的数据载体来传递数据,虽然避免了从内核空间传递到用户空间这一次复制,但是仍然没有能够避免另外两次复制的发生。
发明内容
本发明的技术解决问题是如何在协议栈和应用程序间传输数据的过程中避免复制,提高处理性能。
为了解决上述问题,本发明提供了一种协议栈和应用程序间传输数据的方法,包括:
S101、接收应用程序发送给协议栈的单链表形式的第一数据;
S102、将所述第一数据中各数据块按照单链表的顺序依次映射到传输控制协议TCP段中,在一个TCP段中映射的数据块的长度小于或等于预定长度;所述映射是指将表示所述数据块在发送数据缓冲区中起止位置的信息写入所述TCP段;将映射得到的TCP段依次加入发送队列。
可选地,所述步骤S102包括:
S201、当接收到所述第一数据后,创建TCP段作为当前TCP段;
S202、将所述第一数据中未映射完成的数据块按照所述单链表的顺序依次映射到所述当前TCP段中,当映射到所述当前TCP段中的数据块的数据长度达到预定长度或所述第一数据已全部映射完成时进行步骤S203;
S203、将所述当前TCP段加入发送队列的末尾;
S204、判断所述第一数据中是否还存在未映射的数据块,如果不存在则指示映射结束;如果存在则进行步骤S205;
S205、创建新的TCP段,将新创建的TCP段的地址记录在所述当前TCP段中;将新创建的TCP段作为当前TCP段,返回步骤S202。
可选地,所述步骤S202包括:
S202A、在当前TCP段中创建分片,所述分片包括数据首地址和数据长度;创建分片后根据所述单链表的顺序,查找所述第一数据中第一个未映射完的数据块;将所查找到的数据块内未映射数据在发送缓冲区的起始地址写入所创建的分片的数据首地址;
S202B、比较该数据块内未映射数据的长度与当前TCP段的剩余长度;所述剩余长度为所述预定长度与所述当前TCP段中已映射的数据块的总长度之差;如果该数据块内未映射数据的长度小于所述剩余长度,则进行步骤S202C;如果该数据块内未映射数据的长度等于所述剩余长度,则将数据块的长度或所述剩余长度写入所创建的分片的数据长度,进行步骤S203;如果该数据块内未映射数据的长度大于所述剩余长度,则将所述剩余长度写入所创建的分片的数据长度,进行步骤S203;
S202C、将数据块内未映射数据的长度写入所创建的分片的数据长度;判断所述第一数据中是否还存在未映射的数据块,如果不存在则指示映射结束;如果存在则返回步骤S202A。
可选地,所述TCP段各包括一个用于描述本TCP段的结构体tcp_seg;所述tcp_seg包含本TCP段中所映射的数据块的数据总长度,其值等于该TCP段中所有分片的数据长度的总和;所述tcp_seg还包含本TCP段中第一个分片的地址;
所述将新创建的TCP段的地址记录在当前TCP段中的步骤包括:
将新创建的TCP段的tcp_seg的地址记录在当前TCP段的tcp_seg中;
所述分片还包括本TCP段中前一个和下一个分片的地址。
可选地,所述的方法还包括:
当协议栈收到包含数据的报文且连接处于已建立状态时,将接收到的报文控制块加入接收链表的末尾,将接收到的报文控制块中表示数据起始位置的指针设置为该报文控制块在接收数据缓冲区中的起始地址。
本发明还提供了一种协议栈和应用程序间传输数据的装置,包括:
发送数据接口模块,用于接收应用程序发送给协议栈的单链表形式的第一数据;
映射模块,用于将所述第一数据中各数据块按照单链表的顺序依次映射到TCP段中,在一个TCP段中映射的数据块的长度小于或等于预定长度;所述映射是指将表示所述数据块在发送数据缓冲区中起止位置的信息写入所述TCP段;将映射得到的TCP段依次加入发送队列。
可选地,所述映射模块包括:
映射控制单元、映射执行单元、发送控制单元;
所述映射控制单元用于当接收到所述第一数据后,创建TCP段作为当前TCP段发送给所述映射执行单元;
所述映射执行单元用于将所述第一数据中未映射完成的数据块按照单链表的顺序依次映射到所述当前TCP段中,当映射到所述当前TCP段中的数据块的数据长度达到预定长度或所述第一数据已全部映射完成时通知所述发送控制单元;
所述发送控制单元用于将所述当前TCP段加入发送队列的末尾,然后通知所述映射控制单元;
所述映射控制单元还用于当收到所述发送控制单元的通知后,判断所述第一数据中是否存在未映射的数据块,如果不存在则指示映射结束;如果存在则创建新的TCP段,将新创建的TCP段的地址记录在所述当前TCP段中;将新创建的TCP段作为当前TCP段,发送给所述映射执行单元。
可选地,所述映射执行单元包括:
分片子单元,用于在当前TCP段中创建分片,所述分片包括数据首地址和数据长度;还用于创建分片后根据所述单链表的顺序,查找所述第一数据中第一个未映射完的数据块;将所查找到的数据块内未映射数据在发送缓冲区的起始地址写入所创建的分片的数据首地址;
比较子单元,用于比较该数据块内未映射数据的长度与当前TCP段的剩余长度;所述剩余长度为所述预定长度与所述当前TCP段中已映射的数据块的总长度之差;如果该数据块内未映射数据的长度小于所述剩余长度,则通知所述分片子单元;如果该数据块内未映射数据的长度等于所述剩余长度,则指示所述分片子单元将数据块的长度或所述剩余长度写入所创建的分片的数据长度,通知所述发送控制模块;如果该数据块内未映射数据的长度大于所述剩余长度,则指示所述分片子单元将所述剩余长度写入所创建的分片的数据长度,通知所述发送控制模块;
所述分片子单元还用于当收到所述比较子单元的通知后将数据块内未映射数据的长度写入所创建的分片的数据长度;判断所述第一数据中是否还存在未映射的数据块,如果不存在则结束;如果存在则创建分片。
可选地,所述映射控制单元所创建的TCP段各包括一个用于描述本TCP段的结构体tcp_seg;所述tcp_seg包含本TCP段中所映射的数据块的数据总长度,其值等于该TCP段中所有分片的数据长度的总和;所述tcp_seg还包含本TCP段中第一个分片的地址;
所述映射控制单元将新创建的TCP段的地址记录在当前TCP段中是指将该新创建的TCP段的tcp_seg的地址记录在当前TCP段的tcp_seg中;
所述分片还包括本TCP段中前一个和下一个分片的地址。
可选地,所述的装置还包括:
接收数据接口模块,用于当协议栈收到包含数据的报文且连接处于已建立状态时,将接收到的报文控制块加入接收链表的末尾,将接收到的报文控制块中表示数据起始位置的指针设置为该报文控制块在接收数据缓冲区中的起始地址。
本发明的至少一个实施例通过在专有协议栈中使用单链表对数据进行传输,避免了低效的内存复制,可以提高系统整体的处理性能,适用于处理基于协议栈的数据传输,要求系统处理性能比较高的网络应用系统。本发明的一个优化方案使用单链表结构向应用程序传递数据,通过把驱动收到的报文直接传递给应用程序从而避免了数据在协议栈中的复制。本发明的又一个优化方案使用共享的接收/发送数据缓冲区传递数据,避免了数据接收和发送时在应用程序和协议栈之间的内存复制操作。
附图说明
图1为实施例一中发送队列的链表形式的示意图;
图2为实施例一的具体例子中发送队列的示意图;
图3为实施例一的具体例子中发送的流程示意图;
图4为实施例一的具体例子中接收链表的示意图;
图5为实施例一的具体例子中接收的流程示意图。
具体实施方式
下面将结合附图及实施例对本发明的技术方案进行更详细的说明。
需要说明的是,如果不冲突,本发明实施例以及实施例中的各个特征可以相互结合,均在本发明的保护范围之内。另外,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
实施例一、一种协议栈和应用程序间传输数据的方法,包括:
S101、接收应用程序发送给协议栈的单链表形式的第一数据;
S102、将所述第一数据中各数据块按照单链表的顺序依次映射到TCP段中,在一个TCP段中映射的数据块的长度小于或等于预定长度;所述映射是指将表示所述数据块在发送数据缓冲区中起止位置的信息写入所述TCP段;将映射得到的TCP段依次加入发送队列。
本实施例中,所述第一数据是以单链表形式存储的,可以将该单链表中每个节点视为所述第一数据中一个数据块,各节点分别包括用于存储数据的区域,以及用于指示下一个节点在发送数据缓冲区中的起始地址的指针。
本实施例中,所述协议栈可以但不限于为TCP协议栈或其它遵守TCP协议栈标准开发的协议栈。
本实施例中,发送数据的时候,应用程序直接以单链表的形式将待发送的第一数据交给协议栈,然后发送给IP层。协议栈仅接受以链表形式发送的数据,本实施例中是将应用程序传递给协议栈的链表根据预定长度(可以但不限于为TCP连接的最大段长度)重新分割为适当的TCP段,形成一个新的逻辑数据链表(即所述发送队列),提交给驱动层进行发送,以此避免了数据发送时产生的内存复制。所述TCP段是所述协议栈处理数据收发的最小单位,每个TCP段最大可以包含TCP最大段长度(即所述预定长度)指定的数据长度。
由于专用协议栈的适用场景一般都是对专门的应用场景而进行设计的,换言之其上层的应用处理流程相对是固定不变的,而且专用协议栈一般都是为了最大限度的满足应用场景的需要而使用的,因此在对处理性能有很高要求的应用系统中,一个能够不进行内存复制的协议栈实现是很有价值的。
本实施例的一种实施方式中,所述步骤S102具体可以包括:
S201、当接收到所述第一数据后,创建TCP段作为当前TCP段;
S202、将所述第一数据中未映射完成的数据块按照所述单链表的顺序依次映射到所述当前TCP段中,当映射到所述当前TCP段中的数据块的数据长度达到预定长度或所述第一数据已全部映射完成时进行步骤S203;
S203、将所述当前TCP段加入发送队列的末尾;
S204、判断所述第一数据中是否还存在未映射的数据块,如果不存在则指示映射结束;如果存在则进行步骤S205;
S205、创建新的TCP段,将新创建的TCP段的地址记录在所述当前TCP段中;将新创建的TCP段作为当前TCP段,返回步骤S202。
该实施方式中,所述步骤S202具体可以包括:
S202A、在当前TCP段中创建分片,所述分片包括数据首地址和数据长度;创建分片后根据所述单链表的顺序,查找所述第一数据中第一个未映射完的数据块;将所查找到的数据块内未映射数据在发送缓冲区的起始地址写入所创建的分片的数据首地址;
S202B、比较该数据块内未映射数据的长度与当前TCP段的剩余长度;所述剩余长度为所述预定长度与所述当前TCP段中已映射的数据块的总长度之差;如果该数据块内未映射数据的长度小于所述剩余长度,则进行步骤S202C;如果该数据块内未映射数据的长度等于所述剩余长度,则将数据块的长度或所述剩余长度写入所创建的分片的数据长度,进行步骤S203;如果该数据块内未映射数据的长度大于所述剩余长度,则将所述剩余长度写入所创建的分片的数据长度,进行步骤S203;
S202C、将数据块内未映射数据的长度写入所创建的分片的数据长度;判断所述第一数据中是否还存在未映射的数据块,如果不存在则指示映射结束;如果存在则返回步骤S202A。
本实施方式中,所述分片(slot)通过记录两个参数:数据首地址和数据长度,来描述映射到TCP段中的数据块在发送数据缓冲区中的起止位置;通常一个数据块对应于一个分片,分片的起始位置表示所对应的数据块在发送数据缓冲区中的起始地址,数据长度表示所对应的数据块所包含的数据的长度;但当一个数据块的长度大于所述剩余长度时,它将被映射到两个TCP段的两个分片中,第一个TCP段的分片的数据长度为所述剩余长度;第二个TCP段的分片中的数据长度则为该数据块未映射完成的部分的长度(即该数据块的原长度减去所述剩余长度),数据首地址为该数据块未映射完成的部分在发送数据缓冲区中的起始地址。所述分片是用来为IP层和设备驱动程序提供足够信息,以便可以把一个TCP段组成一个网络报文进行发送的。
本实施方式是用数据首地址加数据长度表示数据块在发送数据缓冲区中的起止位置,在其它实施方式中,也可以采用数据首地址加数据末地址的方式、或数据末地址加数据长度的方式来表示。
本实施方式的一种备选方案中,所述TCP段各包括一个用于描述本TCP段的结构体tcp_seg,即tcp_seg和TCP段一一对应,每个tcp_seg包含本TCP段中映射的数据块的数据总长度,其值等于该TCP段中所有分片的数据长度的总和,每个tcp_seg还包含本TCP段中第一个slot的地址;
TCP段中的各slot除了数据首地址和数据长度之外,还包括本TCP段中前一个和下一个slot(如果存在的话)的地址。
本备选方案中,所述将新创建的TCP段的地址记录在当前TCP段中的步骤包括:
将新创建的TCP段的tcp_seg的地址记录在当前TCP段的tcp_seg中。
即,每个tcp_seg还包含了下一个TCP段(如果存在的话)的地址。
这样在本备选方案中,所形成的发送队列可视为一个tcp_seg组成的链表,每个tcp_seg中又包含一个slot的链表,如图1所示;每个TCP段包括一个结构体tcp_seg,以及一个或多个用于记录所述第一数据中各数据块在发送数据缓冲区中起止位置的slot。
本备选方案中,发送队列的一个具体的例子如图2所示,假设所述预定长度为2048字节,各slot22中的字段“prev”和“next”分别表示本TCP段中前一个和下一个slot的地址,各tcp_seg21中包括数据总长度、用于记录下一个tcp_seg的地址的字段“seg”、以及用于记录本TCP段中第一个slot地址的字段“slot”。
该备选方案中,一个具体的数据接收的例子如图3所示,接收流程包括步骤S301~S309。
S301,开始写入;初始化数据起始地址为需要发送的第一数据对应的单链表中第一个数据块在发送数据缓冲区中的起始地址,使用一个数据块指针记录当前数据块,并将其初始化为指向所述第一个数据块,使用一个整型变量记录当前数据块中已经处理过的数据偏移量并初始化为0。
S302,查找发送队列中最后一个未发送的TCP段。
S303,判断查找到的TCP段是否还可添加数据,当映射到该TCP段的数据块的数据总长度小于所述预定长度时,表示该TCP段可添加数据,以该TCP段作为当前TCP段,进行步骤S305;如果不可添加数据,则进行步骤S304。
S304,创建TCP段作为当前TCP段,生成当前TCP段的tcp_seg并进行初始化,将当前TCP段中已映射的数据块的数据总长度设置为0。
S305,在当前TCP段中创建分片。
S306,填写所创建的分片,设置其数据首地址为所述数据起始地址,设置其数据长度为当前数据块的数据长度和所述剩余长度之间较小的一个(相等时任选其一)。
S307,更新所述数据起始地址为原数据起始地址加上该分片的数据长度,判断当前数据块的数据长度是否大于所述剩余长度,如果大于则进行步骤S308;如果不大于则进行步骤S309。
S308,更新所述整型变量为原数据偏移量加上该分片的数据长度,以记录当前数据块中已处理的数据的位置;当前数据块的数据长度更新为原始数据长度减去该分片的数据长度,返回步骤S304。
满足这个分支的分片可以保证当前数据块内的数据尚未处理完,并且此时TCP段长度等于所述预定长度。
S309,移动所述数据块指针指向下一个数据块,以下一个数据块作为当前数据块。满足这个分支的分片可以保证当前数据块内的数据已经处理完并且此时TCP段长度小于或等于所述预定长度。
S310,判断数据块是否映射完,如果数据块已映射完则进行步骤S312;如果没映射完则进行步骤311。
S311,更新tcp_seg中当前TCP段中已映射的数据块的数据总长度为原先的数据总长度加上所述分片的数据长度;判断该数据总长度是否等于所述预定长度,如果等于则返回步骤S304;如果不等于则返回步骤S305。
S312,将上述操作生成的TCP段按照生成顺序插入发送队列。
本实施例的一种实施方式中,所述方法还可以包括:
当协议栈收到包含数据的报文且连接处于已建立状态时,将接收到的报文控制块加入接收链表的末尾,将接收到的报文控制块中表示数据起始位置的指针设置为该报文控制块在接收数据缓冲区中的起始地址;
当应用程序接收数据的时候,通过Socket API将所述接收链表全部取走,即可完成接收过程。
本实施方式中,接收链表如图4所示,其中顺序存放了所有接收到的报文控制块23,假设各报文控制块23的长度为2048字节;将接收到的报文控制块23加入接收链表的末尾,意味着接收链表中原末尾的报文控制块23中用于指示下一节点地址的指针“next”会被设置为接收到的报文控制块23的地址,而接收到的报文控制块23中用于指示上一节点地址的指针“prev”则会被设置为所述原末尾的报文控制块23的地址。其中,报文控制块23的地址通常是指该报文控制块23在接收数据缓冲区中的起始地址。
在数据接收过程中只有指针的赋值和对接收链表增加节点的操作,没有进行数据的复制操作,应用程序通过报文控制块可以找到数据的起始位置和数据长度,以便对数据进行处理。本实施方式以接收链表为核心,由于接收到的报文控制块中已经包含数据,因此可以通过在接收报文的时候直接将报文控制块做成单链表,然后把这个单链表返回给应用程序来避免接收数据时产生的内存复制。
本实施方式中,包括数据接收(协议栈接收报文并发送给应用程序)和数据发送(应用程序通过协议栈发送数据)两个部分,应用程序必须使用接收数据缓冲区或者发送数据缓冲区来存储数据,所述接收数据缓冲区和所述发送数据缓冲区分别是专门用于接收和发送报文的、可以被系统任何模块访问的共享内存缓冲区,由驱动程序维护,接收数据缓冲区和发送数据缓冲区之间可以相互转换。
本实施方式中,一个具体的数据接收的例子如图5所示,接收流程包括步骤S501~S509。
S501、协议栈接收报文。
S502、判断报文是否包含数据,如果不包含则返回步骤S501,即等待接收下一次的报文;如果包含则进行步骤S503。
S503、设置接收数据缓冲区的指针。
S504、判断接收链表是否为空,如果不为空则直接进行步骤S506;如果为空则进行步骤S505。
S505、设置连接的数据接收状态,即将连接设置为已经建立的状态。
S506、在接收数据缓冲区中将所接收到的报文控制块加入接收链表。
S507、判断数据接收状态是否被设置,如果是则进行步骤S508;如果不是则返回步骤S501,即等待接收下一次的报文。
S508、通知应用程序。
S509、清除数据接收状态,返回步骤S501,即等待接收下一次的报文。
实施例二、一种协议栈和应用程序间传输数据的装置,包括:
发送数据接口模块,用于接收应用程序发送给协议栈的单链表形式的第一数据;
映射模块,用于将所述第一数据中各数据块按照单链表的顺序依次映射到TCP段中,在一个TCP段中映射的数据块的长度小于或等于预定长度;所述映射是指将表示所述数据块在发送数据缓冲区中起止位置的信息写入所述TCP段;将映射得到的TCP段依次加入发送队列。
本实施例的一种实施方式中,所述映射模块具体可以包括:
映射控制单元、映射执行单元、发送控制单元;
所述映射控制单元用于当接收到所述第一数据后,创建TCP段作为当前TCP段发送给所述映射执行单元;
所述映射执行单元用于将所述第一数据中未映射完成的数据块按照单链表的顺序依次映射到所述当前TCP段中,当映射到所述当前TCP段中的数据块的数据长度达到预定长度或所述第一数据已全部映射完成时通知所述发送控制单元;
所述发送控制单元用于将所述当前TCP段加入发送队列的末尾,然后通知所述映射控制单元;
所述映射控制单元还用于当收到所述发送控制单元的通知后,判断所述第一数据中是否存在未映射的数据块,如果不存在则指示映射结束;如果存在则创建新的TCP段,将新创建的TCP段的地址记录在所述当前TCP段中;将新创建的TCP段作为当前TCP段,发送给所述映射执行单元。
本实施方式中,所述映射执行单元具体可以包括:
分片子单元,用于在当前TCP段中创建分片,所述分片包括数据首地址和数据长度;还用于创建分片后根据所述单链表的顺序,查找所述第一数据中第一个未映射完的数据块;将所查找到的数据块内未映射数据在发送缓冲区的起始地址写入所创建的分片的数据首地址;
比较子单元,用于比较该数据块内未映射数据的长度与当前TCP段的剩余长度;所述剩余长度为所述预定长度与所述当前TCP段中已映射的数据块的总长度之差;如果该数据块内未映射数据的长度小于所述剩余长度,则通知所述分片子单元;如果该数据块内未映射数据的长度等于所述剩余长度,则指示所述分片子单元将数据块的长度或所述剩余长度写入所创建的分片的数据长度,通知所述发送控制模块;如果该数据块内未映射数据的长度大于所述剩余长度,则指示所述分片子单元将所述剩余长度写入所创建的分片的数据长度,通知所述发送控制模块;
所述分片子单元还用于当收到所述比较子单元的通知后将数据块内未映射数据的长度写入所创建的分片的数据长度;判断所述第一数据中是否还存在未映射的数据块,如果不存在则结束;如果存在则创建分片。
本实施方式中,所述映射控制单元所创建的TCP段可以各包括一个用于描述本TCP段的结构体tcp_seg;所述tcp_seg包含本TCP段中所映射的数据块的数据总长度,其值等于该TCP段中所有分片的数据长度的总和;所述tcp_seg还包含本TCP段中第一个分片的地址;
所述映射控制单元将新创建的TCP段的地址记录在当前TCP段中是指将该新创建的TCP段的tcp_seg的地址记录在当前TCP段的tcp_seg中;
所述分片还包括本TCP段中前一个和下一个分片的地址。
本实施方式中,所述的装置还可以包括:
接收数据接口模块,用于当协议栈收到包含数据的报文且连接处于已建立状态时,将接收到的报文控制块加入接收链表的末尾,将接收到的报文控制块中表示数据起始位置的指针设置为该报文控制块在接收数据缓冲区中的起始地址。
本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本发明不限制于任何特定形式的硬件和软件的结合。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明的权利要求的保护范围。
Claims (10)
1.一种协议栈和应用程序间传输数据的方法,包括:
S101、接收应用程序发送给协议栈的单链表形式的第一数据;
S102、将所述第一数据中各数据块按照单链表的顺序依次映射到传输控制协议TCP段中,在一个TCP段中映射的数据块的长度小于或等于预定长度;所述映射是指将表示所述数据块在发送数据缓冲区中起止位置的信息写入所述TCP段;将映射得到的TCP段依次加入发送队列;
其中,所述发送数据缓存区是用于发送报文的、可以被系统任何模块访问的共享内存缓存区,由驱动程序维护。
2.如权利要求1所述的方法,其特征在于,所述步骤S102包括:
S201、当接收到所述第一数据后,创建TCP段作为当前TCP段;
S202、将所述第一数据中未映射完成的数据块按照所述单链表的顺序依次映射到所述当前TCP段中,当映射到所述当前TCP段中的数据块的数据长度达到预定长度或所述第一数据已全部映射完成时进行步骤S203;
S203、将所述当前TCP段加入发送队列的末尾;
S204、判断所述第一数据中是否还存在未映射的数据块,如果不存在则指示映射结束;如果存在则进行步骤S205;
S205、创建新的TCP段,将新创建的TCP段的地址记录在所述当前TCP段中;将新创建的TCP段作为当前TCP段,返回步骤S202。
3.如权利要求2所述的方法,其特征在于,所述步骤S202包括:
S202A、在当前TCP段中创建分片,所述分片包括数据首地址和数据长度;创建分片后根据所述单链表的顺序,查找所述第一数据中第一个未映射完的数据块;将所查找到的数据块内未映射数据在发送数据缓冲区的起始地址写入所创建的分片的数据首地址;
S202B、比较该数据块内未映射数据的长度与当前TCP段的剩余长度;所述剩余长度为所述预定长度与所述当前TCP段中已映射的数据块的总长 度之差;如果该数据块内未映射数据的长度小于所述剩余长度,则进行步骤S202C;如果该数据块内未映射数据的长度等于所述剩余长度,则将数据块的长度或所述剩余长度写入所创建的分片的数据长度,进行步骤S203;如果该数据块内未映射数据的长度大于所述剩余长度,则将所述剩余长度写入所创建的分片的数据长度,进行步骤S203;
S202C、将数据块内未映射数据的长度写入所创建的分片的数据长度;判断所述第一数据中是否还存在未映射的数据块,如果不存在则指示映射结束;如果存在则返回步骤S202A。
4.如权利要求3所述的方法,其特征在于:
所述TCP段各包括一个用于描述本TCP段的结构体tcp_seg;所述tcp_seg包含本TCP段中所映射的数据块的数据总长度,其值等于该TCP段中所有分片的数据长度的总和;所述tcp_seg还包含本TCP段中第一个分片的地址;
所述将新创建的TCP段的地址记录在当前TCP段中的步骤包括:
将新创建的TCP段的tcp_seg的地址记录在当前TCP段的tcp_seg中;
所述分片还包括本TCP段中前一个和下一个分片的地址。
5.如权利要求1到4中任一项所述的方法,其特征在于,还包括:
当协议栈收到包含数据的TCP报文且连接处于已建立状态时,将接收到的TCP报文控制块加入接收链表的末尾,将接收到的TCP报文控制块中表示数据起始位置的指针设置为该报文控制块在接收数据缓冲区中的起始地址。
6.一种协议栈和应用程序间传输数据的装置,包括:
发送数据接口模块,用于接收应用程序发送给协议栈的单链表形式的第一数据;
映射模块,用于将所述第一数据中各数据块按照单链表的顺序依次映射到TCP段中,在一个TCP段中映射的数据块的长度小于或等于预定长度;所述映射是指将表示所述数据块在发送数据缓冲区中起止位置的信息写入所述TCP段;将映射得到的TCP段依次加入发送队列;
其中,所述发送数据缓存区是用于发送报文的、可以被系统任何模块访问的共享内存缓存区,由驱动程序维护。
7.如权利要求6所述的装置,其特征在于,所述映射模块包括:
映射控制单元、映射执行单元、发送控制单元;
所述映射控制单元用于当接收到所述第一数据后,创建TCP段作为当前TCP段发送给所述映射执行单元;
所述映射执行单元用于将所述第一数据中未映射完成的数据块按照单链表的顺序依次映射到所述当前TCP段中,当映射到所述当前TCP段中的数据块的数据长度达到预定长度或所述第一数据已全部映射完成时通知所述发送控制单元;
所述发送控制单元用于将所述当前TCP段加入发送队列的末尾,然后通知所述映射控制单元;
所述映射控制单元还用于当收到所述发送控制单元的通知后,判断所述第一数据中是否存在未映射的数据块,如果不存在则指示映射结束;如果存在则创建新的TCP段,将新创建的TCP段的地址记录在所述当前TCP段中;将新创建的TCP段作为当前TCP段,发送给所述映射执行单元。
8.如权利要求7所述的装置,其特征在于,所述映射执行单元包括:
分片子单元,用于在当前TCP段中创建分片,所述分片包括数据首地址和数据长度;还用于创建分片后根据所述单链表的顺序,查找所述第一数据中第一个未映射完的数据块;将所查找到的数据块内未映射数据在发送数据缓冲区的起始地址写入所创建的分片的数据首地址;
比较子单元,用于比较该数据块内未映射数据的长度与当前TCP段的剩余长度;所述剩余长度为所述预定长度与所述当前TCP段中已映射的数据块的总长度之差;如果该数据块内未映射数据的长度小于所述剩余长度,则通知所述分片子单元;如果该数据块内未映射数据的长度等于所述剩余长度,则指示所述分片子单元将数据块的长度或所述剩余长度写入所创建的分片的数据长度,通知所述发送控制模块;如果该数据块内未映射数据的长度大于所述剩余长度,则指示所述分片子单元将所述剩余长度写入所创建的分片的数据长度,通知所述发送控制模块;
所述分片子单元还用于当收到所述比较子单元的通知后将数据块内未映射数据的长度写入所创建的分片的数据长度;判断所述第一数据中是否还存在未映射的数据块,如果不存在则结束;如果存在则创建分片。
9.如权利要求8所述的装置,其特征在于:
所述映射控制单元所创建的TCP段各包括一个用于描述本TCP段的结构体tcp_seg;所述tcp_seg包含本TCP段中所映射的数据块的数据总长度,其值等于该TCP段中所有分片的数据长度的总和;所述tcp_seg还包含本TCP段中第一个分片的地址;
所述映射控制单元将新创建的TCP段的地址记录在当前TCP段中是指将该新创建的TCP段的tcp_seg的地址记录在当前TCP段的tcp_seg中;
所述分片还包括本TCP段中前一个和下一个分片的地址。
10.如权利要求6到9中任一项所述的装置,其特征在于,还包括:
接收数据接口模块,用于当协议栈收到包含数据的TCP报文且连接处于已建立状态时,将接收到的TCP报文控制块加入接收链表的末尾,将接收到的TCP报文控制块中表示数据起始位置的指针设置为该报文控制块在接收数据缓冲区中的起始地址。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310657148.8A CN103905420B (zh) | 2013-12-06 | 2013-12-06 | 一种协议栈和应用程序间传输数据的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310657148.8A CN103905420B (zh) | 2013-12-06 | 2013-12-06 | 一种协议栈和应用程序间传输数据的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103905420A CN103905420A (zh) | 2014-07-02 |
CN103905420B true CN103905420B (zh) | 2017-10-10 |
Family
ID=50996574
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310657148.8A Active CN103905420B (zh) | 2013-12-06 | 2013-12-06 | 一种协议栈和应用程序间传输数据的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103905420B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109547519B (zh) * | 2017-09-22 | 2022-11-01 | 中兴通讯股份有限公司 | 反向代理方法、装置及计算机可读存储介质 |
CN109688085B (zh) * | 2017-10-19 | 2021-11-02 | 中兴通讯股份有限公司 | 传输控制协议代理方法、存储介质及服务器 |
CN110121114B (zh) * | 2018-02-07 | 2021-08-27 | 华为技术有限公司 | 发送流数据的方法及数据发送设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101135980A (zh) * | 2006-08-29 | 2008-03-05 | 飞塔信息科技(北京)有限公司 | 一种基于Linux操作系统实现零拷贝的装置和方法 |
CN101150487A (zh) * | 2007-11-15 | 2008-03-26 | 曙光信息产业(北京)有限公司 | 一种零拷贝网络报文发送方法 |
US7414975B2 (en) * | 2005-03-24 | 2008-08-19 | Ixia | Protocol stack |
CN102035751A (zh) * | 2011-01-20 | 2011-04-27 | 大唐移动通信设备有限公司 | 一种数据的传输方法和设备 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4942375B2 (ja) * | 2006-03-27 | 2012-05-30 | 株式会社ソニー・コンピュータエンタテインメント | ネットワーク処理装置 |
-
2013
- 2013-12-06 CN CN201310657148.8A patent/CN103905420B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7414975B2 (en) * | 2005-03-24 | 2008-08-19 | Ixia | Protocol stack |
CN101135980A (zh) * | 2006-08-29 | 2008-03-05 | 飞塔信息科技(北京)有限公司 | 一种基于Linux操作系统实现零拷贝的装置和方法 |
CN101150487A (zh) * | 2007-11-15 | 2008-03-26 | 曙光信息产业(北京)有限公司 | 一种零拷贝网络报文发送方法 |
CN102035751A (zh) * | 2011-01-20 | 2011-04-27 | 大唐移动通信设备有限公司 | 一种数据的传输方法和设备 |
Also Published As
Publication number | Publication date |
---|---|
CN103905420A (zh) | 2014-07-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104965757B (zh) | 虚拟机热迁移的方法、虚拟机迁移管理装置及系统 | |
US20090138570A1 (en) | Method for setting parameters and determining latency in a chained device system | |
CN107003943A (zh) | NVMe over Fabric架构中数据读写命令的控制方法、存储设备和系统 | |
CN113515396B (zh) | 图形渲染方法、装置、电子设备与存储介质 | |
CN101635682B (zh) | 一种存储管理的方法和系统 | |
CN101150485A (zh) | 一种零拷贝缓冲区队列网络数据发送的管理方法 | |
CN103905420B (zh) | 一种协议栈和应用程序间传输数据的方法及装置 | |
CN107077390A (zh) | 一种任务处理方法以及网卡 | |
US7167934B1 (en) | Peripheral device data transfer protocol | |
CN115150286B (zh) | 传输节点变更方法、装置、计算机设备、存储介质 | |
US10489322B2 (en) | Apparatus and method to improve performance in DMA transfer of data | |
CN111400213B (zh) | 传输数据的方法、装置及系统 | |
CN101437046A (zh) | 一种固态硬盘中的数据处理方法、固态硬盘和网络设备 | |
CN109298888A (zh) | 队列的数据存取方法及装置 | |
CN101808105B (zh) | 一种访问数据的方法、装置和系统 | |
CN116483738B (zh) | 数据访问方法及装置、存储介质及电子装置 | |
CN110311843A (zh) | 基于PCIe链路的通信方法、装置、电子设备、存储介质 | |
CN117539807A (zh) | 一种数据传输方法、相关设备及存储介质 | |
CN104394099A (zh) | 一种报文传输方法及装置 | |
CN106372013B (zh) | 远程内存访问方法、装置和系统 | |
CN115883022A (zh) | Dma传输控制方法、装置、电子设备及可读存储介质 | |
CN105117353A (zh) | 带有通用数据交互模块的fpga及采用该fpga的信息处理系统 | |
CN108319428A (zh) | 一种数据读取的方法及装置 | |
CN109885508A (zh) | 高速外设组件互连标准总线系统及其数据传输方法、装置 | |
US9104637B2 (en) | System and method for managing host bus adaptor (HBA) over infiniband (IB) using a single external memory interface |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |