流量整形,在不使用比特率上限/最大值的情况下对数据包进行优先级排序

流量整形,在不使用比特率上限/最大值的情况下对数据包进行优先级排序

我编写了一个脚本,将流量划分为 3 个管道。第一个管道需要具有高优先级,并且始终首先发送。现在,只要满足一个条件,它就可以完美地工作。我输入了正确的上限/最大比特率。此脚本是为与可与许多不同的互联网连接配合使用的设备一起工作而编写的。可以设置最大比特率,但我希望它无需设置最大比特率即可工作。或者,如果我设置一个高值(如 999mbps),优先级仍然有效。这可能吗?如果可能,怎么做?

谢谢你!

苹果酸

这是我的脚本:

#!/bin/bash

DEV=$1
UPLINK=$2
DOWNLINK=$3
PORT_CLIENT=$4
PORT_TELNET=$5
PORT_SSH=$7
PORT_RTSP=$6

#erase previous qdiscs
tc qdisc del dev $DEV root
#tc qdisc del dev $DEV ingress


#set root qdisc
tc qdisc add dev $DEV root handle 1:0 htb
#set different pipes, rates and priorities        
tc class add dev $DEV parent 1:0 classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit
tc class add dev $DEV parent 1:1 classid 1:10 htb rate $[7*${UPLINK}/10]kbit ceil ${UPLINK}kbit prio 1
tc class add dev $DEV parent 1:1 classid 1:20 htb rate $[2*${UPLINK}/10]kbit ceil ${UPLINK}kbit prio 3
tc class add dev $DEV parent 1:1 classid 1:30 htb rate $[1*${UPLINK}/10]kbit ceil ${UPLINK}kbit prio 4
#unlimited access
#tc class add dev $DEV parent 1:0 classid 1:90 htb rate 100000mbit burst 100000mbit


#stochastic fairness
#tc qdisc add dev $DEV parent 1:10 handle 100: sfq perturb 10
#tc qdisc add dev $DEV parent 1:20 handle 200: sfq perturb 10
#tc qdisc add dev $DEV parent 1:30 handle 300: sfq perturb 10
tc qdisc add dev $DEV parent 1:10 handle 100: pfifo limit 2
tc qdisc add dev $DEV parent 1:20 handle 200: pfifo limit 2
tc qdisc add dev $DEV parent 1:30 handle 300: pfifo limit 2


#filter data streams into pipe1
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 match ip sport $PORT_CLIENT 0xffff flowid 1:10
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 match ip sport $PORT_TELNET 0xffff flowid 1:10
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 match ip sport $PORT_SSH 0xffff flowid 1:10
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 match ip protocol 6 0xff match u8 0x10 0xff at nexthdr+13 flowid 1:10
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 match ip protocol 6 0xff match u32 0x52545350 0xffffffff at 40 flowid 1:10
#filter video streams into pipe2
tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32 match ip sport $PORT_RTSP 0xffff flowid 1:20
#filter rest into pipe3
tc filter add dev $DEV parent 1:0 protocol ip prio 18 u32 match ip dst 0.0.0.0/0 flowid 1:30

答案1

简短答案

最好将上限设置为(可能略低于) WAN 接口向您的整形设备传送流量的最大速度。

理论与解释(以及为什么需要天花板)

我从您的脚本中注意到您正在对入站(入口)流量进行整形。理想情况下,最好在流量到达您的设备之前在流量来源(ISP)处应用整形。这是因为,对于入站流量,您实际上无法控制它如何到达您。您可以在它到达您之后对其进行控制,这在一定程度上有效地帮助管理流量(我很欣赏您正在尝试这样做),但这并不是严格意义上的“正确”做法。

但回到你最初的问题。我将基于使用出口(出站)整形的设置来回答,这不是你正在做的事情,但希望它能把事情放在上下文中。需要上限的主要原因是由于对流量将要去或被传递到的下一个介质/跳跃/任何东西都有一些限制。任何接收/发送流量的设备都会有一个接收/发送缓冲区,如果流量速率达到介质可以处理的最大速度,或者各种缓冲区已满,那么这个缓冲区就会变满,此时,延迟开始蔓延,同时出现数据包丢失。

为了解决这个问题,如果引入整形并将速率限制在略低于下一个介质的速度(并且正确应用此整形,即设置正确的规则以匹配正在使用的协议),那么这将改善流量的整体流动性。如果应用整形但不是受限于下一个介质的最大速度,之前应用的任何整形都会丢失并最终变得毫无用处,因为该介质的接收/发送缓冲区开始排队,并撤消您的工具包之前为整形它所做的所有艰苦工作。这就是为什么需要上限的原因;整形器需要知道它可以传递多少流量到下一步,而不会导致下一个介质破坏其精心包装(整形)的苹果车。

至于入口整形(您在这里所做的),我希望您现在可以看到,实际上,当且仅当您转发入口流量的介质(LAN)比到达 WAN 端的最大流量速率慢时,上限基本上需要设置为合理的值。这是我能想到的唯一一个整形能真正帮助您解决问题的例子。但我怀疑,就像目前的大多数互联网连接一样,WAN 速度比 LAN 速度慢得多,所以基本上,上限可以设置为您喜欢的任何合理值(LAN 接口的速度可能是一个不错的选择) - 但话虽如此,将上限设置为略低于 WAN 到达(下载)速度的最大速率可能更有意义。这样做将减轻流量在 ISP 端排队的趋势,因为整形器将减慢并平息流量以保持其受到控制(例如 TCP 连接,其中 TCP 协议固有地试图将速度保持在传输过程中的最大可能速率)。这意味着智能排队和整形主要由您的整形器管理,而不是首先被 ISP 上的任何愚蠢的限制设备拦截。

我几年前写过一篇关于流量整形的 HOWTO:http://phix.me/dm/- 许多人都发现这很有用,包括一位拥有 MikroTik 路由器的美国小伙子,他将我的方法应用到他的路由器上,从而解决了他遇到的每一个流量问题,从缓慢的 DNS 查找到 torrenting 时抖动的 SSH 会话等等。我也在我当前的路由宽带设置中使用相同的原则。但请注意,我的 HOWTO 专门讨论了出口整形,根本没有涉及入口。主要原因是我个人不需要入口整形,而且我意识到(多年前研究这一切时)我无法控制到达我的入站流量(正如我之前所说的)。我最近选择了一家提供一些巧妙整形的 ISP,因此结合我的出站整形策略和他们的基本入站整形策略,我知道我可能拥有最顺畅的互联网连接之一。

相关内容