流媒体传输协议浅析(三)可靠UDP传输方案

2023-05-16

一、引言

从流媒体的业务特征和TCP,UDP各种特点,UDP在媒体传输方面具有很大优越性,但UDP可靠性需要业务开发这投入大量的人力;相反 tcp 技术成熟,可以复用已稳定的http 服务器技术,不需要投入人力和技术解决可靠性问题,成熟,开发简单,拿来即用。故TCP在传统的流媒体协议还是广泛存在。但实际的网络拥塞,带宽不足,信号衰减会造成tcp 传输的音视频体验很糟糕。对稳定性,实时性,抗弱网抖动性的要求高的场景,UDP媒体传输技术正在崛起。

                                 

 

二、UDP传输常见使用场景:

1)视频监控

在视频监控场景,无论是RTSP,还是gb28181,媒体都是UDP承载(也存在通过TCP承载RTSP封装RTP媒体流,但这种用法不多,不符合国标用法和通用做法)

2)IPTV电视

在IPTV中,无法是点播还是直播,都是UDP承载电视节目码流。

3)会议电视

   在传统的会议电视,信令协议从h323过度到主流的sip,但媒体承载还是UDP封装的RTP流

4)音视频通话

无论是传统的VoIP还是目前互联网上流行的webrtc,也都是UDP承载的RTP码流

三、可靠性的UDP传输方案

既然udp是音视频传输的理想方案,但udp可靠性工作需要投入大量工作,技术门槛高,小团队几乎望而却步。那有没有一种可用的开源技术即具备tcp的可靠性,又具备udp的低延迟性?答案是肯定的。类似的sctp,quic,kcp的可靠UDP传输方法某些大厂开始引入媒体传输中,下面介绍几种目前比较流行的可靠UDP技术。

1)UDT(UDP-based Data Transfer Protocol)

 UDT的主要目的是支持高速广域网上的海量数据传输,所以除了在UDP之上实现类似TCP的协议和算法之外,UDT还对TCP的拥塞算法做了一些细节上的调整,包括Negative-ACK(NAK)、ACK to ACK(ACK2)、基于对数的动态AIMD等。不过UDT的重传效率较低,无效报文,实际效果并不理想。

参考实现:https://git.dorkbox.com/dorkbox/UDT/src/branch/master/src

2)KCP

KCP是一个很简单的ARQ的实现,包括选择重传和快重传等机制,对上层提供一个可靠的字节流。应用层可以使用多流复用的框架来实现对多个流的支持。另外,KCP增加了可配置启用的加密和FEC选项,FEC用的是Reed-Solomon纠删码,例如可以配置发送10%的冗余数据,来减少丢包时需要的重传,从而降低数据传输的延时。

参考实现:https://github.com/skywind3000/kcp

3)QUIC

QUIC是Google实现的一种可靠UDP传输协议,并且已经被选择作为HTTP/3的基础。它的特点有:

a)内建安全性,集成TLS

b)连接建立过程和TLS协商过程合并,减少往返请求次数,提高连接速度

c)集成多种拥塞算法,包括最新的BBR

d)多流支持,每个流有独立的拥塞控制,避免单个流中的丢包阻塞其它所有流(Head-of-line Blocking问题),更好的支持类似HTTP/2中的乱序请求

e)连接迁移:QUIC可以通过连接ID来唯一标识一个连接,当用户在有线、无线、移动网络之间切换时,可以保持上层连接的有效性,不需要再进行重连。

另外,早期的QUIC还使用了一种基于异或的FEC算法,不过在新版本中已经去掉。该协议已经在chromium中实现,参考获取方法:https://www.chromium.org/quic/playing-with-quic

4)uTP

uTP是BitTorrent中新增加的一种UDP传输协议,主要特点是使用了LEDBAT(Low Extra Delay Background Transport)拥塞算法。这种算法基于延时来检测网络拥塞,可以更早的探测到拥塞和更早的以及更大幅度的进行避让,从而避免影响用户上网操作的进行,保持后台下载跟前台操作的和平共处。

参考实现:https://github.com/bittorrent/libutp

5)SCTP(Stream Control Transmission Protocol,流控制传输协议)

准确的说,SCTP不是一种可靠UDP协议,而是一种跟TCP/UDP平级的传输层协议,是IETF在2000年指定的标准协议。目前Linux和部分UNIX已经集成,Windows和Mac需要使用第三方包来实现。SCTP最初主要用于电信系统,它的特点有:

a)跟TCP一样面向连接,提供可靠传输

b)跟UDP一样面向消息

c)多流支持

d)每个流可以配置成接受有序或无序的消息

e)Multi-Homing:可以配置多个地址,利用多条网络传输通道

f)更好的安全性:要求四次握手,避免TCP的SYN Flooding攻击

注意webrtc的sctp不是跟tcp和UDP平级的传输层协议,它是基于UDP的开发实现,详见webrtc代码或https://github.com/sctplab/usrsctp

参考:https://zhuanlan.zhihu.com/p/68466363

四、总结

以上基于UDP的可靠性传输技术在某些领域已经有成功的应用案例。在音视频传输领域可以根据业务需求,移植过来替换已有协议底层的TCP或UDP接口,改善传输性能。更多更详细信息请关注微信公众号:AV_Chat

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

流媒体传输协议浅析(三)可靠UDP传输方案 的相关文章

  • 是否可以将 char * 转换为结构?

    这是我的问题 rcvfrom 参数之一是 char 一旦我从中获取数据 我想将其转换为结构 然而选角并不成功 我究竟做错了什么 这是我所做的 struct int8 t seq int8 t ack bool flag char data
  • unix 上的 Boost UDP 套接字问题 - 绑定:地址已在使用中

    首先 我知道同一主题还有其他几个线程 但我无法在其中找到任何可以帮助我的内容 因此我将尝试非常具体地说明我的情况 我设置了一个简单的 UDP 客户端 UDP 服务器对 负责在多个并行模拟之间发送数据 也就是说 模拟器的每个实例都在单独的线程
  • 是否可以在 socket.io 中使用 UDP?

    我正在开发一款游戏 听说 UDP 更适合实时游戏 我知道 socket io 使用 TCP 并且想知道是否有某种方法可以将其切换到 UDP 我尝试查找它 但只找到了 2012 年左右的帖子 其中说 UDP 仅在浏览器中处于实验阶段 从标准浏
  • 使用 Winsock 通过单个 UDP 服务器处理 10 个客户端

    我已经使用 UDP 套接字建立了一个服务器 客户端应用程序 但我的服务器无法一次处理多个客户端 现在我想修改我的应用程序 让 10 个客户端分别运行在不同的计算机上 而我的服务器运行在单独的计算机上 我希望我的服务器能够与 10 个不同机器
  • 丢包纠错码 (UDP)

    我不知道要寻找什么 因为我从 纠错代码 中得到的只是与您不知道错误位置的情况相关的内容 因此 这些代码比我需要的要复杂得多 而且效率低下 在下文中 请注意位等于数据包 因为只有整个数据包可能会丢失 因此位类比非常适合 是否有 ECC 考虑到
  • Android udp 多播与以太网

    大家好 我正在开发一个使用 udp 多播的项目 我有一台服务器通过以太网电缆发送多播 udp 数据包 我花了几周的时间阅读有关 android 上多播的所有帖子 但我仍然无法在我的 Asus Transformer Tablet 4 1 上
  • 如何使用 ZeroMQ 处理原始 UDP?

    我有一个客户 我无法更改其代码 但我想使用 重新 编写ZeroMQ插座 客户使用原始TCP和原始的UDP插座 我知道我可以使用ZMQ ROUTER RAW对于生的TCP插座 但是原始的怎么样 UDP数据流 ZeroMQ 中对 UDP 的支持
  • Python-UDP客户端

    我目前正在阅读Pythonbook https www nostarch com blackhatpython并遇到了以下示例 import socket target host 127 0 0 1 target port 80 creat
  • Android 上的 UDP 视频流

    我有一个 Android 项目 需要构建一个客户端应用程序来接收 UDP 或 RTP 单播视频流并播放它们 不幸的是 我似乎无法使其正常工作 并且已经广泛搜索了解决方案 我已经在 Xoom Android 3 2 和 Nexus S And
  • 将 Docker 容器连接到网络接口/设备而不是 IP 地址

    经过仔细的研究 测试和摆弄 我只能找到通过从 IP 端口转发来将 Docker 容器连接到给定接口的方法 这可以通过添加来完成 p Host IP Host Port Container Port to a docker run命令 我有一
  • 当网络上的所有计算机都具有相同的公共IP地址时,如何向特定计算机发送UDP数据包? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 这就是问题 它非常简单 理解 我家里有 2 台电脑 它们都有相同的公共 IP 地址 例如 1 2 3 4 我在咖啡馆有一台计算机 不同的网络 因此它具
  • 如何监听任意端口的广播包?

    使用 NET 如何在任何端口上侦听发送到 255的udp广播数据包 而不需要绑定到特定端口 我自己找到了办法 它是这样工作的 mainSocket new Socket AddressFamily InterNetwork SocketTy
  • Java UDP 服务器,并发客户端

    下面的代码足以接受并发 UDP 传输吗 更具体地说 如果 2 个客户端同时传输 当我调用 receive 时 DatagramSocket 会将传输排队并一一传送它们 还是只有一个能够通过 DatagramSocket socket new
  • C#/Unity - 无法从异步方法调用 Unity 方法

    我正在使用Unity3D 这是我的异步方法 private void Receive IAsyncResult ar try IPEndPoint ipEndPoint null byte data udpClient EndReceive
  • TCP 兼容性:为什么 TCP 不兼容数据包广播和组播操作?

    http en wikipedia org wiki User Datagram Protocol http en wikipedia org wiki User Datagram Protocol 与 TCP 不同 UDP 与数据包广播
  • 我刚刚在哪个适配器上收到此 UDP 数据包?

    我正在尝试用 C 编写一个 BOOTP 服务器 我正在接收并解析来自客户端的 BOOTP 数据包 我需要回复我的服务器 IP 地址 问题是 计算机可以有多个网络适配器 客户端还没有 IP 地址 有什么方法可以查出 UDP 数据包是在哪个适配
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • 接收UDP数据包

    假设我的程序通过网络 UDP 发送 1000 字节 它是否保证接收方将 一批 接收 1000 个字节 或者他可能需要执行多次 读取 直到收到完整的消息 如果后者为真 我如何确保同一消息的数据包顺序不会 混淆 按顺序 或者协议可能保证这一点
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 为什么 SNMP 通常在 UDP 上运行而不是 TCP/IP 上?

    今天早上 工作中出现了大问题 因为 SNMP 陷阱没有 通过 因为 SNMP 是通过 UDP 运行的 我记得在大学网络课上 UDP 不能像 TCP IP 那样保证传输 维基百科说 SNMP 可以在 TCP IP 上运行 但 UDP 更常见

随机推荐

  • prometheus监控k8s集群

    prometheus监控k8s集群 实现思路 pod性能 xff1a 使用cadvisor进行实现 xff0c 监控容器的CPU 内存利用率 Node性能 xff1a 使用node exporter实现 xff0c 主要监控节点CPU 内存
  • centos7部署vsftpd虚拟用户

    vsftpd部署 一 xff1a 安装vsftpd 1 首先要查看你是否安装vsftpd rpm qa grep vsftpd vsftpd 3 0 2 10 el7 x86 64 2 安装vsftpd yum install y vsft
  • Ceph OSD扩容与缩容

    在企业生产环境中 xff0c 随着时间的迁移数据会存在磁盘空间不足 xff0c 或者机器节点故障等情况 OSD又是实际存储数据 xff0c 所以扩容和缩容OSD就很有必要性 随着我们数据量的增长 xff0c 后期可能我们需要对osd进行扩容
  • mysql的条件查询基础知识(一)

    一 xff1a 条件查询基础知识 语法 xff1a select 查询列表 from 表名 where 筛选条件 二 xff1a 分类 xff1a 主要分为3类 xff1a 一 按条件表达式筛选 简单条件运算符 xff1a gt lt 61
  • 【C++构造函数后面的冒号作用】

    C 43 43 构造函数后面的冒号作用 功能1 对基类进行初始化2 对类成员进行初始化3 对类中const变量进行初始化 功能 1 对基类进行初始化 多重继承中 xff0c 对多个基类进行初始化 冒号后面有多个参数 xff0c 中间用逗号隔
  • mysql基础知识常见函数(二)

    一 xff1a 常见函数概念 概念 xff1a 类似于java的方法 xff0c 将一组逻辑语句封装在方法体中 xff0c 对外暴露方法名 好处 xff1a 1 隐藏了实现细节 2 提高代码的重用性 调用 xff1a select 函数名
  • mysql基础知识分组函数跟分组查询(三)

    一 xff1a 分组函数 功能 xff1a 用作统计使用 xff0c 又称为聚合函数或统计函数或组函数 分类 xff1a sum 求和 avg 平均值 max 最大值 min 最小值 count 计算个数 特点 xff1a 1 sum av
  • $*和$@的区别

    一 xff1a 解析 xff1a 会把接收到的所有参数当成一个整体对待 xff0c 表示一个参数 64 会对待接收到的所有参数进行区分 以空格分隔开 xff0c 独立的多个参数 二 xff1a 举例说明 root 64 fengge sh
  • mysql性能瓶颈排查

    mysql性能瓶颈排查 top free vmstat sar mpstat 查看mysqld进程的cpu消耗占比 确认mysql进程的cpu消耗是 user 还是sys 高 确认是否是物理内存不够用了 确认是否有swap产生 使用下面工具
  • centos7系统提示no space left on device

    一 操作报错 no space left on device 但是查看系统磁盘占用空间 xff0c 却还有空闲 xff0c 说明是inodes占用满了 二 查看磁盘系统的inodes使用情况 三 要解决这问题 xff0c 只需找出 xff0
  • page_cleaner

    MySQL Error Log 中IO写入瓶颈的警告分析 在一台MySQL实例上频繁做大批量的写入测试 xff0c 无意中发现MySQL的errorlog中频繁出现如下的Note xff1a page cleaner 1000ms inte
  • mysql的存储函数与存储过程

    1 存储过程概述 我们前面所学习的 MySQL 语句都是针对一个表或几个表的单条 SQL 语句 xff0c 但是在数据库的实际操作中 xff0c 经常会有需要多条 SQL 语句处理多个表才能完成的操作 例如 xff0c 为了确认学生能否毕业
  • 逆变

    去年今日此门中 xff0c 人面桃花相映红 人面不知何处去 xff0c 桃花依旧笑春风 去年的今天 xff0c 刚高考完的我正处于迷茫与蹉跎之中 xff0c 想起那时候的我 xff0c 怀着此种状态 xff0c 想必也无可厚非吧 xff01
  • 使用SecureCRT+VNCViewer进行端口转发,修改端口映射

    1 设置本地端口转发属性 xff0c 设置成功后 xff0c 此时已经将服务器上的5901端口映射到windows本地的5901端口 2 打开本机VNCViewer进行远程连接的配置 3 打开该远程连接 xff0c 进行5000端口和999
  • 面试题目积累

    题目一 xff1a 如何配置寄存器 xff08 1 xff09 通过手册 一 找到要操作IO口的基地址 二 找到端口输入寄存器的地址偏移 三 找到输入数据寄存器中具体的端口数据位 2 操作IO口 一 找到基地址 二 找到偏移地址 xff0c
  • FreeRTOS学习笔记-Stream Buffer

    FreeRTOS学习笔记 Stream Buffer 概述关键函数课程示例StreamBuffer 创建 发送与接收StreamBuffer查询接收添加监控任务 xff0c 确定StreamBuffer大小 概述 关键函数 span cla
  • 色彩表示与编码

    图片中的代码 xff0c 依旧是RGB色值的表示 在计算机中 xff0c RGB的每个通道 xff0c 通常都以8位2进制空间来存储 xff0c 因此能对每个通道进行256阶分级 xff1a 以10进制数表示时 xff0c 范围为0 255
  • 程序猿小白的2016—不忘初心,继续奋斗

    回顾过去的一年 xff0c 酸甜苦辣各种滋味 这一年很不一样 xff0c 离开了大学校门 xff0c 在社会上也体验了一把 思想逐渐成熟起来 xff0c 2016已然成为过去 xff0c 却带给了自己很多难忘的经历 完美的毕业设计 作为一名
  • 流媒体传输协议浅析(二)UDP媒体传输

    一 引言 既然UDP天然适合流媒体场景 xff0c 为什么还存在TCP的流媒体协议 xff1f UDP的实时性 xff0c 低延迟 xff0c 又支持组播 xff0c 确实适合音视频场景 xff0c 但由于UDP是不稳定不可靠传输技术 xf
  • 流媒体传输协议浅析(三)可靠UDP传输方案

    一 引言 从流媒体的业务特征和TCP xff0c UDP各种特点 xff0c UDP在媒体传输方面具有很大优越性 xff0c 但UDP可靠性需要业务开发这投入大量的人力 xff1b 相反 tcp 技术成熟 xff0c 可以复用已稳定的htt