为什么UDP接收或发送会丢包

摘自海思sdk内文档 BSP FAQ.doc

l   用户态应用程序在接收UDP数据时(单播或组播报文),同时进行其它有延时的操作(如写码流数据到USB存储设备), 应该程序将延迟接收UDP数据包,而socket默认接收缓存只有108544Byte,这样可能会使socket接收缓存满,无法接收新的UDP数据包,出现丢包现象。

可在内核下通过执行下面命令进行确认:

cat /proc/net/snmp| grep Udp

如果RcvbufErrors字段增加较多,说明确实是socket接收缓存满导致的丢包。

以下命令可以增加接收缓冲区,解决以上问题。

echo 20000000 >/proc/sys/net/core/rmem_max

echo 20000000 >/proc/sys/net/core/rmem_default

echo 20000000 >/proc/sys/net/core/netdev_max_backlog

这种改动,需要根据实际码流发送速度和接收程序的延时进行参数调优。

/proc/sys/net/core/rmem_default  
/proc/sys/net/core/rmem_max  
  
使用udp接收数据时:  
若没有调用setsockopt设置系统接收缓存,则接收缓存的大小为rmem_default.  
若程序调用setsockopt设置系统接收缓存,设置值不能超过rmem_max.  
  
系统会为每个udp socket申请一份缓存空间,而不是共用同一份缓存.  
即每个udp socket都会有一个rmem_default大小的缓存空间(假设没有setsockopt设置).  

 
 

l   UDP发送可能会丢包,一种原因是CPU发送UDP报文的速率超过了网卡MAC的发包速率,导致网卡MAC的发送缓冲队列满,引起了丢包。

可以在内核下通过执行下面命令进行确认:

ifconfig eth0

如果打印的信息中TX dropped和overruns值基本相等,都增加较多,说明是网络MAC的发送缓冲队列满导致的丢包。

以下命令可以减小发送缓冲区,让CPU发包速率慢一点,解决以上问题。

echo 20000 >/proc/sys/net/core/wmem_max

echo 20000 >/proc/sys/net/core/wmem_default

这种改动,需要根据码流发送速率和丢包率的要求进行参数调优。



猜你喜欢

转载自blog.csdn.net/vc66vcc/article/details/80536626