这几天写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. android studio 导入一个已有的android studio project作为lib使用

    android studio 导入一个已有的android studio project作为lib使用 新项目来了. 需要搭建框架. android studio对我来说还是很陌生,之前一个项目在同事 ...

  2. PHP 捕捉错误,记录到日志

    register_shutdown_function("shutdown"); define('ERR_LOG_FILE', '/dev/shm/php_log.txt'); if ...

  3. C++中的static关键字的总结

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...

  4. CVPR历年Best Papers

    作者:我爱机器学习原文链接:CVPR历年Best Papers CVPR (Computer Vision)(2000-2016) 年份 标题 一作 一作单位 2016 Deep Residual L ...

  5. R语言入门系列1--数学狗还是做数据好了

    nanana,作为一个不合格的数学专业学生,脑袋不好使,又穷逼,只好学点儿实用的东西,希望能养活自己~~~ 不瞎哔哔,想做数据方面工作的时候在犹豫是学R还是学python,一点儿python基础都没有 ...

  6. jQuery focus、blur事件 添加、删除类名

    jQuery.focusblur = function(ele,className){ var focusblurid = $(ele); focusblurid.focus(function(){ ...

  7. zip压缩命令的使用

    file命令可以查看文件的类型 tar类型 .tar gzip类型   .gz  bzip2类型  .bz2 zip类型    .zip 如果一个压缩文件由tar命令解压的前提,2个条件 1.这个文件 ...

  8. SPRING 标签库

    打造专属自己的淘宝旺铺装修店铺优化商品推广网站客服工作物流发货 如果这个User的宿舍在Gryffindor(Gryffindor是哈利·波特在Hogwarts的宿舍——译者注), 那么“House” ...

  9. Javascript轮播 支持平滑和渐隐两种效果(可以只有两张图)

    先上两种轮播效果:渐隐和移动   效果一:渐隐 1 2 3 4 效果二:移动 1 2 3 4 接下来,我们来大致说下整个轮播的思路: 一.先来看简单的,移动的,先上来一个图----移动效果图: 说明: ...

  10. firefox浏览器中silverlight无法输入问题

    firefox浏览器中silverlight无法输入问题 今天用firefox浏览silverlight网页,想在文本框中输入内容,却没想到silverlight插件意外崩溃了.google一下,发现 ...