openwrt下面的QoS,挺多都不太管用的。

qos-scripts,是最常见的,但我测试了其实是没有生效的,看帖子说要在系统里面做修改才行,不会弄。

sqm-qos,经过测试并没有生成dscp的标记,其实也是无效的,实际使用也是这样。

qosv4,确实能够保证小包优先和游戏延迟的保证,打游戏一点不卡,不过在带宽分配上,就不是很给力,限制死了一个固定带宽,不能高效地利用带宽资源。

gargoyle是我用得最顺手的。以一定的带宽损失来换取延迟的保障,并且能够合理的分配带宽。使用的似乎是imq和hfsc。hfsc是没有优先级的概念的,只有带宽分配的动态比例。

后面两张图是QoS里面的上传部分的设置,Service Classes定义了4个类别,看名称就是我想要实现的分类。Slow的带宽比例很低,这里是用的3%,官方默认为1%,并且QoS的默认Service就是Slow,也就是没有特殊定义的端口或者协议,会被分配到这个Slow里面,这一点就是能够限制p2p下载软件速度的保证。

带宽要按照实际的填写,上图的400kbps,应该对应50KB/s的速度,实际只能到40KB/s(下载速度也类似),不要因为这个,就加大这个数值,让它跑满带宽。正是由于系统有保留带宽,才能够保证低延迟。

一般来讲,网络连接的远程端口是固定的,比如80,443,3724等端口,本地端口一般是随机的。所以上传里面设置目标端口(destination port)为80,443这些才是正确的(下行相反,应该设置source port)。也有例外,ios的facetime,经过测试,远程端口一般是3487这些,在官网上面有提到,但是其中的16384-16402,是本地端口,设置的时候要注意。
https://support.apple.com/zh-cn/HT202078

下载的QoS里面,service可以设置MinRTT,官方解释是,不开的话,大约是150ms的延迟,开了以后减半,当然这会牺牲更多的带宽。MinRTT只有在打开了acc(自动拥塞控制)之后才有效,acc打开以后路由会自动ping一个ip地址,得到一个ping值,高于这个ping的包都会被舍弃掉。

我用石像鬼的一个问题就是,没有minrtt的service延迟没法保证,有的应用并不能找到准确的端口或者端口范围,这样就会出现卡顿,石像鬼只能保证它获得的带宽,但是不能保证没有延迟,比如用微信或者QQ视频的时候,端口用是随机乱跳的,根本没法设置,所以视频就容易卡顿,虽然数据传输率足够,但是卡顿还是很明显的。

后来改用了ddwrt,因为可以选用htb模式,这个是带有流量分级的,只要没有更高等级的流量,或者不是很拥堵,基本不会出现卡顿,而且也可以比较方便的将nas的优先级放到最末。不过ddwrt的QoS不是很稳定,有时候用着用着就失效了,重启一下就好了,也不是太靠谱。