UDP丢包原因总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UDP丢包原因总结
丢包检查⽅法
给每个UDP包编号,对⽐收发端的接收到的包。

对于UDP协议层上的包,例如RTP包,可以从RTP包中读出包的序列号进⾏判断。

抓包。

发送端和接收端分别抓包。

linux下可以使⽤tcpdump,windows下使⽤wireshark。

linux下,可以使⽤watch netstat -su查看丢包统计。

主要看RcvbufErrors和SndbufErrors。

如果两个统计项的数字都在不断增加,表明⽹卡有丢包。

发送⽅丢包
发送的包太⼤
发送的包⽐64K⼤会导致UDP协议sendto返回错误。

发送的包⽐MTU⼤,UDP包在接收端容易丢包,可查看接收端的⽹卡统计。

可考虑把包切分到MTU⼀下再发送。

发包速度太快
发包速度太快的话,可能有两个问题:1.接收端来不及接收导致接收端丢包。

2.发送端⽹卡处理不过来。

这个时候sendto没有返回错误,但是⽤netstat查看会发现SndbufErrors不断上升,有可能是⽹卡的输出队列太⼩导致。

可以考虑使⽤ifconfig命令把txqueuelen设置⼤⼀些。

UDP包流量太⼤
同⼀个端⼝发送的数据量太⼤时会导致⽹卡丢包,这个时候可以⽤netstat查看会发现SndbufErrors不断上升。

sendto会返回-1.这个时候可以考虑增⼤/proc/sys/net/core/wmem_max的值。

这种情况尤其是同时给多个客户端发送⾳视频数据时导致。

笔者曾经遇到过这么⼀次情况。

⼀个端⼝向8个客户端发送视频流时,⽹卡流量⼤概400M/s,sendto会返回-1,errno 11.程序⾥也调⽤setsockopt设置了发送缓冲区为60M,然⽽还是会丢包。

后来将系统参
数/proc/sys/net/core/wmem_max设到60M才解决问题。

接收端丢包
接收缓冲区太⼩
接收缓冲区⼩于发送客户端的包的⼤⼩,或者接收客户端recvfrom速度太慢,导致接收缓冲区满丢弃数据。

前⼀种问题,可以考虑增⼤接收缓冲区。

后⼀种问题,可以考虑将接收操作和业务处理操作分离到不同的线程来处理。

作者:⼩怪兽狂殴奥特曼
链接:https:///p/7f4700a5e970
来源:简书
著作权归作者所有。

商业转载请联系作者获得授权,⾮商业转载请注明出处。

相关文档
最新文档