RTSP RTP RTCP协议区分方法技术文档

1. 文档概述

1.1 文档目的

本文档旨在详细阐述RTSP(Real Time Streaming Protocol)、RTP(Real-time Transport Protocol)和RTCP(RTP Control Protocol)三种协议的技术特点、报文格式和识别方法,帮助网络工程师、开发人员和安全分析人员准确区分和理解这三种在流媒体传输中密切相关的协议。

1.2 适用范围

  • 网络协议分析人员
  • 流媒体系统开发人员
  • 网络安全监控人员
  • 网络故障排查工程师

1.3 三种协议的角色定位

在流媒体传输系统中,RTSP、RTP和RTCP各司其职:

  • RTSP:负责流媒体会话的建立、控制和终止,是应用层的控制协议
  • RTP:负责实际媒体数据的传输,是传输层的传输协议
  • RTCP:负责RTP传输的质量监控和同步,是RTP的配套控制协议

三者协同工作,共同完成流媒体的实时传输任务。


2. RTSP协议详解

2.1 RTSP协议简介

RTSP(Real Time Streaming Protocol,实时流传输协议)是由RealNetworks、Netscape和哥伦比亚大学共同开发的,定义在RFC 2326中的应用层协议。RTSP主要用于控制具有实时特性的数据(如音频、视频)的传输,它本身并不传输数据,而是充当"网络远程控制"的角色。

2.2 协议特点

  • 协议层次:应用层协议(OSI第7层)
  • 传输协议:主要基于TCP,也可使用UDP
  • 协议类型:文本协议(类似HTTP)
  • 连接方式:面向连接(使用TCP时)或无连接(使用UDP时)
  • 默认端口:554(TCP/UDP)

2.3 报文格式

RTSP报文分为请求报文和响应报文两种类型。

2.3.1 请求报文格式
请求行
请求头
空行
消息体(可选)

请求行格式:

方法 SP 请求URI SP RTSP版本 CRLF

常用方法:

  • DESCRIBE:获取媒体描述信息(SDP格式)
  • SETUP:建立传输会话,指定传输方式
  • PLAY:开始播放,指定播放范围
  • PAUSE:暂停播放
  • TEARDOWN:终止会话
  • OPTIONS:查询服务器支持的方法
  • ANNOUNCE:向服务器发送媒体描述
  • RECORD:开始录制
2.3.2 响应报文格式
状态行
响应头
空行
消息体(可选)

状态行格式:

RTSP版本 SP 状态码 SP 原因短语 CRLF

常见状态码:

  • 200 OK:请求成功
  • 400 Bad Request:请求语法错误
  • 404 Not Found:资源未找到
  • 455 Method Not Valid in This State:方法在当前状态无效
  • 500 Internal Server Error:服务器内部错误

2.4 协议示例

2.4.1 DESCRIBE请求示例
DESCRIBE rtsp://example.com/media.mp4 RTSP/1.0
CSeq: 1
User-Agent: LibVLC/3.0.0
Accept: application/sdp

2.4.2 DESCRIBE响应示例
RTSP/1.0 200 OK
CSeq: 1
Content-Type: application/sdp
Content-Length: 443

v=0
o=- 0 0 IN IP4 192.168.1.100
s=Media Presentation
c=IN IP4 192.168.1.100
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=control:trackID=0
m=audio 0 RTP/AVP 97
a=rtpmap:97 MPEG4-GENERIC/48000/2
a=control:trackID=1
2.4.3 SETUP请求示例
SETUP rtsp://example.com/media.mp4/trackID=0 RTSP/1.0
CSeq: 2
Transport: RTP/AVP/UDP;unicast;client_port=5000-5001
User-Agent: LibVLC/3.0.0

2.4.4 PLAY请求示例
PLAY rtsp://example.com/media.mp4 RTSP/1.0
CSeq: 3
Range: npt=0.000-
Session: 12345678
User-Agent: LibVLC/3.0.0

2.5 RTSP识别特征

  1. 端口特征:默认使用554端口(TCP或UDP)
  2. 文本协议:报文为可读的ASCII文本
  3. 关键词识别:
    • 请求行包含:RTSP/1.0
    • 常见方法:DESCRIBE、SETUP、PLAY、PAUSE、TEARDOWN
    • 响应行包含:RTSP/1.0 200 OK等状态码
  4. 报文结构:类似HTTP,包含请求/响应行、头部字段、空行和可选消息体

3. RTP协议详解

3.1 RTP协议简介

RTP(Real-time Transport Protocol,实时传输协议)定义在RFC 3550中,是一个网络传输协议,用于在互联网上传输音频和视频等实时数据。RTP通常运行在UDP之上,但也可以运行在其他传输协议上。

3.2 协议特点

  • 协议层次:传输层协议(OSI第4层)
  • 传输协议:主要基于UDP
  • 协议类型:二进制协议
  • 连接方式:无连接
  • 端口范围:动态分配,通常为偶数端口(如5000、5002、5004等)

3.3 RTP报文格式

RTP报文由固定头部(Fixed Header)和载荷数据(Payload Data)组成。

3.3.1 RTP固定头部结构

RTP固定头部长度为12字节,结构如下:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X|  CC   |M|     PT      |       sequence number         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           timestamp                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           synchronization source (SSRC) identifier            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

字段说明:

  • V (Version, 2 bits):RTP版本号,当前为2
  • P (Padding, 1 bit):填充位,指示数据包末尾是否有填充字节
  • X (Extension, 1 bit):扩展位,指示固定头部后是否有扩展头部
  • CC (CSRC Count, 4 bits):CSRC计数,指示CSRC标识符的个数(0-15)
  • M (Marker, 1 bit):标记位,具体含义由载荷类型定义(如视频帧结束标记)
  • PT (Payload Type, 7 bits):载荷类型,标识RTP载荷的格式
  • Sequence Number (16 bits):序列号,每发送一个RTP包递增1,用于检测丢包和重排序
  • Timestamp (32 bits):时间戳,反映RTP数据包中第一个字节的采样时刻
  • SSRC (32 bits):同步源标识符,唯一标识RTP流的源
3.3.2 CSRC列表(可选)

如果CC字段不为0,固定头部后会有CSRC列表,每个CSRC标识符占4字节。

3.3.3 扩展头部(可选)

如果X字段为1,会有扩展头部:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      defined by profile       |           length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        header extension                       |
|                             ....                              |

3.4 载荷类型(Payload Type)

RTP载荷类型用于标识载荷的编码格式,常见值包括:

PT值编码格式说明
0PCMUG.711 μ-law
8PCMAG.711 A-law
18G729G.729音频编码
26JPEGJPEG视频
31H261H.261视频编码
32MPVMPEG-1/2视频
33MP2TMPEG-2传输流
96动态动态分配(H.264等)
97动态动态分配(AAC等)

3.5 RTP报文示例

3.5.1 H.264视频RTP包(十六进制)
80 60 12 34 56 78 9a bc 12 34 56 78 [H.264载荷数据...]

解析:

  • 80 = 1000 0000:V=2, P=0, X=0, CC=0
  • 60 = 0110 0000:M=0, PT=96(动态载荷类型,H.264)
  • 12 34:序列号 = 0x1234 = 4660
  • 56 78 9a bc:时间戳 = 0x56789abc
  • 12 34 56 78:SSRC = 0x12345678

3.6 RTP识别特征

  1. 端口特征:动态分配的偶数端口(如5000、5002、5004等)
  2. 二进制协议:报文为二进制格式
  3. 头部特征:
    • 第一个字节的高2位必须为10(V=2)
    • 固定头部长度为12字节(不含CSRC和扩展)
    • 序列号连续递增
    • 时间戳递增(可能有跳跃)
  4. 传输特征:基于UDP,无连接,可能丢包

4. RTCP协议详解

4.1 RTCP协议简介

RTCP(RTP Control Protocol,RTP控制协议)是RTP的配套协议,定义在RFC 3550中。RTCP本身不传输媒体数据,而是提供RTP会话的监控、同步和会话管理功能。

4.2 协议特点

  • 协议层次:传输层协议(OSI第4层)
  • 传输协议:基于UDP
  • 协议类型:二进制协议
  • 连接方式:无连接
  • 端口范围:RTP端口+1(通常为奇数端口,如5001、5003、5005等)
  • 传输频率:通常占RTP会话总带宽的5%

4.3 RTCP报文格式

RTCP报文由多个RTCP包组成,每个RTCP包都有公共头部。

4.3.1 RTCP公共头部结构
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|    RC   |       PT      |             length            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         payload                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

字段说明:

  • V (Version, 2 bits):版本号,必须为2
  • P (Padding, 1 bit):填充位
  • RC (Reception Report Count, 5 bits):接收报告计数,具体含义取决于包类型
  • PT (Packet Type, 8 bits):包类型,标识RTCP包的类型
  • Length (16 bits):长度字段,以32位字为单位,减1(包含头部)
4.3.2 RTCP包类型
PT值包类型名称说明
200SRSender Report发送者报告
201RRReceiver Report接收者报告
202SDESSource Description源描述
203BYEGoodbye离开通知
204APPApplication-defined应用定义
205RTPFBTransport layer FB message传输层反馈
206PSFBPayload-specific FB message载荷特定反馈

4.4 主要RTCP包类型详解

4.4.1 SR (Sender Report) - 发送者报告

SR包由RTP数据发送者发送,包含发送统计信息和接收统计信息。

SR包结构:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|    RC   |   PT=200=SR   |             length            |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|                         SSRC of sender                        |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|              NTP timestamp, most significant word             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             NTP timestamp, least significant word             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         RTP timestamp                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     sender's packet count                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      sender's octet count                    |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|                 SSRC_1 (SSRC of first source)                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| fraction lost |       cumulative number of packets lost       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           extended highest sequence number received           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      interarrival jitter                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         last SR (LSR)                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   delay since last SR (DLSR)                  |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|                 SSRC_2 (SSRC of second source)                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              ...                              |
4.4.2 RR (Receiver Report) - 接收者报告

RR包由RTP数据接收者发送,只包含接收统计信息(无发送统计信息)。

4.4.3 SDES (Source Description) - 源描述

SDES包包含源的描述信息,如CNAME(规范名称)、NAME(用户名)、EMAIL等。

4.4.4 BYE - 离开通知

BYE包用于指示一个或多个源离开会话。

4.5 RTCP报文示例

4.5.1 SR包示例(十六进制)
81 c8 00 0c 12 34 56 78 [NTP时间戳] [RTP时间戳] [包计数] [字节计数] [接收报告块...]

解析:

  • 81 = 1000 0001:V=2, P=0, RC=1(1个接收报告块)
  • c8 = 1100 1000 = 200:PT=200(SR包)
  • 00 0c:长度 = 0x000c = 12(32位字,减1后为11)
  • 12 34 56 78:发送者SSRC

4.6 RTCP识别特征

  1. 端口特征:RTP端口+1(奇数端口,如5001、5003、5005等)
  2. 二进制协议:报文为二进制格式
  3. 头部特征:
    • 第一个字节的高2位必须为10(V=2)
    • 第二个字节的PT字段为200-206(常见RTCP包类型)
    • 包长度字段以32位字为单位
  4. 传输特征:
    • 基于UDP
    • 传输频率低(约占5%带宽)
    • 通常与RTP配对出现

5. 协议区分方法

5.1 基于端口的识别方法

5.1.1 端口识别规则
协议默认/典型端口端口特征
RTSP554固定端口(TCP/UDP)
RTP动态分配通常为偶数端口(如5000、5002、5004)
RTCP动态分配通常为奇数端口,RTP端口+1(如5001、5003、5005)
5.1.2 端口识别注意事项
  • RTSP的554端口是标准端口,但实际应用中可能使用其他端口
  • RTP/RTCP端口在RTSP SETUP阶段协商确定
  • RTP和RTCP端口通常成对出现,相差1
  • 某些实现可能使用非标准的端口分配方式

5.2 基于报文格式的识别方法

5.2.1 RTSP识别方法

文本协议特征:

  1. 报文为可读的ASCII文本
  2. 请求行包含RTSP/1.0关键字
  3. 常见方法关键词:
    • DESCRIBE
    • SETUP
    • PLAY
    • PAUSE
    • TEARDOWN
    • OPTIONS
  4. 响应行包含状态码(如200 OK、404 Not Found)
  5. 头部字段格式类似HTTP(CSeq:、Session:、Transport:等)

识别示例:

检测到端口554上的TCP连接
检查前几个字节是否为ASCII文本
查找"RTSP/1.0"关键字
查找RTSP方法关键字(DESCRIBE、SETUP等)
5.2.2 RTP识别方法

二进制协议特征:

  1. 固定头部第一个字节的高2位必须为10(二进制1000 0000到1011 1111,即0x80-0xBF)
  2. 固定头部长度为12字节(不含CSRC和扩展)
  3. 序列号字段连续递增(可能有回绕)
  4. 时间戳字段递增(可能有跳跃)
  5. SSRC字段在同一流中保持不变

识别算法:

1. 检查UDP包大小(至少12字节)
2. 检查第一个字节:高2位是否为10(V=2)
3. 检查载荷类型字段(PT,第2字节的低7位)
4. 检查序列号是否连续或接近连续
5. 检查时间戳是否合理递增

识别示例:

十六进制数据:80 60 12 34 56 78 9a bc 12 34 56 78 ...
解析:
- 0x80 = 1000 0000:V=2 ✓
- 0x60 = 0110 0000:PT=96(动态载荷类型)
- 序列号:0x1234
- 时间戳:0x56789abc
- SSRC:0x12345678
结论:这是RTP包
5.2.3 RTCP识别方法

二进制协议特征:

  1. 固定头部第一个字节的高2位必须为10(V=2)
  2. 第二个字节的PT字段为200-206(常见RTCP包类型)
  3. 长度字段以32位字为单位
  4. 包大小通常较小(几十到几百字节)
  5. 传输频率低

识别算法:

1. 检查UDP包大小(至少8字节)
2. 检查第一个字节:高2位是否为10(V=2)
3. 检查第二个字节的PT字段:
   - 200 = SR(发送者报告)
   - 201 = RR(接收者报告)
   - 202 = SDES(源描述)
   - 203 = BYE(离开通知)
4. 检查端口是否为奇数(RTP端口+1)
5. 检查传输频率(RTCP通常低频传输)

识别示例:

十六进制数据:81 c8 00 0c 12 34 56 78 ...
解析:
- 0x81 = 1000 0001:V=2 ✓, RC=1
- 0xc8 = 1100 1000 = 200:PT=200(SR包)✓
- 长度:0x000c = 12(32位字)
- SSRC:0x12345678
结论:这是RTCP SR包

5.3 基于协议交互流程的识别

5.3.1 典型交互流程
客户端                    服务器
  |                         |
  |----DESCRIBE (RTSP)----->|
  |<---200 OK (RTSP)--------|
  |                         |
  |----SETUP (RTSP)-------->|
  |<---200 OK (RTSP)--------|
  |   (协商RTP/RTCP端口)     |
  |                         |
  |----PLAY (RTSP)--------->|
  |<---200 OK (RTSP)--------|
  |                         |
  |<---RTP数据包 (UDP)------|
  |<---RTCP包 (UDP)---------|
  |<---RTP数据包 (UDP)------|
  |<---RTCP包 (UDP)---------|
  |        ...              |
  |                         |
  |----TEARDOWN (RTSP)----->|
  |<---200 OK (RTSP)--------|
5.3.2 流程识别要点
  1. RTSP会话建立:先有RTSP的DESCRIBE/SETUP/PLAY请求
  2. 端口协商:SETUP响应中包含Transport头部,指定RTP/RTCP端口
  3. 数据传输:RTP/RTCP在协商的端口上传输
  4. 会话终止:TEARDOWN请求终止会话

5.4 基于工具的识别方法

5.4.1 Wireshark识别

Wireshark可以自动识别这三种协议:

  1. RTSP识别:

    • 过滤器:rtsp
    • 特征:显示为"RTSP"协议,可展开查看请求/响应详情
    • 统计:Statistics -> Protocol Hierarchy可查看RTSP流量
  2. RTP识别:

    • 过滤器:rtp
    • 特征:显示为"RTP"协议,可查看序列号、时间戳、载荷类型
    • 分析:Telephony -> RTP -> RTP Streams可分析RTP流
  3. RTCP识别:

    • 过滤器:rtcp
    • 特征:显示为"RTCP"协议,可查看包类型(SR/RR/SDES等)
    • 分析:Telephony -> RTP -> RTP Stream Analysis包含RTCP统计
5.4.2 tcpdump识别

使用tcpdump抓包并分析:

# 抓取RTSP流量(端口554)
tcpdump -i eth0 port 554 -A

# 抓取RTP流量(假设端口5000-5010)
tcpdump -i eth0 portrange 5000-5010 -x

# 识别RTP包(检查第一个字节)
tcpdump -i eth0 'udp and (udp[0] & 0xc0) == 0x80'

# 识别RTCP包(检查PT字段为200-206)
tcpdump -i eth0 'udp and udp[1] >= 200 and udp[1] <= 206'
5.4.3 自定义识别脚本

Python示例(使用scapy):

from scapy.all import *

def identify_protocol(packet):
    if packet.haslayer(TCP) and packet[TCP].dport == 554:
        payload = bytes(packet[TCP].payload)
        if b'RTSP/1.0' in payload or b'DESCRIBE' in payload:
            return "RTSP"
    
    if packet.haslayer(UDP):
        payload = bytes(packet[UDP].payload)
        if len(payload) >= 12:
            # 检查RTP
            if (payload[0] & 0xC0) == 0x80:  # V=2
                pt = payload[1] & 0x7F
                if pt < 200:  # RTP载荷类型通常<200
                    return "RTP"
                elif 200 <= pt <= 206:  # RTCP包类型
                    return "RTCP"
    return "Unknown"

# 使用示例
packets = rdpcap("capture.pcap")
for pkt in packets:
    proto = identify_protocol(pkt)
    print(f"{pkt.summary()} -> {proto}")

6. 协议交互流程

6.1 RTSP会话建立流程

6.1.1 完整会话流程
客户端                          服务器
  |                               |
  | 1. DESCRIBE请求                |
  |------------------------------>|
  | 查询媒体描述信息               |
  |                               |
  | 2. 200 OK响应(SDP)           |
  |<------------------------------|
  | 返回媒体描述(编码、格式等)    |
  |                               |
  | 3. SETUP请求(视频轨道)       |
  |------------------------------>|
  | 建立传输会话                   |
  | 指定传输方式:RTP/AVP/UDP      |
  | 客户端端口:5000-5001          |
  |                               |
  | 4. 200 OK响应                  |
  |<------------------------------|
  | 服务器端口:5002-5003          |
  | Session: 12345678             |
  |                               |
  | 5. SETUP请求(音频轨道)       |
  |------------------------------>|
  | 建立音频传输会话               |
  |                               |
  | 6. 200 OK响应                  |
  |<------------------------------|
  | Session: 12345678             |
  |                               |
  | 7. PLAY请求                    |
  |------------------------------>|
  | 开始播放                       |
  |                               |
  | 8. 200 OK响应                  |
  |<------------------------------|
  |                               |
  | [数据传输阶段]                 |
  |                               |
  | 9. TEARDOWN请求                |
  |------------------------------>|
  | 终止会话                       |
  |                               |
  | 10. 200 OK响应                 |
  |<------------------------------|
6.1.2 关键交互细节

DESCRIBE阶段:

  • 客户端请求媒体描述
  • 服务器返回SDP(Session Description Protocol)格式的媒体信息
  • SDP包含媒体类型、编码格式、RTP载荷类型映射等

SETUP阶段:

  • 客户端指定传输方式(UDP单播/多播、TCP等)
  • 客户端提供接收端口(RTP和RTCP)
  • 服务器确认或指定服务器端口
  • 服务器返回Session ID,后续请求需携带

PLAY阶段:

  • 客户端指定播放范围(npt时间)
  • 服务器开始发送RTP数据
  • 可随时发送PAUSE暂停,再PLAY继续

6.2 RTP/RTCP数据传输流程

6.2.1 RTP数据传输
发送端                    接收端
  |                         |
  |----RTP包 #1------------>|
  |  序列号: 1000            |
  |  时间戳: 90000           |
  |                         |
  |----RTP包 #2------------>|
  |  序列号: 1001            |
  |  时间戳: 90000           |
  |                         |
  |----RTP包 #3------------>|
  |  序列号: 1002            |
  |  时间戳: 180000          |
  |                         |
  |        ...              |

RTP传输特点:

  • 序列号连续递增(检测丢包)
  • 时间戳反映采样时刻(同步)
  • 标记位(M)标识帧边界
  • 可能丢包(UDP特性)
6.2.2 RTCP反馈机制
发送端                    接收端
  |                         |
  |----RTP数据包------------>|
  |----RTP数据包------------>|
  |----RTP数据包------------>|
  |                         |
  |<----RTCP RR-------------|
  |  丢包统计                |
  |  抖动统计                |
  |  延迟统计                |
  |                         |
  |----RTCP SR------------->|
  |  发送统计                |
  |  NTP时间戳(同步)       |
  |                         |

RTCP功能:

  • QoS监控:丢包率、抖动、延迟
  • 同步:NTP时间戳用于音视频同步
  • 会话管理:BYE包通知离开
  • 源识别:SDES包提供源描述

6.3 完整流媒体传输时序图

时间轴
  |
  | RTSP阶段
  |   |
  |   |--DESCRIBE-->|
  |   |<--200 OK----|
  |   |--SETUP----->|
  |   |<--200 OK----|
  |   |--PLAY------>|
  |   |<--200 OK----|
  |
  | RTP/RTCP阶段
  |   |
  |   |<--RTP------>| (持续)
  |   |<--RTCP----->| (周期性)
  |   |<--RTP------>|
  |   |<--RTCP----->|
  |   |     ...     |
  |
  | RTSP阶段
  |   |
  |   |--TEARDOWN-->|
  |   |<--200 OK----|

7. 实际应用场景

7.1 典型应用场景

7.1.1 IP摄像头监控系统

场景描述:

  • 摄像头作为RTSP服务器
  • 客户端(NVR、手机APP)通过RTSP控制
  • 视频流通过RTP传输
  • RTCP监控传输质量

协议使用:

摄像头 (192.168.1.100:554)  <--RTSP-->  客户端
摄像头 (192.168.1.100:5000) <--RTP-->   客户端
摄像头 (192.168.1.100:5001) <--RTCP-->  客户端
7.1.2 视频会议系统

场景描述:

  • 多点视频会议
  • 每个参与者发送/接收多个RTP流(视频、音频)
  • RTCP用于QoS监控和同步

协议使用:

  • RTSP用于会话控制(可选,某些系统使用SIP)
  • RTP传输音视频数据
  • RTCP监控网络质量和同步
7.1.3 流媒体直播

场景描述:

  • 直播服务器推送流
  • 多个客户端同时接收
  • 使用RTP多播或单播

协议使用:

  • RTSP控制播放
  • RTP传输媒体数据
  • RTCP监控接收质量

7.2 协议组合使用示例

7.2.1 标准RTSP+RTP+RTCP组合
应用场景:点播视频播放

1. RTSP控制通道(TCP 554)
   - 建立会话
   - 控制播放(播放、暂停、跳转)
   - 终止会话

2. RTP数据通道(UDP 偶数端口)
   - 传输视频帧
   - 传输音频帧

3. RTCP控制通道(UDP 奇数端口)
   - 监控传输质量
   - 同步音视频
   - 会话管理
7.2.2 RTSP over TCP(RTP over RTSP)

某些场景下,RTP也通过RTSP的TCP连接传输:

RTSP连接(TCP 554)
  |
  |--RTSP控制消息
  |--RTP数据(通过RTSP连接)
  |--RTCP数据(通过RTSP连接)

识别方法:

  • 检查RTSP连接上的数据
  • RTP包仍然有RTP头部特征(V=2)
  • RTCP包仍然有RTCP头部特征(PT=200-206)

7.3 常见问题和解决方案

7.3.1 端口识别问题

问题:无法确定哪些端口是RTP/RTCP

解决方案:

  1. 分析RTSP SETUP响应中的Transport头部
  2. 查找端口对(偶数/奇数)
  3. 检查报文格式(RTP头部特征)
7.3.2 协议混淆问题

问题:RTSP和HTTP容易混淆(都使用文本协议)

解决方案:

  1. 检查端口(RTSP通常554,HTTP通常80/443)
  2. 检查协议版本(RTSP使用RTSP/1.0,HTTP使用HTTP/1.1)
  3. 检查方法(RTSP方法如DESCRIBE、SETUP,HTTP方法如GET、POST)
7.3.3 RTP/RTCP区分问题

问题:RTP和RTCP都是二进制UDP协议,容易混淆

解决方案:

  1. 检查端口(RTCP通常是RTP端口+1)
  2. 检查PT字段(RTP PT<200,RTCP PT=200-206)
  3. 检查包大小(RTCP通常较小)
  4. 检查传输频率(RTCP低频,RTP高频)
7.3.4 动态端口问题

问题:RTP/RTCP使用动态端口,难以预先配置防火墙

解决方案:

  1. 分析RTSP SETUP响应获取端口范围
  2. 配置防火墙允许端口范围
  3. 使用NAT/ALG(Application Layer Gateway)自动处理

8. 总结

8.1 三种协议的核心区别总结

特性RTSPRTPRTCP
协议层次应用层传输层传输层
主要功能会话控制数据传输质量监控
传输协议TCP/UDPUDPUDP
默认端口554动态(偶数)动态(奇数,RTP+1)
协议类型文本协议二进制协议二进制协议
报文格式类似HTTP固定12字节头部可变长度头部
识别关键词RTSP/1.0, DESCRIBE, SETUPV=2, PT<200V=2, PT=200-206
传输频率按需高频(媒体数据)低频(5%带宽)
连接方式面向连接(TCP)无连接无连接

8.2 快速识别方法速查表

8.2.1 端口识别
端口554 (TCP/UDP) → RTSP
偶数端口 (UDP) → 可能是RTP
奇数端口 (UDP, RTP端口+1) → 可能是RTCP
8.2.2 报文识别
文本协议 + "RTSP/1.0" → RTSP
二进制 + 第一个字节高2位=10 + PT<200 → RTP
二进制 + 第一个字节高2位=10 + PT=200-206 → RTCP
8.2.3 工具识别
Wireshark过滤器:
- rtsp → RTSP协议
- rtp → RTP协议
- rtcp → RTCP协议

tcpdump识别:
- port 554 → RTSP
- udp[0] & 0xc0 == 0x80 and udp[1] < 200 → RTP
- udp[0] & 0xc0 == 0x80 and 200 <= udp[1] <= 206 → RTCP

8.3 识别流程决策树

开始
  |
  |--端口是554? --是--> RTSP (检查文本协议特征确认)
  |              |
  |              否
  |
  |--UDP协议? --否--> 其他协议
  |           |
  |           是
  |
  |--检查第一个字节高2位=10? --否--> 其他协议
  |                          |
  |                          是
  |
  |--检查PT字段
  |   |
  |   |--PT < 200? --是--> RTP
  |   |
  |   |--200 <= PT <= 206? --是--> RTCP
  |   |
  |   |--其他? --> 可能是RTP(动态载荷类型)或其他协议

8.4 最佳实践建议

  1. 综合识别:结合端口、报文格式、交互流程多种方法
  2. 工具辅助:使用Wireshark等专业工具提高识别准确性
  3. 上下文分析:结合协议交互流程,RTSP会话通常先于RTP/RTCP
  4. 持续监控:对于动态端口,需要持续监控SETUP响应
  5. 文档记录:记录识别规则和异常情况,便于后续分析

附录

A. 参考资料

  • RFC 2326: Real Time Streaming Protocol (RTSP)
  • RFC 3550: RTP: A Transport Protocol for Real-Time Applications
  • RFC 3551: RTP Profile for Audio and Video Conferences with Minimal Control

B. 常用工具

  • Wireshark: 网络协议分析工具
  • tcpdump: 命令行抓包工具
  • VLC Media Player: RTSP客户端测试工具
  • ffmpeg: 流媒体处理工具

C. 相关协议

  • SDP (Session Description Protocol): 会话描述协议,RTSP DESCRIBE响应中使用
  • SIP (Session Initiation Protocol): 会话发起协议,某些场景替代RTSP
  • HTTP: 超文本传输协议,与RTSP格式相似但用途不同
  • 在这里插入图片描述

在这里插入图片描述

Logo

火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。

更多推荐