记录一个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 ~~

时间: 2024-12-09 04:46:38

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

记录一个小技巧,在一个包下的多个main函数调试

在eclipse中,有好几个class想做测试,又不想工程太多,都写在了一个包里面,也方便import 但是每次运行的时候,eclipse都默认运行第一次建立的那个main函数. 要想运行其他的,需要做一下修改. 在工具栏中, 点击run旁边的下拉箭头,会出现一个下拉菜单. 点击Run Configurations 进入到配置界面 在标注红色的区域,上面那个是选取工程,下面那个是选取该工程的主函数 在这里点search,找到你刚写的新的主函数,如果里面还看不到,可以手动输入就好了 然后点击app

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

目录 1. 两种丢包处理策略 2. 前向纠错(FEC) 3. 丢包重传(ARQ) [参考文献] 1. 两种丢包处理策略 为了保证实时性,通常适应UDP协议来针对RTP数据进行传输,而UDP无法保证数据传输的质量,所以在网络环境不好的时候,丢包是经常出现的问题,有什么策略来改善这个问题吗? 常用的方法有: 丢包重传(ARQ)和前向纠错(FEC). 通常抗丢包有两种方式,FEC和ARQ.FEC是前向冗余,举个例子,发送数据A和B,增加发送一个数据C等于A和B的异或.接收方接到这3个包的任意2个包,异

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

1 现象 近期对一款基于QCA方案.有线Phy为AR8033.WiFi双频且支持iEEE802.11AC的WLAN产品进行了深度验证,发现有线口同部分PC机直连时,WiFi终端ping 该PC机时总是丢包,有时高达20%:但通过交换机再接PC机时,又不会丢包.一直以为是偶现,所以未引起重视,反正跑流性能与稳定性都没有任何影响.后来新购了一批千兆有线口的便携机进行配套验证时,发现每台都是如此,ping包丢得一塌涂地.在WLAN设备和PC机上分别开启抓包工具,可以看到设备已发包,但PC机未收到报文:

UDP 收/发 广播包

网络通信基础 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用过程: 1. 初始化网络库 2. 创建SOCK_DGRAM类型的Socket. 3. 绑定套接字. 4. 发送.接收数据. 5. 销毁套接字. 6. 释放网络库. 广播数据包的原理: 专门用于同时向网络中所有工作站进行发送的一个地址叫做广播地址.在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的

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

最近在做一个项目,在这之前,做了个验证程序. 发现客户端连续发来1000个1024字节的包,服务器端出现了丢包现象. 纠其原因,是服务端在还未完全处理掉数据,客户端已经数据发送完毕且关闭了. 我用过sleep(10),暂时解决这个问题,但是这不是根本解决办法,如果数据量大而多,网络情况不太好的话,还是有可能丢失. 你试着用阻塞模式吧... select...我开始的时候好像也遇到过..不过改为阻塞模式后就没这个问题了... 采用回包机制,每个发包必须收到回包后再发下一个 UDP丢包是正常现象,因

openStack 云平台管理节点管理网口流量非常大 出现丢包严重 终端总是时常中断问题调试及当前测试较有效方案

tuning for Data Transfer hosts connected at speeds of 1Gbps or higher <一.本次OpenStack系统调试简单过程简单记录> 1,dmesg 日志,丢包问题关键原因定位; [101231.909932] net_ratelimit: 85 callbacks suppressed 2,ethstatus -i p5p1 实时追踪网口TX/RX状态; 3,具体内核等相关参数调整 # recommended default co

libpcap丢包原理分析及Fedora 9 内核2.6.25.14下安装PF-RING的详细过程

看到网上有人讲解fedora 9下安装PF-RING的过程,都是几年前的了,比较老了,我安装PF-RING就是为了使用libpcap库,libpcap的原理是通过socket 将数据包从网卡 捕获数据包,然后在提交给应用程序,和winpcap很大的区别是,libpcap采用的是2个缓冲区,内核类似的一个乒乓操作,详细见我的庖丁解牛 --winpcap源码彻底解密一系列的文章.winpcap采用的是环状缓冲区,在winpcap下当网卡有数据到来时,npf.sys就会将数据拷贝 到内核缓冲区中,而内

一次由于网卡流量跑满引起的服务器丢包总结

最近收到线上一台DB服务器ping丢包,丢包率一直在30%左右.通过Zabbix监控查看了服务器CPU,内存都很正常,网卡流量也不高,基本在100M左右. 首先确认一下服务器硬件是否正常,由于没有收到硬件报警.登录服务器通过HP管理工具在此确认了硬件信息都正常(硬盘,缓存卡,内存等).  第二步在排查一下系统问题,通过top,ps等命令也没有发现什么异常,基本上排除系统问题.  第三步查看了一下该服务器上联监控机端口流量,也都很正常,由于收到只有这一台服务器报警,也排除了上联交换机故障问题. 

网络丢包的四大原因和修复方法

网络链接阻塞数据在网络传输过程中会经过很多设备和网络链接,只要其中一个网络链接在数据到达之前已经满负载了,那么数据将会在这里阻塞一段时间.如果说网络设备非常落后,那么网络链接就没有足够的等待空间给新数据,它唯一能做的就是将信息丢弃. 修复方法:A增加阻塞链接的带宽B使用Qos(流量优先级和资源保留控制机制)优先处理实时应用.尽管这种方法并不能缓解网络链接阻塞情况,但是它可以优先处理语音和视频来降低断线的可能性. 设备性能(路由器.防火墙.交换机)在带宽充足的情况下,如果你的路由器.防火墙.交换机