CN102946347B - 一种加速Linux系统本地数据包处理的方法及装置 - Google Patents
一种加速Linux系统本地数据包处理的方法及装置 Download PDFInfo
- Publication number
- CN102946347B CN102946347B CN201210524029.0A CN201210524029A CN102946347B CN 102946347 B CN102946347 B CN 102946347B CN 201210524029 A CN201210524029 A CN 201210524029A CN 102946347 B CN102946347 B CN 102946347B
- Authority
- CN
- China
- Prior art keywords
- packet
- linux
- skb
- nfp
- record sheet
- 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
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明涉及一种加速Linux系统本地数据包处理的方法及装置,将本地数据包经Linux IP协议栈处理后的路由和包修改信息,记录在该数据包所属连接跟踪结构体中,形成连接跟踪条目,对后续属于此连接跟踪条目的本地数据包,将使用连接跟踪条目中记录下来的路由和包修改信息直接处理,从而达到加速本地数据包处理的目的。本发明所述的加速Linux系统本地数据包处理的方法及装置,简化数据包在Linux协议栈的处理流程,从而达到加速Linux系统对本地数据包处理的目的,有效的提高了Linux系统处理本地数据包的能力,弥补了目前网络加速领域对Linux系统收发本地数据包进行加速的空白。
Description
技术领域
本发明涉及Linux系统本地数据包处理(Linux操作系统网络领域),具体说是一种加速Linux系统本地数据包处理的方法及装置。
背景技术
随着Linux操作系统的发展,Linux已广泛应用于各种嵌入式系统中。Linux和其他嵌入式操作系统相比较具有非常大的优势。首先,Linux是开放源代码的,不存在黑箱技术,遍布全球的众多Linux爱好者又是Linux开发者的强大技术支持;其次,Linux的内核小、效率高,内核的更新速度很快,Linux是可以定制的,其系统内核最小只有约上百K字节;第三,Linux是免费的操作系统,在价格上极具竞争力。
Linux还有着嵌入式操作系统所需要的很多特色,突出的就是:Linux适应于多种CPU和多种硬件平台,是一个跨平台的系统。Linux对网络中最常用的TCP/IP协议有最完备的支持。提供了包括十兆、百兆、千兆的以太网络,以及无线网络,令牌环网、光纤甚至卫星的支持。所以Linux很适于网络设备。
基于Linux操作系统在嵌入式领域的显著优势,各嵌入式芯片生产商纷纷向Linux靠拢,并对Linux系统作出了不同程度的优化。比如,在数据转发方面,就有各种加速解决方案的提出。但是目前的各类加速方案中,有几个明显的缺陷:
1.加速只涉及数据转发方面,对Linux本地数据包的处理没做任何的优化。
2.一旦启用数据加速功能,对Linux netfilter(包过滤框架)功能支持不够完善。
而随着网络技术的发展和创新,像IP电话,可视电话等新兴业务的出现,对终端接入设备(如家庭网关)的本地数据包处理能力提出了更高要求。为提高类似新兴业务的服务质量,同时节约Linux系统本身资源,加强Linux系统对本地数据包的处理能力显得极其重要。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种加速Linux系统本地数据包处理的方法及装置,简化数据包在Linux协议栈的处理流程,从而达到加速Linux系统对本地数据包处理的目的。
为达到以上目的,本发明采取的技术方案是:
一种加速Linux系统本地数据包处理的方法,其特征在于:在宽带接入设备的Linux系统中,将本地数据包经Linux IP协议栈处理后的路由和包修改信息,记录在该数据包所属的连接跟踪结构体中,形成连接跟踪条目,对后续属于此连接跟踪条目的本地数据包,将使用连接跟踪条目中记录下来的路由和包修改信息直接处理,从而达到加速本地数据包处理的目的。
在上述技术方案的基础上,在Linux系统中,每一条连接跟踪条目都有唯一的连接跟踪结构体struct nf conn与之对应。
在上述技术方案的基础上,连接跟踪条目通过加速信息记录表记录属于该连接跟踪条目的本地数据包经Linux IP协议栈处理后的路由和包修改信息,每一条连接跟踪条目与两张加速信息记录表对应,两张加速信息记录表分别记录属于此连接跟踪条目的本地数据包发送方向和接收方向的路由和包修改信息;
所述加速信息记录表以结构体struct nfp_info形式保存,
在连接跟踪结构体struct nf_conn中,设有指针数组structnfp_info*nfp[IP_DIR_MAX],IP_DIR_MAX表示数据流方向最大值,取值为2,其中包括指针nfp[0]和指针nfp[1];
指针nfp[0]用于指向连接跟踪条目本地数据包发送方向的数据所对应的加速信息记录表,当nfp[0]等于NULL时,表明该连接跟踪条目本地数据包发送方向不启用加速处理功能;当nfp[0]指向结构体struct nfp_info实例时,表明该连接跟踪条目本地数据包发送方向启用加速处理功能;
指针nfp[1]用于指向连接跟踪条目本地数据包接收方向的数据所对应的加速信息记录表,当nfp[1]等于NULL时,表明该连接跟踪条目本地数据包接收方向不启用加速处理功能;当nfp[1]指向结构体struct nfp_info实例时,表明该连接跟踪条目本地数据包接收方向启用加速处理功能。
在上述技术方案的基础上,结构体struct nfp_info中至少包括以下成员:
成员struct dst_dentry*dst,用于记录数据包路由信息;
成员__u32 dscp,用于记录数据包差分服务代码点DSCP值;
成员__u32 priority,用于记录数据包优先级skb->priority的值;
成员__u32 mark,用于记录Linux内核数据包标记skb->mark的值;
成员struct net_device*output_dev,用于记录本地数据包发送方向的出口网络设备;
成员struct net_device*input_dev,用于记录本地数据包接收方向的入口网络设备;
成员_u8 attri,用于记录加速信息表属性,其中:记录发送方向加速信息取1,记录接收方向加速信息取2。
在上述技术方案的基础上,本地数据包接收方向的处理流程包括以下步骤:
步骤101,Linux系统从网络驱动层收取数据帧;
步骤102,检查数据帧是否带有vlan标签vlan tag,如果有vlantag,则执行步骤103,否则执行步骤104;
步骤103,剥除数据帧的vlan tag,重新执行步骤102;
步骤104,检查数据帧是否为IP数据,如果是,则去除数据帧的MAC头部,形成数据包,再执行步骤105,否则将数据帧提交Linux协议栈处理,此处不再进一步分析;
步骤105,从数据包中提取IP五元组信息,所述IP五元组信息包括:数据包源IP,源端口,目的IP,目的端口以及传输层协议TCP或者UDP,根据此IP五元组信息,查询Linux协议栈连接跟踪表,如果找到数据包所属的连接跟踪条目对应的结构体struct nf_conn,则执行步骤106,否则执行步骤109;
步骤106,检查数据包所属连接跟踪结构体成员struct nfp_info*nfp[1]是否为NULL,如果为NULL,则执行步骤109,否则执行步骤107;
步骤107,用数据包所属连接跟踪条目记录的数据包发送方向的源IP、源端口、目的IP、目的端口依次替换数据包的目的IP、目的端口、源IP、源端口;连接跟踪条目记录的数据包发送方向的源IP、源端口、目的IP、目的端口记录在连接跟踪结构体struct nf_conn成员struct nf_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]中;
步骤108,根据指针nfp[1]所指向的加速信息记录表,对数据包skb内容进行相应的修改,修改内容包括:用加速信息记录表中的dscp值重新设置数据包DSCP域;将加速信息记录表中的dst、priority、mark、output_dev和input_dev分别赋值给skb->_skb_dst、skb->priority、skb->mark、skb->dev和skb->input_dev,修改完成后执行步骤111;
步骤109,数据包进入Linux IP协议栈的收包处理流程;
步骤110,提取数据包经Linux IP协议栈处理后的路由结果、skb->mark、skb->priority、skb->dev和skb->input_dev信息,依次赋值给加速信息记录表的dst、mark、priority、output_dev和input_dev成员,并建立连接跟踪结构体成员nfp[1]与加速信息记录表的映射关系;然后执行步骤111;
步骤111,将数据包提交函数ip_local_deliver_finish处理,然后进入Linux socket处理流程。
在上述技术方案的基础上,本地数据包发送方向的处理流程包括以下步骤:
步骤201,函数ip_local_out从传输层接收发送数据包;
步骤202,从数据包中提取IP五元组信息,所述IP五元组信息包括:数据包源IP,源端口,目的IP,目的端口以及传输层协议TCP或者UDP,根据此IP五元组信息,查询Linux协议栈连接跟踪表,如果找到数据包所属的连接跟踪条目对应的结构体struct nf_conn,则执行步骤203,否则执行步骤206;
步骤203,检查数据包所属连接跟踪结构体成员struct nfp_info*nfp[0]是否为NULL,如果为NULL,则执行步骤206,否则执行步骤204;
步骤204,用数据包所属连接跟踪条目记录的数据包接收方向的源IP、源端口、目的IP、目的端口依次替换数据包的目的IP、目的端口、源IP、源端口;连接跟踪条目记录的数据包接收方向的源IP、源端口、目的IP、目的端口记录在连接跟踪结构体struct nf_conn成员struct nf_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]中;
步骤205,根据指针nfp[0]所指向的加速信息记录表,对数据包skb内容进行相应的修改,修改内容包括:用加速信息记录表中的dscp值重新设置数据包DSCP域;将加速信息记录表中的dst、priority、mark、output_dev和input_dev分别赋值给skb->_skb_dst、skb->priority、skb->mark、skb->dev和skb->input_dev,修改完成后执行步骤208;
步骤206,数据包进入Linux IP协议栈的发包处理流程;
步骤207,提取数据包经Linux IP协议栈处理后的路由结果、skb->mark、skb->priority、skb->dev和skb->input_dev信息,依次赋值给加速信息记录表的dst、mark、priority、output_dev和input_dev成员,并建立连接跟踪结构体成员nfp[0]与加速信息记录表的映射关系;然后执行步骤208;
步骤208,将数据包提交函数ip_finish_output处理,然后进入网络驱动层发送出去。
在上述技术方案的基础上,当加速信息记录表需要删除时,由加速信息删除单元完成该操作,包括以下步骤:
步骤301:当Linux网络状态改变,以通知链的形式发送消息给消息处理器;所述Linux网络状态改变包括:iptables规则的添加或删除;网络设备状态改变;IPV4地址改变;路由表的添加或删除;路由缓存清除;以及连接跟踪条目自身老化;
步骤302:消息处理器根据接收到的消息,匹配与之对应的连接跟踪条目;
步骤303:消息处理器检查所匹配的连接跟踪条目是否存在与之对应的加速信息记录表,如果存在,则执行步骤304,否则结束退出;
步骤304:消息处理器删除所匹配的连接跟踪条目所对应的加速信息记录表。
一种加速Linux系统本地数据包处理的装置,其特征在于,包括:加速信息存储单元,加速信息设置单元,加速判决单元,本地数据包加速处理单元和加速信息删除单元;
加速信息存储单元,用于保存属于同一条连接跟踪条目的数据包在进行加速处理时所需要的路由和包修改信息,这些信息以加速信息记录表的形式保存,加速信息记录表通过连接跟踪条目间接访问;
加速信息设置单元,负责新建和设置加速信息记录表,并建立加速信息记录表与连接跟踪条目的映射关系;
加速判决单元,用于判断本地数据包是否可以进行加速处理,如果可以进行加速处理,则将该数据包提交本地数据包加速处理单元处理,否则将该数据包提交Linux协议栈处理;进一步,如果该数据包为IP数据,则在Linux IP协议栈将该数据包处理完成后,该数据包将进一步提交加速信息设置单元处理;
本地数据包加速处理单元,负责根据本地数据包所属连接跟踪条目以及其对应的加速信息记录表内容,对该数据包进行修改,修改完成后,将接收的本地数据包提交Linux socket层处理,将发送的本地数据包提交网络驱动层处理;
加速信息删除单元,负责监控Linux网络状态的变化,清除与其状态变化相关联的连接跟踪条目所对应的加速信息记录表。
本发明所述的加速Linux系统本地数据包处理的方法及装置,简化数据包在Linux协议栈的处理流程,从而达到加速Linux系统对本地数据包处理的目的,有效的提高了Linux系统处理本地数据包的能力,弥补了目前网络加速领域对Linux系统收发本地数据包进行加速的空白。本发明具备以下特点:
1.本发明基于Linux协议栈实现,与具体的硬件无关,方便在各硬件平台上进行移植;
2.本发明通监控iptables(IP信息包过滤系统)规则的变化,在实现加速的同时,有效的支持Linux netfilter(包过滤框架)功能。
附图说明
本发明有如下附图:
图1是本地数据包加速处理框图;
图2是连接跟踪条目以及加速信息记录表关系示意图;
图3是本地数据包接收处理流程图;
图4是本地数据包发送处理流程图;
图5是加速信息记录表删除流程图。
具体实施方式
以下结合附图对本发明作进一步详细说明。
本发明主要应用于宽带接入设备,对提升宽带接入设备的性能以及处理能力有显著效果。本发明所述的加速Linux系统本地数据包处理的方法的核心思想是:在宽带接入设备的Linux系统中,将本地数据包经Linux IP协议栈处理后的路由和包修改信息,记录在该数据包所属的连接跟踪结构体中,形成连接跟踪条目,对后续属于此连接跟踪条目的本地数据包,将使用连接跟踪条目中记录下来的路由和包修改信息直接处理,从而达到加速本地数据包处理的目的。在Linux系统中,每一条连接跟踪条目都有唯一的连接跟踪结构体与之对应,以结构体struct nf_conn表示,参见图2。
在上述技术方案的基础上,连接跟踪条目通过加速信息记录表记录属于该连接跟踪条目的本地数据包经Linux IP协议栈处理后的路由和包修改信息,每一条连接跟踪条目与两张加速信息记录表对应,两张加速信息记录表分别记录属于此连接跟踪条目的本地数据包发送方向和接收方向的路由和包修改信息;
连接跟踪条目和加速信息记录表的关系如图2所示,所述加速信息记录表以结构体struct nfp_info形式保存,即:加速信息记录表与结构体struct nfp_info对应,结构体struct nfp_info用于记录属于该连接跟踪条目(指与加速信息记录表对应的连接跟踪条目)的本地数据包经Linux IP协议栈处理后的路由和包修改信息;
在连接跟踪结构体struct nf_conn中,增加指针数组structnfp_info*nfp[IP_DIR_MAX],IP_DIR_MAX表示数据流方向最大值,取值为2,其中包括指针nfp[0]和指针nfp[1](即:struct nfp_info*nfp[0]和struct nfp_info*nfp[1]);图2所示的结构体structnf_conn中未提及的其他成员均属于Linux系统自定义成员,不属发明内容,不再详述;
指针nfp[0]用于指向连接跟踪条目本地数据包发送方向的数据所对应的加速信息记录表,当nfp[0]等于NULL时,表明该连接跟踪条目本地数据包发送方向不启用加速处理功能;当nfp[0]指向一个结构体struct nfp_info实例时(结构体指针是用来指向结构体实例的),表明该连接跟踪条目本地数据包发送方向启用加速处理功能;
指针nfp[1]用于指向连接跟踪条目本地数据包接收方向的数据所对应的加速信息记录表,当nfp[1]等于NULL时,表明该连接跟踪条目本地数据包接收方向不启用加速处理功能;当nfp[1]指向另一个结构体struct nfp_info实例时(结构体指针是用来指向结构体实例的,此实例不是nfp[0]指向的那一个实例,而是另一个),表明该连接跟踪条目本地数据包接收方向启用加速处理功能。
图2所示加速信息记录表对应的结构体struct nfp_info的实例中,其各成员介绍如下:
成员struct dst_dentry*dst,用于记录数据包路由信息;
成员__u32 dscp,用于记录数据包DSCP(差分服务代码点)值;
成员__u32 priority,用于记录skb->priority(数据包优先级)的值;
成员__u32mark,用于记录skb->mark(Linux内核数据包标记)的值;
成员struct net_device*output_dev,用于记录本地数据包发送方向的出口网络设备;
成员struct net_device*input_dev,用于记录本地数据包接收方向的入口网络设备;
成员_u8 attri,用于记录加速信息表属性,其中:记录发送方向加速信息取1,记录接收方向加速信息取2。
数据包一旦进入本地数据包加速处理单元,将根据加速信息记录表中的这些信息对数据包进行相应修改。
下面结合图4和图3,对本发明的本地数据包发送方向和接收方向的处理流程进行进一步详细说明。
如图3所示,本地数据包接收方向的处理流程包括以下步骤:
步骤101,Linux系统从网络驱动层收取数据帧;
步骤102,检查数据帧是否带有vlan tag(vlan标签),如果有vlan tag,则执行步骤103,否则执行步骤104;
步骤103,剥除数据帧的vlan tag,重新执行步骤102;
步骤104,检查数据帧是否为IP数据,如果是,则去除数据帧的MAC头部,形成数据包,再执行步骤105,否则将数据帧提交Linux协议栈处理,此处不再进一步分析,接收方向的处理流程结束;
步骤105,从数据包中提取IP五元组信息,所述IP五元组信息包括:数据包源IP,源端口,目的IP,目的端口以及传输层协议TCP或者UDP,根据此IP五元组信息,查询Linux协议栈连接跟踪表,如果找到数据包所属的连接跟踪条目对应的结构体struct nf_conn,则执行步骤106,否则执行步骤109;连接跟踪表是连接跟踪条目形成的hash链表,属公知技术范畴,不再详述;
步骤106,检查数据包所属连接跟踪结构体成员struct nfp_info*nfp[1](即指针nfp[1])是否为NULL(空),如果为NULL,则执行步骤109,否则执行步骤107;
步骤107,用数据包所属连接跟踪条目记录的数据包发送方向的源IP、源端口、目的IP、目的端口依次替换数据包的目的IP、目的端口、源IP、源端口;连接跟踪条目记录的数据包发送方向的源IP、源端口、目的IP、目的端口记录在连接跟踪结构体struct nf_conn成员struct nf_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]中,此为Linux系统标准处理方法,不再详述;
步骤108,根据指针nfp[1]所指向的加速信息记录表,对数据包skb内容进行相应的修改,修改内容包括:用加速信息记录表中的dscp值重新设置数据包DSCP域;将加速信息记录表中的dst、priority、mark、output_dev和input_dev分别赋值给skb->skb_dst、skb->priority、skb->mark、skb->dev和skb->input_dev,修改完成后执行步骤111;skb是数据包在Linux内核的表现形式,本发明主要涉及的skb成员如下:skb->_skb_dst记录数据包路由结果信息;skb->mark记录数据包在Linux内核的标记;skb->priority记录数据包优先级;skb->dev记录数据包出口网络设备;skb->input_dev记录数据包入口网络设备;
步骤109,数据包进入Linux IP协议栈的收包处理流程;
步骤110,提取数据包经Linux IP协议栈处理后的路由结果、skb->mark、skb->priority、skb->dev和skb->input_dev信息,依次赋值给加速信息记录表的dst、mark、priority、output_dev和input_dev成员,并建立连接跟踪结构体成员nfp[1]与加速信息记录表的映射关系;然后执行步骤111;
步骤111,将数据包提交函数ip_local_deliver_finish处理,然后进入Linux socket处理流程。所述ip_local_deliver_finish为Linux系统公知函数,不再详述。所述Linux socket处理流程为Linux系统公知处理流程,不再详述。
上述流程中,步骤110可以通过向HOOK点NF_INET_LOCAL_IN注册钩子函数实现,钩子函数的优先级取最低,确保本地数据包已经由Linux IP协议栈处理完成。所述HOOK和NF_INET_LOCAL_IN为Linux系统公知宏定义,不再详述。
如图4所示,本地数据包发送方向的处理流程包括以下步骤:
步骤201,函数ip_local_out从传输层接收发送数据包;所述ip_local_out为Linux系统公知函数,不再详述;
步骤202,从数据包中提取IP五元组信息,所述IP五元组信息包括:数据包源IP,源端口,目的IP,目的端口以及传输层协议TCP或者UDP,根据此IP五元组信息,查询Linux协议栈连接跟踪表,如果找到数据包所属的连接跟踪条目对应的结构体struct nf_conn,则执行步骤203,否则执行步骤206;
步骤203,检查数据包所属连接跟踪结构体成员struct nfp_info*nfp[0](即指针nfp[0])是否为NULL(空),如果为NULL,则执行步骤206,否则执行步骤204;
步骤204,用数据包所属连接跟踪条目记录的数据包接收方向的源IP、源端口、目的IP、目的端口依次替换数据包的目的IP、目的端口、源IP、源端口;连接跟踪条目记录的数据包接收方向的源IP、源端口、目的IP、目的端口记录在连接跟踪结构体struct nf_conn成员struct nf_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]中,此为Linux系统标准处理方法,不再详述;
步骤205,根据指针nfp[0]所指向的加速信息记录表,对数据包skb内容进行相应的修改,修改内容包括:用加速信息记录表中的dscp值重新设置数据包DSCP域;将加速信息记录表中的dst、priority、mark、output_dev和input_dev分别赋值给skb->_skb_dst、skb->priority、skb->mark、skb->dev和skb->input_dev,修改完成后执行步骤208;
步骤206,数据包进入Linux IP协议栈的发包处理流程;
步骤207,提取数据包经Linux IP协议栈处理后的路由结果、skb->mark、skb->priority、skb->dev和skb->input_dev信息,依次赋值给加速信息记录表的dst、mark、priority、output_dev和input_dev成员,并建立连接跟踪结构体成员nfp[0]与加速信息记录表的映射关系;然后执行步骤208;
步骤208,将数据包提交函数ip_finish_output处理,然后进入网络驱动层发送出去。所述ip_finish_output为Linux系统公知函数,不再详述。
上述流程中,步骤207可以通过向HOOK点NF_INET_POST_ROUTING或NF_BR_POST_ROUTING注册钩子函数实现,钩子函数的优先级取最低,确保数据包已经由Linux IP协议栈处理完成。所述HOOK、NF_INET_POST_ROUTING和NF_BR_POST_ROUTING为Linux系统公知宏定义,不再详述。
在上述技术方案的基础上,已设置好的加速信息记录表,可能因为Linux网络状态改变而需要删除,则由加速信息删除单元完成该操作。如图5所示,当加速信息记录表需要删除时,加速信息删除单元的执行流程包括以下步骤:
步骤301:当Linux网络状态改变,以通知链的形式发送消息给消息处理器;所述Linux网络状态改变包括:iptables规则的添加或删除;网络设备状态改变;IPV4地址改变;路由表的添加或删除;路由缓存清除;以及连接跟踪条目自身老化;
步骤302:消息处理器根据接收到的消息,匹配与之对应的连接跟踪条目(一条消息可能对应多条连接跟踪条目);
步骤303:消息处理器检查所匹配的连接跟踪条目是否存在与之对应的加速信息记录表,如果存在,则执行步骤304,否则结束退出;
步骤304:消息处理器删除所匹配的连接跟踪条目所对应的加速信息记录表。
经实践表明,本发明对Linux收发本地数据包的性能有较大幅度的提升。以一嵌入式Linux系统为例,在不启用加速处理功能的情况下,本地UDP数据吞吐量为401M,在开启加速处理功能的情况下,本地UDP数据吞吐量提升至591M,提升约50%。
根据上述方法,本发明提供了一种加速Linux系统本地数据包处理的装置,如图1所示,本发明所述的加速Linux系统本地数据包处理的装置,至少包括:加速信息存储单元,加速信息设置单元,加速判决单元,本地数据包加速处理单元和加速信息删除单元;
加速信息存储单元,用于保存属于同一条连接跟踪条目的数据包在进行加速处理时所需要的路由和包修改信息,这些信息以加速信息记录表的形式保存,加速信息记录表通过连接跟踪条目间接访问;
加速信息设置单元,负责新建和设置加速信息记录表,并建立加速信息记录表与连接跟踪条目的映射关系;
加速判决单元,用于判断本地数据包是否可以进行加速处理,如果可以进行加速处理,则将该数据包提交本地数据包加速处理单元处理,否则将该数据包提交Linux协议栈处理;进一步,如果该数据包为IP数据,则在Linux IP协议栈将该数据包处理完成后,该数据包将进一步提交加速信息设置单元处理;所述Linux IP协议栈是Linux协议栈的子集,只负责IP包的处理;
本地数据包加速处理单元,负责根据本地数据包所属连接跟踪条目以及其对应的加速信息记录表内容,对该数据包进行修改,修改完成后,将接收的本地数据包提交Linux socket层处理,将发送的本地数据包提交网络驱动层处理;
加速信息删除单元,负责监控Linux网络状态的变化(状态变化包括:iptables规则的添加和删除;网络设备状态改变;IPV4地址改变;路由表的添加和删除;路由缓存清除以及连接跟踪条目自身老化),清除与其状态变化相关联的连接跟踪条目所对应的加速信息记录表。
下面结合附图1,对数据包的发送和接收过程进行进一步描述。
发送过程:
步骤一:用户程序打开socket发送数据包,数据包经传输层(TCP/UDP协议层)后进入加速判决单元;
步骤二:加速判决单元提取数据包IP五元组信息,根据IP五元组信息查询连接跟踪表,检查是否存在与数据包处理相对应的加速信息记录表,如果存在,则将数据包提交本地数据包加速处理单元处理(步骤四),否则将数据包提交Linux IP协议栈处理,经Linux IP协议栈处理完成后进入加速信息设置单元处理(步骤三);
步骤三:加速信息设置单元提取数据包经Linux IP协议栈处理后的路由和包修改信息,设置加速信息记录表,并建立加速信息记录表与数据包所属连接跟踪条目的映射关系,然后将数据包提交网络接口驱动层发送出去;
步骤四:本地数据包加速处理单元根据数据包所对应的连接跟踪条目和加速信息记录表,对数据包进行相应的修改,修改完成后将数据包提交网络接口驱动层发送出去。
接收过程:
步骤一:网络接口驱动层接收数据帧,并将数据帧提交加速判决单元处理;
步骤二:加速判决单元首先检查数据帧是否携带vlan标签,如果携带vlan标签,则剥除vlan标签。之后剥除数据帧的MAC头部,形成数据包,再检查数据包是非为IP数据,如果非IP数据则提交Linux协议栈处理,否则提取数据包IP五元组信息,根据IP五元组信息查询连接跟踪表,检查是否存在与数据包处理相对应的加速信息记录表,如果存在,则将数据包提交本地数据包加速处理单元处理(步骤四),否则将数据包提交Linux IP协议栈处理,经IP协议栈处理完成后进入加速信息设置单元处理(步骤三);
步骤三:加速信息设置单元提取数据包经Linux IP协议栈处理后的路由和包修改信息,设置加速信息记录表,并建立加速信息记录表与数据包所属连接跟踪条目的映射关系,然后将数据包提交Linuxsocket层接收;
步骤四:本地数据包加速处理单元根据数据包所对应的连接跟踪条目和加速信息记录表,对数据包进行相应的修改,修改完成后将数据包提交Linux socket层接收。
以上所述仅为本发明的较佳实施例,并不用于限制本发明,凡在本发明精神和原则之内所做的任何修改、等同替换和改进等,均含于本发明的保护范围之内。
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
Claims (6)
1.一种加速Linux系统本地数据包处理的方法,其特征在于:在宽带接入设备的Linux系统中,将本地数据包经Linux IP协议栈处理后的路由和包修改信息,记录在该数据包所属的连接跟踪结构体中,形成连接跟踪条目,对后续属于此连接跟踪条目的本地数据包,将使用连接跟踪条目中记录下来的路由和包修改信息直接处理,从而达到加速本地数据包处理的目的;
在Linux系统中,每一条连接跟踪条目都有唯一的连接跟踪结构体struct nf_conn与之对应;
连接跟踪条目通过加速信息记录表记录属于该连接跟踪条目的本地数据包经Linux IP协议栈处理后的路由和包修改信息,每一条连接跟踪条目与两张加速信息记录表对应,两张加速信息记录表分别记录属于此连接跟踪条目的本地数据包发送方向和接收方向的路由和包修改信息;
所述加速信息记录表以结构体struct nfp_info形式保存,
在连接跟踪结构体struct nf_conn中,设有指针数组structnfp_info*nfp[IP_DIR_MAX],IP_DIR_MAX表示数据流方向最大值,取值为2,其中包括指针nfp[0]和指针nfp[1];
指针nfp[0]用于指向连接跟踪条目本地数据包发送方向的数据所对应的加速信息记录表,当nfp[0]等于NULL时,表明该连接跟踪条目本地数据包发送方向不启用加速处理功能;当nfp[0]指向结构体struct nfp_info实例时,表明该连接跟踪条目本地数据包发送方向启用加速处理功能;
指针nfp[1]用于指向连接跟踪条目本地数据包接收方向的数据所对应的加速信息记录表,当nfp[1]等于NULL时,表明该连接跟踪条目本地数据包接收方向不启用加速处理功能;当nfp[1]指向结构体struct nfp_info实例时,表明该连接跟踪条目本地数据包接收方向启用加速处理功能。
2.如权利要求1所述的加速Linux系统本地数据包处理的方法,其特征在于,结构体struct nfp_info中至少包括以下成员:
成员struct dst_dentry*dst,用于记录数据包路由信息;
成员__u32 dscp,用于记录数据包差分服务代码点DSCP值;
成员__u32 priority,用于记录数据包优先级skb->priority的值;
成员__u32 mark,用于记录Linux内核数据包标记skb->mark的值;
成员struct net_device*output_dev,用于记录本地数据包发送方向的出口网络设备;
成员struct net_device*input_dev,用于记录本地数据包接收方向的入口网络设备;
成员_u8 attri,用于记录加速信息表属性,其中:记录发送方向加速信息取1,记录接收方向加速信息取2。
3.如权利要求1所述的加速Linux系统本地数据包处理的方法,其特征在于,本地数据包接收方向的处理流程包括以下步骤:
步骤101,Linux系统从网络驱动层收取数据帧;
步骤102,检查数据帧是否带有vlan标签vlan tag,如果有vlantag,则执行步骤103,否则执行步骤104;
步骤103,剥除数据帧的vlan tag,重新执行步骤102;
步骤104,检查数据帧是否为IP数据,如果是,则去除数据帧的MAC头部,形成数据包,再执行步骤105,否则将数据帧提交Linux协议栈处理,此处不再进一步分析;
步骤105,从数据包中提取IP五元组信息,所述IP五元组信息包括:数据包源IP,源端口,目的IP,目的端口以及传输层协议TCP或者UDP,根据此IP五元组信息,查询Linux协议栈连接跟踪表,如果找到数据包所属的连接跟踪条目对应的结构体struct nf_conn,则执行步骤106,否则执行步骤109;
步骤106,检查数据包所属连接跟踪结构体成员struct nfp_info*nfp[1]是否为NULL,如果为NULL,则执行步骤109,否则执行步骤107;
步骤107,用数据包所属连接跟踪条目记录的数据包发送方向的源IP、源端口、目的IP、目的端口依次替换数据包的目的IP、目的端口、源IP、源端口;连接跟踪条目记录的数据包发送方向的源IP、源端口、目的IP、目的端口记录在连接跟踪结构体struct nf_conn成员struct nf_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]中;
步骤108,根据指针nfp[1]所指向的加速信息记录表,对数据包skb内容进行相应的修改,修改内容包括:用加速信息记录表中的dscp值重新设置数据包DSCP域;将加速信息记录表中的dst、priority、mark、output_dev和input_dev分别赋值给skb->_skb_dst、skb->priority、skb->mark、skb->dev和skb->input_dev,修改完成后执行步骤111;
步骤109,数据包进入Linux IP协议栈的收包处理流程;
步骤110,提取数据包经Linux IP协议栈处理后的路由结果、skb->mark、skb->priority、skb->dev和skb->input_dev信息,依次赋值给加速信息记录表的dst、mark、priority、output_dev和input_dev成员,并建立连接跟踪结构体成员nfp[1]与加速信息记录表的映射关系;然后执行步骤111;
步骤111,将数据包提交函数ip_local_deliver_finish处理,然后进入Linux socket处理流程。
4.如权利要求1所述的加速Linux系统本地数据包处理的方法,其特征在于,本地数据包发送方向的处理流程包括以下步骤:
步骤201,函数ip_local_out从传输层接收发送数据包;
步骤202,从数据包中提取IP五元组信息,所述IP五元组信息包括:数据包源IP,源端口,目的IP,目的端口以及传输层协议TCP或者UDP,根据此IP五元组信息,查询Linux协议栈连接跟踪表,如果找到数据包所属的连接跟踪条目对应的结构体struct nf_conn,则执行步骤203,否则执行步骤206;
步骤203,检查数据包所属连接跟踪结构体成员struct nfp_info*nfp[0]是否为NULL,如果为NULL,则执行步骤206,否则执行步骤204;
步骤204,用数据包所属连接跟踪条目记录的数据包接收方向的源IP、源端口、目的IP、目的端口依次替换数据包的目的IP、目的端口、源IP、源端口;连接跟踪条目记录的数据包接收方向的源IP、源端口、目的IP、目的端口记录在连接跟踪结构体struct nf_conn成员struct nf_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]中;
步骤205,根据指针nfp[0]所指向的加速信息记录表,对数据包skb内容进行相应的修改,修改内容包括:用加速信息记录表中的dscp值重新设置数据包DSCP域;将加速信息记录表中的dst、priority、mark、output_dev和input_dev分别赋值给skb->_skb_dst、skb->priority、skb->mark、skb->dev和skb->input_dev,修改完成后执行步骤208;
步骤206,数据包进入Linux IP协议栈的发包处理流程;
步骤207,提取数据包经Linux IP协议栈处理后的路由结果、skb->mark、skb->priority、skb->dev和skb->input_dev信息,依次赋值给加速信息记录表的dst、mark、priority、output_dev和input_dev成员,并建立连接跟踪结构体成员nfp[0]与加速信息记录表的映射关系;然后执行步骤208;
步骤208,将数据包提交函数ip_finish_output处理,然后进入网络驱动层发送出去。
5.如权利要求1所述的加速Linux系统本地数据包处理的方法,其特征在于,当加速信息记录表需要删除时,由加速信息删除单元完成该操作,包括以下步骤:
步骤301:当Linux网络状态改变,以通知链的形式发送消息给消息处理器;所述Linux网络状态改变包括:iptables规则的添加或删除;网络设备状态改变;IPV4地址改变;路由表的添加或删除;路由缓存清除;以及连接跟踪条目自身老化;
步骤302:消息处理器根据接收到的消息,匹配与之对应的连接跟踪条目;
步骤303:消息处理器检查所匹配的连接跟踪条目是否存在与之对应的加速信息记录表,如果存在,则执行步骤304,否则结束退出;
步骤304:消息处理器删除所匹配的连接跟踪条目所对应的加速信息记录表。
6.一种加速Linux系统本地数据包处理的装置,其特征在于,包括:加速信息存储单元,加速信息设置单元,加速判决单元,本地数据包加速处理单元和加速信息删除单元;
加速信息存储单元,用于保存属于同一条连接跟踪条目的数据包在进行加速处理时所需要的路由和包修改信息,这些信息以加速信息记录表的形式保存,加速信息记录表通过连接跟踪条目间接访问;
加速信息设置单元,负责新建和设置加速信息记录表,并建立加速信息记录表与连接跟踪条目的映射关系;
加速判决单元,用于判断本地数据包是否可以进行加速处理,如果可以进行加速处理,则将该数据包提交本地数据包加速处理单元处理,否则将该数据包提交Linux协议栈处理;进一步,如果该数据包为IP数据,则在Linux IP协议栈将该数据包处理完成后,该数据包将进一步提交加速信息设置单元处理;
本地数据包加速处理单元,负责根据本地数据包所属连接跟踪条目以及其对应的加速信息记录表内容,对该数据包进行修改,修改完成后,将接收的本地数据包提交Linux socket层处理,将发送的本地数据包提交网络驱动层处理;
加速信息删除单元,负责监控Linux网络状态的变化,清除与其状态变化相关联的连接跟踪条目所对应的加速信息记录表。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210524029.0A CN102946347B (zh) | 2012-12-07 | 2012-12-07 | 一种加速Linux系统本地数据包处理的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210524029.0A CN102946347B (zh) | 2012-12-07 | 2012-12-07 | 一种加速Linux系统本地数据包处理的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102946347A CN102946347A (zh) | 2013-02-27 |
CN102946347B true CN102946347B (zh) | 2015-07-01 |
Family
ID=47729255
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210524029.0A Active CN102946347B (zh) | 2012-12-07 | 2012-12-07 | 一种加速Linux系统本地数据包处理的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102946347B (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105245464A (zh) * | 2015-08-27 | 2016-01-13 | 北京华夏创新科技有限公司 | 一种基于安卓系统的网络加速方法 |
CN105516017A (zh) * | 2015-11-20 | 2016-04-20 | 上海斐讯数据通信技术有限公司 | 定向加速的方法、装置及终端设备 |
CN106130997A (zh) | 2016-06-30 | 2016-11-16 | 网宿科技股份有限公司 | 流量引导的方法和装置 |
CN107872545B (zh) * | 2017-09-26 | 2022-12-06 | 中兴通讯股份有限公司 | 一种报文传输方法及装置、计算机可读存储介质 |
CN108737557A (zh) * | 2018-05-29 | 2018-11-02 | Oppo(重庆)智能科技有限公司 | 一种数据包传输方法、终端及计算机存储介质 |
CN108848202B (zh) * | 2018-06-21 | 2021-05-04 | Oppo(重庆)智能科技有限公司 | 电子装置、数据传输方法及相关产品 |
CN110519212B (zh) * | 2019-06-16 | 2021-06-22 | 北京中科海讯数字科技股份有限公司 | 一种基于匿名推断的通信转发系统 |
CN113746671B (zh) * | 2020-01-19 | 2023-05-26 | 烽火通信科技股份有限公司 | 一种业务加速方法、终端设备及家庭网关 |
CN111404817B (zh) * | 2020-03-24 | 2022-06-03 | 深圳市吉祥腾达科技有限公司 | 一种提升网络通信设备分片数据包转发性能的方法及系统 |
CN111641530B (zh) * | 2020-04-08 | 2022-11-11 | 上海联虹技术有限公司 | 实现加速转发的方法、装置、终端及存储介质 |
CN112511461A (zh) * | 2020-11-06 | 2021-03-16 | 无锡江南计算技术研究所 | 一种面向申威平台的网络数据包的调度方法 |
CN112929278B (zh) * | 2021-02-24 | 2022-07-22 | 深圳市吉祥腾达科技有限公司 | 一种网络通信设备多核并行快速转发数据包的方法及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101494605A (zh) * | 2009-03-05 | 2009-07-29 | 中兴通讯股份有限公司 | 一种基于以太网驱动的数据转发方法和装置 |
CN102158419A (zh) * | 2011-05-23 | 2011-08-17 | 深圳市共进电子有限公司 | 在家庭网关中实现数据包加速转发的方法 |
-
2012
- 2012-12-07 CN CN201210524029.0A patent/CN102946347B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101494605A (zh) * | 2009-03-05 | 2009-07-29 | 中兴通讯股份有限公司 | 一种基于以太网驱动的数据转发方法和装置 |
CN102158419A (zh) * | 2011-05-23 | 2011-08-17 | 深圳市共进电子有限公司 | 在家庭网关中实现数据包加速转发的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102946347A (zh) | 2013-02-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102946347B (zh) | 一种加速Linux系统本地数据包处理的方法及装置 | |
US20220321404A1 (en) | Programmable Protocol Parser For NIC Classification And Queue Assignments | |
US9882808B2 (en) | Packet processing method and apparatus | |
WO2015074324A1 (zh) | 一种数据包快速转发方法及装置 | |
EP3208974A1 (en) | Power line carrier communication terminal control device, system and method | |
CN107980213A (zh) | 内联网络加速器 | |
CN102123082A (zh) | 数据包转发方法和设备 | |
CN102696205A (zh) | 通信控制系统和通信控制方法 | |
US20130329732A1 (en) | Filtering of unsolicited incoming packets to electronic devices | |
WO2014036938A1 (en) | Packet forwarding | |
CN101951378A (zh) | 用于ssl vpn的协议栈体系结构及数据处理方法 | |
CN102201990B (zh) | 一种用于自治网络的业务控制方法及系统 | |
CN105099921A (zh) | 一种基于用户的快速业务处理方法以及装置 | |
EP3618365A1 (en) | Packet forwarding | |
CN112769597A (zh) | 一种云边协同虚拟化场景的容器网络限流方法和系统 | |
US9203758B2 (en) | Network system, packet processing method and recording medium | |
CN107770031A (zh) | 一种可扩展虚拟局域网vxlan报文处理方法和装置 | |
CN101699796B (zh) | 一种基于流信任的数据报文高速转发的方法、系统及路由器 | |
CN101222412A (zh) | 网络地址转换穿越方法和系统 | |
CN104471538B (zh) | 一种数据流处理方法、设备和系统 | |
CN102655476B (zh) | 一种互联网协议流转发方法,及设备 | |
KR101235206B1 (ko) | 패킷 파싱 장치 및 방법 | |
US9240898B1 (en) | Integrating VLAN-unaware devices into VLAN-enabled networks | |
CN110035010A (zh) | 匹配域的匹配方法及相关装置 | |
CN103563328B (zh) | 数据分流方法和装置 |
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 |