• +1

公网传输技术之SRT协议解析(下)

2022-05-17 21:01
来源:澎湃新闻·澎湃号·湃客
听全文
字号

作者:张博力

编辑:Alex

▼扫描上图二维码了解音视频技术大会更多信息▼

摘  要: 本文从 SRT 协议的工作流程谈起,着重介绍和解析了 SRT 协议的数据包结构,并举例说明如何利用 Wireshark 抓包软件进行链路故障分析,从而解决实际工作中的问题。

引  言

SRT(Secure Reliable Transport)协议即安全可靠传输协议,是一种新兴的视音频传输协议,能够在公共互联网环境下实现高质量低延时的实时视音频传输。

公网传输技术之 SRT 协议解析(上)着重讨论了如何衡量 SRT 协议的可靠程度,以及如何在不同应用场景下配置 SRT 链路的参数。本文作为下篇,将从 SRT 协议的工作流程入手,对 SRT 协议的数据包结构进行解析,之后举例介绍如何利用 Wireshark 软件进行抓包分析,从而排除链路故障或者获取链路信息。

1、SRT 协议工作流程

SRT 协议中最常用的工作模式为“呼叫 - 监听”(Caller-Listener)模式,监听方(Listener)会持续监听本方的固定 UDP 端口,呼叫方(Caller)通过访问监听方的公网 IP 地址和该固定端口来建立 SRT 连接。呼叫和监听的角色主要在 SRT 协议握手阶段起作用,无论是编码端还是解码端都可以担任呼叫者或监听者的角色。

图 1 表示了 SRT 协议的工作流程,整个流程包括握手、参数交换、数据传输、连接关闭等步骤。另外在传输有效数据时,双方会发送控制数据来完成丢包恢复、连接保持等功能。

图 1  SRT 协议工作流程

2、SRT 数据包结构

SRT 协议根据 UDT 协议(UDP-based Data Transfer Protocol) 改进而来,已经在 2020 年 3 月 10 日向 IETF 提交了 RFC 草案,这也表示 SRT 协议进入了比较稳定的发展轨道。

众所周知,SRT 的传统优势领域是点对点的实时音视频传输,而近两年,SRT 协议在上行推流方面有了迅速的发展,很多主流平台和公司都支持使用 SRT 协议来代替 RTMP 协议进行上行推流,其中的关键点就是 SRT 的 StreamID 功能,而 StreamID 功能就包含在 SRT 握手数据包的配置扩展模块中。

总的来说,SRT 协议中包含两类数据包:信息数据包(Data Packet)和控制数据包(Control Packet),他们通过 SRT 首部的最高位(标志位)来区分,0 代表信息数据包,1 代表控制数据包。控制数据包又包含了 握手(Handshake)、肯定应答(ACK)、否定应答(NAK)、对肯定应答的应答(ACKACK),保持连接(Keepalive)、关闭连接(Shutdown) 等多种类型。

2.1 信息数据包结构

图 2 展示了 SRT 信息数据包的结构,其承载了需要传输的有效数据。SRT 首部长度为 16 字节,最高位为标志位,SRT 信息数据包首部包含四个区域:数据包序列号、报文序号、时间戳、目的地端套接字 ID。

数据包序列号:SRT 使用基于序列号的数据包发送机制,发送端每发送一个数据包,数据包序列号加 1。

报文序号:报文序号独立计数,在它之前设置了四个标志位(见图 2)。

时间戳:以连接建立时间点(StartTime)为基准的相对时间戳,单位为微秒。

目的地端套接字 ID:在多路复用时用来区分不同的 SRT 流。

图 2  SRT 信息数据包

2.2 握手数据包结构

握手数据包分为 HSv4 版本(SRT 版本 <1.3)和 HSv5 版本(SRT 版本>=1.3),图 3 为 HSv5 版本握手数据包的结构,HSv5 握手数据包主要包含五个区域:SRT 首部、握手控制信息(cif.hsv5)、握手请求 / 响应扩展模块(hsreg/hsrsp)、加密扩展模块(kmreg/kmrsp)、配置扩展模块(config)。这里重点介绍前三个区域,握手数据包的结构参见图 3:

图 3  HSv5 握手数据包

1. 所有 SRT 控制数据包的首部是基本相同的,均包含四个区域:控制类型和保留区域、附加信息、时间戳、目的地端套接字,其中控制类型字段为 0 代表握手数据包。

2. 握手控制信息区域(cif.hsv5)中比较重要的字段如下:

ISN:随机生成的数据包初始序列号,之后所有的信息数据包以此为基准计数。

握手类型:该字段第一个作用是表示该握手数据包所处的握手阶段(以 “呼叫 - 监听” 模式为例,其握手分为诱导阶段 Induction 和结尾阶段 Conclusion),第二个作用对于用户来说更为重要,在握手失败后 “握手类型” 字段会显示相应的错误码,错误码所对应的错误类型见表 1。

错误码错误类型错误码错误类型

1000未知原因1008对端版本过旧

1001系统功能错误1009集合模式套接字冲突

1002对端拒绝1010密码错误

1003资源分配问题1011需要密码

1004握手中的错误数据1012Stream 标志位冲突

1005监听方 Backlog 溢出1013拥塞控制类型冲突

1006内部程序错误1014包过滤器冲突

1007该套接字已关闭1015组冲突

表 1 错误码和错误类型对应表 1

SRT 套接字 ID:该字段需要和 SRT 首部中的目的地端套接字 ID 加以区分,该字段只作用于握手阶段,而目的地端套接字 ID 作用于数据传输全过程。

同步 cookie:在 “呼叫 - 监听” 模式下,出于防止 DoS 攻击的目的,只由监听方生成同步 cookie,该 cookie 由监听方的主机、端口和当前时间生成,精确度为 1 分钟。

3. 握手请求扩展模块(HSREG)中比较重要的字段如下:

SRT 版本:只要有任何一方的 SRT 版本低于 1.3,双方就会以 HSv4 版本握手方式来建立连接,HSv4 方式握手会有三次或四次往返,而最新的 HSv5 握手只需要两次往返。出于兼容性的考虑,即使双方的 SRT 版本都高于 1.3,第一个握手请求信息也是 HSv4 格式。

SRT 标志位:共有 8 位标志位,来实现 SRT 的不同模式和功能。

发送方向延时和接收方向延时:SRT 协议 1.3 版本实现了双向传输功能,双向传输可以分别设定不同方向的固定延时。对于常规的单向传输,假设 A 向 B 发送数据,该方向的延时量 Latency 应该是 A 的发送方向延时(PeerLatency)和 B 的接收方向延时(RecLatency)的最大值,该延时量在握手阶段就已由双方协商确定。在单向传输时,有一些编解码器将它的 PeerLatency 和 RecLatency 设置成统一的值,这种简易设置方法并不会影响单向传输的工作。

4. 加密扩展模块 KMREQ 和配置扩展模块 CONFIG

由于篇幅的原因,最后两个非必需的扩展模块不再详细讨论。其中加密扩展模块(KMREQ)主要负责 SRT 的 AES128/AES192/AES256 加密功能的实现。而配置扩展模块(CONFIG)包含了四种:SRT_CMD_SID、SRT_CMD_CONGESTION、SRT_CMD_FILTER、SRT_CMD_GROUP,其中 SRT_CMD_SID 扩展模块就是负责 SRT 上行推流中不可或缺的 StreamID 功能,有兴趣的朋友可以自行抓包查看。

2.3 ACK 数据包结构

ACK 数据包是由 SRT 接收端反馈给发送端的肯定应答,发送端收到 ACK 后便会认为相应数据包已经成功送达。ACK 数据包中还包含了接收端估算的链路数据,可以作为发送端拥塞控制的参考。ACK 数据包结构见图 4,其中几个比较重要的字段如下:

图 4 ACK 控制数据包

控制类型:该字段等于 2 便表示 ACK 数据包。

附加信息:其中包含了独立计数的 ACK 序列号,该序列号主要用于 ACK 包和 ACKACK 包的一一对应。

最近一个已接收数据包的序列号 + 1:该字段的值等于最近一个已收到的信息数据包的序列号加 1,例如 ACK 包中该字段为 6,便表示前 5 个数据包均已收到,发送端可以将它们从缓冲区中踢出。需要注意本字段是和数据包序列号有关,与 ACK 序列号无关。

往返时延 RTT 估值:通过 ACK 数据包和 ACKACK 数据包估算出的链路往返时延。

往返时延 RTT 估值的变化量:该变化量能够衡量 RTT 的波动程度,数值越大表示链路 RTT 越不稳定。

接收端可用缓冲数据:表示目前接收端缓冲区有多少缓冲数据可供解码,该数值越大越好,其最大值由延时量参数(Latency)决定。

链路带宽估值:对本次链路带宽的估算值。

接收速率估值:接收端下行网络带宽的估算值。

2.4 NAK 数据包结构

当 SRT 接收端发现收到的数据包序列号不连续时,便会判断有数据包丢失,并立刻向发送方回复否定应答(NAK)数据包。此外 SRT 接收端还会以一定间隔发送周期 NAK 报告,其中包括了间隔期的所有丢失包序列号,这种重复发送 NAK 的机制主要为了防止 NAK 数据包在反向传输中丢失。NAK 数据包结构见图 5,其控制类型字段等于 3,包内含有丢失数据包的序列号列表。

图 5 NAK 控制数据包

2.5 ACKACK 数据包结构

ACKACK 的主要作用是用来计算链路的往返时延(RTT),而 RTT 作为重要的链路信息会包含在 ACK 数据包中,ACKACK 数据包结构参见图 6。首先 ACK 数据包和 ACKACK 数据包都包含有精准的时间戳和 ACK 序列号,当发送端传输给接收端 ACK 数据包时,接受端会立刻返回一个 ACKACK 数据包,之后发送端会根据 “ACK 序列号” 将 ACK 包和 ACKACK 包一一对应起来,并通过将他们的时间戳相减从而得到链路的往返时延(RTT)。

图 6 ACKACK 数据包结构

2.6 连接保持和连接关闭数据包结构

SRT 中最后两个数据包类型是连接保持(Keepalive)数据包和连接关闭(Shutdown)数据包,它们的数据包结构参见图 7 和图 8。

图 7 连接保持数据包结构

 

图 8 连接关闭数据包结构

3、Wireshark 抓包分析

Wireshark 是被业界广泛使用的开源数据包分析软件,它可以截取各类网络数据包,并显示数据包的详细信息。随着广电行业 IP 化的不断推进,Wireshark 的使用也越来越频繁,其重要性可类比于波形监视器对于 SDI 信号的作用,以及码流分析仪对于 TS 流信号的作用。

下面列举了两个利用 Wireshark 软件进行链路分析的例子:

3.1 场景一 连接失败

在 SRT 链路的搭建过程中,难免会遇到连接失败的情况,其原因是多种多样的,这时我们便可以利用 Wireshark 的抓包分析功能来判断错误的类型。

图 9 是连接失败后的抓包数据,抓包视频可参见下方视频。首先可以观察到双方在不停的交换握手数据包,说明握手没有成功,但另一方面也说明 IP 地址和端口号是设置正确的,双方能够正常通信。

在双方 SRT 版本都高于 1.3 的情况下,SRT 握手过程需要两次往返,既有四个握手数据包,并且第一个握手数据包一定是 HSv4 版本握手数据包,由此我们可以定位出第一个握手数据包。接着观察到第四个握手数据包的 “Handshake Type” 字段是 1002-Reject,含义是 “对端拒绝”,这表示双方可能在某个参数上不匹配而导致了握手失败。

我们接着查看第二个握手包,这是监听方发给呼叫方的响应,其中 “Encryption Field” 区域为 AES-128,即要求对方以 AES-128 的方式响应加密。再查看第三个握手包,这是呼叫方发给监听方的,其中 “Extended Field” 区域的 KMREQ 模块为 NOT,表示该握手包没有加密扩展模块,即没有响应对方的加密要求。

经过以上的分析,我们可以得知这次连接失败是因为 Listener 方要求对端以 AES-128 的方式响应加密要求,而 Caller 方并没有做出加密的响应。如果要成功连接,我们就需要获知 Listener 方的加密密码,并在 Caller 方选择 AES-128 的加密方式。

图 9 场景一:通过抓包分析找出故障原因

3.2 场景二 获取链路信息

互联网链路中单次往返时延(RTT-Round Trip Time) 表示了数据在发送端和接收端之间往返一次花费的时间。链路的 RTT 值以及 RTT 的波动程度决定了 SRT 链路延时量参数的设置,但实际工作中由于防火墙等原因往往难以直接获得 RTT 值,这时我们可以通过 Wireshark 软件对 ACK 数据包进行分析来获得相应信息。

通过图 10 可以看到,链路的 RTT 是 20.61 毫秒,而 RTT 的变化量是 9.786 毫秒,这也说明了该条链路的 RTT 并不稳定,而 RTT 波动意味着丢包重传需要的时间也会随之波动,从而带来整条 SRT 链路差错控制能力的波动,这也意味着我们必须依照该条链路的特性进行参数调整。

图 10 场景二:RTT 估值和 RTT 估值的变化量

总  结

SRT 协议由于其优异的性能、较低的软硬件要求、开源免费的特性,在各个领域的应用越来越广泛,最近两年在上行推流方面也有了长足的发展。掌握好 SRT 协议的数据包结构能够帮助我们使用抓包软件进行故障分析和判断,从而快速准确地解决实际工作中出现的问题,希望本文能够给大家带来一些帮助,也欢迎大家讨论和交流。

参考文献:

[1]https://datatracker.ietf.org/doc/html/draft-sharabayko-mops-srt/

[2]SRT Protocol Technical Overview[M/OL].(2018-10) [2020-07]. https://www3.haivision.com/e/38322/srt-tech/8mwjcv/1293755769?h=XZ8B52VndjJ2-4BgYxY0yd2XSxpPXDU78YojBOTOmMs

[3]https://github.com/Haivision/srt/blob/master/docs/API.md

[4]SRT Deployment Guide,v1.1,Issue 01[M/OL].(2018-10) [2020-07].www3.haivision.com/srt-alliance-guide.

延伸阅读:

公网传输技术之 SRT 协议解析 (上)

作者简介:

张博力,安徽广播电视台工程师。

    本文为澎湃号作者或机构在澎湃新闻上传并发布,仅代表该作者或机构观点,不代表澎湃新闻的观点或立场,澎湃新闻仅提供信息发布平台。申请澎湃号请用电脑访问http://renzheng.thepaper.cn。

    +1
    收藏
    我要举报
            查看更多

            扫码下载澎湃新闻客户端

            沪ICP备14003370号

            沪公网安备31010602000299号

            互联网新闻信息服务许可证:31120170006

            增值电信业务经营许可证:沪B2-2017116

            © 2014-2026 上海东方报业有限公司