公司监控平台突然弹出告警:“UDP丢包率超15%”,运维小哥抓着咖啡杯盯了十分钟屏幕,ping是通的,TCP服务也正常——可视频会议卡顿、IoT传感器数据断续、语音对讲时断时续,问题就出在UDP上。
UDP本身不保证可靠,但丢包太多就是真毛病
UDP没重传、没确认、没顺序保障,所以“偶尔丢几个包”不算异常;可一旦告警频繁触发,说明底层链路或配置出了实际问题,不是“UDP特性”能背锅的。
网卡驱动太老,发包直接被内核吞掉
某次升级完Linux内核后,安防摄像头的UDP流开始间歇性失联。查dmesg发现大量:
igb 0000:02:00.0: tx hang timeout, resetting adapter换掉三年没更新的igb驱动,丢包率从12%直降到0.03%。老旧网卡驱动对高吞吐UDP帧处理乏力,尤其在千兆口跑满时容易丢弃发送队列里的包。防火墙悄悄拦了UDP回包
不少安全软件默认开启“状态检测+UDP连接跟踪”,但UDP没有三次握手,很多防火墙靠超时机制模拟“连接”。当设备端UDP心跳间隔超过防火墙设置的UDP连接超时(比如默认30秒),后续回包会被当成非法包丢弃。检查iptables规则:
iptables -t raw -L PREROUTING -n | grep udp若看到类似CT invalid日志,大概率是这里卡住了。交换机QoS策略误伤业务UDP流
办公网里视频会议用的UDP端口(如5004/5005)常被归类到“低优先级流量”,而交换机QoS把这类包直接限速或丢弃。抓包对比:镜像口能看到源设备已发出UDP包,但目标设备收不到——十有八九是中间交换机做了无差别限速。登录交换机查:
display qos policy interface gigabitethernet 1/0/1看看是否有针对UDP端口范围的remark或car策略。应用层发包太快,本地socket缓冲区溢出
某IoT网关程序用sendto()每毫秒发一个800字节UDP包,而系统net.core.wmem_default只有212992字节。结果内核发送队列长期满载,新包进来直接被丢。临时缓解:
echo 4000000 > /proc/sys/net/core/wmem_max长期得改应用逻辑,加节流或用环形缓冲区控速。MTU不匹配,IP分片遇上禁用DF标志
跨VPN或SD-WAN传输时,出口MTU设成1500,但中间某段链路只支持1400,又恰巧应用设置了IP_DONTFRAG,那大于1400的UDP包直接被路由器静默丢弃,连ICMP Fragmentation Needed都不回。用mtr加-U参数实测路径MTU:
mtr -U -s 1420 192.168.10.5如果从某跳开始全*,基本就是MTU断点。