一、RTSP
1、简介
RTSP(Real-Time Stream Protocol)协议是一个基于文本的多媒体播放控制协议,属于应用层。RTSP以客户端方式工作,对流媒体提供播放、暂停、后退、前进等操作。
它主要用来控制具有实时特性的数据的发送,但其本身并不用于传送流媒体数据,而必须依赖下层传输协议(如RTP/RTCP)所提供的服务来完成流媒体数据的传送。RTSP负责定义具体的控制信息、操作方法、状态码,以及描述与RTP之间的交互操作。
RTSP可以在TCP上传输也可以在UDP上传输,而RTP和RTCP是基于UDP协议的(TCP协议的重传机制可能会引起较大时延)。
2、RTSP的URL
客户端要播放RTSP媒体流,就需要知道媒体源的URL,RTSP的URL格式一般如下:
rtsp://host[:port]/[abs_path]/content_name
host: 有效的域名或IP地址;
port: 端口号,缺省为554,若为缺省可不填写,否则必须写明。
目前市面上常用的海康网络摄像头的RTSP地址格式为:
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
示例: rtsp://admin:12345@192.168.1.67:554/h264/ch1/main/av_stream
3、RTSP报文
RTSP是一种基于文本的协议,用CRLF(回车换行)作为每一行的结束符。
rtsp中定义的方法有:OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE, GET_PARAMETER ,SET_PARAMETER
1.OPTION 目的是得到服务器提供的可用方法
2.DESCRIBE C向S发起DESCRIBE请求,为了得到会话描述信息(SDP)
3.SETUP 客户端提醒服务器建立会话,并确定传输模式
uri中带有trackID=0,表示对该通道进行设置。Transport参数设置了传输模式,包的结构。接下来的数据包头部第二个字节位置就是interleaved,它的值是每个通道都不同的,trackID=0的interleaved值有两个0或1,0表示rtp包,1表示rtcp包,接受端根据interleaved的值来区别是哪种数据包。
4.PLAY 客户端发送播放请求
5.TEARDOWN 客户端发起关闭请求
ps:
sdp的格式
v=<version>
o=<username> <session id> <version> <network type> <address type> <address>
s=<session name>
i=<session description>
u=<URI>
e=<email address>
p=<phone number>
c=<network type> <address type> <connection address>
b=<modifier>:<bandwidth-value>
t=<start time> <stop time>
r=<repeat interval> <active duration> <list of offsets from start-time>
z=<adjustment time> <offset> <adjustment time> <offset> ....
k=<method>
k=<method>:<encryption key>
a=<attribute>
a=<attribute>:<value>
m=<media> <port> <transport> <fmt list>
v = (协议版本)
o = (所有者/创建者和会话标识符)
s = (会话名称)
i = * (会话信息)
u = * (URI 描述)
e = * (Email 地址)
p = * (电话号码)
c = * (连接信息)
b = * (带宽信息)
z = * (时间区域调整)
k = * (加密密钥)
a = * (0 个或多个会话属性行)
时间描述:
t = (会话活动时间)
r = * (0或多次重复次数)
媒体描述:
m = (媒体名称和传输地址)
i = * (媒体标题)
c = * (连接信息 — 如果包含在会话层则该字段可选)
b = * (带宽信息)
k = * (加密密钥)
a = * (0 个或多个媒体属性行)
4、RTSP认证
rtsp认证分为2种:基本认证(basic authentication)、摘要认证(digest authentication)。基本认证是http1.0的认证方案,摘要认证是1.1针对1.0的改进版本,基本认证由于存在未加密直接传送有安全隐患,摘要认证经过MD5转换,具备更高的安全性。
认证过程:
客户端发送不带认证信息的DESCRIBE请求到服务端,RTSP服务端认为没有通过认证,返回401 Unauthorized携带WWW-Authenticate认证响应。
此时客户端程序应该弹出密码认证窗口 ,提示输入认证信息:用户名和密码
从响应消息中进行判断,如果发现是basic认证,通过对 username:password 进行base64编码得到Authorization,携带Authorization再次发起DESCRIBE请求。
如果是digest认证,还会返回一个nonce字段,客户端以用户名,密码,nonce,HTTP方法,请求的URI等信息为基础产生response信息进行反馈,其中response计算方法如下:
(1)当password为MD5编码,则
response = md5( password:nonce:md5(public_method:url) );
(2)当password为ANSI字符串,则
response= md5( md5(username:realm:password):nonce:md5(public_method:url) );
客户端在每次发起不同的请求方法时都需要计算response字段,同样在服务器端校验时也默认采取同样的计算方法。
例如:
Authorization: Digest username="admin",realm="Hipcam RealServer", nonce="3b27a446bfa49b0c48c3edb83139543d",uri="rtsp://192.168.123.158:554/11", response="258af9d739589e615f711838a0ff8c58"
通过对海康摄像头取流播放抓包得到的rtsp报文内容:
二、RTP和RTCP
数据传输协议RTP,用于实时传输数据。该协议提供的信息包括:时间戳(用于同步)、序列号(用于丢包和重排序检测)、以及负载格式(用于说明数据的编码格式)。
控制协议RTCP,用于QoS反馈和同步媒体流。相对于RTP来说,RTCP所占的带宽非常小,通常只有5%。
RTP的工作机制为:
当应用程序建立一个RTP会话时,应用程序将确定一对目的传输地址。目的传输地址由一个网络地址和一对端口组成,有两个端口:一个给RTP包,一个给RTCP包,使得RTP/RTCP数据能够正确发送。RTP数据发向偶数的UDP端口,而对应的控制信号RTCP数据发向相邻的奇数UDP端口(偶数的UDP端口+1),这样就构成一个UDP端口对。
版本号(V):2比特,用来标志使用的RTP版本。
填充位(P):1比特,如果该位置位,则该RTP包的尾部就包含附加的填充字节。
扩展位(X): 1比特,如果该位置位的话,RTP固定头部后面就跟有一个扩展头部。
CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。
标记位(M): 1比特,??
载荷类型(PayloadType): 7比特,标识了RTP载荷的类型。
序列号(SN):16比特,每发送一个 RTP 数据包,序列号增加1。接收端可以据此检测丢包和重建包序列。
时间戳(Timestamp): 2比特,记录了该包中数据的第一个字节的采样时刻。在一次会话开始时,时间戳初始化成一个初始值。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加(时间在流逝嘛)。时钟频率依赖于负载数据格式,并在描述文件(profile)中进行描述。
同步源标识符(SSRC):32比特,同步源就是指RTP包流的来源。在同一个RTP会话中不能有两个相同的SSRC值。该标识符是随机选取的 RFC1889推荐了MD5随机算法。
贡献源列表(CSRC List):0~15项,每项32比特,用来标志对一个RTP混合器产生的新包有贡献的所有RTP包的源。由混合器将这些有贡献的SSRC标识符插入表中。SSRC标识符都被列出来,以便接收端能正确指出交谈双方的身份。
RTCP???
参考:
https://www.cnblogs.com/yuweifeng/p/7567846.html 流媒体协议之RTSP详解20170922
https://blog.csdn.net/deliapu/article/details/79199023 网络流媒体协议之——RTSP协议
https://blog.csdn.net/lanfengywf/article/details/80924275 流媒体协议之RTSP客户端的实现20171014
https://www.cnblogs.com/yuweifeng/p/7550737.html 流媒体协议之JRTPLIB的使用20170919
https://github.com/babosa/Course GitHub课程
https://blog.csdn.net/machh/article/details/51868569 RTP/RTCP协议解析
https://blog.csdn.net/machh/article/details/52121648 流媒体传输协议详解之---RTSP认证