2008-11-03 102 views
6

我想通过使用代理的HTTP获取RTSP流。 Real客户端的行为似乎有点紧张:它一次尝试所有可能的端口,方法和协议。唯一可行的是通过端口80的HTTP GET。这样的请求确实发出,并在服务器上被接收。下面是当它由代理向服务器发送请求的外观:rtsp通过代理上的http

GET /SmpDsBhgRl83c52ef2-d0f4-41ac-bada-93e5350f67d1?1="1" HTTP/1.0\r\n 
Connection: Keep-Alive\r\n 
Host: 10.194.5.162:80\r\n 
Pragma: no-cache\r\n 
User-Agent: RealPlayer G2\r\n 
Expires: Mon, 18 May 1974 00:00:00 GMT\r\n 
Accept: application/x-rtsp-tunnelled, */*\r\n 
ClientID: WinNT_5.1_6.0.14.806_RealPlayer_R41UKD_en-GB_686\r\n 
X-Actual-URL: rtsp://10.194.5.162:554/01.mp3\r\n 
\r\n 

这里是服务器的响应:

HTTP/1.0 200 OK\r\n 
Server: RMServer 1.0\r\n 
Expires: Mon, 18 May 1974 00:00:00 GMT\r\n 
Pragma: no-cache\r\n 
x-server-ipaddress: 10.194.5.162\r\n 
Content-type: audio/x-pn-realaudio\r\n 
\r\n 

此时4个字节,从到达服务器(它们的值是48 02 02 00) - 就是这样,没有更多。服务器是否期望客户端的任何内容,如果是的话 - 是什么?这种操作模式是否可以工作?

对这个问题的一些详细信息:显然,与RTSP通过HTTP内置的RealPlayer工作的打算机制如下:

  1. 尝试连接到以下端口:80,8080,554,7070 。 (也尝试直接下载文件,只为它赫克,通过发出GET端口80 http://hostname:port/mediafilename
  2. 对于上述每个端口,创建2个连接。
  3. 发送GET请求到其中一个到url的连接http://hostname:port/SmpDsBhgRl<guid>?1 =“1”,其中<guid>是,是,新创建的GUID。为此请求添加一个名为X-Actual-URL的标题,其中包含原始RTSP URL。
  4. 在其他连接上发送POST请求,并将上面的GUID作为请求主体的一部分加入到URL http://hostname:port/SmpDsBhgRl中。发送32767字节的内容长度标头,以防止代理过早关闭连接。
  5. 开始通过POST请求向服务器发出命令,并获取相应的RTSP流作为GET响应的一部分。

奇怪的东西(如果上面不够奇怪)是,例如,它适用于Squid,但不是如果您使用任何端口3128或8080!不知何故,客户端使用它连接的端口来决定请求的顺序或取消请求的时间,但无论如何,尽管难以置信,但它可以与代理端口9090,3129,8081一起使用,但是不与3128或8080.

更新#2:Here是RealPlayer的来源,并解释了上述行为。但仍然没有解决方案。

更新#3:好的,鉴于上述情况,48 02 02 00的魔法值是清楚的:48 =='h'是HTTP_RESPONSE,接下来的02是以下数据的长度,接下来的02被称为POST_NOT_RECEIVED(意思是POST请求没有在相应的GET请求的一秒钟内到达服务器)。

更新#4:此行为(即具有巨大内容长度的POST请求)也是WebEx使用的ActiveX的特征(可能还有许多其他Web应用程序需要到服务器的开放通道)。

+0

服务器的HTTP 200 OK响应是否有效?我的服务器用于响应您的情况,但RealPlayer在打开GET和POST连接后停止响应。然后,我添加到响应48 02 00 00和Content-Length:4属性的主体,它的工作原理...也许你需要修改你的HTTP OK响应并在收到POST连接后发送它,而不是在此之前。 – Cipi 2010-03-10 13:16:46

回答

0
  1. 查看是否发出同样的请求,但绕过代理(例如,重放你贴以上使用Netcat的请求)在响应身体流大于四个字节的结果。
  2. 看看的TCP报文的代理接收,例如,通过窃听在TCP 交通是正在运行的代理,比如,使用Wireshark的机器上。
3

首先,你可能需要阅读此:

http://developer.apple.com/quicktime/icefloe/dispatch028.html

二,HTTP请求(GET和POST)需要进行格式化,使他们得到适当的代理。我见过坚持缓存POST请求的代理,防止它到达服务器。这些代理是错误的,但对此你无能为力,而且我无法解决这个问题。大多数情况下,我都看到过这种反病毒软件,它试图对来自浏览器的POST请求进行透明代理,以扫描他们的私人信息,如社会安全号码。您可能会遇到同样的问题。

您是否使用McAfee的反病毒任何机会?

此外,似乎Real发明了自己的方式来做同样的事情,但基本设计非常相似 - GET用于下游链接,POST用于上游,带有一些魔术饼干(在这种情况下,GUID )将两者联系在一起。无论哪种方式,POST应该到达服务器,在你的情况下,它似乎没有。

顺便说一句,因为这个问题似乎是通过代理不会POST请求,如何发布这一要求,除了得到什么?