【问题标题】:rtsp over http over a proxyrtsp over http 通过代理
【发布时间】:2010-09-20 12:25:02
【问题描述】:

我正在尝试使用代理通过 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. 向 URL http://hostname:port/SmpDsBhgRl<guid>?1="1" 的连接之一发送 GET 请求,其中<guid> 是,是的,一个新创建的 GUID。向此请求添加一个名为 X-Actual-URL 的标头,其中包含原始 RTSP URL。
  4. 在另一个连接上向 URL http://hostname:port/SmpDsBhgRl 发送一个 POST 请求,并将上面的 GUID 作为请求正文的一部分。发送一个 32767 字节的 Content-Length 头,防止代理过早关闭连接。
  5. 开始通过 POST 请求向服务器发出命令,并在 GET 响应中获取相应的 RTSP 流。

奇怪的东西(如果上面还不够奇怪的话)是,例如,它可以与 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:这种行为(即具有巨大 Content-Length 的 POST 请求)也是 WebEx 使用的 ActiveX 的特征(可能还有许多其他需要与服务器建立开放通道的 Web 应用程序)。

【问题讨论】:

  • 服务器的 HTTP 200 OK 响应是否有效?!我的服务器曾经像您一样响应,但 RealPlayer 在打开 GET 和 POST 连接后停止响应。然后我添加到响应的正文 48 02 00 00 和 Content-Length: 4 属性并且它起作用了......也许你需要修改你的 HTTP OK 响应并在你收到 POST 连接之后发送它,而不是在那之前。跨度>

标签: http networking proxy streaming rtsp


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

【讨论】:

    【解决方案2】:

    首先,您可能想阅读以下内容:

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

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

    您是否正在使用 McAfee 的防病毒软件?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      • 2012-11-08
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2013-06-22
      相关资源
      最近更新 更多