【音视频第21天】RTP、RTCP结合wireshark抓包详解

news2025/1/22 8:39:06

感觉单纯看理论没啥意思,结合RTCP、RTP来看一看抓包详解

RTP

实时传输协议RTP(Realtime Transport Protocol):是针对Internet上多媒体数据流的一个传输协议, 由IETF作为RFC1889发布,现在最新的为RFC3550。RTP被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信息和实现流同步。RTP的典型应用建立在UDP上,但也可以在TCP等其他协议之上工作。RTP本身只保证实时数据的传输,并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。

RTP报文头格式

之前曾经写过一个RTP报文:https://blog.csdn.net/Magic_o/article/details/130059383?spm=1001.2014.3001.5501
RTP报文头格式(见RFC3550 Page12):
在这里插入图片描述
PT(Payload Type 负载类型)的值定义如下
在这里插入图片描述
除了上表中明确指定PT值的负载类型,还有些负载类型由于诞生的较晚,没有具体的PT值,
只能使用动态(dynamic)PT值,即96到127,这就是为什么大家普遍指定H264的PT值为96。
重新抄一遍:
Version (V)
Version 总是 2。

Padding §
Padding 是控制有效载荷是否具有填充值的布尔值。
有效负载的最后一个字节包含添加了多少填充字节的计数。

Extension (X)
如果设置的话,RTP 报头将有扩展段(可选)。这点将在下面更详细地描述。

CSRC count (CC)
在 SSRC 之后,有效负载之前的 CSRC 标识符的数量。

Marker (M)
标记位没有预设含义,用户可以根据自己的需求随意使用它。
在某些情况下,它是在用户讲话时设置的。它还通常用于标记关键帧

Payload Type (PT)
Payload Type(负载类型)是此数据包所承载的编解码器的一个唯一标识符。

对于 WebRTC,Payload Type 是动态的。一个呼叫中的 VP8 的 PT 可能与另一个呼叫中的不同。呼叫中的 offerer 确定 Payload Type 到 Session Description(会话描述符)中的编解码器的映射。

Sequence Number
Sequence Number(序列号)用于对流中的数据包进行排序。每次发送数据包时,Sequence Number 都会增加 1。

RTP 被设计为可以在有损网络上使用。这为接收器提供了一种检测数据包何时丢失的方法。

Timestamp
此数据包的采样时刻。这不是全局时钟,而是在当前媒体流中所经过的时间。举例来说,如果多个 RTP 包都属于同一视频帧,那么它们可能具有相同的时间戳。

Synchronization Source (SSRC)
SSRC 是此流的唯一标识符。这使你可以在单个 RTP 流上传输多个媒体流。

Contributing Source (CSRC)
一个列表,用于表示哪些 SSRC 参与到了这个数据包中。
这通常用于语音指示器。假设在服务器端,你将多个音频源组合到一个单独的 RTP 流中。然后,你可以在此字段中表示 " 输入流 A 和 C 此时正在讲话 “。

Payload
实际有效负载数据。如果设置了填充(padding)标记,则可能以添加的填充字节数结尾。

CSRC count (CC)
CSRC是SSRC之后和有效载荷之前的标识符。

详细可以见到https://webrtcforthecurious.com/zh/docs/06-media-communication/#packet-format%E5%8C%85%E6%A0%BC%E5%BC%8F

RTP报文抓包分析

在这里插入图片描述
在这里插入图片描述
根据您提供的帧信息,这是一个 RTP(实时传输协议) 包,它在以太网 II 上传输,长度为 1147 字节 (9176 位)。该帧的源地址为 Cisco_ba:5a:44(00🇩🇪fb:ba:5a:44),目标地址为 fa:16:3e:d0:ca:a7(fa:16:3e:d0:ca:a7)。该帧使用 IP(互联网协议) 版本 4,源地址为 112.17.79.157,目标地址为 172.21.145.154。该帧使用 UDP(用户数据报协议),源端口为 59037,目标端口为 20309。
在这里插入图片描述
这是一个 RTP(实时传输协议) 包,它被 DTLS-SRTP(数据加密协议 - 安全 rtp) 协议初始化。该包的序列号为 9632,扩展序列号为 75168,时间戳为 4038466672。该包包含一个未知的同步源标识符,其定义未知。

该包包含三个 RFC 5285(现代 RTP 协议) 头扩展。

在 RTP 包中,数据部分是一个动态 RTP 类型 (DynamicRTP-Type-96),其序列号为 96。该序列号是动态分配的,用于标识当前数据传输。

该包的 SRTP(安全 rtp) 加密载荷为 f963a0958f28c30d4c526fbdc99c8c1111da25659fcfc57287b164aad3bc41870c239d,其验证标签为 2d49a54079949ef7ffb1。
根据 DTLS-SRTP 协议,初始化协议通过一个 RTP 包进行传输,该包包含一个未知的同步源标识符。在未来的数据传输中,可以使用这个标识符来标识同步源。此外,DTLS-SRTP 还支持加密和认证,以确保数据的机密性和完整性。

RTCP

实时传输控制协议RTCP(Realtime Transport Control Protocol):负责管理传输质量,在当前应用进程之间交换控制信息,提供流量控制和拥塞控制服务。在RTP会话期间,各参与者周期性地传送RTCP包,包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料,因此,服务器可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,能以有效的反馈和最小的开销使传输效率最佳化,故特别适合传送网上的实时数据。
RTCP包括五种数据包类型(RFC3550 Page69):
在这里插入图片描述

RTCP报文头格式

每个RTCP包的开始部分是与RTP数据包相类似的固定部分,随后是一块结构化单元,它随负载类型不同长度发生变化,但是总以32比特终止.
发射机报告包由3部分组成,若定义,可能跟随第4个面向协议的扩展部分.
以SR报文为例,RTCP报文格式(RFC3550 Page35)如下:
在这里插入图片描述

Version (V)
Version 总是 2。

Padding §
Padding 是控制有效载荷是否具有填充值的布尔值。

有效负载的最后一个字节包含添加了多少填充字节的计数。

Reception Report Count (RC)
此数据包中的报告数。单个 RTCP 数据包可以包含多个事件。

Packet Type (PT)
指示 RTCP 数据包类型的唯一标识符。WebRTC Agent 不需要支持所有这些类型,并且 Agent 之间的支持能力可以是不同的。下面这些是你可能经常看到的类型:

192 - 完整的帧内请求(FIR)
193 - 否定确认(NACK)
200 - 发送方报告(SR)
201 - 接收方报告(RR)
202 - source Description (SDEC)
203 -  Goodbye(BYE)
204 - Application-defined(APP)
205 - 通用 RTP 反馈
206 - 有效负载特定反馈

RTCP报文抓包分析

以NACK为例

NACK

在这里插入图片描述

在这里插入图片描述
RTCP 帧序列号 416 是一个用于在实时通信中传输控制信息的 RTCP(Real-Time Control Protocol) 帧。
RTCP 帧长度为 72 字节 (576 位),包括帧头和数据部分的长度。RTCP 帧头包含发送者和接收者的源和目标地址,以及传输协议。
通用 RTP 反馈消息是用于报告数据传输错误的 RTP 反馈消息类型。在这种情况下,NACK 消息表明在传输过程中丢失了 8 个帧
RTCP 帧的源端口号为 20309,这是发送者的应用程序端口号。目标端口号为 59037,这是接收者的应用程序端口号。
总的来说,捕获结果表明接收者接收到了一个带有通用 RTP 反馈消息的 RTCP 帧,这表明在传输过程中丢失了 8 个帧。

PID(消息类型标识符) 用于标识传输反馈消息的类型。RTCP Transport Feedback NACK PID:19163 表示一个 NACK(否定确认) 消息被发送,以通知接收方有一定数量的帧丢失。NACK 消息通常由发送方发送,以请求接收方重新传输丢失的帧。
PID:19163 是一个用于传输反馈消息的 PID,它标识了这种消息的类型。在 RTCP 传输中,有许多不同的 PID 用于不同类型的传输反馈消息。
在这里插入图片描述
RTCP Transport Feedback NACK PID 包用于指示 RTP 包的丢失或错误,而 RTCP Transport Feedback NACK BLP 包用于指示 RTP 包的源地址或目的地址不正确。

RTCP Transport Feedback NACK BLP: Cx027d (Frames 19164 19166 19167 19168 19169 19170 19173 lost)
Frame 19164 also lost
Frame 19166 also lost
Frame 19167 also lost
Frame 19168 also lost
Frame 19169 also lost
Frame 19170 also lost
Frame 19173 also lost

https://zhuanlan.zhihu.com/p/350908977

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/468837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于PyQt5的图形化界面开发——自制Redis图形化客户端(文末附源码)

基于PyQt5的图形化界面开发——自制Redis图形化客户端 前言1. Python第三方库安装及Redis学习1.1 Python第三方库安装1.2 Redis数据库安装和基础命令 2. 登录界面2.1 login.py2.2 image_login.py 3. 主界面3.1 main_ui.py3.2 image_main.py 4.界面切换5. 写在最后(附下载链接) …

软件测试笔记(三):黑盒测试

1 黑盒测试概述 黑盒测试也叫功能测试,通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作是一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,对程序接口进行测试,只检查程序功能是否按…

Java——把数组排成最小的数

题目链接 牛客网在线oj题——把数组排成最小的数 题目描述 输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 例如输入数组[3,32,321],则打印出这三个数字能…

汇编语言(第3版)- 学习笔记 - 第1章-基础知识

汇编语言(第3版)- 学习笔记 - 第1章-基础知识 1.1 机器语言1.2 汇编语言的产生1.3 汇编语言的组成1.4 存储器1.5 指令和数据1.6 存储单元1.7 CPU对存储器的读写1.8 地址总线1.9 数据总线1.10 控制总线1.11 内存地址空间(概述)1.12 主板1.13 接口卡1.14 各…

NSSCTF-[NSSRound#X Basic]ez_z3 [MoeCTF 2022]Art [HDCTF2023]basketball

目录 NSSCTF-[NSSRound#X Basic]ez_z3 [MoeCTF 2022]Art [HDCTF2023]basketball NSSCTF-[NSSRound#X Basic]ez_z3 题目下载:下载 查壳: 发现有upx壳,但是使用upx -d命令不能脱壳,载入十六进制编辑器查看 把XYU改为UPX&#x…

netty/websocket服务器配置阿里云SSL证书安全访问配置,亲测有效

背景:java 微服务包括https访问和websocket访问,当https接口访问ws请求时报错,因为https能访问wss。 申请阿里云免费证书后,搜索各种教程比如nginx配置方式、netty访问证书等。走了不少弯路,终于走通一种。 关键点:1…

龙蜥开发者说:亲历从基础设施构建到系统质量保障,龙蜥未来可期 | 第 19 期

「龙蜥开发者说」第 19 期来了!开发者与开源社区相辅相成,相互成就,这些个人在龙蜥社区的使用心得、实践总结和技术成长经历都是宝贵的,我们希望在这里让更多人看见技术的力量。本期故事,我们邀请了龙蜥社区开发者宋彦…

【Python】值得收藏,三元一次方程组的计算,快来看看有什么新奇的~~~

三元一次方程组的计算对于大家来说都不陌生了,但是用编程语言来解决方程组问题想必还是会有些大聪明们有点迷糊的,今天就带大家来看看是怎么利用python实现方程组的解集的; 本文主要分成两部分: 解题验算综述 解题 题目1 代码 …

Security中使用Redis管理会话(模拟cookie实现)

配置redis相关 1. 配置Redis package com.zzhua.blog.config.redis;import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.cor…

【HCIP】IPV6综合实验(ripng,ospfv3,bgp,6to4)

目录 一、IP规划 二、 连通公网部分(IPv4) 三、R1、R2上IPv4+v6配置 四、IPV6部分ip配置 五、IPV6部分OSPF&BGP协议配置 Ⅰ、 ospf Ⅱ、bgp 六、联通网络 需求: 1、AR1处于IPV4,也有IPV6的地址,有两个环回 2、AR45678处…

Golang Gin 请求参数绑定与多数据格式处理

之前学习了使用Gin框架的Engine的默认路由功能解析HTTP请求。现在我们来学习gin框架的参数绑定操作和请求结果返回格式。 处理POST请求时,使用context.PostForm或者context.DefaultPostForm获取客户端表单提交的数据。 像上述这种只有username和password两个字段的表…

CS:APP 第7章链接分步编译(cpp/cc1/as/ld)遇到的问题

环境 WSL Ubuntu 22.04.2 LTS gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 问题 问题一 cc1 命令找不到 cc1 命令在 /usr/lib/gcc/x86_64-linux-gnu/11/cc1 里,注意不同操作系统等可能 cc1 的位置不一样,可以使用 find 或者 locate 命令搜索。 通过下…

聊点技术 | 架构瘦身,让Bonree ONE跑得更轻

4月21日,博睿数据ONE有引力2023春季产品发布会圆满落幕,一体化智能可观测平台Bonree ONE 2023春季正式版正式发布,这一次发布的版本更轻、更强、更智能。 Bonree ONE在上一版基础上削减50%组件数量,下架两大高耗能组件&#xff0c…

97-TCP为什么要有一个“TIME_WAIT“的状态

文章目录 1.TCP为什么要有一个"TIME_WAIT"的状态(1) 可靠的终止 TCP 连接。(2) 保证让迟来的 TCP 报文有足够的时间被识别并被丢弃 ; 2.拓展带外数据 1.TCP为什么要有一个"TIME_WAIT"的状态 "TIME_WAIT"状态存在的原因主要有两点: (1) 可靠的终…

成功经验分享,Nacos注册中心实践,带你玩转Nacos

1、什么是 Nacos ? 官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集: 注册中心配置中心服务管理 平台 nacos的特性包括: 服务发现和服务健康监测动态配置服务动态…

行人检测(人体检测)4:C++实现人体检测(含源码,可实时人体检测)

行人检测(人体检测)4:C实现人体检测(含源码,可实时人体检测) 目录 行人检测(人体检测)4:C实现人体检测(含源码,可实时人体检测) 1. 前言 2. 行人检测(人体检测)检测模型(YOLOv5) (1&#xf…

谈「效」风生 | 如何找到现有研发体系的「内耗问题」?

#第3期:如何找到现有研发体系的「内耗问题」?# 在上一期《谈到提升效能,我们应该如何下手?》我们聊到开始做研发效能的四个要点:评估现有流程、引入自动化工具、建立度量指标、持续改进。本期就围绕「评估现有研发体系…

二次创业接地气、强内功,三只松鼠从一棵树出发重造“人设”

民以食为天,自古以来,“吃”都是一门浅显与深奥并存的生意。产业链看似简单:种、收、制、卖,却足以令众多企业为之前赴后继十年、百年。 三只松鼠,正在这条变革的道路上砥砺前行。自去年4月开启全面转型以来&#xff…

C++ 赋值运算符重载

赋值运算符重载 运算符重载: C为了增强代码的可读性,可以对 运算符 进行重载,运算符重载 就是具有特殊函数名的函数,这个函数也具有返回值类型,函数名字和参数列表,它的返回值和参数列表的形式和普通函数…

基于SAM的二次开发案例收集分享

一、AnyLabeling[1]——制作人:vietanhdev AnyLabeling LabelImg Labelme Improved UI Autolabeling AnyLabeling软件是一个集成了YOLO、Segment Anything模型(AI支持)的高效数据标注工具,它可以通过点击目标的方式完成目标检…