rtsp通过代理上的http

时间:2008-11-03 15:45:11

标签: http networking proxy streaming rtsp

我正在尝试使用代理通过HTTP获取RTSP流。 Real客户端的行为似乎有点忙碌:它会立即尝试所有可能的端口,方法和协议。唯一应该工作的是通过端口80的HTTP GET。确实发出了这样的请求,并在服务器上接收。以下是请求在代理发送到服务器时的外观:

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) - 就是这样,仅此而已。服务器此时是否期望来自客户端,如果是这样 - 什么?这种操作模式是否有效?

有关此问题的更多信息:显然,使用内置于RealPlayer中的HTTP上的RTSP的预期机制如下:

  1. 尝试连接以下端口:80,8080,554,7070。 (尝试直接下载文件,只是为了它,通过在端口80上发出GET http://hostname:port/mediafilename
  2. 对于上述每个端口,创建2个连接。
  3. 向网址http://hostname:port/SmpDsBhgRl <guid>的其中一个连接发送GET请求?1 =“1”,其中<guid>是,是新创建的GUID。在此请求中添加一个名为X-Actual-URL的标头,其中包含原始RTSP URL。
  4. 在另一个连接上发送POST请求,将URL http://hostname:port/SmpDsBhgRl与上面的GUID作为请求正文的一部分发送。发送一个32767字节的Content-Length标头,以防止代理提前关闭连接。
  5. 通过POST请求开始向服务器发出命令,并获取相应的RTSP流作为GET响应的一部分。
  6. 奇怪的东西(如果上面的内容不够奇怪)是,例如,它适用于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应用程序)。

2 个答案:

答案 0 :(得分:3)

首先,您可能想要阅读:

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

其次,需要格式化HTTP请求(GET和POST),以便正确代理它们。我见过代理人坚持缓存过多的POST请求,阻止它到达服务器。那些代理是错误的,但你无能为力,我无法解决这个问题。大多数情况下,我用反病毒软件看到了这一点,它试图对来自浏览器的POST请求进行透明代理,以扫描它们以获取社会安全号码等私人信息。您可能遇到了同样的问题。

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

此外,Real似乎发明了自己做同样事情的方式,但基本设计非常相似 - 下游链接的GET,上游的POST,以及一些神奇的cookie(在这种情况下,GUID)将两者绑在一起在服务器上。无论哪种方式,POST应该到达服务器,在你的情况下它似乎没有。

顺便说一句,由于问题似乎是POST请求没有通过代理,除了GET之外,如何发布该请求?

答案 1 :(得分:0)

  1. 查看是否发出相同的请求但是绕过代理(例如,使用Netcat重播您在上面发布的请求)会导致在响应正文中流式传输超过四个字节。
  2. 查看代理正在接收的TCP数据包,例如,通过窃听TCP 例如,使用Wireshark运行代理的计算机上的流量。