精华内容
参与话题
问答
  • UDP丢包原因

    千次阅读 2016-07-18 19:19:24
    UDP 丢包的原因和改善

    一、主要丢包原因

    1、接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。

    2、发送的包巨大丢包:虽然send方法会帮你做大包切割成小包发送的事情,但包太大也不行。例如超过50K的一个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));

    具体设置代码可以参考下面链接:
    http://blog.sina.com.cn/s/blog_a459dcf5010153mp.html

    4、发送的包频率太快:虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包。这种情况也有时可以通过设置socket接收缓冲解决,但有时解决不了。所以在发送频率过快的时候还是考虑sleep一下吧。

    5、局域网内不丢包,公网上丢包。这个问题我也是通过切割小包并sleep发送解决的。如果流量太大,这个办法也不灵了。总之udp丢包总是会有的,如果出现了用我的方法解决不了,还有这个几个方法: 要么减小流量,要么换tcp协议传输,要么做丢包重传的工作。

     

     

    二、具体问题分析

    1.发送频率过高导致丢包

    很多人会不理解发送速度过快为什么会产生丢包,原因就是UDP的SendTo不会造成线程阻塞,也就是说,UDP的SentTo不会像TCP中的SendTo那样,直到数据完全发送才会return回调用函数,它不保证当执行下一条语句时数据是否被发送。(SendTo方法是异步的)这样,如果要发送的数据过多或者过大,那么在缓冲区满的那个瞬间要发送的报文就很有可能被丢失。至于对“过快”的解释,作者这样说:“A few packets a second are not an issue; hundreds or thousands may be an issue.”(一秒钟几个数据包不算什么,但是一秒钟成百上千的数据包就不好办了)。 要解决接收方丢包的问题很简单,首先要保证程序执行后马上开始监听(如果数据包不确定什么时候发过来的话),其次,要在收到一个数据包后最短的时间内重新回到监听状态,其间要尽量避免复杂的操作(比较好的解决办法是使用多线程回调机制)。

    2.报文过大丢包

    至于报文过大的问题,可以通过控制报文大小来解决,使得每个报文的长度小于MTU。以太网的MTU通常是1500 bytes,其他一些诸如拨号连接的网络MTU值为1280 bytes,如果使用speaking这样很难得到MTU的网络,那么最好将报文长度控制在1280 bytes以下。

    3.发送方丢包

    发送方丢包:内部缓冲区(internal buffers)已满,并且发送速度过快(即发送两个报文之间的间隔过短);  接收方丢包:Socket未开始监听;  虽然UDP的报文长度最大可以达到64 kb,但是当报文过大时,稳定性会大大减弱。这是因为当报文过大时会被分割,使得每个分割块(翻译可能有误差,原文是fragmentation)的长度小于MTU,然后分别发送,并在接收方重新组合(reassemble),但是如果其中一个报文丢失,那么其他已收到的报文都无法返回给程序,也就无法得到完整的数据了。 

    展开全文
  • UDP解决丢包问题总结

    千次阅读 2019-11-24 22:13:14
    收包率低/丢包率高的原因分析 (1) 缓存太小,不能及时接收数据。 连续多个UDP包超过了UDP接收缓冲区大小 ,比如: 如:UDP包过大 如:UDP发包速率过快,突发大数据流量超过了缓冲区上限 (2)recvfrom()接收...

    收包率低/丢包率高的原因分析

    • (1) 缓存太小,不能及时接收数据。

      连续多个UDP包超过了UDP接收缓冲区大小 ,比如:

      1. 如:UDP包过大
      2. 如:UDP发包速率过快,突发大数据流量超过了缓冲区上限
    • (2)recvfrom()接收到数据之后处理速度太慢

      如果数据接收和处理是连续进行的,那么可能由于数据处理过慢,两次recvfrom调用的时间间隔里发过来的包丢失

    对应的解决方法

    • UDP包过大

      解决方法:增加系统发送或接收缓冲区大小

      int nBuf=32*1024;//设置为32K  
      setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nBuf,sizeof(int));
      setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nBuf,sizeof(int));
      
    • 发包速率过快

      解决方法:增加应答机制,处理完一个包后,在继续发包

    • recvfrom()接收到数据之后处理速度太慢

      服务器程序启动之出,开辟两个线程,一个线程专门用于接收数据包,并存放在应用层的缓存区;另外一个线程用于专门处理和响应数据包请求,避免因为处理数据造成数据丢包。其本质上还是增大了缓冲区大小,只是将系统缓冲区转移到了自己的缓冲区。

    • 最复杂的方式

      在应用层实现丢包重发机制超时机制,确保数据包不丢失。

    版权声明:本文为CSDN博主「shuaixio」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/baidu_35692628/article/details/76165337

    展开全文
  • 为什么UDP接收或发送会丢包

    千次阅读 2018-06-01 13:50:17
    同时进行其它有延时的操作(如写码流数据到USB存储设备), 应该程序将延迟接收UDP数据包,而socket默认接收缓存只有108544Byte,这样可能会使socket接收缓存满,无法接收新的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

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



    展开全文
  • 如何解决TCP丢包的问题UDP丢包的问题一、主要丢包原因解决UDP丢包的问题 TCP传输协议中如何解决丢包问题 首先TPC为什么会丢包? TCP是基于不可靠的网路实现可靠传输,肯定会存在丢包问题。 如果在通信过程中,...

    TCP传输协议中如何解决丢包问题

    首先TPC为什么会丢包?

    1. TCP是基于不可靠的网路实现可靠传输,肯定会存在丢包问题。

    2. 如果在通信过程中,发现缺少数据或者丢包,那边么最大的可能性是程序发送过程或者接受过程中出现问题。
      在这里插入图片描述

    如何解决TCP丢包的问题

    TCP协议丢包后,如何解决丢包的问题

    为了满足TCP协议不丢包。TCP协议有如下规定:

    1. 数据分片:发送端对数据进行分片,接受端要对数据进行重组,由TCP确定分片的大小并控制分片和重组

    2. 到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认

    3. 超时重发:发送方在发送分片时设置超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片数据

    4. 滑动窗口:TCP连接的每一方的接受缓冲空间大小固定,接收端只允许另一端发送接收端缓冲区所能接纳的数据,TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出

    5. 失序处理:作为IP数据报来传输的TCP分片到达时可能会失序,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层;

    6. 重复处理:作为IP数据报来传输的TCP分片会发生重复,TCP的接收端必须丢弃重复的数据;

    7. 数据校验:TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到分片的检验或有差错,TCP将丢弃这个分片,并不确认收到此报文段导致对端超时并重发

    UDP丢包的问题

    一、主要丢包原因

    1、接收端处理时间过长导致丢包
    调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。

    2、发送的包巨大丢包
    虽然send方法会帮你做大包切割成小包发送的事情,但包太大也不行。例如超过50K的一个udp包,不切割直接通过send方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个send。

    3、发送的包较大,超过接受者缓存导致丢包
    包超过mtu size数倍,几个大的udp包可能会超过接收者的缓冲,导致丢包。这种情况可以设置socket接收缓冲。以前遇到过这种问题,我把接收缓冲设置成64K就解决了。

    4、发送的包频率太快
    虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包。这种情况也有时可以通过设置socket接收缓冲解决,但有时解决不了。所以在发送频率过快的时候还是考虑sleep一下吧。

    5、局域网内不丢包,公网上丢包
    这个问题我也是通过切割小包并sleep发送解决的。如果流量太大,这个办法也不灵了。总之udp丢包总是会有的,如果出现了用我的方法解决不了,还有这个几个方法: 要么减小流量,要么换tcp协议传输,要么做丢包重传的工作。

    解决UDP丢包的问题

    1.发送频率过高导致丢包

    很多人会不理解发送速度过快为什么会产生丢包,原因就是UDP的SendTo不会造成线程阻塞,也就是说,UDP的SentTo不会像TCP中的SendTo那样,直到数据完全发送才会return回调用函数,它不保证当执行下一条语句时数据是否被发送。(SendTo方法是异步的)这样,如果要发送的数据过多或者过大,那么在缓冲区满的那个瞬间要发送的报文就很有可能被丢失。至于对“过快”的解释,作者这样说:“A few packets a second are not an issue; hundreds or thousands may be an issue.”(一秒钟几个数据包不算什么,但是一秒钟成百上千的数据包就不好办了)。 要解决接收方丢包的问题很简单,首先要保证程序执行后马上开始监听(如果数据包不确定什么时候发过来的话),其次,要在收到一个数据包后最短的时间内重新回到监听状态,其间要尽量避免复杂的操作(比较好的解决办法是使用多线程回调机制)。

    2.报文过大丢包

    至于报文过大的问题,可以通过控制报文大小来解决,使得每个报文的长度小于MTU。以太网的MTU通常是1500 bytes,其他一些诸如拨号连接的网络MTU值为1280 bytes,如果使用speaking这样很难得到MTU的网络,那么最好将报文长度控制在1280 bytes以下。

    3.发送方丢包

    发送方丢包:内部缓冲区(internal buffers)已满,并且发送速度过快(即发送两个报文之间的间隔过短); 接收方丢包:Socket未开始监听; 虽然UDP的报文长度最大可以达到64 kb,但是当报文过大时,稳定性会大大减弱。这是因为当报文过大时会被分割,使得每个分割块(翻译可能有误差,原文是fragmentation)的长度小于MTU,然后分别发送,并在接收方重新组合(reassemble),但是如果其中一个报文丢失,那么其他已收到的报文都无法返回给程序,也就无法得到完整的数据了。

    展开全文
  • udp 丢包问题以及解决方案

    千次阅读 2011-10-29 15:14:11
    1:场景 服务器: 4 CPU 300w/min upd 包接收量 ,丢包为 2k /min 以上都是峰值。 只有一个CPU 负荷高,其他CPU ...3) udp丢包有很多种可能, 可能在网卡那一层就丢了,怎么检测? 关键是要弄清楚整个的一
  • UDP丢包及无序的现象

    2017-01-05 10:58:14
    发现客户端连续发来1000个1024字节的包,服务器端出现了丢包现象. 纠其原因,是服务端在还未完全处理掉数据,客户端已经数据发送完毕且关闭了. 有没有成熟的解决方案来解决这个问题. 我用过sleep(1),暂时解决这个...
  • udp丢包原因和解决

    千次阅读 2017-04-26 18:18:23
    一、主要丢包原因1、接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收...
  • UDP主要丢包原因及具体问题分析

    千次阅读 2019-03-18 09:35:27
    一、主要丢包原因 1、接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包...
  • 压力测试下,UDP丢包解决方案

    千次阅读 2017-03-20 10:07:14
    udp丢包是指在截获数据包后,linux内核的tcp/ip协议栈在udp数据包处理过程中的丢包,主要原因有两个:udp数据包格式或校验和错误和应用程序来不及处理udp数据包。 首先介绍通用的udp丢包检测方法,使用netstat命令...
  • linux,socket通信,udp,接收缓冲区,recvfrom
  • udp丢包 又是udp丢包

    2017-06-21 17:28:41
    http://blog.csdn.net/pi9nc/article/details/17165171 http://www.cnblogs.com/my_life/articles/5363527.html http://blog.csdn.net/chen495810242/article/details/37593661
  • Netty之UDP丢包解决

    2017-01-05 10:53:00
    程序背景 程序是Java编写,基于Netty框架写的...通过GC日志对比发现丢包的时间点偶有处于Full GC,说明Java程序接收间歇性stop world的不是根因。 观察Udp的dump 通过watch -n 1 -d 'cat /proc/net/udp >> /u...
  • 通过RTP传输高清h264码流时,...解决这个问题的方法,需要增加udp缓冲区的大小,设置的方法分为设置系统的整体缓冲区,在程序中设置socket的缓冲区。  (1)设置linux系统的缓冲区的方法,是在命令行下输入: sysctl
  • 最近工作中遇到某个服务器应用程序 UDP 丢包,在排查过程中查阅了很多资料,我在排查过程中基本都是通过使用 tcpdump 在出现问题的各个环节上进行抓包、分析在那个环节出现问题、针对性去排查解决问题,对症下药,...
  • iperf测试UDP丢包

    千次阅读 2018-07-25 17:20:57
    在实际的测试中,iperf测试UDP通常会丢包; 尤其是网口物理速率较高的系统;比如10G,40G网口; 1G的网口,如果处理器强劲,使用系统自带协议栈,应该还能处理得过来; 在网上查了一下; 看到有几种办法,汇总...
  • UDP RTP 丢包解决 AVCom的API接口使用说明
  • UDP丢包和无序 问题的解决方法 最近在做一个项目,在这之前,做了个验证程序.发现客户端连续发来1000个1024字节的包,服务器端出现了丢包现象.纠其原因,是服务端在还未完全处理掉数据,客户端...
  • UDP 丢包原因

    2016-10-11 17:35:01
    自己在做UDP传输时遇到的问题,接收端没设置缓存,结果总是丢包。 看到这篇文章设置了一下接收缓存就好 [cpp] view plain copy int nRecvBuf=32*1024;//设置为32K setsockopt(s,SOL_SOCKET,...
  • 局域网UDP丢包优化

    万次阅读 2014-04-13 10:42:59
    UDP接收和处理的速度决定了
  • UDP丢包(Linux)并测试

    千次阅读 2019-07-04 18:14:40
    一、UDP丢包现象 UDP丢包是正常现象,因为它是不安全的。 UDP是无连接的,面向消息的数据传输协议,与TCP相比,有两个致命的缺点,一是数据包容易丢失,二是数据包无序。 要实现文件的可靠传输,就必须在上层对...
  • 最近做的一个程序用到了IOCP通信模型,里面用到了setsockopt对套接字进行设置,看源代码的时候最setsockopt函数很不理解,看了msdn以后还是不太明白这个函数的用法,于是就到网上找了一个这个函数的用法,找到了下面...
  • windows下udp连接&解决丢包现象

    千次阅读 2014-09-04 00:41:18
    服务端: 客户端:
  • Linux UDP严重丢包问题的解决

    千次阅读 2016-09-20 11:19:35
    测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%。同等情形下Windows上测试,仅丢几条数据。形势严峻,必须解决。考虑可能是因为协议栈Buffer太低所致,于是先看看...
  • 使用 iPerf 测试并排查 UDP 丢包问题

    千次阅读 2018-03-21 11:42:20
    转自 https://help.aliyun.com/knowledge_detail/58656.html 现象描述使用高速通道打通同一个地域(Region)下的两台 VPC 网络类型的 ECS 实例后,通过 iPerf 测试两台实例内网之间 UDP 丢包率,测试带宽达到 50 ...
  • udp丢包原因分析

    2020-01-06 11:15:20
    什么会导致udp丢包呢,这里列举了如下几点原因: 调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包...
  • # 首先说说环境。 * 网络环境很理想,万兆内网,主机之间使用一台光纤交换机连接并无任何中间节点;...> 浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)http://www.cnblogs.com/linuxbug/p/4906000.html

空空如也

1 2 3 4 5 ... 20
收藏数 18,415
精华内容 7,366
关键字:

udp丢包怎么解决