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速度太慢,导致接收缓冲区满丢弃数据。前一种问题,可以考虑增大接收缓冲区。后一种问题,可以考虑将接收操作和业务处理操作分离到不同的线程来处理。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要通过整理网络上的资料,整理出的关于TCP方面的简单理论知识。作为Java程序员虽然更多的时候我们都是直接调...
    tomas家的小拨浪鼓阅读 10,987评论 1 100
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 14,479评论 6 174
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 10,486评论 0 8
  • # 图解TCP/IP 标签(空格分隔): 2018招聘 --- ##第1章 网络基础知识 ### ### 1.1 ...
    Kai_a3da阅读 5,333评论 0 2
  • 马上又到了五一小长假,很多人又开始计划出游的事,这次我就根据自己去年的经验写了一篇干货,专注苏州那些你不知道的好吃...
    咖喱爱土豆阅读 13,252评论 0 32