通常来说,RTSP提供UDP方式发送RTP流。当然,发送流媒体时,UDP往往是更好的选择。
下面是使用UDP时的一些问题:
-
UDP协议上的RTSP/RTP需要打开许多UDP端口(每一路流媒体都需要2个UDP端口,一个用于接收数据,一个用于接收控制信息);
-
当因特网上的路由器没有打开这些端口的时候,第一点将会存在问题;
-
中间网络路由器很容易就过滤或者忽略掉UDP数据包;
-
UDP是不可靠传输协议,媒体包在因特网上传输时会面临着丢包。
如果在TCP传输协议上承载RTSP/RTP将解决这些问题
-
RTSP/RTP的控制命令和数据都通过一个端口,即RTSP的端口(默认为554),进行交互。
-
TCP协议提供可靠的流传输。
-
TCP包更容易穿透中间网络路由器。
在TCP传输协议上承载RTSP/RTP也不是完美的,同样存在一些问题:
-
由于二元交织,会使得RTP包封包和解包的过程变得更加复杂。
-
TCP是可靠的传输协议,但正是因为如此,会导致在实时流媒体中的延时。
- 使用TCP传输协议承载RTSP/RTP需要花更多的功夫。
接下来让我们来了解一下怎么使用TCP承载RTSP/RTP。
TCP承载RTSP/RTP
当使用TCP协议承载RTSP/RTP时,所有的命令和媒体数据都将通过RTSP端口,通常是554,进行发送。同时,数据将经过二元交织格式化之后才能发送。
接下来我们将描述使用TCP承载RTSP/RTP的主要要素:
SETUP
要使用TCP连接,RTSP客户端需要在SETUP阶段请求TCP连接。SETUP命令中应该包括如下格式的Transport:
Transport: RTP/AVP/TCP;interleaved=0-1
上述Transport将告诉服务端使用TCP协议发送媒体数据,并且使用信道 0 和 1 对流数据以及控制信息进行交织。详细说来,使用偶数信道作为数据传输信道,使用奇数信道作为控制信道(数据信道 + 1)。所以,如果你设定数据信道为 0 ,那控制信道应该是 0 + 1 = 1。
下面是一个rtsp客户端请求 通过rtp over tcp方式建立连接报文;
SETUP之后,RTP数据将通过用来发送RTSP命令的TCP Socket进行发送。RTP数据将以如下格式进行封装:
| magic number | channel number | data length | data |magic number -
magic number: RTP数据标识符,"$" 一个字节
channel number: 信道数字 - 1个字节,用来指示信道
data length : 数据长度 - 2个字节,用来指示插入数据长度
data : 数据 - ,比如说RTP包,总长度与上面的数据长度相同
RTP,RTCP数据和RTSP数据共享TCP数据通道,所以必须有一个标识来区别三种数据。
RTP和RTCP数据会以$符号+1个字节的通道编号+2个字节的数据长度,共4个字节的前缀开始,RTSP数据是没有前缀数据的。RTP数据和RTCP数据的区别在于第二个字节的通道编号,
下面给出一个 RTP OVER TCP 方式数据头结构定义 4oct
typedef struct rtsp_interleaved
{
unsigned int magic : 8;// $
unsigned int channel : 8; //0-1
unsigned int rtp_len : 16;
}RILF;
下面给出一个完整的交互过程:
(1) OPTIONS 客户端向服务器询问有哪些方法可以使用**
- 1
- 2
- 3
- 1
- 2
- 3
服务器接收到OPTIONS请求后发出响应报文。状态码200代表请求成功。然后返回服务器当前时间(GMT)和所支持的方法。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
(2) DESCRIBE 客户端像服务端请求描述媒体的详细信息。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
服务端响应DESCRIBE请求所发回的报文,通过SDP协议发送媒体属性。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
(3) SETUP 客户端向服务端发送SETUP请求,要求服务端设置会话属性和流媒体传输方式以建立会话
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
服务端响应DESCRIBE请求所发回的报文
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
(4) PLAY 会话建立后,客户端发出PLAY请求播放所申请的流媒体。传输机制按照SETUP命令所设置的进行
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
服务器回应
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
以下是RTP over RTSP(TCP)的数据流:
RFC 2326 第10.12节说明了插入二进制数据的细节。