一种基于NetFPGA的可编程虚拟路由器内部通信方法

文档序号:7869032阅读:197来源:国知局
专利名称:一种基于NetFPGA的可编程虚拟路由器内部通信方法
技术领域
本发明涉及通信及计算机技术领域,具体是一种基于NetFPGA的可编程虚拟路由器内部通信方法。
背景技术
未来互联网体系结构、协议、算法与实现技术都需要大量的理论分析和仿真实验, 更需要在实验网络系统中进行评估和验证。为了提供验证其算法和新协议的平台,保证不破坏现有的网络结构又能够利用真实的网络流量验证算法和协议,研究者们提出了可编程虚拟化路由器技术。
可编程虚拟路由器包括转发硬件和虚拟路由器两部分转发硬件的核心是 NetFPGA板卡(用于网络的可编程门阵列,由斯坦福大学开发),完成数据包接收和发送;虚拟路由器运行于操作系统为CentOS的主机上,由虚拟化软件OpenVZ(基于Linux内核和作业系统的操作系统级虚拟化技术)生成,完成路由计算和路由交换功能。转发硬件和虚拟路由器之间通过主机操作系统通信。
然而,目前对可编程路由器的研究都还停留在原型构造阶段,只是对路由器的整体架构进行了描述,没有涉及到内部的实现细节,即使是一些已经做出原型系统的设计,其着眼点也放在硬件的设计与开发上,对整体的通信过程也仅仅是作出一个概括性的描述, 而没有给出一个具体可行的方案。发明内容
本发明解决的问题是在Linux内核支持数据包转发的基础上,提供一种虚拟可 编程路由器的内部通信方法,使得虚拟路由器与网络上其他路由器、虚拟路由器与底层硬件之间正确的交换数据包。
本发明采用了以下技术方案一种基于NetFPGA的可编程虚拟路由器内部通信方法,包括以下步骤捕获进入Linux 内核的NetFPGA数据包,将该数据包封装后发送到虚拟路由器;经所述虚拟路由器处理后的数据包通过主机操作系统转发出去,并将路由信息部署到NetFPGA中。
A、初始化建立以下模块数据包入口设备检查模块;产生虚拟网卡nf的网卡虚拟模块,nf的MAC称为vMAC ;数据封装模块,在数据包封装模块存放vMAC_VR映射表(虚拟网卡-虚拟路由器映射表,包含nf网卡MAC地址vMAC,虚拟路由器标识符VRID,虚拟路由器网卡veth的MAC地址veMAC和IP地址velP), nfc信息表(NetFPGA板载网卡nfc的配置信息,包括网卡名称interface,MAC地址,IP地址);数据分发模块,信息接收模块。
B、在Linux内核网络协议栈入口处设置数据包入口设备检查模块,检查每一个流 Λ Linux内核的数据包的入口设备名称。
C、如果入口设备名称为nfc则触发数据封装模块,并将该流入Linux内核的数据包缓冲区skb (数据包在Linux内核中的表现形式)和入口设备名称nfc传送到数据封装模块,由数据封装模块将skb封装到一个新的IPv4数据包,然后该新的数据包通过Linux 内核发送到虚拟路由器;由NetFPGA板卡发送给主机的数据包包括三类a.路由信息包, b.需要进行路由计算的普通数据包,c.出错数据包,a、b、c三类统称为P1。
D、如果入口设备名称不为nfc,则不作任何处理。
在步骤C之后还包括如下步骤Cl、在数据包封装模块接到触发通知后,获取skb中的协议数据区skb->head中的MAC 地址字段即dMAC,将dMAC与在vMAC-VR映射表中的表项vMAC比较,查找对应的VR( Virtual Router)信息的IP地址velP (虚拟路由器IP地址)和MAC地址veMAC (虚拟路由器MAC地址)。
C2、如果在vMAC-VR映射表中找到对应此MAC地址的VR信息,则查找nfc信息表, 查到入口设备的MAC地址nfcMAC和入口设备的IP地址nfcIP,将该skb中包含的协议数据区skb_>head封装到一个新的IPv4数据包newHead中,对于步骤C中所述的三种数据包封装方法相同;否则将数据包丢弃。
C3、将步骤C中所述数据包Pl中的skb_>head替换为skb_>newHead,替换后的数据包称为P2,替换步骤为释放skb_>head,并将skb_>head赋值为NULL ;将skb_>head指向 newHead,即skb_>head=newHead ;重新对P2作CRC校验,然后将P2送回内核网络协议栈处理队列,数据包P2会由Linux内核自动转发到指定虚拟路由器。
C4、数据分发模块会将虚拟路由器网卡veth设置为混杂模式,采用Iibpcap库 (Packet Capture library,即数据包捕获函数库)抓取veth上的数据包,将抓取到的数据包P2去掉协议头后,得到与Pl数据相同 的P3,将P3解包后得到获取目的MAC地址即dMAC, 然后将dMAC与虚拟路由器的网卡nf的MAC地址比较。
C5、如果比较结果相同,则将此数据包送往此虚拟网卡η。
C6、如果比较结果不同,则将此数据包丢弃。
所述步骤C5之后还包括C7、送往网卡nf的数据包P3由上层路由软件(如XORP或者Qugga等)读取,对于C3中所述数据包Pl的a、c两类,路由软件处理后没有任何输出,对于数据包Pl的b类,经处理后得到与Pl结构相同的P4,将P4封装成以太网数据包P5 (如图6)后从网卡veth发送出去。
CS、在虚拟路由器之外,即主机操作系统内,位于主机操作系统的用户空间路由信息接收模块通过监控网关venet,捕获每一个从veth发送出去的数据包(ARP广播包),对其中抓取的数据包P5,去掉以太网首部后,得到P4,根据P4中的目的IP地址及目的MAC地址, 形成一条路由信息。通过调用NetFPGA的驱动程序API将路由信息部署到NetFPGA中;数据段通过Iibnet函数库封装成标准IPv4数据包P6由主机操作系统的网卡发送出去。
具体地,利用TUN/TAP模拟与所述NetFPGA所带网卡数量相同的路由器虚拟网卡 veth,使虚拟路由器更加贴近真实环境。
具体地,通过Iibnet将经虚拟路由器处理后的数据包封装成一个ARP广播包,并通过路由器虚拟网卡veth发送出去。
信息接收模块监控网关venet,对每一个发送出去的ARP广播包,解包后去掉以太网首部,分析数据段内容获取路由信息,然后将数据段发送出去,通过调用NetFPGA的API将路由信息部署到NetFPGA中。
所述通过Iibnet将经虚拟路由器处理后的数据包封装成一个ARP广播包的步骤包括调用libnet_init_packet初始化一个数据包;调用libnet_build_ethernet封装一个以太网数据包;libnet_open_raw_sock打开一个套接字;调用libnet_write_link_ layer发送一个链路层数据包。
具体地,所述获取路由信息的步骤包括通过Iibpcap库抓取网关venet上的数据包,去掉以太网首部,获得数据段;申请一段新的缓冲区,将所述数据段的第7 12字节、31 35字节复制进去,然后调用ioctl命令将其部署到NetFPGA中;通过Iibnet将所述数据段发送出去。
本发明通过一种隧道方式将NetFPGA反馈给主机的数据包分发到相应的虚拟路由器,依托于内核网络协议栈内的Netfilter框架,仅通过少量代码就能够实现传输目的, 加快了数据包在传输过程中的时延,减少了部署的难度;模拟了 NetFPGA的接口特性,使用户在使用中更加贴近真实环境;可编程虚拟化路由器是未来网络研究项目中重要的试验平台,本发明填补了其研究中虚拟路由器内部通信方法缺失的空白。


图1为系统结构示意图;图2为NetFPGA原始数据包Pl格式;图3为vMAC_VR映射表,VRID为虚拟路由器编号,vMAC是虚拟网卡nf的MAC地址, veMAC、velP为虚拟路由器网卡ve th的MAC地址和IP地址;图4为nfc信息表,此表包含了 NetFPGA板载网卡的信息,包括MAC地址和IP地址; 图5为封装数据包newHead格式;图6为封装数据包P5格式;图7为虚拟路由器接收数据包流程图;图8为数据包发送及路由信息部署流程图。
具体实施方式
本发明基于NetFPGA的可编程虚拟路由器通信方法需要设置以下功能模块数据包入口设备检查模块通过读取每一个流入Linux内核的数据包缓冲区skb的input_dev结构,获取输入设备的名称。
数据封装模块将从NetFPGA送往主机的原始数据包封装到一个新的IPv4数据包内,并初始化vMAC_VR映射表和nf信息表;网卡虚拟模块在OpenVZ虚拟机通过TUN/TAP虚拟出多个以太网虚拟网卡nf,TUN是操作系统内核中的虚拟网络设备,向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能,供虚拟路由器使用;网卡nf有如下特性操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或 “注入”)数据包,从而模拟从外部接受数据的过程;初始化虚拟路由器VR标识符VRID。
数据分发模块捕捉虚拟路由器网卡veth上的数据包,并将其中的NetFPGA数据包写入对应的网卡nf ;信息接收模块通过侦听网关venet,分析由网卡veth发送出去的数据包,获取路由信息,并通过调用NetFPGA的驱动程序API将路由信息下发到NetFPGA中。
本发明包括以下步骤步骤一将所述数据包入口设备检查模块设置在Linux内核网络协议栈入口处,即在内核协议栈入口函数netif_receive_skb出增加一个函数,对进入内核的每一个数据包缓冲区skb,检查缓冲区内成员in_device的值,即入口设备的名称。
步骤二 如果入口设备的名称不是nfcx(x为网卡编号),则不做任何处理,将该数据包送回内核数据包处理队列;如果入口设备的名称为nfcx,则触发数据封装模块,并将该数据包缓冲区skb和输入设备名称nfcx传递给该模块;由NetFPGA板卡发送给主机的数据包包括三类a.路由信息包,b.需要进行路由计算的普通数据包,c.出错数据包,对于这三类信息包,封装方法相同,将其统称为P1。
步骤三获取步骤二中所述数据包Pl的协议数据区skb->head中7 12字节所包含的目的MAC地址dMAC,并根据此MAC地址与vMAC-VR映射表(如图3 )中的表项vMAC比较,查找对应虚拟路由器VR自带网卡veth的MAC地址veMAC及IP地址velP。
步骤四如果没有在映射表中找到对应信息,则将此数据包丢弃;如果在映射表中查找到对应信息,再次根据网卡名称nfcx查找nfc信息表(如图4),查找输入设备nfcx 的MAC地址nfcMAC及IP地址nfcIP,根据这些信息封装一个新的IPv4数据包newHead, 数据包格式如图5,以太网首部中源MAC地址为nfcMAC,目的MAC地址为veMAC,类型字段 type为0x0800,IP首部中源IP地址为nfcIP,目的IP地址为velP,protocol为177,IP数据段包括VRID和传递进来的数据包协议数据区skb->head。
步骤五将步骤二中所述数据包Pl的协议数据区skb->head替换为新封装的数据包skb->newHead,并重新作CRC校验,此时数据包Pl变成数据包P2,最后将整个缓冲区skb 送回内核协议栈处理队列,Linux内核会将数据包自动转发到对应的虚拟路由器。
步骤六数据分发模块将OpenVZ虚拟机自带网卡veth设置为混杂模式,捕捉、分析到达网卡数据包,如果是一个IPv4数据包并且protocol字段是177,则这个数据包是 P2,去掉P2的以太网首部和IP首部,读取VRID字段并与本路由器的VRID比较,如果不同, 则将数据包丢弃;如果VRID相同,去掉VRID段,得到结构、数据与Pl相同的数据包P3。
步骤七读取P3的第7 12字节,获取目的MAC地址,即dMAC,分别与由网卡虚拟模块产生的各个虚拟网卡nfx (X为网卡编号)的MAC地址比较,如果MAC地址相同,则将 P3写入该网卡。
步骤八写入nfx的数据包P3,会由路由软件,如X0RP、Qugga等读取并处理,对于步骤三中所述数据包Pl中的a、c两类,经过路由软件处理后不会有任何输出,Pl中的b类经过处理后会产生格式与P3相同的数据包P4,P3与P4内容上唯一不同的地方是P4的目的MAC被路由软件修改成了下一跳的MAC地址。
步骤九通过Libnet将P4封装成一个以太网数据包P5 (如图6),源MAC地址为 veth的MAC地址veMAC,目的MAC地址为广播地址FF: FF: FF: FF: FF: FF, TYPE字段为OxCCFE, payload (负载)为P4,然后通过网卡veth直接发送出去;封装的具体步骤包括1.调用libnet_init初始化一个数据包;2.根据步骤九中所述的信息,调用libnet_build_ ethernet将P4封装成一个以太网数据包P5 ;3.调用libnet_write将数据包P5发送出去。
步骤十路由信息分析模块监控位于主机操作系统内的网关venet,抓取从veth 上面发送出去的数据包,分析这些数据包中以太网首部中的目的MAC地址和TYPE字段,如果目的MAC地址为FF:FF:FF:FF:FF:FF,TYPE字段为OxCCFE,那么这个数据包就是步骤九中所述的从网卡veth发送出去的数据包P5,去掉数据包P5的以太网首部区域,获取经路由软件处理后产生的数据包P4。
步骤^^一 分析P4,获取目的MAC地址和目的IP地址,记录成一条路由信息,通过 NetFPGA提供的参数,调用ioctl将信息存储至NetFPGA中。
步骤十二 将P4通过主机自带网卡ethx发送出去。具体步骤包括1.分析P4以太网首部,获取源MAC地址、目的MAC地址、TYPE字段,IP首部的ihl (首部长度)、TOS (服务类型)、tot_len (总长度)、TTL (生存时 间)、protocol (协议)、源IP地址、目的IP地址, payload (负载)指针;2.调用libnet_init初始化一个数据包;3.根据步骤I中所述的11 条信息,调用libnet_build_ipv4创建一个标准IPv4数据包P6 ;4.调用libnet_write将数据包P6发送出去。
权利要求
1.一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于,包括以下步骤 捕获进入Linux内核的NetFPGA数据包,将该数据包封装后发送到虚拟路由器; 经所述虚拟路由器处理后的数据包通过主机操作系统转发出去,并将路由信息部署到NetFPGA 中。
2.根据权利要求1所述一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于所述捕获进入Linux内核的NetFPGA数据包,将该数据包封装后发送到虚拟路由器的步骤包括 初始化建立数据封装模块,在数据封装模块中存放vMAC-VR映射表和nfc信息表; 在Linux内核网络协议栈入口处设置数据包入口设备检查模块,检查每一个流入Linux内核的数据包的入口设备名称; 如果入口设备名称为nfc则触发数据封装模块,并将该流入Linux内核的数据包缓冲区skb和入口设备名称nfc传送到数据封装模块,由数据封装模块将skb封装到一个新的IPv4数据包,然后该新的数据包通过Linux内核发送到虚拟路由器; 如果入口设备名称不为nfc则不作任何处理。
3.根据权利要求2所述一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于所述数据封装模块将skb封装到一个新的IPv4数据包的步骤包括 获取skb中的协议数据区skb->head中的MAC地址字段,并在vMAC_VR映射表中查找VR信息的IP地址,即虚拟路由器IP地址veIP和虚拟路由器MAC地址veMAC ; 如果在vMAC-VR映射表中找到VR信息,则查找nfc信息表,查到入口设备的MAC地址nfcMAC和入口设备的IP地址nfcIP,将该skb中包含的协议数据区skb_>head封装到一个新的IPv4数据包newHead中;否则将数据包丢弃。
4.根据权利要求1所述一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于利用TUN/TAP模拟与所述NetFPGA所带网卡数量相同的路由器虚拟网卡veth。
5.根据权利要求1所述一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于所述经所述虚拟路由器处理后的数据包通过主机操作系统转发出去,并将路由信息部署到NetFPGA中的步骤包括 通过I ibnet将经虚拟路由器处理后的数据包封装成一个ARP广播包,并通过路由器虚拟网卡veth发送出去; 信息接收模块监控网关venet,对每一个发送出去的ARP广播包,解包后去掉以太网首部,分析数据段内容获取路由信息,然后将数据段发送出去,通过调用NetFPGA的API将路由信息部署到NetFPGA中。
6.如权利要求5所述的一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于所述通过Iibnet将经虚拟路由器处理后的数据包封装成一个ARP广播包的步骤包括调用libnet_init_packet初始化一个数据包;调用libnet_build_ethernet封装一个以太网数据包;libnet_open_raw_sock 打开一个套接字;调用 libnet_write_link_layer发送一个链路层数据包。
7.如权利要求5所述的一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于所述获取路由信息的步骤包括通过Iibpcap库抓取网关venet上的数据包,去掉以太网首部,获得数据段; 申请一段新的缓冲区,将所述数据段的第7 12字节、31 35字节复制进去,然后调用ioctl命令将其部署到NetFPGA中; 通过Iibnet将所述数据段发送出去。
全文摘要
本发明公开了一种基于NetFPGA的可编程虚拟路由器内部通信方法,其包括以下步骤通过检查进入Linux内核的数据包的入口设备,将其中设备名称为nfc的数据包封装到一个新的IPv4数据包内,目的MAC地址和IP地址为虚拟路由器网卡veth的MAC地址和IP地址,发送到虚拟路由器,去掉封装包的以太网首部和IP首部,分析其数据段并写入对应网卡,由路由软件处理后,将数据包通过主机操作系统发送出去,路由信息通过调用ioctl部署到NetFPGA中。加快了数据包在传输过程中的时延,减少了部署的难度。
文档编号H04L12/741GK103001883SQ20121054686
公开日2013年3月27日 申请日期2012年12月17日 优先权日2012年12月17日
发明者徐川, 赵磊, 唐红, 赵国锋 申请人:重庆邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1