精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
使用标准的RTSP/RTP可以通过一个TCP连接将QuickTime表示以流媒体的形式发布给用户。然而这样的一个连接不足以到达处于防火墙里面,通过HTTP代理服务器间接访问英特网的私有IP网络用户。为了使流媒体到达这样的客户,QuickTime 4.1 支持将RTSP和RTP数据放置到HTTP请求和应答中进行传输,使处于防火墙里面的观众可以通过HTTP代理服务器访问QuickTime的多媒体表示。
QuickTime的HTTP传输是基于由客户端发起的HTTP GET和POST这两个不同的方法构建而成的。服务器在这个基础上绑定连接,以建立一个虚拟的全双工连接。建立这种类型的连接的协议必须满足下面的要求:
QuickTime的HTTP传输利用了HTTP GET和POST方法的能力,分别使这两个方法的应答和信息体中携带数量不受限制的数据。举个最简单的应用实例中,客户向服务器发送一个HTTP GET信息,请求服务器打开一个从服务器到客户端的连接;然后客户端再发送一个HTTP POST信息,请求服务器打开一个客户端到服务器端的连接。结果得到了一个虚拟全双工连接,这使得基于这个连接发送不经修改的RTSP和RTP数据成为可能。
为了和QuickTime的HTTP传输协议协同工作,客户端的HTTP请求必须:
处理这些规定以外,客户端的HTTP POST请求报头可以包含其它的指示符,以帮助HTTP代理服务器处理优化处理RTSP流。
下面是一个客户端GET请求的实例:
GET /sw.mov HTTP/1.0 |
|
下面是一个客户端POST请求的实例:
POST /sw.mov HTTP/1.0 |
|
请注意:服务器端并不响应客户端的POST 请求,客户端会接着将RTSP数据作为当前POST请求的信息体发送出来。
这个客户POST请求的实例中包含三个可选的报头指示符,用于控制HTTP代理服务器的行为,使之进行恰当的处理:
HTTP要求所有的POST请求都需要有一个content-length报头。在上面的客户POST请求实例中,内容长度为32767,是随意给出的一个值。在实际情况中,这个值好像常常被代理服务器忽略,所以以RTSP请求的形式发送数据时,长度可能会大于这个指示符指定的值。QuickTime服务器忽略content-length报头。
当服务器接收到来自客户端的HTTP GET请求时,必须进行应答,并在应答的报头中为Content-Type和Accept这两个指示符指定application/x-rtsp-tunneled的MIME t类型。
请注意:服务器必须对所有来自客户端的HTTP GET 请求进行应答,但是永远不要对客户端的HTTP POST请求进行应答。
服务器的应答报头中可以可选地包含Cache-Control: no-store和Pragma: no-cache这两个指示符,以防止HTTP代理服务器对事务进行缓存。业界推荐各种服务器的具体实现碰到这些报头时遵循它们的设定。
服务器集群经常通过round-robin DNS或者其它负载平衡的算法来分配连接。为了确保客户端请求能够被定向到服务器农场中的某个特定的服务器,服务器可以可选地在其对客户端初始的GET请求的应答报头中包含一个x-server-ip-address指示符,并在其后紧跟着由带点的十进制数组成的IP地址。当这个指示符存在时,客户端必须将其POST请求直接发到指定的IP地址,而不考虑DNS查找返回的IP地址是什么。
如果没有发生HTTP错误,则服务器发送包含“200 OK”的应答报头。服务器应答中的HTTP错误表示服务器无法建立虚拟的全双工连接;HTTP错误并不意味着RTSP错误。在发生HTTP错误时,服务器只是简单地关闭连接。
下面是一个服务器对GET请求的应答实例:
HTTP/1.0 200 OK |
|
在应答中包含下面的这些报头指示符不是必须的,但是是推荐的,因为这些指示符告诉服务器以什么方式工作才能较好地处理处理RTSP流:
由客户端在POST连接上发出的RTSP请求必须使用base64方法进行编码(参见RFC 2045 “英特网信息主体”,6.8部分,Base64 Content-Transfer-Encoding,以及RFC 1421 “电子邮件的隐私增强” 4.3.2.4部分,可打印的编码)。base64编码防止HTTP代理服务器将embodied RTSP请求确定为不合法的HTTP请求。
下面是一个编码前的RTSP请求实例:
DESCRIBE rtsp://tuckru.apple.com/sw.movRTSP/1.0 |
|
下面是编码之后的同一个RTSP请求:
REVTQ1JJQkUgcnRzcDovL3R1Y2tydS5hcHBsZS5jb20vc3cubW92IFJUU1AvMS4w |
|
客户端可能在任何时候关闭POST连接。这样做可以释放服务器端的套接口和内存资源,否则这些资源可能会长时间地被使用。在QuickTime HTTP流媒体中,关闭POST连接的最好时机通常是发生在PLAY请求之后。
对于实现HTTP之上的QuickTime RTSP和RTP通道来说,对这里没有描述的HTTP特性的支持并不是必须的。该通道应该尽可能真实地模拟正常的TCP连接,而不要添加不必要的特性。