基于TCP连接的RTSP协议分析
2013-10-15 18:56
501 查看
RTSP 概述
RTSP(Real Time Streaming Protocol),实时流传输协议,是TCP/IP协议体系中的一个应用层协议,控制实时数据的传送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频的受控、点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP
(RFC1889)上传送机制提供方法。RTSP和HTTP类似,属于应用层协议,通过socket rtsp命令来进行通讯。RTSP协议的默认端口是554。
常用控制命令执行顺序常用的是5个命令:
1,OPTIONS,//询问server,那些命令可用
2,DESCRIBE,//请求rtsp路径的媒体描述信息
3,SETUP,//设置会话的属性,以及传输模式,建立会话
GET_PARAMETER,//取得流控制参数,可能某些服务器不支持
SET_PARAMETER,//设置流控制参数,可能某些服务器不支持
4,PLAY,//开始播放流媒体数据
5,TEARDOWN //关闭对话
实例分析RTSP、RTP协议
(一)
RTSP建立过程
1.
三次握手建立RTSP连接
略
2.
C->S ,Client发送DESCRIBE命令,请求资源的描述。
服务器端回应:
3.
C->S,Client发送SETUP命令,建立RTP和RTCP连接。
4.
C->S,Client发送PLAY命令,开始数据的发送。
服务器回应:
(二)
RTP数据连接分析
由于此实例是基于TCP连接发送数据的,因此当服务器(192.168.1.82)回应Client的请求后,就在此连接上发送媒体数据。
1.
IP包头:
450005dc 9693 4000 4006 1ada
c0a8 0152
c0a8 010c
如上图绿线标记,其中长度为20字节,上图红色框标记IP头长指示,单位为4字节。IP包长为0x05de=1500字节。源IP为:c0a8
0152 目的IP为c0a8 010c
2.
TCP包头:
022af13a ee36 8e7f 106c 3f17
8010 00d7 897d 0000 0101 080a 0267 1c66
3d60 25c0
如上图黄线标记,其中源端口为0x022a=554,目的端口0xf13a=61754。其中头长度为32字节,上图红色框标记IP头长指示,单位为4字节。
3.
RTP同步标记:
24000530
其中0x24=36为$的ASCII码,为RTP同步定位标记。0x00为streamChannelId。0x0530=1328,为RTP报文的长度。
int RTP_ReadHandler(int socketNum,struct ResultData* data) { unsigned char c; unsigned char streamChannelId; unsigned short size; unsigned fNextTCPReadSize; int result = 0; do { do { result = recv(socketNum, &c, 1, 0); if (result <=0) { fprintf(stderr,"error reading TCP socket\n"); return 0; } } while (c != '$'); if (recv(socketNum, &streamChannelId, 1, 0)!= 1) break; if (recv(socketNum, (unsigned char*)&size, 2,0) != 2) break; fNextTCPReadSize = ntohs(size); return networkReadHandler(socketNum,&fNextTCPReadSize,data); } while (0); return -1; }
4.
RTP包头:
8021 41ba 6f77 9bc8
5d52 cb82
如上图紫色标记,RTP包头12字节
0x802141ba =
1000 00000010 0001 0100 0001 1011 1010
版本号(V)2bit: 00000001
= 2
填充位(P)1bit: 0
扩展位(X)1bit: 0
CSRC计数器(CC)4bit:
0
标记位(M)1bit: 0
载荷类型(PT)7bit:
00100001 = 33 对应为MP2T Video/Audio
序列号(SN)4Bity: 0x41ba
时间戳: 0x6f779bc8
同步源标识符(SSRC)4bit:0x5d52cb82
5.
媒体数据:
4740 1110 0000 01e0 0000 84c0
133d 49df c05d 1d49 df79 fbff ffff ffff
ffff ffff 0000 01b3 7804 3834 2a3c af42
1020 2044 2044 6868 6868 6868 9880 98a4
a4a4 9898 9898 a4a4 a4bc bcbc f8f8 f8bc
bcbc a4a4 bcbc e0e0 f8f9 1d29 1d05 04f9
0529 2941 4141 a1a1 8989 ffff ffff ffff
1016 161c 1c1c 2222 2222 2828 2828 282e
2e2e 2e2e 2e34 3434 3434 3434 3a3a 3a3a
3a3a 3a3a 4040 4046 4040 4046 4c4c 4c4c
4652 5252 5252 5858 5858 6464 646a 6a76
0000 01b5 1442 0001 0000 0000 01b5 201e
4700 1111 0221 c000 0000 01b8 9eea 8580
0000 0100 008c 0c08 0000 0001 b58f fff7
9800 0000 01b5 7000 0800 0400 0200 0100
0000 01b2 4741 3934 0354 fffd 8080 fc80
80fa 0000 fa00 00fa 0000 fa00 00fa 0000
fa00 00fa 0000 fa00 00fa 0000 fa00 00fa
………………
每个TS包由188字节组成,包头第一个字节固定为0x47。媒体数据是188为单位组成的连续流。
IP报文由如下组成:
IP报文 = IP包头 + TCP包头 + Payload;
Payload= RTP同步标记+ RTP包头+ 7*188 + RTP同步标记+…..+7*188+…
由此看见,RTP传送T流S数据时数据结构如下:
相关文章推荐
- TCP和UDP的区别
- TCP粘包与UDP数据报边界
- TCP字节流与UDP数据报
- HttpCient简单应用
- 写一个快速切换网络的BAT脚本
- httpclient编码
- TCP连接——三次握手和四次断开
- 网络测试工具Netperf安装使用
- Android 中HttpURLConnection与HttpClient使用的简单实例
- JUNIPER OSPF防火墙
- http访问网站过程
- [译]理解HTTP/304响应
- 1-9 实验7 网络通信实验1 广播和单播通信
- socket通信的环形缓冲-TCPQQ
- RTP Payload Format for Transport of MPEG-4 Elementary Streams over http
- VLC RTP Video Streaming over HTTP
- https与http的区别
- XMLHTTPRequest
- http://my.csdn.net/
- android源码下载,curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo网络不可达