【问题标题】:How to establish a TCP Socket connection from a web browser (client side)?如何从 Web 浏览器(客户端)建立 TCP Socket 连接?
【发布时间】:2011-12-24 11:45:39
【问题描述】:

我读过WebSockets,但它们似乎不是纯粹的“套接字”,因为它们之上有一个应用层协议。 "ws:"

有没有办法从网络浏览器进行纯套接字连接,以活跃网页?

这是我在黑暗中的随机刺伤

  • Java 提供的 Applets 套接字(需要安装 java)
  • Flash 提供的 Flash 插座(需要安装 Flash)

但是关于 HTML5,如果它们不是 Sockets,为什么它们被称为 WebSockets?

websocket 协议实现起来是否如此简单以至于“几乎”是套接字?

【问题讨论】:

    标签: ajax flash sockets applet websocket


    【解决方案1】:

    我读过有关 WebSockets 的文章,但它们似乎不是纯粹的“套接字”,因为它们之上有一个应用层协议。

    [是] websocket 协议实现起来如此简单,以至于[它]“几乎”-sockets?

    直接从浏览器允许常规套接字连接永远不会发生,因为它会带来巨大的风险。 WebSockets 与您将获得的浏览器中的原始套接字差不多。最初的 WebSockets 握手类似于 HTTP 握手(允许 Web 服务器代理/桥接它)并增加了 CORS 类型的安全性。此外,WebSockets 是基于消息的传输(而不是作为原始 TCP 流式传输),这是通过在每个消息帧上使用两个字节的标头来完成的。

    即使是闪存也无法完全建立原始 TCP 连接。 Flash 套接字还增加了 CORS 安全性,但不是带内握手,而是 Flash 套接字连接连接到目标服务器上的端口 843 以请求安全策略文件。

    有没有办法从网络浏览器进行纯套接字连接,以活跃网页?

    是的,您可以使用我的websockify bridge/proxy,它允许启用 WebSockets 的浏览器通过 websockify 直接连接到 TCP 套接字。

    但是关于 HTML5,如果它们不是 Sockets,为什么它们被称为 WebSockets?

    WebSockets 是一种基于 TCP 套接字的传输。握手之后,开销非常小(通常只有两个字节的标头)。

    【讨论】:

    • 不错的答案 +1,感谢您的错字。缩小搜索范围:如果我可以在客户端连接服务器就足够了对此有何建议?谢谢
    • 连接到本地主机并没有真正改变安全状况。想象一个可以连接到所有本地端口的恶意网页(或友好网页上的恶意广告)。基本上它绕过了所有的防火墙保护。您仍然可以在本地为您希望代理的任何端口运行 websockify。
    • w3c 有一个raw socket api 的草稿security and privacy considerations 是弱而奇异的。这就是我要说的。
    • @user2350838,原始套接字规范是 sysapps WG (w3.org/2012/09/sysapps-wg-charter.html) 的一部分。 sysapps WG 章程旨在标准化可用于受信任/用户安装的 Web 应用程序(即已安装的 Web 应用程序)的 API。这不是标准网站/网络应用程序可以使用的东西。例如,Chrome 打包的应用程序、Firefox OS 应用程序、PhoneGap 应用程序等都可以访问其他 API。 sysapps 小组正在尝试为这些 API 创建标准。
    • @Kaan 查看我关于为什么 websockify 将不支持任意主机:端口目的地的评论:github.com/kanaka/websockify/issues/3#issue-907487 原因是一样的。总而言之,来自浏览器的任意 TCP 将允许一段恶意 JS 代码(可能是由最近的 github DDOS 等中间人秘密交付)连接到您的内部网络上的任何东西,从而绕过防火墙保护。 WebSocket 通过添加 WebSocket 协商(只允许连接到 WebSocket 服务器)和标准 CORS 来防止这种情况。
    【解决方案2】:

    我无法改进 Kanaka 对您的次要问题的回答,而且我知道这个问题已经存在一年了。但对于主要问题,Is there any way of doing a pure socket connection from a web browser, to enliven webpages? 有一个名为Java / JavaScript Socket Bridge 的项目可能是您(或任何通过 Google 搜索进入此页面的人)正在寻找的东西。与其他人提到的方法相比,这种方法的优势在于它不需要运行客户端或服务器端服务。因此,例如,如果您想纯粹用 JavaScript 实现 IRC 客户端,但您的 Web 主机不允许您有足够的权限来代理连接,那么这个 Java 小程序将是您的最佳选择。唯一需要注意的是确保客户端已安装并允许 Java。

    【讨论】:

      【解决方案3】:

      您可以使用 WebSockets 在客户端和服务器之间发送数据。简单来说,WebSockets 引入的唯一区别就是客户端:

      • 添加一些头字节,如数据类型和长度
      • 添加掩码并使用它们对数据进行编码

      服务器也需要添加头部字节,但不需要对数据进行编码。

      如果你正确地实现了协议(服务器端,也就是说,因为浏览器已经有一个实现),你可以轻松地使用它来发送文本和二进制数据。 (虽然浏览器支持范围很窄,尤其是后者。)

      【讨论】:

      【解决方案4】:

      WebSocket 的好处是它是基于 HTTP 的。您也可以在使用 http 代理的环境中使用它。因此 Websocket 与普通 tcp 具有更高的基础设施兼容性。

      此外,http/WebSocket 还为您提供了一些您必须自己指定的功能:

      • 重定向
      • NAT 保活
      • 通过 URI 进行多路复用
      • 框架

      【讨论】:

      • 什么是框架?
      【解决方案5】:

      如果您要求从服务器推送一些数据,它被广泛称为 COMET 或 Reverse Ajax。

      Web 套接字仍然不是很流行,因为存在固有的防火墙问题和流行浏览器的支持最少。

      您可以查看http://www.ape-project.org/,因为这是最流行的实现之一(但目前仅适用于 unix/linux。对于 Windows,他们建议使用基于虚拟机或 vmware 的实现)

      【讨论】:

        猜你喜欢
        • 2015-01-30
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        • 2019-01-06
        相关资源
        最近更新 更多