这几天写GB28181平台接入层代码,对收到的PS包进行解包时,总是出现误码,最终导致rtsp点播服务中画面花屏。

分析了码流抓包数据之后,发现网络上没有丢包,遂认为PS流解包代码有bug,于是埋头分析了2个小时的解包函数后,没有发现问题。将抓包RTP负载中的PS包数据导出之后,专门利用PS解包代码写了一个小程序,对导出的数据进行处理,又没有问题——后来事实证明解包代码的确没有问题,而且这部分的代码是在其他项目中用过的。自己有些迷糊了,一时想不明白问题出在哪里。

冷静后分析一下,认为抓包结果中的数据不代表应用实际所接收到的数据,二者之间应该是有差别的,比如数据顺序可能会不一样。遂在收包入口函数中,打印每个收到的RTP包的序号,根据序号终于发现:顺序没有乱,但是不间断的有包丢了。这可是问题了,媒体数据是直接进行PS包封装后再在RTP上传输的,丢了少量的包,会导致整个PS包都难以恢复。好在已经知问题是因为收包丢包导致的,现在又继续分析收包丢包的原因。

问题具体情况是采用UDP承载RTP包,RTP包负载部分是PS格式封包的H264码流,每收到一个RTP包,应用就立即对负载中的PS流进行尝试解包(包括必需的缓冲操作),处理完一个RTP包之后再回头继续收包。这样就导致了每次收包之间,间隔比较明显了。用“UDP收包 丢包”作为关键字在网上搜索了一些之后,了解到

采用UDP进行数据通信,若实际流量较大,但recv buffer又不够大,且没有及时进行收包时,则容易造成recv buffer满而丢包

自己业务是用UDP来接收高清视频码流,流量是不小的,并且自己的实现也的确容易导致没有及时收包,觉得上述说法可能是原因。立马进行修改验证,先将recv buffer增加2MiB,花屏现象消失,根据接收的RTP包的序号确认,现在应用层收到的RTP包没有丢包。

到此接入的问题似乎是已经已经解决了,但现在回头看UDP收包的问题,觉得简单扩大recv buffer不是根本之道,只是在本业务场景中,扩大recv buffer后,新增出的buffer尺寸对应的容量,大于视频媒体数据流量,因而没有使得buffer满而丢包。UDP收包丢包,根本上还是需要应用去及时的收包,将recv buffer的空间腾出,不然若流量继续增加,最终还是会出现buffer满而丢包的问题。

UDP收发包毕竟还是太简单,只在IP层之上简单提供收发包接口功能,不像TCP有拥塞控制和自动重传机制,相比之下应用层就需要额外做对应的收发包控制工作,而使用TCP就省事简单很多(当然实现高效的TCP通讯也不是简单的事情)。

结尾吐槽一句:那些制定GB28181标准的砖家们,你们采用PS over RTP的封包格式时,是不是脑子进水了?要知道PS流只是适合媒体数据存储的,而不是网络传输啊,要进行网络传输,干嘛不用TS封包?

~~ end ~~

记录一个UDP收包丢包的问题的更多相关文章

  1. UDP收/发广播包原理及步骤

    原文链接地址:http://www.2cto.com/net/201311/254834.html UDP收/发广播包原理及步骤 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要 ...

  2. UDP 两种丢包处理策略:丢包重传(ARQ) 和 前向纠错(FEC)

    目录 1. 两种丢包处理策略 2. 前向纠错(FEC) 3. 丢包重传(ARQ) [参考文献] 1. 两种丢包处理策略 为了保证实时性,通常适应UDP协议来针对RTP数据进行传输,而UDP无法保证数据 ...

  3. Android Studio多Module使用 aar 依赖包 丢包解决

    FAQ: AAR打包引用丢包问题, jar, aar, dependency 嵌套层级依赖的丢失 问: aar包中,如何包含第三方依赖库? 如果直接作为module 依赖是没有问题的,但是如果打包成a ...

  4. AR8033 1000M模式下ping包丢包率过大分析与解决

    1 现象 近期对一款基于QCA方案.有线Phy为AR8033.WiFi双频且支持iEEE802.11AC的WLAN产品进行了深度验证,发现有线口同部分PC机直连时,WiFi终端ping 该PC机时总是 ...

  5. UDP 收/发 广播包

    网络通信基础 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用过程: 1. 初 ...

  6. linux连接数过多,导致ping包丢包的问题解析

    1.首先要明确,无论是tcp, udp, raw等这些都要占用socket, 那么就涉及到连接数的问题. 所以,linux连接数的问题,不仅仅是tcp连接数. 2.查看当前系统中所有的socket 连 ...

  7. UDP主要丢包原因及具体问题分析

    UDP主要丢包原因及具体问题分析 一.主要丢包原因   1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来 ...

  8. tcp粘包,udp丢包

    TCP是面向流的, 流, 要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者 ...

  9. UDP丢包和无序 问题的解决方法

    最近在做一个项目,在这之前,做了个验证程序. 发现客户端连续发来1000个1024字节的包,服务器端出现了丢包现象. 纠其原因,是服务端在还未完全处理掉数据,客户端已经数据发送完毕且关闭了. 我用过s ...

随机推荐

  1. centos下搭建lamp环境

    1 在线安装所有的服务 yum -y install httpd mysql mysql-server php php-mysql postgresql postgresql-server php-p ...

  2. C#文件流读写文件的简单winform实现

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. 执行时关闭标识位 FD_CLOEXEC 的作用

    首先先回顾 apue 中对它的描述: ① 表示描述符在通过一个 exec 时仍保持有效(书P63,3.14节 fcntl 函数,在讲 F_DUPFD 时顺便提到) ② 对打开文件的处理与每个描述符的执 ...

  4. DOM操作 ——如何添加、移除、移动、复制、创建和查找节点等。

    DOM操作 --如何添加.移除.移动.复制.创建和查找节点等. (1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个 ...

  5. x.2

    某些原因,和女朋友分手了,难过 订的M18XR3居然提前了半个多月到货,开心 想想一个人的孤单,还是有点难过 转眼间人生已经过去小半,剩下的除去苟延残喘20年,也就不到20年时间蹦跶.都说人生如戏,既 ...

  6. pb自动注册ole控件

    方法一:  1.手工注册OCX控件 将该控件随程序一起发布,然后,将此文件拷到windows\system,或者直接放在本运行目录,然后执行dos命令,run( "regsvr32   *. ...

  7. cocos2d-x创建项目

    2.0之后的创建项目方法 第一步,首先 cd cocos2d-x-2.2.1/tools/project-creator/ 第二步, ./create_project.py -project Hell ...

  8. 简单阐述下OC中UIImage三种创建方式~~~

    一. 直接使用imageNamed进行创建 UIImage * image = [UIImage imageNamed:@"1.jpg"]; 简单说一下这种方式的优缺点: 优点:代 ...

  9. height与line-height

    1.网页的所有元素可以分为块元素和行元素.一行文字所在的一个逻辑区域是行元素,其他的元素就都是块元素line-height只针对行元素,height针对其他所有元素 2. width,height对于 ...

  10. xmlrpc实现bugzilla api调用(无会话保持功能,单一接口请求)

    xmlrpc实现bugzilla4   xmlrpc api调用(无会话保持功能,单一接口请求),如需会话保持,请参考我的另外一篇随笔(bugzilla4的xmlrpc接口api调用实现分享: xml ...