一种网络设备和数据包发送方法与流程

文档序号:12278378阅读:1076来源:国知局
一种网络设备和数据包发送方法与流程

本申请涉及互联网网络技术领域,尤其涉及一种Linux操作系统下网桥进行数据转发对网口进行循环遍历的技术问题。



背景技术:

在网络上移动数据的过程中,需要确定在网络上是否允许该数据,如果允许,则需要确定数据将被传送到哪里。当数据从源端传送到目的端的时候,网络可以确定发送端和接收端是否都是有效的和是否允许使用该网络,以及将如何处理数据。传输控制协议/因特网协议(TCP/IP)数据典型地是以帧的形式传输,所述帧包括至少两个部分,地址首标和数据负载。可以从五元组形式的地址首标中找到通常用于通过网络向目的端传输数据的信息,所述五元组包括下述字段:源地址、目的端地址、源端口、目的端口和协议。

在一般的网关设备中,分为WAN侧和LAN侧,WAN侧为接入端,负责链接互联网或者是电信网络,LAN侧为用户接入端,一般情况下,LAN侧会存在多个以太网接口分别链接各种网关终端设备。在家庭网络环境中,一般的终端设备有PC、机顶盒、网络电话或全球眼等网络设备,在企业应用中,组网更为复杂,所有的网络设备都通过网关设备进行接入,包括各种应用服务器,网络终端等等,种类复杂多样,一旦在某个网络中出现环路问题,或者是环路出现在接入网关内部,都会直接影响网关工作和其他网络设备的正常接入。但是由于网管终端设备过多,接线繁杂,又无法快速的知道具体是哪一处出现故障,只能做全面的地毯式检查,这样不仅费时费力,也不容易找到准确的故障出处,甚至以为全面检查而引起新的故障。

目前Linux网桥中所用到的数据包转发函数主要分为两种,一种是数据被转发到特定的端口,另一种是数据扩散,循环遍历转发扩散到所有端口。针对前者,功能实现主要体现在两个方面:对入口流量和出口流量分别进行的数据转发。其中,对入口流量进行数据转发其实就是桥组中的一个网桥端口对数据包进行接收,经过网卡驱动后,调用netif_receive_skb、handle_bridge、br_handle_frame等函数,最后调用函数br_forward来实现数据转发。对出口流量进行数据转发时首先要建立路由wan连接,如果外网的数据想要和lan側的终端进行数据传输时,外网数据会首先会与wan接口建立连接,然后wan接口通过路由规则和arp,可以将需要的网络数据从网桥发送出去,最后网桥就会调用br->netdev_ops->ndo_start_xmit,即br_dev_xmit,br_dev_xmit中会调用br_deliver、br_flood_deliver,进行出口流量的转发。数据扩散同样分为入口流量的扩散和出口流量的扩散,需要调用一个重要的函数br_flood,主要是循环遍历已存在的所有端口,对于符合数据转发条件的端口,调用函数__packet_hook进行后续处理。

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。

中国专利申请号为CN201210525155.8,该发明本发明涉及网络通信技术领域,尤其涉及网关设备动态环路检测、保护以及静态环路检测的方法。本发明的作用是:当确认存在环路,立刻关闭环路接口的接收中断,保护网关设备不受攻击,并开启环路告警灯,告诉用户存在环路情况,接着检测环路是否解除,一旦环路解除,就重新开启环路接口的接收中断,关闭环路告警灯,由上述可以看出,一旦设备出现环路情况,网关设备会发现并且采用保护措施,使得其他非环路链路能正常工作,并且对存在环路的接口进行监控,当环路解除后马上就可以正常工作。

中国专利申请号为CN200510018238.8,该发明提供了一种MAC桥接网络,例如以太网,环路发现、空间重用和保护倒换的方法和装置。环路的控制网桥周期性发送的拓扑发现消息经过整个环路返回控制网桥,记录环路中的网桥和链路情况。控制网桥通过拓扑指示将拓扑信息通告环路的其它网桥,并指定保护网桥和保护端口。保护网桥阻塞保护端口,避免数据在环路中循环。网桥根据拓扑信息选择最短路径,实现空间重用,同时使用心博消息检测链路的连通性,并在发现链路故障时,通知保护网桥实现快速保护倒换。本发明可以在包含多个环路的复杂拓扑结构网络中,通过配置发现环路拓扑或者通过生成树协议簇中的协议自动发现环路拓扑,提高环路空间利用效率,实现50ms之内的快速保护倒换。

以上公开的专利,未解决修改skb报文导致的会影响vlan功能的实现,还会影响终端用户隔离功能的实现。当前能解决上述问题的方法主要是重新添加一个入口函数来实现数据接收和转发的功能。这种方法的缺点是增大了工作量,严重占用产品开发的时间,还有可能会引入其他未知的缺陷,具有很大的不确定性。



技术实现要素:
本发明提供了一种Linux操作系统下网桥数据转发对网口进行循环遍历的新技术方案。在网络数据传输中,有时需要不同的网口之间进行通信,在通信的过程中会对所有存在的网口进行依次循环遍历,对满足要求的网口进行相应的操作,这里所说的操作最基本的就是进行ping操作,当一个网口去ping另外一个网口时,无论对传输报文进行怎样的构造,都不会影响具体的功能。本发明是通过以下技术方案实现的:

一种数据包发送方法,所述数据包发送的网络设备包括:至少二个数据收发端口、数据判断模块、数据处理模块,所述方法包括如下步骤:

S100:一个所述数据收发端口接受所述数据包;

S200:当所述数据判断模块判断所述数据包需要通过所述数据收发端口转发时,所述数据处理模块对所述数据包中的skb报文进行相应修改;

S300:所述数据处理模块克隆修改后的所述skb报文,所述数据判断模块对所有所述数据收发端口进行循环遍历;

S400:对于符合所述数据包转发条件的所述数据收发端口,实现所述数据包转发。

克隆修改后的所述skb报文,具体是指,skb_clone是linux内核对SKB操作的一个函数。如果一个SKB会被不同的用户独立操作,而这些用户可能只是修改SKB描述符中的某些字段值,则内核没必要为每个用户复制一份完整的SKB描述及其相应的数据缓存区,为了提高性能,只作克隆操作。

文中提到的将已经修改后的SKB克隆就是使用skb_clone函数,只是复制sk_buff结构,并不复制skb的数据缓冲区。Clone后的sk_buff结构与原始的sk_buff指向同一数据缓冲区。原始的和clone后的skb描述符的cloned值都会被置1,clone的skb描述符的users值置1,同时数据缓冲区的引用计数dataref增加1,以免共享数据被提前释放。

进一步,所述的数据包发送方法,所述S200步骤中的相应修改为给所述数据包添加v l an头。

进一步,所述的数据包发送方法,所述S200步骤中包括S210步骤:

S210:当所述数据判断模判断所述网络设备状态为forword,允许进行转发的进一步操作。上述forward状态指的报文符合转发要求并且可以进行转发的状态,具体可以分为本地转发(local in)和集中转发(forwarding)。本地转发指的是发往本地协议栈,集中转发则是端口与端口之间的转发。

进一步,所述的数据包发送方法,所述S200步骤中包括S220步骤:

S220:当所述数据判断模判断数据包的容量小于所述网络设备的mtu值,且支持gso,允许进行转发的进一步操作。

上述mtu值,指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。设置合适的MTU值,会提高通信效率。

上述GSO,即为通用分段延后处理。指网卡在支持GSO功能时,对于超大数据包(大于MTU值),内核会将分段的工作延迟到交给驱动的前一刻。如果网卡不支持此功能,则内核用软件的方式对数据包进行分片。

进一步,所述的数据包发送方法,所述S400步骤包括S410步骤:

S410:所述数据包进行遵守规程处理,所述规程包括forword链上的规则、网桥防火墙中post链中的规则或者网桥防火墙中调用out链中的规则。

进一步,所述的数据包发送方法,所述S400步骤包括S420步骤:

S420:当所述数据判断模块判断所述数据包符合相应规则的,修改所述skb报文指向的net dev。

上述net dev是net device的简写,就是“网络设备”的意思。对应于linux中的数据结构net_device结构体,主要功能是实现多种硬件在软件层次上的统一。net_device结构分为全局成员、硬件相关成员、接口相关成员、设备方法成员和公用成员等五个部分。

进一步,所述的数据包发送方法,所述S400步骤包括S430步骤:

S430:对于满足所述数据包转发条件的所述数据收发端口,调用函数_packet_hook进行所述数据包转发的处理。

本发明还提供了一种网络设备,包括至少二个数据收发端口、数据判断模块、数据处理模块,

所述数据收发端口,用于接受或者发送数据包;

所述数据处理模块,用于修改所述数据包中的skb报文;

所述数据判断模块,用于对所述数据包的转发条件进行判断,且对所述数据收发端口进行循环遍历,寻找符合所述数据包的转发条件的所述数据收发端口。

进一步,所述的网络设备,任一所述数据收发端口接受所述数据包后,调用网卡驱动函数处理所述数据包。

进一步,所述的网络设备,符合所述数据包的转发条件的所述数据收发端口为所述网络设备的至少一个非接受所述数据包的所述数据收发端口。

进一步,所述的网络设备,所述数据判断模块判断所述转发条件包括:网桥端口的状态是否为forword、所述数据包大小是否小于所述网络设备的mtu值、是否支持gso、所述数据包是否符合相应规则、发送所述数据包的所述数据收发端口是否与接受所述数据包的所述数据收发端口相同。

再进一步,所述的网络设备,所述数据处理模块根据所述数据判断模块判断为不符合所述转发条件的,对所述数据包进行分片或者丢弃操作。

上述分片操作,是指链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。如果传输数据包的长度超过了MTU值且可以分片传输,就会对数据包进行分片操作,使每一片的长度都小于或等于MTU值。这样就可以将需要传输的数据报文分为若干分片进行传输,并在目标系统中进行重组。

本发明至少具有以下有益效果之一:

1.本发明克服了原先数据包转发,若修改报文,不仅会影响vlan功能的实现,还会影响终端用户隔离功能的实现的技术问题。

2.本发明赋予网络设备根据数据包转发进行自动检测和修改报文的能力。

3.本发明极大地方便网桥类网络设备架设工作。

4.本发明能够做到自动、高效、便捷地完成互联网中数据包的转发工作。

5、本发明提供的自动修改报文、复制报文、网络设备的网口循环遍历发送对应数据包方法,可靠性高,同时执行效率高、应用范围广。

附图说明

下面结合附图和具体实施方式对本发明作进一步详细说明:

图1为本发明第一实施例流程示意图;

图2为本发明第一实施例模块示意图;

图3为本发明第三实施例流程示意图。

附图标记说明

1000-网络设备;100-数据收发端口;200-数据判断模块;300-数据处理模块。

具体实施方式

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,以下说明和附图对于本发明是示例性的,并且不应被理解为限制本发明。以下说明描述了众多具体细节以方便对本发明理解。然而,在某些实例中,熟知的或常规的细节并未说明,以满足说明书简洁的要求。

在本申请一个典型的计算硬件配置中,客户端/终端、网络设备和可信方均包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。

本发明中的客户端、移动终端或网络设备包括处理器,含单核处理器或多核处理器。处理器也可称为一个或多个微处理器、中央处理单元(CPU)等等。更具体地,处理器可为复杂的指令集计算(CISC)微处理器、精简指令集计算(RISC)微处理器、超长指令字(VLIW)微处理器、实现其他指令集的处理器,或实现指令集组合的处理器。处理器还可为一个或多个专用处理器,诸如专用集成电路(ASIC)、现场可编程门阵列(FPGA)、数字信号处理器(DSP)、网络处理器、图形处理器、网络处理器、通信处理器、密码处理器、协处理器、嵌入式处理器、或能够处理指令的任何其他类型的逻辑部件。处理器用于执行本发明所讨论的操作和步骤的指令。

本发明中的客户端、移动终端或网络设备包括存储器,用于存储大数据,可包括一个或多个易失性存储设备,如随机存取存储器(RAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、静态RAM(SRAM)或其他类型的存储设备。存储器可存储包括由处理器或任何其他设备执行的指令序列的信息。例如,多种操作系统、设备驱动程序、固件(例如,输入输出基本系统或BIOS)和/或应用程序的可执行代码和/或数据可被加载在存储器中并且由处理器执行。

本发明中的客户端、移动终端或网络设备的操作系统可为任何类型的操作系统,例如微软公司的Windows、Windows Phone,苹果公司IOS,谷歌公司的Android,以及Linux、Unix操作系统或其他实时或嵌入式操作系统诸如VxWorks等。

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,以下说明和附图对于本发明是示例性的,并且不应被理解为限制本发明。以下说明描述了众多具体细节以方便对本发明理解。然而,在某些实例中,熟知的或常规的细节并未说明,以满足说明书简洁的要求。本发明的具体设备及方法参见下述实施例:

现有解决方案中主要实现函数br_flood的代码块如下:

从代码中可以看出:该函数的逻辑是先循环遍历网桥下的所有端口,对于符合数据转发条件的端口,会复制一份skb后调用函数_packet_hook进行后续处理。另外,从代码中可以看出函数循环的过程,prev端口号总是滞后p端口号(比如:p为ath31时,prev为NULL、p为ath30时,prev为ath31、p为ath29时,prev为ath30,以此类推一直遍历到eth0端口)。这种逻辑实现方式的好处是能很好的保证循环遍历网口的有序性,但是这种方法必须有个前提,在数据转发的过程中不能对skb进行相应的修改,如果修改了(比如:添加相应的报文头)再进行网口循环遍历,会出现一些端口识别不了对应的报文,导致端口与端口之间不能进行通信,进而影响具体功能的实现。

文中所提到到的eth0为无线AP的以太网接入口,ath0、ath1、ath2等指的是Atheros芯片所包含的无线网络接口。一般,有线接入口为eth0口,无线网络接入口为athx口(x为0~31)

在产品开发的过程中,根据需求添加具体新功能时,会在函数should_deliver中添加对数据报文的处理函数,而在该处理函数中经常会有对skb修改的操作,比如在添加业务vlan功能时,会在发送端口为eth0时给skb添加VLAN头。这时,当连接到ath0端口的终端去ping连接到其他端口上的终端的过程中,会对端口进行循环遍历,在p遍历到ath0时,会出现跳过发送处理的情况,因为当循环遍历到ath0时,函数中br_flood中should_deliver(p,skb)不为真(原因:不会往入端口发送一份复制本身的报文),所以不执行if(should_deliver(p,skb))体内的代码,而此时prev为ath1。当遍历到eth0时,根据上面的描述should_deliver处理过程中会给报文添加vlan头,这导致接下来的skb_clone复制了一个带VLAN头的报文从ath1接口发出。而连接端口ath1的终端不识别带vlan信息的报文,所以会出现ping不通的情况。

另外,当连接到athx(x不等于0)接口的终端去ping连接到其他接口上的终端时,在端口p遍历到eth0时,prev为端口ath0,同时又因为should_deliver处理过程中会给报文添加vlan头,所以会出现ping发送的报文添加vlan信息的情况。所以无论是连接到哪个端口(ath0除外),去ping连接到ath0的终端,都会出现ping不通的情况。

由以上描述,不仅会影响vlan功能的实现,还会影响终端用户隔离功能的实现,所以应该修改循环遍历网口转发数据的流程来改善。

第一实施例

本实施例提供一种数据包发送方法,用以解决上述问题,所述数据包发送的网络设备包括:至少二个数据收发端口、数据判断模块、数据处理模块,所述方法包括如下步骤:

S100:一个所述数据收发端口接受所述数据包;

S200:当所述数据判断模块判断所述数据包需要通过所述数据收发端口转发时,所述数据处理模块对所述数据包中的skb报文进行相应修改;

S300:所述数据处理模块克隆修改后的所述skb报文,所述数据判断模块对所有所述数据收发端口进行循环遍历;

S400:对于符合所述数据包转发条件的所述数据收发端口,实现所述数据包转发。

克隆修改后的所述skb报文,具体是指,skb_clone是linux内核对SKB操作的一个函数。如果一个SKB会被不同的用户独立操作,而这些用户可能只是修改SKB描述符中的某些字段值,则内核没必要为每个用户复制一份完整的SKB描述及其相应的数据缓存区,为了提高性能,只作克隆操作。

文中提到的将已经修改后的SKB克隆就是使用skb_clone函数,只是复制sk_buff结构,并不复制skb的数据缓冲区。Clone后的sk_buff结构与原始的sk_buff指向同一数据缓冲区。原始的和clone后的skb描述符的cloned值都会被置1,clone的skb描述符的users值置1,同时数据缓冲区的引用计数dataref增加1,以免共享数据被提前释放。

优选地,所述的数据包发送方法,所述S200步骤中的相应修改为给所述数据包添加vlan头。

本实施例还提供一种网络设备,包括至少二个数据收发端口、数据判断模块、数据处理模块,

所述数据收发端口,用于接受或者发送数据包;

所述数据处理模块,用于修改所述数据包中的skb报文;

所述数据判断模块,用于对所述数据包的转发条件进行判断,且对所述数据收发端口进行循环遍历,寻找符合所述数据包的转发条件的所述数据收发端口。

第二实施例

在实施例一的基础上,优选的所述的数据包发送方法,所述S200步骤中包括S210步骤:

S210:当所述数据判断模判断所述网络设备状态为forword,允许进行转发的进一步操作。上述forward状态指的报文符合转发要求并且可以进行转发的状态,具体可以分为本地转发(local in)和集中转发(forwarding)。本地转发指的是发往本地协议栈,集中转发则是端口与端口之间的转发。

进一步优选地,所述的数据包发送方法,所述S200步骤中包括S220步骤:

S220:当所述数据判断模判断数据包的容量小于所述网络设备的mtu值,且支持gso,允许进行转发的进一步操作。

上述mtu值,指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。设置合适的MTU值,会提高通信效率。

上述GSO,即为通用分段延后处理。指网卡在支持GSO功能时,对于超大数据包(大于MTU值),内核会将分段的工作延迟到交给驱动的前一刻。如果网卡不支持此功能,则内核用软件的方式对数据包进行分片。

优选地,所述的数据包发送方法,所述S400步骤包括S410步骤:

S410:所述数据包进行遵守规程处理,所述规程包括forword链上的规则、网桥防火墙中post链中的规则或者网桥防火墙中调用out链中的规则。

优选地,所述的数据包发送方法,所述S400步骤包括S420步骤:

S420:当所述数据判断模块判断所述数据包符合相应规则的,修改所述skb报文指向的net dev。

上述net dev是net device的简写,就是“网络设备”的意思。对应于linux中的数据结构net_device结构体,主要功能是实现多种硬件在软件层次上的统一。net_device结构分为全局成员、硬件相关成员、接口相关成员、设备方法成员和公用成员等五个部分。

优选地,所述的数据包发送方法,所述S400步骤包括S430步骤:

S430:对于满足所述数据包转发条件的所述数据收发端口,调用函数_packet_hook进行所述数据包转发的处理。

在实施例一提供的网络设备基础上,优选的所述的网络设备,任一所述数据收发端口接受所述数据包后,调用网卡驱动函数处理所述数据包。

优选地,所述的网络设备,符合所述数据包的转发条件的所述数据收发端口为所述网络设备的至少一个非接受所述数据包的所述数据收发端口。

优选地,所述的网络设备,所述数据判断模块判断所述转发条件包括:网桥端口的状态是否为forword、所述数据包大小是否小于所述网络设备的mtu值、是否支持gso、所述数据包是否符合相应规则、发送所述数据包的所述数据收发端口是否与接受所述数据包的所述数据收发端口相同。

进一步优选地,所述的网络设备,所述数据处理模块根据所述数据判断模块判断为不符合所述转发条件的,对所述数据包进行分片或者丢弃操作。

上述分片操作,是指链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。如果传输数据包的长度超过了MTU值且可以分片传输,就会对数据包进行分片操作,使每一片的长度都小于或等于MTU值。这样就可以将需要传输的数据报文分为若干分片进行传输,并在目标系统中进行重组。

第三实施例

本实施例主要优化完善Linux网桥数据转发的流程。如图3本发明第三实施例流程示意图所示,具体步骤如下:

(a)网桥端口接收数据包,经网卡驱动后,调用函数br_forward,实现数据转发。

(b)在函数br_forward中,会对端口进行相应的判断,是否符合数据包转发功能。并且需要判断网桥端口的状态是否为forword,如果都符合,进行下一步转发流程。

(c)转发过程中需要判断数据包大小是否小于设备的mtu值,支持gso,如果成立,则调用dev_queue_xmit,传输数据包,如果不成立,则释放。

(d)如果以上条件成立,则可以对skb进行相应修改,主要在should_deliver函数中进行,并判断是否符合转发条件,如果符合则说明数据包入口端口和出口端口不同,且网桥端口状态为forward,则进行下一步转发流程。

(e)调用br_flood函数实现数据包转发,主要是对skb和转发流程进行相应操作,具体方法是先克隆已经修改的skb,后对转发端口进行循环遍历,避免数据包接收端口识别不了已修改的报文。对于符合转发条件的端口,调用函数_packet_hook进行后续处理。

(f)在数据包向其他端口转发之前,需要在函数br_deliver中判断端口是否符合转发数据包的具体规则。

(g)在以上的操作中,需要调用NF_HOOK处理相应规则,比如:forword链上的规则、网桥防火墙中post链中的规则进行匹配处理以及网桥防火墙中调用out链中的规则,在此基础上修改skb指向的net dev,对允许通过的数据包调用br_forward_finish进行后续处理。

对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1