本发明属于网络技术领域,尤其是涉及链路聚合技术,一种基于DPDK的网络中间设备的链路聚合及其数据包快转的方法,用于网关设备对网络数据包进行快速转发。
背景技术:
链路接口聚合就是把多个物理接口绑定成一个逻辑接口,以实现出/入流量吞吐量在各成员端口的负荷分担,交换机根据用户配置的端口负荷分担策略决定网络封包从哪个成员端口发送到对端的交换机。当交换机检测到其中一个成员端口的链路发生故障时,就停止在此端口上发送封包,并根据负荷分担策略在剩下的链路中重新计算报文的发送端口,故障端口恢复后再次担任收发端口。链路聚合在增加链路带宽、实现链路传输弹性和工程冗余等方面是一项很重要的技术。
DPDK(数据平面开发工具包:Data Plane Development Kit)是一个开源的数据平面开发工具集,是Intel为了解决Linux SMP环境下数据包处理性能问题而提供的一个用户空间下的高效数据包处理函数库和驱动集。DPDK的核心技术包括EAL(环境适配层)、PMD(轮询模式驱动)、RING(无锁环)、MEMPOOL(内存池管理)、MBUF(缓存管理)、KNI(内核NIC接口)、ACL(接入控制库)等。
现有基于DPDK的数据包处理框架,对于DPDK应用程序的链路聚合接口,数据包无法被送到Linux内核实现数据包的选路,从而无法实现数据包的快速转发特性,很大程度上降低了网关设备的转发性能。因此有必要对链路聚合接口的数据包转发进行改进。
技术实现要素:
为了克服上述问题,本发明旨在提出一种基于DPDK的链路聚合接口的数据包转发方法,避免具有相同五元组的数据包重复上Linux内核协议栈,有利于提高数据包的转发效率。
本发明采用的技术方案是:
基于DPDK的链路聚合接口的数据包转发方法,包括:
链路聚合接口接收数据包;
DPDK应用程序解析数据包得到五元组信息;
根据五元组信息查找快转表,若查找到对应节点则由快转通道发送数据,若未查找到对应节点则交由Linux内核处理。
进一步的,上述数据包转发方法,还包括:
DPDK应用程序为链路聚合接口分配对应的KNI接口,数据包通过KNI接口发送至Linux内核;
Linux内核利用协议栈解析数据包并进行选路,将选路信息填充到数据包后,通过KNI接口返回DPDK应用程序;
DPDK应用程序根据数据包的五元组信息在快转表新建节点,并将选路信息填充至该节点;
发送数据包。
优选的,链路聚合接口后续收到五元组信息相同的数据包,由快转通道发送数据,不再进行Linux内核处理。
优选的,链路聚合接口创建时,设置收发数据包的策略,所述策略至少包括轮询、主备、XOR。
采用以上技术方案的本发明,具有以下有益效果:对于快转表未查找到的数据包,经Linux内核处理后返回DPDK应用程序,并新建相应的节点,以备后续相同五元组信息的数据包不再进行Linux处理而实现快速转发,提高链路聚合接口的数据包转发效率,进而有利于提高网关设备的转发性能。
附图说明
图1为本发明的数据包处理流程示意图;
图2为本发明的接口KNI与Linux内核的交互示意图;
图3为本发明的接口收发包流程示意图。
具体实施方式
下面结合附图对本发明的技术方案进行详细说明。
如图1所示,基于DPDK的链路聚合接口的数据包的处理,主要包括:
对数据包进行包头解析,得到五元组信息(即源IP地址SIP、目的IP地址DIP、源端口SPORT、目的端口DPORT、传输层协议TYPE);根据五元组信息查找快转表,若可以查找到相应的节点,则经快转通道将数据发出;若未查找到相应的节点,则利用聚合接口的KNI(接口)将该数据包送到Linux内核进行处理,所述的KNI接口指内核网卡接口(Kernel NIC Interface);Linux内核对数据包进行解析并选路后返回,根据五元组与选路新建节点实现对快转表的更新,将数据包发出。
如图2所示,上述的数据包的处理由DPDK应用程序进行,DPDK应用程序为链路聚合接口分配对应的KNI接口,数据包通过KNI接口发送至Linux内核。
具体的讲,基于DPDK的链路聚合接口的数据包转发方法,包括以下步骤:
链路聚合接口接收数据包;
DPDK应用程序解析数据包得到五元组信息;
根据五元组信息查找快转表,若查找到对应节点则由快转通道发送数据,若未查找到对应节点则通过KNI接口交由Linux内核处理;
Linux内核利用协议栈解析数据包并进行选路,将选路信息填充到数据包后,通过KNI接口返回DPDK应用程序;
DPDK应用程序根据数据包的五元组信息在快转表新建节点,并将选路信息填充至该节点;
发送数据包;
当链路聚合接口,后续收到五元组信息相同的数据包,由快转通道发送数据,不再进行Linux内核处理。
进一步的,对于上述的数据包处理方法的实现方案包括:
设置链路聚合接口属性结构与数据包信息属性结构,其中:
链路聚合接口属性结构用于存储聚合接口相关信息,其最重要的变量是BOND_ID与KNI_ID,分别记录聚合接口ID与其对应的KNI_ID;
数据包信息属性结构,用于实现数据包的快速转发功能,其最重要的变量是OUT_PORT,记录数据包的出接口,整个数据包信息属性结构嵌入在原有数据包属性结构中。
创建链路聚合接口,设置其收发数据包的策略,至少支持轮询、主备、XOR三种模式,将聚合接口ID保存到链路聚合接口属性结构成员变量BOND_ID中;为链路聚合接口创建对应的KNI接口,设定其名称为bondx,将KNI对应的索引保存到链路聚合接口属性结构成员变量KNI_ID中。
如图3所示,修改Linux内核,针对聚合接口,根据设备名称对数据包的进接口与出接口进行处理,使得Linux内核可根据设备名称判断接口是否是聚合接口,若是聚合接口,则该数据包对应的数据包信息属性结构成员变量OUT_PORT将被赋值为聚合接口的名称最后一位索引x加BOND_BASE(可将该值定为200);若是普通物理接口,则该数据包对应的数据包信息属性结构成员变量OUT_PORT将被赋值为该接口名称最后一位索引x。
链路聚合接口按照创建时的收包策略接收数据包,DPDK应用程序对每个数据包的五元组进行解析,将其存储在数据包信息属性结构;
当数据包到达快转表,首先根据其携带的五元组信息查找快转表,若查找到对应的节点,则走快转通道进行数据的发送;相反,若没有查找到相应的节点,则利用链路聚合接口的KNI接口将该数据包送到Linux内核。
Linux内核首先会解析出进接口PORT,其值等于BOND_BASE+X。
若聚合接口被配置为桥模式,则Linux内核将该数据包送到协议栈二层选路。
选路完成后,将该数据包交给DPDK应用程序之前,将出接口保存在OUT_PORT中。
DPDK应用程序接收到从Linux内核出来的数据包后,重新获取数据包的五元组。
当数据包再次走到快转表时,首先还是查找快转表,若没有查找到,则新建一个节点,将从Linux内核携带出来的信息复制到该节点中,建立一条链接,然后将该数据包依照创建时为链路聚合接口设置的发包策略将数据包发送出去;
链路聚合接口后续的数据包依次解析其SIP、DIP、SPORT、DPORT以及TYPE,依据这五元组查找转发表,若查找到对应的节点,则实现了数据包快速转发性能;否则,送其上Linux内核协议栈,建立对应的链接,完成数据包的转发。
如上所述,本发明对聚合接口的数据包根据快转表的节点查询结果进行区别处理,未查询到节点的数据包被送到Linux内核进行选路,可以有效减少需要Linux内核重复处理的数据包量,从而实现了数据包的快速转发,有利于提高网关设备的转发性能。