mching 发表于 2010-10-20 23:52:57

【HTB】数据分类/队列(Queue)的理论及方法

本帖最后由 zooyo 于 2011-2-9 19:56 编辑

本文源地址:http://mching08.com/archives/325.html,转载请注明出处!

在上面一篇文章中已经说过了,所有的数据都要进队列才能对数据进行控制。如何对数据进行分类,进而进入相应的队列,从而使HTB对其进行有效的控制,已达到流量控制的作用。稍后,我将首先对分类的方法进行简单的介绍,然后分别通过在RouterOS上设置相应进入队列的方法对以上的理论加以实践。

1、数据分类的方法
总的来说,队列就是需要将网络上的流量进行分类,从而让设备对相应的队列进行控制。主要有以下几种分类的方法:包长的大小、IP地址、目的端口、此外还有P2P,应用层识别等。
下面分别对这几种方法做一些说明:
1)包长的大小:所谓的小包优先
小包一般是一些控制报文,在上传带宽比较小的时候非常有用,而且包长小的话,同样数目的包比大包要占用的带宽要小很多。一般来说512byte以下的报文为小包,传导的是网络中的控制信息。
2)IP地址:所谓的VIP优先
一般来说,一个网络内部可能有几个特殊的IP地址,可能是企业的高管,也可能是小区中缴费多的用户等等,他们理所应当获取较高的优先权。
3)目的端口:所谓的特殊应用优先
在网络环境中,一些通用的服务都有自己固定的端口,比如为大家所熟知HTTP的80端口,pop3的110端口,SMTP的25端口,ftp的21端口,ssh的22端口,telnet的23端口,dns的53端口,ssl的443端口等等。这就需要看具体的环境中,应用的什么服务比较多了,然后对这些端口进行配置。
4)其他:
都是一些非主流的分类的方法了,因为每个厂商都有自己的识别方法,而且识别率都无法达到100%,因此不对这些方法做何评价。只是对这些技术做一些介绍,典型的有RouterOS的L7识别,Panabit的应用层识别等等。

2、如何有效的对队列进行管理
对队列进行管理的时候主要通过两个方面,一种是对队列的带宽进行管理(即流量监管),另一种是对队列的优先级进行管理(即流量整形)。

对此,我给出以下建议:分类层次应该为包大小------目的端口------IP地址。
下面说说我给出这种建议的依据:
1)包长小的包一般在网络中起控制作用,这种包的特点就是实时性要求特别高,占用带宽不高,为了保证上传流量不被过多的占用(有时候FTP上传也是需要占用带宽的),建议其CIR设置在可用上行带宽的一半以下,包长比较大的包可以将其进入一个队列。
2)下载队列中,可以不用去管大包小包,因为在用户看来,所接受的大包小包的重要程度是同等的。
3)前面已经说了,上传和下载是分开的,在1)中也说了上传应该注意的,下面我们来说说下载的。迅雷下载和网页流量,哪个更重要?显然是网页,因此将网页的80端口优先对于做网络优化的工程师来说是非常必要的。找到更多的对自己有用的端口,并对其进行优化使我们下一步的目标。
4)几个分类方法之间的配合
一般来说,小包中有也有各种服务的包,各种服务中,希望哪个IP请求的服务优先被满足?这就需要我们在标记的时候,对这些服务的包进去分类的区分。
5)PCQ的应用
如果某种服务下面,所有的IP的优先级都差不多,可以采用PCQ的方式,来让RouterOS根据环境中用户的在线数量去平分带宽。

需要注意几点:
1)标记数据包需要通过首先标记连接,再去标记数据包,这样比较准确;
2)标记的时候应该包含所有的情况,包含时需要根据Passthrough属性的值来确定标记是否终止,标记数据包应该紧接在所标记连接以后;
3)mangle中,标记的顺序是从上到下的,匹配成功以后还会继续向下匹配,除非Passthrough的值为no;
4)将192.168.1.2的包分类标记有两种方法,一种是先标记192.168.1.2所有的数据连接,再标记192.168.1.2中80端口的连接,再标记其他端口的连接,中间的Passthrough的值全为yes;另一种方法是先标记192.168.1.2中80端口的连接,再去标记其他所有的连接,中间的Passthrough的值全部为no。显而易见,后者的方法更为科学,更为节省资源;
5)标记小包的时候,不要尝试着去标记小包的连接,应该是先标记连接以后再根据连接去标记该连接中的大包和小包。

3、我们来对上面的理论在实际环境中加以实践
步骤是先标记数据包,然后将这些数据包应用在Queue Tree中。
/ip firewall mangle
add chain=prerouting src-address=192.168.1.0/24 protocol=icmpaction=mark-connection new-connection-mark=all_icmp_con passthrough=yes
add chain=prerouting connection-mark=all_icmp_con action=mark-packet new-packet-mark=all_icmp_pack passthrough=no
add chain=prerouting src-address=192.168.1.0/24 protocol=tcp dst-port=80 action=mark-connection new-connection-mark=all_80_con passthrough=yes
add chain=prerouting connection-mark=all_80_con action=mark-packet packet-size=0-512 new-packet-mark=all_80_small_pack passthrough=no
add chain=prerouting connection-mark=all_80_con action=mark-packet new-packet-mark=all_80_big_pack passthrough=no
add chain=prerouting src-address=192.168.1.0/24 action=mark-connection new-connection-mark=all_other_con passthrough=yes
add chain=prerouting connection-mark=all_other_con action=mark-packet packet-size=0-512 new-packet-mark=all_other_small_pack passthrough=no
add chain=prerouting connection-mark=all_other_con action=mark-packet new-packet-mark=all_other_big_pack passthrough=no
/queue tree
add name=Down parent=lan
add name=icmp_d parent=Down packet-mark=all_icmp_pack priority=1
add name=80_small_d parent=Down packet-mark=all_80_small_pack priority=2
add name=80_big_d parent=Down packet-mark=all_80_big_pack priority=3
add name=other_small_d parent=Down packet-mark=all_other_small_pack priority=4
add name=other_big_d parent=Down packet-mark=all_other_big_pack priority=5
add name=Up parent=wan
add name=icmp_u parent=Up packet-mark=all_icmp_pack priority=1
add name=80_small_u parent=Up packet-mark=all_80_small_pack priority=2
add name=80_big_u parent=Up packet-mark=all_80_big_pack priority=3
add name=other_small_u parent=Up packet-mark=all_other_small_pack priority=4
add name=other_big_u parent=Up packet-mark=all_other_big_pack priority=5这里只是给个示范,更多的端口需要自己去添加!

yblgzz 发表于 2010-10-21 00:03:09

赚个金币先

qwert1388 发表于 2010-10-21 00:49:41

赚个金币先

jekebbn 发表于 2010-10-21 02:07:49

打酱油去了

ymjssg109 发表于 2010-10-21 04:14:25

看看先,学习学习

火蚂蚁 发表于 2010-10-21 08:30:26

打酱油去了

michaelyuan 发表于 2010-10-21 09:40:18

看看写的什么

tmd 发表于 2010-10-21 09:45:45

看看先,学习学习

cc100 发表于 2010-10-21 09:47:59

非金币帖支持

单纯是错误 发表于 2010-10-21 09:48:07

很好哦~~要学习一下~

zhuhaijingwei 发表于 2010-10-21 09:52:34

学习一下啊

rurubi 发表于 2010-10-21 11:01:35

赚个金币先

wugalang88 发表于 2010-10-21 12:57:07

看看先,学习学习

hjfgt 发表于 2010-10-21 13:38:33

顶一下学习中。。。

win28703 发表于 2010-10-21 14:09:55

看看.............
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 【HTB】数据分类/队列(Queue)的理论及方法