一种tcp数据包的传输方法

文档序号:7686625阅读:124来源:国知局
专利名称:一种tcp数据包的传输方法
技术领域
本发明属于计算机网络和数据通信技术领域,涉及一种TCP (Transmission Control Protocol)数据包的传输方法,可用于应用网关的设备和软件中,以提高网关传输TCP数 据包以及处理其应用层数据的效率,减少系统开销和网络延迟。
背景技术
应用网关通常采用透明代理技术,在客户机和服务器之间充当中间人的角色,接收流 经的TCP数据包并重定向到内核层的本地网络协议栈中,由协议栈对数据包进行协议解析 处理和TCP流重组,还原提取出应用层数据,然后通过流套接字(Stream Socket)将应用 层数据从内核层拷贝到用户层,传送给用户层的业务程序(如病毒检测程序、关键词过滤 程序等)进行各种处理和修改(如删除、替换);用户层业务程序将处理修改后的数据再 通过流套接字从用户层拷贝到内核层,交给本地网络协议栈,并通知协议栈釆用重定向前 原始数据包的目的IP地址和目的端口来重新构建数据包并进行协议封装,然后发送出去。 其中,流量重定向多采用网络地址转换技术(Network Address Translation,简称NAT), 这主要是由于传统的套接字实现(如伯克利套接字,参见文献W.R. Stevens, B.Fe皿er and A.M. Rodoff, "UNIX Network Programming, Volume 1: The Sockets Networking API", Addison Wesley, 2003; IEEE Std 1003.1)和网络协议栈的实现不能接收和处理非本地目的 IP地址和目的端口的数据包,也不能发送非本地源IP地址和源端口的数据包。因此,应 用网关对接收到的数据包要进行目的地址转换(DNAT),将其目的IP地址和目的端口改 为网关的本地IP地址和本地端口,从而将其重定向到应用网关的本地网络协议栈中;对于 待发送的数据包则要进行源地址转换(SNAT),将其源IP地址和源端口从网关的本地IP 地址和本地端口改为DNAT前原始数据包的源IP地址和源端口。为了区分属于不同TCP 连接的数据包,需要对TCP流量进行连接跟踪并在连接表中记录NAT操作前后的IP地址 和端口信息。上述技术存在如下几个主要缺陷,造成应用网关处理效率和容量的大幅下降,无法满 足在高流量带宽以及存在大量并发会话的网络环境中的性能需求(1) NAT技术对每一 个数据包的IP地址和端口字段进行修改并需重新计算校验和,对系统性能造成一定影响;(2) NAT技术依赖于连接跟踪,需要建立会话表,为每一个TCP会话保存IP地址、端 口等信息,而会话跟踪和会话表管理任务的时空间开销繁重,会严重影响系统的性能;(3) 为了保持NAT转换前后TCP连接的一一对应关系,在执行DNAT操作时需要将不同的 TCP连接的数据包目的端口转换为不同的本地端口 ,因而系统能够支持的最大并发连接数 受限于可用的本地端口数目(不多于65535个);(4)数据在内核层和用户层之间多次 拷贝传递,以及在发送数据时需要重新进行数据包构建等操作,也会严重降低系统性能。发明内容本发明的目的在于提供一种TCP数据包传输方法,通过将非本地TCP数据包直接重 定向到本地网络协议栈进行处理(不依赖于网络地址转换技术)、流套接字负载均衡、减 少内核层和用户层之间的数据拷贝传递、在内核层的流套接字之间直接传递TCP数据包以 及减少网络协议栈中执行数据包构建等复杂操作的开销,提高了内核层内部各模块间传输 和处理TCP数据包以及内核层与用户层业务程序之间传输数据的效率。本发明的上述发明目的是通过如下的技术方案实现 一种TCP数据包的传输方法,其 步骤如下1. 将应用网关接收到的、目的IP地址为非本地IP地址的TCP数据包传输到内核层的 数据包转发模块;2. 数据包转发模块根据负载均衡算法从用户层业务程序创建的"监听"流套接字池中 选出一个"监听"流套接字,将其本地监听端口保存到数据包的内核数据结构中;3. 所述"监听"流套接字响应新建TCP连接握手请求,并创建"数据"流套接字,所 述流套接字包含三个数据包缓冲队列接收队列、发送队列和深度处理队列;"监听"流 套接字还包含一个监听队列和一个新建TCP连接队列;4. 数据包转发模块将TCP数据包重定向到内核层的本地网络协议栈;5. 本地网络协议栈的TCP输入处理模块对TCP数据包的TCP包头进行解析处理,在 "数据"流套接字散列表中査找是否存在与数据包对应的"数据"流套接字;6. 若存在"数据"流套接字,则将数据包加入到"数据"流套接字的接收队列的队尾,跳到步骤9;7. 若不存在"数据"流套接字,则在"监听"流套接字散列表中找到数据包转发模块 选出的"监听"流套接字,将数据包加入到"监听"流套接字的监听队列的队尾;8. TCP新建连接模块从监听队列队首取出TCP数据包,完成与客户机的新建TCP连 接握手,创建与客户机进行通信的"数据"流套接字,将该流套接字加入到内核中的"数 据"流套接字散列表以及"监听"流套接字的新建TCP连接队列队尾;9. 用户层的业务程序调用套接字的系统调用函数accept(),从"监听"流套接字的新建 TCP连接队列队首取出"数据"流套接字并返回其信息给业务程序;调用套接字的系统调 用函数socket(),创建与服务器通信的"数据"流套接字;调用套接字的系统调用函数 connect(),建立应用网关与服务器间的TCP连接;10. 业务程序调用套接字的系统调用函数,触发TCP输入处理模块从"数据"流套接 字的接收队列的队首取出TCP数据包,还原提取出应用层数据并拷贝到业务程序提供的用 户层缓冲区中,如果所述函数的参数flags中包含标识MSG—PREINSPECTING,则将数据 包加入到"数据"流套接字的深度处理队列队尾;11. 业务程序解析处理用户层缓冲区中的数据,调用套接字的系统调用函数,并根据 所述函数的参数flags中设置的不同标识,执行对"数据"流套接字深度处理队列中的原始TCP数据包的处理操作,包括丢弃;对TCP数据包的内容不做任何修改原样发送出去; 采用业务程序提供的数据替换TCP数据包的内容后发送出去;其中上述步骤中所有系统调用函数均兼容伯克利套接字。进一步,步骤2中所述的用户层的业务程序创建"监听"流套接字池的步骤为-1) 用户层的业务程序调用套接字的系统调用函数socket(),创建一个流套接字;2) 业务程序调用套接字的系统调用函数bind(),设置流套接字的本地监听端口;3) 业务程序调用套接字的系统调用函数listenO,将流套接字设置为"监听"流套接 字,并以本地监听端口为键值将其加入内核中的"监听"流套接字散列表;4) 业务程序创建多个"监听"流套接字,形成一个监听"流套接字池。 上述步骤2中,负载均衡算法采用对源IP地址、源端口、目的IP地址和目的端口进行哈希的方法。上述步骤5中,TCP输入处理模块根据数据包的目的IP地址、目的端口、源IP地址 和源端口信息査找是否存在对应的"数据"流套接字。上述步骤7中,TCP输入处理模块根据数据包内核数据结构中保存的"监听"流套接 字的本地监听端口信息,找到数据包转发模块选出的"监听"流套接字。上述步骤9中所述信息包括客户机的IP地址和端口、服务器的IP地址和端口。上述步骤10中,所述的系统调用函数为recv()、 recvmsg()或recvfrom()。进一步,上述步骤11中所述的执行对"数据"流套接字深度处理队列中原始TCP数 据包的丢弃操作的处理步骤为用户层的业务程序调用套接字的系统调用函数send()、 sendmsg()或sendto(),函数参数flags置为MSG_POSTINSPECTING和MSG—DROP,将流 套接字的深入处理队列中当前所有原始TCP数据包全部移出并丢弃;所述函数均兼容伯克 利套接字。进一步,上述步骤11中所述的执行对"数据"流套接字深度处理队列中原始TCP数 据包内容的发送操作的处理步骤为1) 用户层的业务程序调用套接字的系统调用函数transfer(),其函数定义如下 int transfer(int ssocket, int dsocket, void *buf, int len, int flags);其中,参数ssocket为原始TCP数据包所在的套接字,dsocket为要发送TCP数据包的 套接字,buf为业务程序提供的应用层数据缓冲区指针,len为数据缓冲区中数据的字节数, flags为标识字段。transfer()的返回值为实际上成功发送出去的应用层数据的字节数;2) transfer()将流套接字ssocket的深入处理队列中当前所有原始TCP数据包全部移出;3) 如果函数参数flags中包含MSG—POSTINSPECTING标识但不包含MSG—REPLACE 标识,则将上述原始TCP数据包去掉TCP包头后加入流套接字dsocket的发送队列队尾, 等待经本地网络协议栈(包括TCP输出处理模块)和数据包转发模块执行完协议封装、TCP 状态机维护、数据链路层或网络层转发信息査找等处理工作后,将其发送出去;4) 如果flags中包含MSG_POSTINSPECTING标识和MSG—REPLACE标识,则将业 务程序提供的应用层数据从用户层拷贝到内核层,然后复用上述原始TCP数据包,去掉其 TCP包头并用上述应用层数据替换数据包的内容——如果数据的长度超过这些原始TCP 数据包内容的总长度,则拷贝新的TCP数据包来放置超长部分的数据——然后将数据包加 入流套接字dsocket的发送队列队尾,等待经本地网络协议栈和数据包转发模块发送出去。本发明的优点和积极效果如下1.本发明通过将非本地TCP数据包直接重定向到本地网络协议栈进行处理,以及通 过在内核的流套接字间直接传递TCP数据包,提高了内核层内部各模块间传输和处理TCP 数据包的效率;2. 本发明通过设置套接字的数据包缓冲深度处理队列,以及根据系统调用参数flags 中设置的不同标识对其中的原始TCP数据包执行处理,减少了在内核层和用户层之间多次 拷贝传递数据以及在网络协议栈中执行数据包构建等复杂操作的开销;3. 本发明通过上述技术手段以及数据报套接字负载均衡,实现了应用网关对TCP流 量应用层数据的在线高速处理、TCP数据包的快速转发以及对大量并发TCP连接的支持。4. 本发明保证了应用网关对于通信源端和目的端的透明性。


图l本发明实施例的系统结构图;图2本发明实施例的创建"监听"流套接字的流程图; 图3本发明实施例的处理TCP数据包的流程图。
具体实施方式
以防病毒应用安全网关为例,参照附图对本发明的一种面向应用网关的TCP协议处理 与流套接字实现方法进行详细说明。 图1为该实施例的系统结构图。TCP数据包的内核数据结构包含一个非本地数据包标识字段bsepsocket,应用网关的 本地网络协议栈根据该字段是否置1来区分非本地数据包(即目的IP地址和源IP地址均 不为本地IP地址的数据包)和本地数据包。数据包的内核数据结构包含一个该数据包所属套接字的本地监听端口字段 sepsocket—listenjort,通过设置该字段,将新建TCP连接握手阶段的数据包分配给业务程 序创建的"监听"流套接字进行处理,并实现不同"监听"流套接字间的负载均衡。"监 听"流套接字负责响应处理新建TCP连接握手请求并创建对应的"数据"流套接字,由"数 据"流套接字负责在TCP连接建立后响应处理该连接后续的TCP数据包。本地网络协议栈中包含两个流套接字散列表 一个是"监听"流套接字散列表,用以 保存所有通过套接字的系统调用socket()和listen()进行创建和设置的"监听"流套接字; 另一个是"数据"流套接字散列表,用以保存所有由"监听"流套接字创建的"数据"流 套接字。通过这两个散列表实现对流套接字的快速查找。套接字的内核数据结构包含一个标识字段sk_SepSOCket,当该字段置1时允许流套接字处理非本地TCP数据包。同时为该标识字段增加一个对应的SOL—SOCKET级别的套接 字选项SO—SEPSOCKET,使得业务程序可以通过套接字的系统调用setsockopt()对该标识字段进行设置。套接字的内核数据结构包含如下四个字段源IP地址、源端口、目的IP地址、目的 端口,用于保存通信双方的IP地址和端口信息。每个流套接字包含三个数据包缓冲队列接收队列sk—receive一queue、发送队列 sk_write—queue和深度处理队列sk—inspect—queue,用于分别保存从本地网络协议栈接收到 的数据包、准备通过本地网络协议栈发送的数据包以及正在由业务程序进行处理的数据 包。每个"监听"流套接字还包含一个数据包缓冲队列监听队列prequeue,用于保存"监听"流套接字接收到的数据包。每个"监听"流套接字包含一个新建TCP连接队列accept—queue,保存由该"监听" 流套接字完成TCP握手的新建TCP连接的信息。如图2所示,创建"监听"流套接字的流程为(1) 用户层的业务程序调用套接字的系统调用函数socket(),创建一个流套接字。 socket()与伯克利套接字兼容,其调用形式如下int socketfd = socket(PFJNET, SOCK—STREAM, IPPROTO一IP);(2) 业务程序调用套接字的系统调用函数setsockopt(),将该流套接字的sk_sepsocket字段置1,从而允许该流套接字处理非本地TCP数据包。setsockopt()与伯克利套接字兼容,其调用形式如下setsockopt(socketfd, SOL—SOCKET, SO—SEPSOCKET, 1, sizeof(int));(3) 业务程序调用套接字的系统调用函数bind()——与伯克利套接字兼容,设置该流套接字的本地监听端口;(4) 业务程序调用套接字的系统调用函数listen()——与伯克利套接字兼容,将该流 套接字设置为"监听"流套接字,并将其加入"监听"流套接字散列表。此外,业务程序通常创建多个"监听"流套接字,形成一个"监听"流套接字池,再 通过并行和负载均衡将TCP新建连接的请求分散到不同的"监听"流套接字进行处理,以 提高TCP连接的新建速率。如图3所示,防病毒应用安全网关处理TCP数据包的流程为-(1) 对于防病毒应用安全网关接收到的、目的IP地址为非本地IP地址的TCP数据 包,送入内核层的数据包转发模块进行处理,根据一定的规则判断数据包是否需要由用户 层业务程序进行处理;(2) 如果不需要,则将数据包直接转发出去,结束;(3) 如果需要,则数据包转发模块将数据包内核数据结构的bsepsocket字段置l,标 明其为非本地数据包;(4) 数据包转发模块根据负载均衡算法(参见文献C.Kopparapu, "Load Balancing Servers, Firewalls, and Caches" , Wiley, 2002)从业务程序创建的"监听"流套接字池中选 出一个"监听"流套接字,将该套接字的本地监听端口保存到数据包内核数据结构的 sepsocket一listenjx)rt字段中。为了保证一个确定的TCP连接对应到一个确定的"监听"流 套接字,TCP负载均衡算法可采用对源IP地址、源端口、目的IP地址和目的端口进行哈 希(Hash)的方法,如假设"监听"流套接字池中有n个套接字,贝挡一个TCP的syn 包到来时,计算其源端口、目标端口、源IP地址的低16位和目的IP地址的低16位之和, 然后除以n取余,得到余数m,从而将该TCP syn包分配给编号为m的"监听"流套接字;(5) 数据包转发模块将TCP数据包直接重定向到内核层的本地网络协议栈;(6) 本地网络协议栈的TCP输入处理模块得到bsepsocket字段置l的TCP数据包后, 对数据包的TCP包头进行解析处理;(7) TCP输入处理模块在"数据"流套接字散列表中査找是否存在sk_SepSocket字段 置1且目的IP地址、目的端口、源IP地址和源端口与数据包的对应字段信息一致的套接 字;如果存在,则将TCP数据包加入该"数据"流套接字的sk—receive—queue队尾,等 待用户层业务程序对其应用层数据进行防病毒检测过滤;如果不存在,则在"监听"流套接字散列表中査找sk—sepsocket字段置1且本地监 听端口与数据包内核数据结构的sepsocketJistenjort字段相同的"监听"流套接字。如果 找到,则将数据包加入该"监听"流套接字的prequeue队尾;否则丢弃该TCP数据包, 结束;TCP新建连接模块从"监听"流套接字的prequeue队首取出一个TCP数据包,检査 TCP包头中的syn、 ack和rst字段。若TCP包头的syn字段为1 , ack字段和rst字段为0, 则该数据包是TCP syn包;若TCP包头的ack字段为1 , syn字段和rst字段为0,则该数据包是TCP ack包;若TCP包头的ack字段为1 , syn字段、rst字段和fin字段为0,则该 数据包是TCP syn-ack包。对于TCP syn包,TCP新建连接模块用该数据包的目的IP地址、 源IP地址为源IP地址和目的IP地址构建构建一个TCP syn-ack包发送给客户机。对于TCP ack包,TCP新建连接模块创建一个与客户机进行通信的"数据"流套接字,将该流套接 字内核数据结构的sk一sepsocket字段置l,然后将数据包的源IP地址、源端口 (即客户机 的IP地址和端口 )和目的IP地址、目的端口 (即服务器的IP地址和端口 )信息分别填入 该流套接字内核数据结构的目的IP地址、目的端口、源IP地址和源端口字段中。然后, 将该流套接字加入到内核中的"数据"流套接字散列表以及"监听"流套接字的accept—queue 队尾;(8) 用户层的业务程序调用套接字的系统调用函数accept()—一与伯克利套接字兼 容,调用形式如下int csockfd = accept(socketfd, addr, addrlen); 其中参数socketfd为"监听"流套接字。accept()从socketfd的accepLqueue队首取出 一个"数据"流套接字,将其内核数据结构中的源IP地址、源端口 (即服务器的IP地址 和端口 )和目的IP地址、目的端口 (即客户机的IP地址和端口 )字段等信息通过参数addr 返回给业务程序;(9) 业务程序调用套接字的系统调用函数socket(),创建一个与服务器通信的"数据" 流套接字,并调用套接字的系统调用函数setsockopt()将其内核数据结构的sk_Sepsocket字 段置1 ,从而允许其处理非本地TCP数据包;(10) 业务程序调用套接字的系统调用函数connect()——与伯克利套接字兼容,与 服务器建立TCP连接。调用的形式如下co皿ect(ssockfd, addr, addrlen); 其中,参数addr中包含客户机的IP地址和端口、服务器的IP地址和端口。 connect()将套接字内核数据结构中的源IP地址、源端口、目的IP地址和目的端口字段分别置为客 户机IP地址和端口 、服务器IP地址和端口 ,触发TCP新建连接模块向服务器发起新建TCP 连接请求并完成TCP连接握手过程;(11) 业务程序调用套接字的系统调用函数recv()、 recvmsg()或recvfrom()——与伯克利套接字兼容,调用形式如下int i = recv(socketfd, buf, len, MSG—PREINSPECTING); int i = recvmsg(socketfd, msg, MSG_PREINSPECTING);int i = recvfrom(socketfd, buf, len, MSG_PREINSPECTING, sockaddr, addrlen); 其中,函数参数flags置为MSG—PREINSPECTING。 recv()、 recvmsg()和recvfrom()触 发TCP输入处理模块从"数据"流套接字socketfd的sk_receive_queue队首取出TCP数据 包进行流重组,将应用层数据还原提取出来后拷贝到业务程序提供的用户层缓冲区buf或 msg中。执行完上述操作后,由于函数参数flags中包含MSG—PREINSPECTING标识,则 不释放TCP数据包,而是将其加入到流套接字的Sk_inspeCt_qUeue队尾,等待业务程序的 处理结果;(12) 业务程序对buf或msg中的数据进行应用协议解析,提取出其中的数据进行 病毒扫描检测,并针对不同的检测结果执行相应的处理,包括如下几种情况通过检査, 数据中不含病毒,原始TCP数据包的净荷不做修改、直接转发出去;未通过检査,数据中 含有病毒,将原始TCP数据包丢弃;未通过检查,数据中含有病毒,将原始TCP数据包 的净荷进行替换后发送出去;(13) 如果需要丢弃TCP数据包,则用户层的业务程序调用套接字的系统调用函数 send()、 sendmsg()或sendto()——与伯克利套接字兼容,将流套接字的sk_inspect—queue队 列中当前所有原始TCP数据包全部移出并丢弃。调用形式如下int i = send(socketfd, buf, len, MSG—POSTINSPECTING | MSG—DROP); int i = sendmsg(socketfd, msg, MSG—POSTINSPECTING | MSG—DROP); int i = sendto(socketfd, buf, len, MSG—POSTINSPECTING | MSG—DROP, sockaddr, addr—len);其中,函数参数flags置为MSG—POSTINSPECTING和MSG—DROP的组合;(14) 如果需要转发TCP数据包,则用户层的业务程序调用套接字的系统调用函数 transfer()执行对流套接字深入处理队列中原始TCP数据包的处理,即在与客户机通信的"数 据"流套接字和与服务器通信的"数据"流套接字之间传递并发送TCP数据包。transfer() 的定义如下int transfer(int ssocket, int dsocket, void *buf, int len, int flags);其中,参数ssocket为原始TCP数据包所在的套接字,dsocket为要发送TCP数据包的 套接字,buf为数据缓冲区指针,len为数据缓冲区中数据的字节数,flags为标识字段。 transfer()的返回值为实际上成功发送出去的应用层数据的字节数。transfer()执行如下操作1)将流套接字ssocket的sk—inspect—queue队列中当前所有原 始TCP数据包全部移出;2)如果flags中包含MSG—POSTINSPECTING标识但不包含 MSG—REPLACE标识,则将上述原始TCP数据包去掉TCP包头后加入流套接字dsocket的sk一write—queue队尾,等待经本地网络协议栈(包括TCP输出处理模块)和数据包转发模 块执行完协议封装、TCP状态机维护、数据链路层或网络层转发信息査找等处理工作后, 将其发送出去;3 )如果flags中包含MSG—POSTINSPECTING标识和MSG—REPLACE标 识,则将buf或msg所指向的应用层数据从用户层拷贝到内核层,然后复用上述原始TCP 数据包,去掉其TCP包头并用上述应用层数据替换数据包的内容。如果数据的长度超过这 些原始TCP数据包内容的总长度,则拷贝新的TCP数据包来放置超长部分的数据。最后, 将这些TCP数据包内核数据结构的bsepsocket字段置1,然后将其加入流套接字dsocket 的sk—write—queue队尾,等待经本地网络协议栈和数据包转发模块发送出去。最后应说明的是以上实施例仅用以说明而非限制本发明的技术方案,尽管参照上述 实施例对本发明进行了详细说明,本领域的技术人员应当理解依然可以对本发明进行修 改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本 发明的权利要求范围当中。
权利要求
1.一种TCP数据包的传输方法,其步骤如下1)将应用网关接收到的、目的IP地址为非本地IP地址的TCP数据包传输到内核层的数据包转发模块;2)数据包转发模块根据负载均衡算法从用户层业务程序创建的“监听”流套接字池中选出一个“监听”流套接字,将其本地监听端口保存到数据包的内核数据结构中;3)所述“监听”流套接字响应新建TCP连接握手请求,并创建“数据”流套接字,所述流套接字包含三个数据包缓冲队列接收队列、发送队列和深度处理队列;“监听”流套接字还包含一个监听队列和一个新建TCP连接队列;4)数据包转发模块将TCP数据包重定向到内核层的本地网络协议栈;5)本地网络协议栈的TCP输入处理模块对TCP数据包的TCP包头进行解析处理,在“数据”流套接字散列表中查找是否存在与数据包对应的“数据”流套接字;6)若存在“数据”流套接字,则将数据包加入到“数据”流套接字的接收队列的队尾,并跳到步骤9;7)若不存在“数据”流套接字,则在“监听”流套接字散列表中找到数据包转发模块选出的“监听”流套接字,将数据包加入到“监听”流套接字的监听队列的队尾;8)TCP新建连接模块从监听队列队首取出TCP数据包,完成与客户机的新建TCP连接握手,创建与客户机进行通信的“数据”流套接字,将该流套接字加入到内核中的“数据”流套接字散列表以及“监听”流套接字的新建TCP连接队列队尾;9)用户层的业务程序调用套接字的系统调用函数accept(),从“监听”流套接字的新建TCP连接队列队首取出“数据”流套接字并返回其信息给业务程序;调用套接字的系统调用函数socket(),创建与服务器通信的“数据”流套接字;调用套接字的系统调用函数connect(),建立应用网关与服务器间的TCP连接;10)业务程序调用套接字的系统调用函数,触发TCP输入处理模块从“数据”流套接字的接收队列的队首取出TCP数据包,还原提取出应用层数据并拷贝到业务程序提供的用户层缓冲区中,如果所述函数的参数flags中包含标识MSG_PREINSPECTING,则将数据包加入到“数据”流套接字的深度处理队列队尾;11)业务程序解析处理用户层缓冲区中的数据,调用套接字的系统调用函数,并根据所述函数的参数flags中设置的不同标识,执行对“数据”流套接字深度处理队列中的原始TCP数据包的处理操作,包括丢弃;对TCP数据包的内容不做任何修改原样发送出去;采用业务程序提供的数据替换TCP数据包的内容后发送出去;其中上述步骤中所有系统调用函数均兼容伯克利套接字。
2. 如权利要求1所述的一种TCP数据包的传输方法,其特征在于步骤2)中所述的"监听" 流套接字池的创建方法如下1) 用户层的业务程序调用套接字的系统调用函数socket(),创建一个流套接字;2) 业务程序调用套接字的系统调用函数bind(),设置流套接字的本地监听端口;3) 业务程序调用套接字的系统调用函数listen(),将流套接字设置为"监听"流套接字, 并以本地监听端口为键值将其加入内核中的"监听"流套接字散列表;4) 业务程序创建多个"监听"流套接字,形成一个监听"流套接字池。
3. 如权利要求1所述的一种TCP数据包的传输方法,其特征在于步骤2)中所述的负载均 衡算法采用对源IP地址、源端口、目的IP地址和目的端口进行哈希的方法。
4. 如权利要求1所述的一种TCP数据包的传输方法,其特征在于步骤5)中,TCP输入处 理模块根据数据包的目的IP地址、目的端口、源IP地址和源端口信息查找是否存在对应 的"数据"流套接字。
5. 如权利要求1所述的一种TCP数据包的传输方法,其特征在于步骤7)中在TCP输入 处理模块根据数据包内核数据结构中保存的"监听"流套接字的本地监听端口信息,找到 数据包转发模块选出的"监听"流套接字。
6. 如权利要求1所述的一种TCP数据包的传输方法,其特征在于步骤9)中所述信息包括 目的IP地址、目的端口、源IP地址和源端口。
7. 如权利要求1所述的一种TCP数据包的传输方法,其特征在于步骤IO)中,所述的系 统调用函数为recv()、 recvmsg()或recvfrom()。
8. 如权利要求1所述的一种TCP数据包的传输方法,其特征在于步骤ll)所述的执行对 "数据"流套接字深度处理队列中原始TCP数据包的丢弃操作的处理步骤为用户层的业务程序调用套接字的系统调用函数send()、 sendmsg()或sendto(),函数参数flags置为 MSG—POSTINSPECTING禾口 MSG—DROP,将流套接字的深入处理队列中当前所有原始 TCP数据包全部移出并丢弃。
9. 如权利要求1所述的一种TCP数据包的传输方法,其特征在于步骤11)所述的执行对 "数据"流套接字深度处理队列中原始TCP数据包内容的发送操作的处理步骤为1) 用户层的业务程序调用套接字的系统调用函数transfer(),调用函数均兼容伯克利套 接字;2) transfer()将流套接字的深入处理队列中当前所有原始TCP数据包全部移出;3) 如果上述函数的参数flags中包含MSG—POSTINSPECTING标识,但不包含 MSG—REPLACE标识,则将上述原始TCP数据包去掉TCP包头后加入流套接字dsocket的 发送队列队尾,经本地网络协议栈和数据包转发模块执行完协议封装、TCP状态机维护、 数据链路层或网络层转发信息查找等处理工作后,将其发送出去; 4) 如果flags中同时包含MSG-POSTINSPECTING标识和MSG—REPLACE标识,则 将业务程序提供的应用层数据从用户层拷贝到内核层,然后复用上述原始TCP数据包,去 掉其TCP包头并用应用层数据替换数据包的内容,如果数据的长度超过原始TCP数据包 内容的总长度,则拷贝新的TCP数据包来放置超长部分的数据,将数据包加入流套接字 dsocket的发送队列队尾,经本地网络协议栈和数据包转发模块发送出去。
全文摘要
本发明的目的在于提供一种TCP数据包的传输方法,该方法通过将非本地TCP数据包直接重定向到本地网络协议栈进行处理(不依赖于网络地址转换技术)、流套接字负载均衡、减少内核层和用户层之间的数据拷贝传递、在内核层的流套接字之间直接传递TCP数据包以及减少网络协议栈中执行数据包构建等复杂操作的开销,提高了内核层内部各模块间传输和处理TCP数据包以及内核层与用户层业务程序之间传输数据的效率,实现了应用网关对TCP流量应用层数据的在线高速处理、TCP数据包的快速转发以及对大量并发TCP会话的支持,并保证了应用网关对于通信源端和目的端的透明性。
文档编号H04L12/56GK101217493SQ200810055730
公开日2008年7月9日 申请日期2008年1月8日 优先权日2008年1月8日
发明者刘晓舟, 嘉 姚, 廖唯棨, 张建宇, 维 邹 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1