linux下udp qos配置需优先保时延、控突发、防抢占,核心是dscp分级标记(如voip用ef、游戏用af41)、htb+fq_codel调度结构(避免bufferbloat)、u32 filter映射dscp至流量类,并辅以tbf限速和接收缓冲区优化。

Linux 下 UDP 传输场景对 QoS 配置有特殊要求——UDP 本身无拥塞控制、不重传、易突发,一旦带宽被占满或网络抖动,就直接丢包,影响实时性业务(如 VoIP、视频会议、游戏状态同步)。因此 QoS 不是“锦上添花”,而是保障可用性的必要手段。
关键原则:优先保时延、控突发、防抢占
UDP 流量不能靠 TCP 那套自动降速来缓解拥塞,必须由系统主动干预。QoS 的核心不是“限速”,而是“分级调度 + 主动整形 + 精准识别”。
一、用 DSCP 标记区分 UDP 流类型
别只靠端口,要结合协议语义打标记,让内核和后续网络设备(如路由器)能统一识别。
- VoIP(SIP/RTP)→
EF(Expedited Forwarding)iptables -t mangle -A PREROUTING -p udp --dport 5060 -j DSCP --set-dscp-class EF # SIP 信令 iptables -t mangle -A PREROUTING -p udp --dport 10000:20000 -j DSCP --set-dscp-class EF # RTP 媒体流
- 游戏心跳/状态更新 →
AF41(确保低丢包,但容忍微小延迟)iptables -t mangle -A PREROUTING -p udp --dport 7777 -j DSCP --set-dscp-class AF41
- 普通 UDP 日志、监控上报 →
BE(Best Effort)或CS1(低优先级)iptables -t mangle -A PREROUTING -p udp --dport 514 -j DSCP --set-dscp-class CS1
⚠️ 注意:确保网卡驱动支持 DSCP 透传(多数现代网卡默认开启),且若流量经 NAT 或转发,需在
POSTROUTING链重复标记。
二、HTB + FQ_CODEL 构建低延迟调度结构
单纯 HTB 容易堆积缓冲区导致 Bufferbloat;搭配 fq_codel 可主动丢包抑制延迟飙升。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
# 清空旧规则 tc qdisc del dev eth0 root 2>/dev/null # 添加根 qdisc:HTB 控制总带宽,子类挂 fq_codel 实现每流公平与低延迟 tc qdisc add dev eth0 root handle 1: htb default 30 # 总带宽设为物理链路速率(如 1Gbps),避免过载 tc class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit ceil 1000mbit # 高优先级类(EF):保证最小带宽 + 最高调度优先级 tc class add dev eth0 parent 1:1 classid 1:10 htb rate 50mbit ceil 200mbit prio 1 tc qdisc add dev eth0 parent 1:10 fq_codel flows 1024 target 5ms interval 100ms # 中优先级类(AF41):弹性带宽,防抢占但不硬保 tc class add dev eth0 parent 1:1 classid 1:20 htb rate 20mbit ceil 500mbit prio 2 tc qdisc add dev eth0 parent 1:20 fq_codel flows 512 target 10ms interval 150ms # 默认类(BE/CS1):严格限速,防止 UDP 突发打满链路 tc class add dev eth0 parent 1:1 classid 1:30 htb rate 10mbit ceil 100mbit prio 3 tc qdisc add dev eth0 parent 1:30 fq_codel flows 256 target 20ms interval 300ms
✅
fq_codel的target值越小,越激进地丢包以压低延迟;interval决定检测周期,建议按典型 RTT 设置。
三、用 u32 filter 将 DSCP 映射到对应 class
仅靠 iptables 打标还不够,tc 必须知道把哪个包送进哪一类:
# 匹配 DSCP EF → 流向 class 1:10 tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dsfield 184 252 flowid 1:10 # 匹配 DSCP AF41 → 流向 class 1:20(dsfield 值查 RFC 2474) tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dsfield 168 252 flowid 1:20 # 其余未标记的走默认类 tc filter add dev eth0 parent 1: protocol ip prio 3 u32 match ip dsfield 0 0 flowid 1:30
? DSCP 值 = DSCP Class × 4(如 EF=46 → 46×4=184;AF41=34 → 34×4=136,但实际匹配用掩码
252即0xfc,保留高6位)
四、针对 UDP 突发的额外加固措施
-
限制单流发送速率(应用层更优,但内核层可兜底)
对已知高发 UDP 端口(如 DNS 53、NTP 123),用tbf(Token Bucket Filter)做硬限速:tc qdisc add dev eth0 parent 1:30 handle 20: tbf rate 2mbit burst 32kbit latency 70ms tc filter add dev eth0 parent 1: protocol ip u32 match ip dport 53 0xffff flowid 20:1
-
调大接收缓冲区,减少内核丢包
sysctl -w net.core.rmem_max=8388608 sysctl -w net.core.rmem_default=2097152 # 应用中也需 setsockopt(SO_RCVBUF)
-
禁用 TX 拥塞控制(UDP 不需要)
ethtool -K eth0 tso off gso off gro off lro off
不复杂但容易忽略










