基于linux内核的高性能流控方法技术

技术编号:7850335 阅读:250 留言:0更新日期:2012-10-13 07:25
本发明专利技术涉及一种基于linux内核的高性能流控方法。本发明专利技术首先在Linux内核中的sk_buff中有mark字段,同时加入index字段,Mark字段用来进行带宽对象的流控,index是无符号整数,把其分成两部分,高16位用来进行服务流控,低16位用来进行单ip流控;再建立数据包列队;然后数据包再通过流控方法进行控制是否出队:数据包按照服务流控方法进行控制,如果数据包可以出队,则依次进行带宽对象流控方法、单IP流控方法进行控制,如果数据包再上述的三个流控方法任意一个不能出队,则重新排队;最后出队的数据包经过发包调度方法选择后进行发包。本发明专利技术的单ip流量控制的性能比目前linux中模块性能好,不会造成队列出队时间上的浪费,有助于提高性能。

【技术实现步骤摘要】

本专利技术涉及网关产品对流量的整形和控制,具体涉及一种基于Iinux内核的高性能流控方法。
技术介绍
Linux固有的流控策略,分为有队列和无队列两种,能够满足部分用户对流控的简单需求,但是在很多情景下还有很多不足。Linux固有技术缺陷 I、在这些技术中,要么用户控制某些网段,要么控制某些主机流量,无法同时即控制某 些网段不能超过一定流量,同时服务和每个主机也不能超过一定的流量。2,Htb算法是目前Iinux中用的最多的流控算法,能够很好的解决一些问题,但是当用户需要控制网段内每台主机的流量都不能超过一定流量时,且主机数目较多,这对htb算法来说是很消耗性能的,无法做到真正的实用性。
技术实现思路
本专利技术所解决的技术问题是提供一种通过彻底更改Iinux内核流控方式,实现了基于I inux内核对网络进行流量控制的高性能流控方法。为解决上述的技术问题,本专利技术采取的技术方案 一种基于Iinux内核的高性能流控方法,其特殊之处在于所述流控方法为首先在Linux内核中的sk_buff中有mark字段,同时加入index字段,Mark字段用来进行带宽对象的流控,index是无符号整数,把其分成两部分,高16位用来进行服务流控,低16位用来进行单ip流控;再建立数据包列队;然后数据包再通过流控方法进行控制是否出队数据包按照服务流控方法进行控制,如果数据包可以出队,则依次进行带宽对象流控方法、单IP流控方法进行控制,如果数据包再上述的三个流控方法任意一个不能出队,则重新排队;最后出队的数据包经过发包调度方法选择后进行发包。上述的服务流控方法为首先建立一个65536长度的整数数组D,其下标代表目的端口 ;其次,建立一个300个数据包队列数组E,D数组每个元素的值为E数组的下标,如当设置了对http进行流控,则先检查D [80]的值是否已经设置,如设置即已流控,如未设置,先取得E中没有使用的一个队列,把其下标赋值给D[80],当有http数据包到来时,会根据目的端口 80,得到D[80]的值D1,再根据E[D1]取得队列,进行入队操作。上述的带宽对象流控方法为建立一个队列数组,根据sk_buff中的mark值来选择队列,mark值由用户态程序统一控制,由iptables的mark target进行设置,当带有mark值不为O的数据包到来时,此包目的端口不进行服务流控,根据mark值选择队列,进行排队流控。上述的单IP流控方法的步骤如下 (I)、建立数据包队列建立了一个含300元素的无符号整形数组,每个无符号整形数组是32位,每一位对应9600队列中的一个,其中第O个队列为不进行流控的队列,该位为I,表示该位对应的队列被使用,通过该无符号整形数组的计算实现快速选择队列。(2)、数据包列队的Ip地址共32位,现把其看成两部分,前16位和后16位,前16位通过一个大小为65535的指针数组A来表示,数组下标即表示具体ip的前16位值,后16位也是通过一个65535的数组来表示,但是其是动态分配的,后16位的数组中,数组中每个结构中包含flag和index字段,flag表示该ip是否要流控,index是一个索引值,为无符号整数,当一个ip数据包进入时,先取得该ip的前16位,以该值作为前16位数组的下标,如果数组内容为空,则表示没有建立过该前16位对应的后16位的数组,需要创建,index初始值为-I,flag初始值为O ;如果数组内容不空,则可以根据该指针内容来访问对应的后16位数组,再根据对应值的flag和index进行流控,同时把index值赋给sk_buff中的index字段。上述的单IP流控方法的快速选择队列的具体步骤如下 (1)、先看无符号整数值是否为全1,通过和OxfffTfTfT与得知; (2)、如果无符号整数值为全1,则取数组中下一个整数继续步骤(I); (3)、如果无符号整数值不是全1,计算低16位是否为全I; (4)、如果无符号整数值为全1,则把该整数值右移16位,否则不变; (5)、计算无符号整数值的低8位是否为全I; (6)、如果无符号整数值为全1,则把该整数值右移4位,否则不变; (7)、计算无符号整数值的低2位是否为全I; (8)、如果无符号整数值为全1,则把该整数值右移2位,,否则不变; (9)、计算无符号整数值的低I位是否为1,不是则第二位为1,则找到了具体的位置,并能够计算出对应的数组下标; (10)、当ip不流控时,把相应的位置O。上述的发包调度方法的具体步骤如下 (1)、每个队列有指向前一个和后一个队列的指针,队列形成一个双向链表,每个队列是发送链表中的一个节点,同时,只有有数据包等待发送的队列,才会加入发送链表,当队列中没有数据包时,队列从发送链表中删除; (2)、发送链表建立一个链表头和一个当前发包链表节点指针,把当前发包链表节点指针指向的队列进行数据包出队,再根据流控方法检查该数据包是否能够发送,如果可以,发送该数据包,否则把该数据包重新入队,且是放到队列的头,同时把当前发包链表节点指针下移; (3)、发送链表是在数据包入队的时候建立的,当有数据包进入时,调用入队函数,该函数检测该数据包对应的队列是否在双向队列链表中,如果不在,把对应队列加入双向队列链表,同时把双向队列链表的当前发包链表节点指针指向该队列;否则,直接把双向队列链表的当前发包链表节点指针指向该队列,当出队发包时,会优先发送刚入队的队列的数据包。上述的每个队列中数据包流控的计算算法如下 带宽的计算是在一秒内通过的数据长度,在Iinux内核中,一秒一般被分成250份,所以一个jiffies就是1/250秒,带宽如果是a,那么一个jiffies的流量就是a/250,每个队列中有保存上次数据包到来的jiffies_last,每个jiffies的流量jiffies_byte,现在允许通过的字节数bytes,现在最大允许通过的字节数burst,该队列中每来一个数据包,都会计算现在的jiffies和jiffies_last的差值,该差值乘以jiffies_byte,再加上现在允许通过的字节数bytes,算出现在可以通过的字节数bytes,如果bytes大于burst,则bytes等于burst。最后,通过比较数据包长度和bytes的关系,大于bytes,则不同出队;小于bytes则出队,发送该数据包,同时,bytes值减去该数据包长度。与现有技术相比,本专利技术的有益效果 本专利技术的单ip流量控制的性能比目前Iinux中模块性能好,这里只有链接的第一个包会进行标签的获取及计算,且是直接索引取得,当获取到标签时,把该标签赋值到链接上,以后的数据包会在走链接跟踪时获取index值,进而进行流量的控制,同时出队的队列也是有数据包的队列,不会造成队列出队时间上的浪费,有助于提高性能。附图说明 图I为本专利技术的单ip流控方法流程示意图。具体实施例方式下面结合附图和具体实施方式对本专利技术进行详细说明。一种基于Iinux内核的高性能流控方法,其特殊之处在于所述流控方法为首先在Linux内核中的sk_buff中有mark字段,同时加入index字段,Mark字段用来进行带宽对象的流控,index是无符号整本文档来自技高网...

【技术保护点】

【技术特征摘要】
1.一种基于Iinux内核的高性能流控方法,其特征在于所述流控方法为首先在Linux内核中的sk_buff中有mark字段,同时加入index字段,Mark字段用来进行带宽对象的流控,index是无符号整数,把其分成两部分,高16位用来进行服务流控,低16位用来进行单ip流控;再建立数据包列队;然后数据包再通过流控方法进行控制是否出队数据包按照服务流控方法进行控制,如果数据包可以出队,则依次进行带宽对象流控方法、单IP流控方法进行控制,如果数据包再上述的三个流控方法任意一个不能出队,则重新排队;最后出队的数据包经过发包调度方法选择后进行发包。2.根据权利要求I所述的基于Iinux内核的高性能流控方法,其特征在于所述的服务流控方法为首先建立一个65536长度的整数数组D,其下标代表目的端口 ;其次,建立一个300个数据包队列数组E,D数组每个元素的值为E数组的下标,如当设置了对http进行流控,则先检查D [80]的值是否已经设置,如设置即已流控,如未设置,先取得E中没有使用的一个队列,把其下标赋值给D [80],当有http数据包到来时,会根据目的端口 80,得到D[80]的值D1,再根据E[D1]取得队列,进行入队操作。3.根据权利要求I或2所述的基于Iinux内核的高性能流控方法,其特征在于所述的带宽对象流控方法为建立一个队列数组,根据sk_buff中的mark值来选择队列,mark值由用户态程序统一控制,由iptables的mark target进行设置,当带有mark值不为0的数据包到来时,此包目的端口不进行服务流控,根据mark值选择队列,进行排队流控。4.根据权利要求3所述的基于Iinux内核的高性能流控方法,其特征在于所述的单IP流控方法的步骤如下 (1)、建立数据包队列建立了一个含300元素的无符号整形数组,每个无符号整形数组是32位,每一位对应9600队列中的一个,其中第0个队列为不进行流控的队列,该位为1,表示该位对应的队列被使用,通过该无符号整形数组的计算实现快速选择队列; (2)、数据包列队的Ip地址共32位,现把其看成两部分,前16位和后16位,前16位通过一个大小为65535的指针数组A来表示,数组下标即表示具体ip的前16位值,后16位也是通过一个65535的数组来表示,但是其是动态分配的,后16位的数组中,数组中每个结构中包含flag和index字段,flag表示该ip是否要流控,index是一个索引值,为无符号整数,当一个ip数据包进入时,先取得该ip的前16位,以该值作为前16位数组的下标,如果数组内容为空,则表示没有建立过该前16位对应的后16位的数组,需要创建,index初始值为-1,flag初始值为0 ;如果数组内容不空,则可以根据该指针内容来访问对应的后16位数组,再根据对应值的flag和index进行流控,同时把index值赋给sk_buff中的index字段。5.根据权利要求4所述的基于Iinux内...

【专利技术属性】
技术研发人员:陈宏伟何建锋赵明彰刘亚轩
申请(专利权)人:西安交大捷普网络科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1