抓包分析rtsp tph264

Posted 屁小猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抓包分析rtsp tph264相关的知识,希望对你有一定的参考价值。

一、rtsp分析
rtsp是通过tcp传输的,过滤数据包,分析如下:

追踪tcp流,可以得到如下:
//tcp.port == 1234过滤得到:

OPTIONS rtsp://127.0.0.1:1234/ RTSP/1.0
CSeq: 2
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)

RTSP/1.0 200 OK
Server: VLC/3.0.16
Content-Length: 0
Cseq: 2
Public: DESCRIBE,SETUP,TEARDOWN,PLAY,PAUSE,GET_PARAMETER

DESCRIBE rtsp://127.0.0.1:1234/ RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp

RTSP/1.0 200 OK
Server: VLC/3.0.16
Date: Wed, 09 Mar 2022 02:51:18 GMT
Content-Type: application/sdp
Content-Base: rtsp://127.0.0.1:1234/
Content-Length: 547
Cache-Control: no-cache
Cseq: 3

v=0
o=- 16560462224506433247 16560462224506433247 IN IP4 LAPTOP-QF7IG4BT
s=Unnamed
i=N/A
c=IN IP4 0.0.0.0
t=0 0
a=tool:vlc 3.0.16
a=recvonly
a=type:broadcast
a=charset:UTF-8
a=control:rtsp://127.0.0.1:1234/
m=audio 0 RTP/AVP 14
b=AS:128
b=RR:0
a=rtpmap:14 MPA/90000/2
a=control:rtsp://127.0.0.1:1234/trackID=4
m=video 0 RTP/AVP 96
b=RR:0
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=64001f;sprop-parameter-sets=Z2QAH6zZQPARfvARAAADA+kAALuAjxgxlg==,aOvjyyLA;
a=control:rtsp://127.0.0.1:1234/trackID=5
SETUP rtsp://127.0.0.1:1234/trackID=4 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=57200-57201

RTSP/1.0 200 OK
Server: VLC/3.0.16
Date: Wed, 09 Mar 2022 02:51:18 GMT
Transport: RTP/AVP/UDP;unicast;client_port=57200-57201;server_port=57202-57203;ssrc=99917EDA;mode=play
Session: c81572e98faef68e;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 4

SETUP rtsp://127.0.0.1:1234/trackID=5 RTSP/1.0
CSeq: 5
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=57204-57205
Session: c81572e98faef68e

RTSP/1.0 200 OK
Server: VLC/3.0.16
Date: Wed, 09 Mar 2022 02:51:18 GMT //单播客户端 偶数端口rtp 奇数端口rtcp
Transport: RTP/AVP/UDP;unicast;client_port=57204-57205;server_port=57206-57207;ssrc=33E4A5A5;mode=play
Session: c81572e98faef68e;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 5

PLAY rtsp://127.0.0.1:1234/ RTSP/1.0
CSeq: 6
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Session: c81572e98faef68e
Range: npt=0.000-

RTSP/1.0 200 OK
Server: VLC/3.0.16
Date: Wed, 09 Mar 2022 02:51:19 GMT
RTP-Info: url=rtsp://127.0.0.1:1234/trackID=4;seq=33470;rtptime=673918348, url=rtsp://127.0.0.1:1234/trackID=5;seq=29052;rtptime=673918348
Range: npt=1636.471649-
Session: c81572e98faef68e;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 6

===================================================

二、RTP报文分析
1.报文





三、rtcp包分析
RTCP也是用UDP来传送的,但RTCP封装的仅仅是一些控制信息,因而分组很短,所以可以将多个RTCP分组封装在一个UDP包中。RTCP有如下五种分组类型

下面只讲述SR类型
发送端报告分组SR(Sender Report)用来使发送端以多播方式向所有接收端报告发送情况。SR分组的主要内容有:相应的RTP流的SSRC,RTP流中最新产生的RTP分组的时间戳和NTP,RTP流包含的分组数,RTP流包含的字节数。SR包的封装如图所示



四、H264包分析
1.H264中NAL UNIT HEADER简介
原始码流都是由一个个的 NALU(Network Abstract Layer)网络抽象层 连续组成,其中NALU=[StartCode] + [NALU Header] + [NALU Payload]组成,其中
StartCode:表示一个NALU的开始,一般情况下是以4字节“00 00 00 01”或者3字节“00 00 01”,一般4字节居多。
NALU Header:表示一组视频编码的头部信息,具体下面分析。
Payload:表示原始字节序列的有效载荷。

NAL UNIT HEADER
下面对比一下原始码流的H264和H265的NAL unit header。其中H264的Nal Unit头是一个字节,具体每个位表示如下:

VCL: Video Coding Layer
解析原始码流的H264 TYPE方式:
//定义header[4]为去除掉“00 00 00 01”之后的那个字节
int type = header[4] & 0x1F
这里说明一下,有些编码是没有SEI帧的,SEI这个增强信息帧中一般填入一些,人脸识别的坐标等信息,也可以自定义一些信息。一般的流都是按照sps,pps,I ,p,I,P……的顺序发送的,其中流媒体发送的时候为了能够在任何点都能够解析编码,通常会在I帧前添加sps和pps两帧的单独包或者聚合包,之后再发送I帧。

RTP包发送的时候,就是将原始码流中的“00 00 00 01”去掉,按照封装格式封装,然后为每一个封装添加RTP header,再发送出去。
在RTP其中CC 很多情况下为0,即没有CSRC信息,所以通常情况下RTP header是由12个字节组成的。
如果使用UDP传输的话,直接使用这个RTP header;但是在tcp传输的时候会在header前在添加四个字节:
​ [magic number]+[channel number]+[data length]

H264数据包如下:

2.H.264 RTP 载荷封装格式
TYPE的类型说明
这里我们先说下Type的类型,RTP中增加了H264中23中以外的格式,先来看下这个header头部

这个Type类型用于区分封装的类型,H.264的帧类型1-23之间,之后RTP又有新增,如下:

这里有些类型分为A型和B型,区别在于是否含有(DON, DONB, DOND)信息,含有的为B型,不含有的为A型。我们一般情况下用到的都是A型,不含有(DON, DONB, DOND)信息的,是我们主要分析的对象。
所以从封装标准文档中看,分为三种格式分别为:Single NAL unit,aggregation packet,Fragmentation unit。

单个NAL包:SINGLE NAL UNIT PACKET

这种很简单,一个 RTP 包仅由一个完整的 NALU 组成. 这种情况下 RTP NAL 头类型字段和原始的 H.264的
NALU 头类型字段是一样的,即在范围1到23之间

聚合包:AGGREGATION PACKETS
单时间聚合包:SINGLE-TIME AGGREGATION PACKET

多时间聚合包:MULTI-TIME AGGREGATION PACKETS (MTAPS)
多时间聚合包分为两种:MTAP16和MTAP24,区别在于每个NALU TS offset的长度一个是16位,一个是24位。
MTAP16格式
MTAP24格式

分片单元:FRAGMENTATION UNITS (FUS)
FU-A 的格式如下

下面是FU indicator,FU Indicator其实和NAL头部几乎一样,就是nal类型变成了分片包的类型28,原先的nal类型保存到了FU Header中的Type。

FU header


这些内容填充好之后,就和payload数据合成一个RTP包,然后发送出去。
这里S=0,E=1,R=0

TYPE= 0X5C & 0X1F = 28
TYPE = 0X81&0X1F = 1 (P帧)
10000001—》S=1, E=0,R=0 P的起始包;

参考:https://www.freesion.com/article/2309579039/

VLC 播放RTSP 抓包分析


VLC 播放RTSP视频抓包记录:

vlc -vvv rtsp://172.16.66.22/nuc.sdp




OPTIONS:
	OPTIONS rtsp://172.16.66.22/nuc.sdp RTSP/1.0
	CSeq: 2
	User-Agent: LibVLC/2.2.6 (LIVE555 Streaming Media v2016.02.22)
	--------------------------------------------------------------------------
	RTSP/1.0 200 OK
	Server: DSS/6.0.3 (Build/526.3; Platform/Linux; Release/Darwin Streaming Server; State/Development; )
	Cseq: 2
	Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD
	
			
DESCRIBE:			
	DESCRIBE rtsp://172.16.66.22/nuc.sdp RTSP/1.0
	CSeq: 3
	User-Agent: LibVLC/2.2.6 (LIVE555 Streaming Media v2016.02.22)
	Accept: application/sdp
	--------------------------------------------------------------------------
	RTSP/1.0 200 OK
	Server: DSS/6.0.3 (Build/526.3; Platform/Linux; Release/Darwin Streaming Server; State/Development; )
	Cseq: 3
	Cache-Control: no-cache
	Content-length: 568
	Date: Wed, 18 Oct 2017 02:13:28 GMT
	Expires: Wed, 18 Oct 2017 02:13:28 GMT
	Content-Type: application/sdp
	x-Accept-Retransmit: our-retransmit
	x-Accept-Dynamic-Rate: 1
	Content-Base: rtsp://172.16.66.22/nuc.sdp/

	v=0
	o=- 0 0 IN IP4 127.0.0.1
	s=No Name
	c=IN IP4 0.0.0.0
	t=0 0
	a=tool:libavformat 57.71.100
	a=control:*
	m=video 0 RTP/AVP 96
	b=AS:3011
	a=3GPP-Adaptation-Support:1
	a=rtpmap:96 H264/90000
	a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAH6zZgFAFuhAAAAMAEAAAAwOo8YMZoA==,aOl7PI8=; profile-level-id=64001F
	a=control:trackID=0
	m=audio 0 RTP/AVP 97
	b=AS:127
	a=3GPP-Adaptation-Support:1
	a=rtpmap:97 MPEG4-GENERIC/48000/2
	a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=119056E500
	a=control:trackID=1

			
			
SETUP:			
	SETUP rtsp://172.16.66.22/nuc.sdp/trackID=0 RTSP/1.0
	CSeq: 4
	User-Agent: LibVLC/2.2.6 (LIVE555 Streaming Media v2016.02.22)
	Transport: RTP/AVP;unicast;client_port=61296-61297
	--------------------------------------------------------------------------
	RTSP/1.0 200 OK
	Server: DSS/6.0.3 (Build/526.3; Platform/Linux; Release/Darwin Streaming Server; State/Development; )
	Cseq: 4
	Cache-Control: no-cache
	Session: 6250823492717837688
	Date: Wed, 18 Oct 2017 02:13:28 GMT
	Expires: Wed, 18 Oct 2017 02:13:28 GMT
	Transport: RTP/AVP;unicast;source=172.16.66.22;client_port=61296-61297;server_port=6970-6971

	
SETUP:
	SETUP rtsp://172.16.66.22/nuc.sdp/trackID=1 RTSP/1.0
	CSeq: 5
	User-Agent: LibVLC/2.2.6 (LIVE555 Streaming Media v2016.02.22)
	Transport: RTP/AVP;unicast;client_port=61298-61299
	Session: 6250823492717837688
	--------------------------------------------------------------------------
	RTSP/1.0 200 OK
	Server: DSS/6.0.3 (Build/526.3; Platform/Linux; Release/Darwin Streaming Server; State/Development; )
	Cseq: 5
	Session: 6250823492717837688
	Cache-Control: no-cache
	Date: Wed, 18 Oct 2017 02:13:28 GMT
	Expires: Wed, 18 Oct 2017 02:13:28 GMT
	Transport: RTP/AVP;unicast;source=172.16.66.22;client_port=61298-61299;server_port=6970-6971

			
PLAY:
	PLAY rtsp://172.16.66.22/nuc.sdp/ RTSP/1.0
	CSeq: 6
	User-Agent: LibVLC/2.2.6 (LIVE555 Streaming Media v2016.02.22)
	Session: 6250823492717837688
	Range: npt=0.000-
	--------------------------------------------------------------------------
	RTSP/1.0 200 OK
	Server: DSS/6.0.3 (Build/526.3; Platform/Linux; Release/Darwin Streaming Server; State/Development; )
	Cseq: 6
	Session: 6250823492717837688
	Range: npt=now-
	RTP-Info: url=rtsp://172.16.66.22/nuc.sdp/trackID=0,url=rtsp://172.16.66.22/nuc.sdp/trackID=1

	.
	.
	.
	.
	.
	.
	
TEARDOWN:			
	TEARDOWN rtsp://172.16.66.22/nuc.sdp/ RTSP/1.0
	CSeq: 7
	User-Agent: LibVLC/2.2.6 (LIVE555 Streaming Media v2016.02.22)
	Session: 6250823492717837688
	--------------------------------------------------------------------------
	RTSP/1.0 200 OK
	Server: DSS/6.0.3 (Build/526.3; Platform/Linux; Release/Darwin Streaming Server; State/Development; )
	Cseq: 7
	Session: 6250823492717837688
	Connection: Close


本文出自 “李春利” 博客,请务必保留此出处http://990487026.blog.51cto.com/10133282/1973660

以上是关于抓包分析rtsp tph264的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 环境中解码 H.264 视频帧

如何对EasyNVR分发出的rtsp流进行抓包分析?

低延时高RTSP兼容的EasyPlayer-RTSP-win解决H.264一帧多个nal单元录像花屏问题方案

VLC 播放RTSP 抓包分析

抓包中H264视频如何播放

如何通过python实现H.264视频推流与接收