公司监控系统突然弹出告警:“视频流卡顿,UDP丢包率超15%”。运维小张抓着鼠标一顿查,ping显示延迟正常,TCP服务也没报错,但摄像头回传的画面就是花屏、断连。这种场景,在安防、直播、VoIP系统里太常见了——问题不在网络不通,而在UDP包悄悄“失踪”了。
UDP本身不保证送达,但丢包太多就真出事了
UDP没有重传、没有确认、没有流量控制,发出去就不管了。这本是它的优势(低延迟),也是它的软肋(一丢就难察觉)。当网络设备、链路或终端扛不住压力时,UDP包就会被静默丢弃,而上层应用往往只看到“数据没来”,不会像TCP那样触发重试或连接重建,告警就成了唯一线索。
这些地方最容易“吃掉”UDP包
1. 网卡驱动或缓冲区溢出
老款网卡或未更新驱动,在高吞吐UDP流(比如4K视频推流)下,内核接收队列(rx ring buffer)容易满。Linux下可查:
cat /proc/net/dev | grep eth0关注 rx_dropped 列数值是否持续增长。临时缓解可调大:sudo ethtool -G eth0 rx 40962. 交换机/路由器端口拥塞
某台接入交换机下挂了8个高清IPC,总码率冲到300Mbps,但上联口只有1G且跑着其他业务。交换机缓存打满后,优先丢弃UDP(因其无QoS标记或DSCP值低)。抓包看现象:同一秒内大量UDP包到达时间戳乱序+间隔跳变,基本可锁定中间设备瓶颈。
3. 防火墙或安全设备策略拦截
有些下一代防火墙默认对“非常规UDP端口”或“短生命周期UDP会话”做速率限制。比如某语音系统用UDP 50000–50050端口,防火墙策略里写了“每秒单IP允许100个UDP新建连接”,结果50路并发通话直接触发限速丢包。检查日志关键词:udp flood drop 或 session limit exceeded。
4. 应用层接收慢,内核缓冲区撑爆
写了个Python脚本收UDP日志,但每次recvfrom()后要写磁盘+解析JSON,耗时30ms。而发端每5ms发一包,10个包进来就填满默认的212992字节接收缓冲区,后续包全丢。用 ss -uln 查 Recv-Q 列长期非零,就是这个信号。
别只盯着“是不是丢包”,先问“谁在丢”
用 tcpdump -i eth0 udp port 5060 -w sip.pcap 在源、中间节点、目的端分别抓包比对,三处包数依次为1000→920→780,说明第一段链路丢10%,第二段丢140个——问题就定位到中间那台三层交换机了。再登录上去看端口统计:show interface gigabitethernet 1/0/2,如果 input queue drops 值飙升,基本不用再查别的。
家庭环境也一样:Wi-Fi 6路由器接了4个在线游戏主机+2个投屏设备,2.4G频段UDP广播包密集碰撞,手机测速正常,但《绝地求生》语音频繁断连。换到5G信道或改用有线直连,丢包立刻归零——无线环境对UDP尤其苛刻,它不像TCP能靠重传掩盖问题。
UDP丢包不是故障,而是网络真实状态的诚实反馈。关键不是消灭所有丢包(那不现实),而是让丢包率稳定在应用可容忍阈值内(如VoIP<1%,视频流<3%),并确保每次丢包都能快速定位到具体环节。