PCQ限速,带宽平均使用

这篇文章由 在 星期三, 9 六月, 2010 发表。

首先看Mangle脚本:


/ip firewall mangle
add action=mark-packet chain=postrouting comment="" disabled=no \
new-packet-mark=pck_small_down out-interface=LAN packet-size=1-512 \
passthrough=no

上面一行代码将在Mangle中添加一个mark-packet项目,用于把包大小为1-512的包标记为pck_small_down,在链表Postrouting于出接口LAN上,需要根据你的情况自行替换为你的内网端口。


add action=mark-packet chain=postrouting comment="" disabled=no \
new-packet-mark=pck_general_down out-interface=LAN packet-mark=\
!pck_small_down passthrough=no

上面一行代码则在Mangle中添加一个mark-packet项目,用于把除了pck_small_down以外的包标记为pck_general_down,同样在链表Postrouting于出接口LAN上,同样你需要根据你的情况替换这个接口。

上两行代码标记了下行方向所有数据,并且区分了小包和其他包,这样做的好处是不仅可以用PCQ均分带宽,而且利用queue tree的优先级还可以将小包优先,这样在带宽紧张的情况下,小包(例如ping)会得到一个比较低的延迟。
再说明一下为什么要在Postrouting链表上操作,因为PCQ中如果要均分带宽是需要根据dst.address来分类的,当然如果要实现内网带宽均分的话,dst.address应该是我们的内网地址,如192.168.0.0/24,这就说明,我们必须在nat以后才可以标记数据包,如果在Prerouting链表中标记数据包,dst.address就会是单一的WAN地址了,也就达不到均分的目的了。


add action=mark-packet chain=prerouting comment="" disabled=no in-interface=\
LAN new-packet-mark=pck_small_up packet-size=1-256 passthrough=no

上面一行代码在Prerouting链表于接口LAN标记了大小1-256的数据包。


add action=mark-packet chain=prerouting comment="" disabled=no in-interface=\
LAN new-packet-mark=pck_general_up packet-mark=!pck_small_up passthrough=\
no

上面一行代码在Prerouting链表于接口LAN标记了大小除了1-256的数据包。

上传是同样的道理,PCQ上传需要指定src.address,如果在nat以后的链表Postrouting,标记数据包,源地址会变成WAN地址,PCQ也失去了意义。
单击下载以上Mangle脚本

再来看看Queue Type脚本:


/queue type
add kind=pcq name=pcq_wan_down pcq-classifier=dst-address pcq-limit=50 \
pcq-rate=1000000 pcq-total-limit=2000
add kind=pcq name=pcq_wan_up pcq-classifier=src-address pcq-limit=50 \
pcq-rate=256000 pcq-total-limit=2000

Queue Type比较简单,添加了2个PCQ类型,pcq_wan_down和pcq_wan_up。他们最大的区别就是标记类不同,下行时候需要根据目的地址(dst.address)分类标记数据包;而上行需要根据源地址(src.address)分类标记数据包。
这里的pcq-rate相当于单机限速,比如说我的设置下行1Mbps,上行256Kbps。我的总带宽是2M,当一台机器下载的时候,下载速度最高100KBytes左右,两台机器下载的时候分别也平均在100KBytes左右,当4台机器一起下载的时候,平均每台机器50KBytes左右。
单击下载以上Queue Type脚本

然后是QueueTree脚本:


/queue tree
add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 \
max-limit=3512k name=WAN_DOWN packet-mark="" parent=LAN priority=8

在queue tree中添加一个WAN_DOWN项目,父点为LAN接口,最大速率3512Kbps,优先级8。注意parent节点,要与Mangle中mark-packet的Interface相同。


add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 \
max-limit=3M name=wan_down_general packet-mark=pck_general_down parent=\
WAN_DOWN priority=8 queue=pcq_wan_down

在queue tree中添加一个wan_down_general项目,父节点为WAN_DOWN,最大速率为3Mbps,针对包标记pck_general_down限速,优先级8,队列类别pcq_wan_down。


add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=512k \
max-limit=2M name=wan_down_small packet-mark=pck_small_down parent=\
WAN_DOWN priority=2 queue=default-small

在queue tree中添加一个wan_down_small项目,父节点为WAN_DOWN,最大速率2Mbps,针对包标记pck_small_down限速,优先级2,队列类别default-small

上面代码完成了下行方向的HTB桶形限速,保证了大包的PCQ限速,同时保证了小包的快速通过。


add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 \
max-limit=512k name=WAN_UP packet-mark="" parent=global-total priority=8

上面代码建立了名为WAN_UP的上行HTB,父节点为global-total,最大速率512Kbps,优先级为8。


add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=0 \
max-limit=384k name=wan_up_general packet-mark=pck_general_up parent=\
WAN_UP priority=8 queue=pcq_wan_up

在queue tree中添加一个wan_up_general项目,针对pck_general_up限速,最大速率为384Kbps,父节点为WAN_UP,优先级为8,队列类型pcq_wan_up


add burst-limit=0 burst-threshold=0 burst-time=0s disabled=no limit-at=256k \
max-limit=512k name=wan_up_small packet-mark=pck_small_up parent=WAN_UP \
priority=2 queue=default-small

在queue tree中添加一个wan_up_small项目,针对pck_small_up,最大速率为256Kbps,父节点为WAN_UP,优先级为2,队列类型default-small。

至此上行HTB也设置完毕。
单击下载以上Queue Tree脚本

有疑难问题的留下联系方式我们共同研究。

2 Responses to “PCQ限速,带宽平均使用”

  1. netfriends

    如果是3线路,而且线路的带宽不一样 如何分别PCQ和分别大小包优先HTB呢?

    • 多线情况下我认为应该在标记线路时区分带宽,如3条线,1条100M两条50M,在进行线路区分时(无论nth、pcc还是random)应该让100M线路获得更高的分配几率。如简单易懂用random做线路区分,还是上面那个100M+50M*2的情况。我的建议是50%的几率走100M的线路,25%的机率走50M其作用的一条,25%走另一条。nth的话请看我另一篇文章:小论nth和passthrough


Leave a Reply