UDP丢包原因总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
来源:简书
著作权归作者所有。
商业转载请联系作者获得授权,⾮商业转载请注明出处。