UDP丢包的原因
2015-06-08 16:00
232 查看
什么会导致udp丢包呢,我这里列举了如下几点原因:
1.调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。2.发送的包太大而丢包。虽然send方法会帮你做大包切割成小包发送的事情,但包太大也不行。例如超过30K的一个udp包,不切割直接通过send方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个send。
3.发送的包较大,超过mtu size数倍,几个大的udp包可能会超过接收者的缓冲,导致丢包。这种情况可以设置socket接收缓冲。以前遇到过这种问题,我把接收缓冲设置成64K就解决了。
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
4.发送的包频率太快,虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包。这种情况也有时可以通过设置socket接收缓冲解决,但有时解决不了。
5.发送的广播包或组播包在windws和linux下都接收正常,而arm上接收出现丢包。这个还不好解决,我的解决方法是大包切割成大小为1448的小包发送,每个包之间sleep 1毫秒,虽然笨,但有效。我这里mtu size为1500字节,减去udp包头8个字节,减去传输层几十个字节,实际数据位1448字节。
除此之外还可以试试设置arm操作系统缓冲:
//设置mtu size 1500最大
ifconfig eth0 mtu 1500
//查看接收缓冲最大和默认大小。
sysctl -A | grep rmem
//设置接收缓冲的最大大小
sysctl -w net.core.rmem_max=1048576
sysctl -w net.core.rmem_default=1048576
sysctl -w net.ipv4.udp_mem=1048576
sysctl -w net.ipv4.udp_rmem_min=1048576
6,局域网内不丢包,公网上丢包。这个问题我也是通过切割小包并sleep发送解决的。如果流量太大,这个办法也不灵了。
总之udp丢包总是会有的,如果出现了用我的方法解决不了,还有这个几个方法: 要么减小流量,要么换tcp协议传输,要么做丢包重传的工作。
UDP丢包的原因
相关文章推荐
- 智能家居为什么使用ZigBee而不是433
- 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
- HTML5+开发移动app-mui开发示例
- 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法 2015-06-08 16:00 50人阅读 评论(0) 收藏
- 情深不寿
- Oracle数据库中文乱码解决方法
- Mozilla CTO兼Firefox OS联合创始人Andreas Gal离职创业
- Web框架
- java简单计算器
- 【JAVA教程】如何用JMX连接本地JVM上运行的Java程序-潭州JAVA
- Arteriosclerosis, Arteriolosclerosis, Atherosclerosis的区别
- GRE写作中关于教育的意义
- LOG算子
- 第13周项目1 动物这样叫
- 第十四周 阅读程序
- quick cocos2d-x 实战:做一个手机横版格斗游戏3:游戏开始界面切图
- Oracle数据库的启动关闭的几种方式
- poj3414(BFS)
- 解决最长单调子
- 操作系统内存配置overcommit_memory