stream量整形,优先化数据包而不使用比特率最大/最大值

我已经写了一个脚本,将stream量塑造成3个pipe道。 第一个pipe道需要高优先级,始终先发送。 这现在完美的1条件。 我input一个正确的ceil / max比特率。 这个脚本被写入工作一个设备,将与许多不同的互联网连接工作。 最大比特率可以设置,但我宁愿让它工作,而不需要设置最大比特率。 或者,如果我设置一个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 

简答

可能最好将天花板设置为(也许刚好低于)WAN接口将stream量传输到整形设备的最大速度。

理论和解释 (以及为什么需要上限)

我从您的脚本中注意到您正在形成入站(入口)stream量。 理想的情况下,最好的做法是在stream量来源(ISP)上应用这个整形,然后再打到你的设备上。 这是因为,对于入站stream量,您无法控制如何到达您。 一旦它到达你,你可以控制它,这有效地帮助pipe理stream量在一定程度上(我很欣赏这是你正在做的事情),但它不是严格的做法的“正确”的方式。

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

为了解决这个问题,如果引入了整形,并将速率限制在恰好低于下一个介质的速度(并且这个整形被正确地应用,即设置正确的规则以匹配正在使用的协议),则这提高了整体的stream动性交通stream。 如果应用了整形,但不限于下一个介质的最大速度,则之前应用的任何整形将丢失并最终无法使用,因为该介质的接收/发送缓冲区开始排队并取消您的套件先前所做的所有努力它。 这就是要求上限的原因。 整形者需要知道有多less交通可以通过下一步,而不会导致下一个媒体打乱它的包装好(形状)的苹果车。

至于入口成形(这是你在这里做的),我希望你现在可以看到,有效地,基本上需要设置一个明智的价值,当且仅当,如果你正在转发入口stream量到(局域网)比到达WAN端的最大stream量速率慢。 这是我能想到的塑造真正帮助你的情况的唯一例子。 但是我怀疑,就像目前大多数互联网连接一样,广域网的速度远远低于局域网的速度,所以基本上,最高限额可以设置为你喜欢的任何合理的值(局域网接口的速度可能是一个不错的select) – 但如果说,将广域网上限设置为低于广域网到达(下载)速度的最大速度可能更有意义。 这样做会减lessstream量在ISP端排队的趋势,因为整形器将减慢并且平缓stream量,使其保持在检查状态(例如TCP连接,其中TCP协议固有地试图在转让)。 这希望意味着智能排队和整形仍然主要由您的整形器来pipe理,而不是由ISP的任何愚蠢的限制设备首先拦截。

我有一个几年前写的关于stream量整形的HOWTO: http : //phix.me/dm/ – 很多人都觉得这很有用,包括美国的一个拥有MikroTik路由器的分支,并将我的方法应用到他的路由器上,从而解决了他遇到的每一个单一的stream量问题,从缓慢的DNS查询到爆炸的SSH会话,而洪stream等等等等,我在我目前路由的宽带设置也使用相同的原则。 但请注意,我的HOWTO具体谈论出口塑造,并没有触及入口。 主要原因是我个人不需要进行入口形成,而且(在研究所有这些年前的研究时)我意识到,我无法控制到达我的入站stream量(正如我之前所说的那样)。 我最近和ISP一起提供了一些巧妙的方式,所以加上我的出站整形政策,以及他们基本的入站整形策略,我知道我可能有一个最光滑的互联网连接可能。