这几天写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. 浅谈对ionic项目的理解

    在思考怎么将客户端app连接到服务器的时候,就在想ionic项目的本质是什么,一开始因为ionic serve这一命令,我以为它自己就是个服务器,但是后来一细想又感觉不是这样,不然客户端又该怎么和服务 ...

  2. Java线程池使用说明

    Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...

  3. java 中的SimpleDateFormat、Date函数以及字符串和Date类型互转

    SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类.它允许进行格式化(日期 -> 文本).解析(文本 -> 日期)和规范化. SimpleDateFor ...

  4. learn python, ref, diveintopython 分类: python 2015-07-22 14:42 14人阅读 评论(0) 收藏

    for notes of learing python. // just ignore the ugly/wrong highlight for python code. ""&q ...

  5. Html标签第二课css

    css(Cascading Style Sheet)叠层样式表.用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言. 一:样式三种控制方法 1.行内样式: <div  style=& ...

  6. Java JDBCI批量插入数据

    智能插入:将整批分批,每一千条提交一次,sql注入(安全,使用软解析,提高效率) sql注入攻击:简单例子 select * from table where name='"+un+&quo ...

  7. 【转】tomcat7性能调优

    注意:调优tomcat需要了解使用的tomcat是什么版本,随着tomcat版本发展有新参数引入,同时有旧参数废弃.本文档以tomcat7为例进行调优 一. 线程池(Thread Pool)优化 编辑 ...

  8. http 301和302的区别

    1.什么是301转向?什么是301重定向? 301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种, ...

  9. iOS 7.1耗电严重解决办法

    自从iOS 7.1正式版发布以来,三天后的升级率就已经达到17.9%,预计一周后升级率能突破40%.但是也有不少用户在苹果官方支持论坛上抱怨iOS 7.1系统耗电严重. 名为PJS2006的iPhon ...

  10. centos7安装jdk8

    1.查看是否已经安装了jdk rpm -qa|grep java 表示没有安装jre 如果已经安装请先卸载 2.查看可安装的java环境 yum list java* 3.安装 java-1.8.0- ...