记录一个UDP收包丢包的问题
这几天写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收包丢包的问题的更多相关文章
- UDP收/发广播包原理及步骤
原文链接地址:http://www.2cto.com/net/201311/254834.html UDP收/发广播包原理及步骤 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要 ...
- UDP 两种丢包处理策略:丢包重传(ARQ) 和 前向纠错(FEC)
目录 1. 两种丢包处理策略 2. 前向纠错(FEC) 3. 丢包重传(ARQ) [参考文献] 1. 两种丢包处理策略 为了保证实时性,通常适应UDP协议来针对RTP数据进行传输,而UDP无法保证数据 ...
- Android Studio多Module使用 aar 依赖包 丢包解决
FAQ: AAR打包引用丢包问题, jar, aar, dependency 嵌套层级依赖的丢失 问: aar包中,如何包含第三方依赖库? 如果直接作为module 依赖是没有问题的,但是如果打包成a ...
- AR8033 1000M模式下ping包丢包率过大分析与解决
1 现象 近期对一款基于QCA方案.有线Phy为AR8033.WiFi双频且支持iEEE802.11AC的WLAN产品进行了深度验证,发现有线口同部分PC机直连时,WiFi终端ping 该PC机时总是 ...
- UDP 收/发 广播包
网络通信基础 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用过程: 1. 初 ...
- linux连接数过多,导致ping包丢包的问题解析
1.首先要明确,无论是tcp, udp, raw等这些都要占用socket, 那么就涉及到连接数的问题. 所以,linux连接数的问题,不仅仅是tcp连接数. 2.查看当前系统中所有的socket 连 ...
- UDP主要丢包原因及具体问题分析
UDP主要丢包原因及具体问题分析 一.主要丢包原因 1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来 ...
- tcp粘包,udp丢包
TCP是面向流的, 流, 要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者 ...
- UDP丢包和无序 问题的解决方法
最近在做一个项目,在这之前,做了个验证程序. 发现客户端连续发来1000个1024字节的包,服务器端出现了丢包现象. 纠其原因,是服务端在还未完全处理掉数据,客户端已经数据发送完毕且关闭了. 我用过s ...
随机推荐
- 【接口】【USB】1.学习笔记
1.USB的优点: 可以热插拔,即插上后可以自动识别: 系统总线供电,USB共有四根线,一根电源线,一根地线,一根D+线,一根D-线,D+和D-线是差分输入线: 可以支持多种设备,且扩展容易,通过HU ...
- SELECT INTO 和 INSERT INTO区别
(1).SELECT * INTO 新表名 FROM 旧表名 (2).INSERT INTO 新表名(列名1,列名2) SELECT * FROM 旧表名 第一句新表名不存在会自动创建, 第二句需创建 ...
- MySQL主主复制
MySQL5. 主主复制 环境如下: CentOS6.4_64 MySQL5. master1:192.168.10.11 master2:192.168.10.12 1.1 配置 master1 a ...
- Bootstrap <基础三十一>插件概览
在前面布局组件中所讨论到的组件仅仅是个开始.Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以给站点添加更多的互动.即使不是一名高级的 JavaScript 开发人员,也可以着手 ...
- AOP基础—代理模式
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代 ...
- Xcode中的Version和Build的区别
Version( 应用程序发布版本号 ) Version对应的是CFBundleShortVersionString. Version 一般由产品部门确定,版本号是由分隔的整数组成的字符串,一般有2段 ...
- Cheap Hollister Clothing
(link to hollisterco site), Spectacles don't simply take care of the eye area inside sun; Putting th ...
- Ruby Cucumber环境
1.http://rubyinstaller.org/downloads 下载rubyinstaller以及developmentkit(注意版本号要对应) 2.安装rubyinstaller以及解压 ...
- Hadoop示例程序WordCount详解及实例(转)
1.图解MapReduce 2.简历过程: Input: Hello World Bye World Hello Hadoop Bye Hadoop Bye Hadoop Hello Hadoop M ...
- 【转】RadControls for Silverlight(学习1-GridView)
引用:Telerik(官 网:http://www.telerik.com/)是保加利亚的一个软件公司,专注于微软.Net平台的表示层与内容管理控件.我们提供高度稳定性和丰富性能的组件产品,并可应用在 ...