本文整理自旧文 ROS 的 Mangle 小包规则 和本站现有的 RouterOS 使用 queue tree 配置流量整形。
这套规则的目标不是让测速数字更好看,而是在下载、上传、BT/PT、代理网关同时工作的情况下,让 DNS、握手、小包和网页交互别被大流量挤死。家庭宽带场景下,最重要的是先把总带宽控制在真实带宽略低一点的位置,再按包类型分优先级。
什么时候需要小包规则
如果家里只有一两台设备轻量上网,RouterOS 默认队列通常够用。小包优先适合下面这些场景:
- 宽带上传比较小,例如 30M、50M,但家里有 NAS、PT、网盘同步或代理节点。
- 一测速或下载,网页打开、DNS 查询、SSH、游戏延迟明显抖动。
- RouterOS 作为主路由,LAN 侧还有 sing-box、mihomo、旁路网关或 Docker 服务。
- 想保留总带宽限制,例如下载 300M 设置成 285M,上传 30M 设置成 28M,避免把运营商侧队列打满。
不要把这套规则理解成“神奇加速”。它只是把拥塞点尽量留在 RouterOS 自己可控的队列里,并且给关键小包更高优先级。
default-small 为什么可能变慢
RouterOS 自带的 default-small 是 pfifo-limit=10。这个队列很短,低带宽或小流量时反应很快,但在 300M 以上的下载、网页测速、多连接下载时,10 个包的队列太容易被打满,TCP 会频繁误判拥塞并回退。
更稳妥的选择:
- 普通家庭宽带:先用
default,默认pfifo-limit=50,不激进,容易排查。 - RouterOS 版本支持
fq-codel:可以参考本站 Queue Tree 文章做更细的队列类型。 - 极低延迟优先并且带宽不高:才考虑
default-small或更小队列,但要用实际下载和延迟一起验证。
这也是为什么我现在更倾向于把基础小包规则的叶子队列设为 default:优先保证稳定吞吐,再在稳定基础上调延迟。
规则结构
基础版规则分三层:
mangle给包打标:DNS、小包、中包、大包。queue tree建立上传总队列和下载总队列。- 子队列按优先级分配:DNS 最高,小包其次,中包居中,大包最低。
这里使用的 packet mark:
| 标记 | 用途 | 优先级 |
|---|---|---|
dns |
DNS、DoT 基础查询 | 1 |
small-packet |
ICMP、0-128 字节的小包 | 2 |
medium-packet |
129-512 字节的中小包 | 3 |
large-packet |
剩余流量兜底 | 8 |
如果你的网络里有独立代理网关,例如 sing-box 机器,也可以另加 proxy-packet 标记,但基础版先不强行加入,避免规则互相覆盖。
队列类型怎么选
生成器里可以选择 default、default-small、fq-codel 和 cake。简单建议如下:
| 带宽环境 | 建议队列 | 说明 |
|---|---|---|
| 100M 以下 | 可以尝试 default-small |
小带宽下更容易感受到低延迟收益,但要实测吞吐是否被压得太狠。 |
| 300M 左右家宽 | 优先用 default |
比 default-small 更稳,测速和大流量下载不容易被队列长度限制拖慢。 |
| 1000M 家宽 | 先用 default 起步 |
千兆下更考验 CPU,能用 fq-codel、cake 并且路由器性能足够的话,体验通常更好。 |
关键不是哪个队列绝对最好,而是看满速下载、满速上传时延迟是否稳定。default-small 更偏低延迟,但队列太短,带宽高时可能影响吞吐;default 更均衡,适合作为通用默认值;fq-codel / cake 更适合现代 SQM,但前提是 RouterOS 版本支持、设备 CPU 扛得住。
RouterOS 默认通常只有 default、default-small、pcq-*、sfq、red 等队列类型,不一定会预置名为 fq-codel 或 cake 的 queue type。本文生成器在选择 fq-codel 或 cake 时,会先创建 qos-gen-fq-codel 或 qos-gen-cake,后面的 Queue Tree 再引用这个名字。
配置生成器
下面输入你的真实宽带上下行、RouterOS 的 WAN/LAN parent 名称和队列类型,点击生成即可。下载和上传建议填运营商标称值,例如 300M/30M;生成器会默认按 95% 和 93% 收敛,避免打满运营商侧缓冲。
生成的命令会先删除 comment 中带有 qos-gen: 的旧规则,不会清理你手工建立的其它 mangle 或 queue tree。
手工配置模板
如果你不需要网页生成器,也可以按下面的结构手工改。这里以 300M/30M 宽带为例,实际总上限收敛成 285M/28M。
/system backup save name=before-small-packet-qos
/ip firewall mangle remove [find comment~"qos-gen:"]
/queue tree remove [find comment~"qos-gen:"]
/ip firewall mangle
add chain=prerouting action=mark-packet comment="qos-gen: dns udp" new-packet-mark=dns passthrough=no protocol=udp dst-port=53
add chain=prerouting action=mark-packet comment="qos-gen: dns tcp" new-packet-mark=dns passthrough=no protocol=tcp dst-port=53,853
add chain=prerouting action=mark-packet comment="qos-gen: icmp small" new-packet-mark=small-packet passthrough=no protocol=icmp
add chain=prerouting action=mark-packet comment="qos-gen: small" new-packet-mark=small-packet packet-mark=no-mark packet-size=0-128 passthrough=no
add chain=prerouting action=mark-packet comment="qos-gen: medium" new-packet-mark=medium-packet packet-mark=no-mark packet-size=129-512 passthrough=no
add chain=prerouting action=mark-packet comment="qos-gen: large" new-packet-mark=large-packet packet-mark=no-mark passthrough=no
/queue tree
# 这里示例使用 queue=default;如果你确认 RouterOS 有 fq-codel 或 cake,也可以替换成对应队列类型。
add comment="qos-gen: upload parent" name=Upload-Total parent=pppoe-out1 limit-at=0 queue=default priority=8 max-limit=28M bucket-size=0.1
add comment="qos-gen: upload dns" name=U1-Dns parent=Upload-Total packet-mark=dns limit-at=2M queue=default priority=1 max-limit=28M bucket-size=0.1
add comment="qos-gen: upload small" name=U2-Small parent=Upload-Total packet-mark=small-packet limit-at=5M queue=default priority=2 max-limit=28M bucket-size=0.1
add comment="qos-gen: upload medium" name=U3-Medium parent=Upload-Total packet-mark=medium-packet limit-at=10M queue=default priority=3 max-limit=28M bucket-size=0.1
add comment="qos-gen: upload large" name=U4-Large parent=Upload-Total packet-mark=large-packet limit-at=0 queue=default priority=8 max-limit=28M bucket-size=0.1
add comment="qos-gen: download parent" name=Download-Total parent=bridge1 limit-at=0 queue=default priority=8 max-limit=285M bucket-size=0.1
add comment="qos-gen: download dns" name=D1-Dns parent=Download-Total packet-mark=dns limit-at=5M queue=default priority=1 max-limit=285M bucket-size=0.1
add comment="qos-gen: download small" name=D2-Small parent=Download-Total packet-mark=small-packet limit-at=23M queue=default priority=2 max-limit=285M bucket-size=0.1
add comment="qos-gen: download medium" name=D3-Medium parent=Download-Total packet-mark=medium-packet limit-at=57M queue=default priority=3 max-limit=285M bucket-size=0.1
add comment="qos-gen: download large" name=D4-Large parent=Download-Total packet-mark=large-packet limit-at=0 queue=default priority=8 max-limit=285M bucket-size=0.1
应用顺序
建议按下面顺序操作:
- 在 RouterOS 里先导出或保存备份。
- 确认
parent名称。下载 parent 通常是 LAN bridge,比如bridge1;上传 parent 通常是pppoe-out1或实际 WAN 口。 - 粘贴生成的命令。
- 执行测速,同时开一个终端看队列状态。
/queue tree print stats
/ip firewall mangle print stats where comment~"qos-gen:"
如果 large-packet 长期大量 drop,而测速远低于总上限,先不要急着降低总带宽。可以先把队列从 default-small 改成 default,再观察单连接和多连接下载的区别。
验证方法
单看网页测速不够。至少做三类验证:
- 浏览器测速:Speedtest、fast.com、运营商测速各测一次。
- 普通下载:找一个稳定的大文件源,跑单连接和多连接。
- 延迟观察:下载时持续 ping 常用 DNS 或游戏服务器。
RouterOS 侧重点看:
/queue tree print stats
/tool profile
如果 CPU 很低、WAN 物理口没有错误、普通多连接下载能跑满,但某个测速站只有几十兆,那通常是测速站或线路互联问题,不要把它误判成家里网关限速。
常见问题
Queue Tree 会不会影响 FastTrack
会。需要被 Queue Tree 管理的流量不能走 FastTrack,否则队列看不到流量。很多家庭路由为了流控稳定,会禁用 FastTrack 或让需要整形的流量绕开 FastTrack。
packet-size 应该怎么分
基础版用 0-128 和 129-512 是为了简单稳定。旧方案里也可以用 0-512 + connection-bytes=0-256k 来定义初始小连接,这种规则更偏交互体验,但要注意不要误把大量下载前段一直提到高优先级。
上传为什么要收敛更多
上传小的时候,运营商侧缓冲一旦被打满,DNS、ACK、SSH、游戏包都会一起抖。300M/30M 宽带可以先设成 285M/28M,上传宁可少一点,也比满速时延迟爆炸更可控。
RouterOS 支持 fq-codel 或 cake 怎么办
如果版本支持 fq-codel 或 cake,可以直接在生成器里选择对应队列类型。生成器会先创建 qos-gen-fq-codel 或 qos-gen-cake,再让 Queue Tree 引用它们。应用前仍建议确认当前 RouterOS 是否支持对应 kind:
/queue type print
如果 RouterOS 提示 kind 不支持,就先改回 default。如果创建成功但性能不稳,说明设备 CPU 或队列参数不适合当前带宽,也先回到 default 再继续调。
回滚
本文生成的规则都带有 qos-gen: 注释,回滚时可以只删这批规则:
/ip firewall mangle remove [find comment~"qos-gen:"]
/queue tree remove [find comment~"qos-gen:"]
/queue type remove [find name="qos-gen-fq-codel"]
/queue type remove [find name="qos-gen-cake"]
如果你已经有复杂 mangle、代理标记、PT 限速或 VLAN 分流,建议不要直接覆盖;先把生成结果当模板,把 packet mark 和 parent 名称并入现有规则。