如何在网页浏览器(客户端)上建立TCP Socket连接?

28

我了解过 WebSockets,但它们似乎不是纯粹的 "sockets",因为它们上面有一个应用层协议。"ws:"

有没有办法从Web浏览器建立纯套接字连接以使网页更生动?

以下是我胡言乱语的随机猜测

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

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

WebSocket协议实现起来是否简单到可以"几乎"算作套接字呢?

5个回答

61
我已经了解了WebSocket,但它们似乎不是纯粹的“sockets”,因为它们上面有一个应用层协议。
WebSocket协议非常简单易于实现,几乎就像原始套接字一样。允许直接从浏览器连接常规套接字是不可能的,因为这会打开巨大的风险。初始的WebSocket握手类似于HTTP握手(允许Web服务器代理/桥接它),并增加了类似CORS的安全性。此外,WebSocket是基于消息的传输(而不是像原始TCP一样流传输),每个消息帧使用两个字节的标头来完成。
即使Flash也不能完全建立原始的TCP连接。Flash套接字也添加了CORS安全性,但是与内部握手不同,Flash套接字连接会连接到目标服务器上的端口843以请求安全策略文件。
有没有办法从Web浏览器进行纯套接字连接,以激活网页?
是的,您可以使用我websockify桥/代理,该工具允许支持WebSockets的浏览器通过websockify直接连接到TCP套接字。
HTML5为什么称为WebSocket,如果它们不是套接字?
WebSocket是在TCP套接字上构建的传输层。握手后,几乎没有任何开销(通常只有两个字节的标头)。

好的回答 +1,并感谢指出笔误。我正在缩小搜索范围:如果我能在客户端连接到服务器,也就是在客户机上安装的服务器,从浏览器的角度来看是本地主机,这对我来说已经足够了,也许有一些安全问题应该更简单,您有什么建议吗?谢谢。 - Hernán Eche
连接到本地主机并不会真正改变安全情况。想象一下,如果有一个恶意网页(或友好网页上的恶意广告)可以连接到您所有的本地端口,那么它基本上就绕过了所有防火墙保护。您仍然可以在本地运行websockify来代理任何端口。 - kanaka
1
有一个w3c原始套接字API的草案。安全和隐私考虑比较薄弱和单一。这就是我要说的。 - user2350838
@user2350838,原始套接字规范是sysapps WG(http://www.w3.org/2012/09/sysapps-wg-charter.html)的一部分。sysapps WG的宪章是标准化可信任/用户安装的Web应用程序(即已安装的Web应用程序)可用的API。这不是标准Web站点/Web应用程序可以使用的东西。例如,Chrome打包的应用程序、Firefox OS应用程序、PhoneGap应用程序等都可以访问其他API。sysapps小组正在尝试为这些API创建一个标准。 - kanaka
@kanaka 你能详细说明在浏览器中允许原始TCP套接字的安全风险吗? - Kaan
1
@Kaan 请看一下我的评论,关于为什么websockify不支持任意主机:https://github.com/kanaka/websockify/issues/3#issue-907487 原因是相同的。总之,从浏览器发送任意TCP请求将允许恶意JS代码连接您内部网络上的任何东西,从而绕过防火墙保护。WebSocket通过添加WebSocket协议(仅允许连接到WebSocket服务器)和标准CORS来防止这种情况。 - kanaka

4
我无法对Kanaka对您的次要问题的答案进行改进,我知道这个问题已经一年了。但是对于主要问题,“是否有任何方法可以从Web浏览器进行纯套接字连接,以使网页活跃起来?” 有一个名为Java / JavaScript Socket Bridge的项目可能是您(或任何从Google搜索中找到此页面的人)正在寻找的。该方法的优点是不需要运行客户端或服务器端服务。因此,例如,如果您想纯粹使用JavaScript实现IRC客户端,但您的Web主机不允许您具有足够的权限代理连接,则此Java小程序将是正确的选择。唯一需要注意的是确保客户端安装并允许Java。

2

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

  • 添加一些标题字节,例如数据类型和长度
  • 添加掩码并使用它们编码数据

服务器也必须添加标题字节,但不需要编码数据。

如果你正确地实现了协议(在服务器端,因为浏览器已经有了一个实现),你可以轻松地使用它来发送文本和二进制数据。(尽管浏览器支持很窄,特别是对于后者。)


1
很想知道那些“头字节”是什么样子的,有参考资料吗?谢谢。 - Hernán Eche
1
@void:在http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.1有规范。之前我在http://stackoverflow.com/q/7045885发布了一些关于从客户端到服务器解码数据的伪代码。 - pimvdb

1
WebSocket的好处在于它基于HTTP。您也可以在使用http代理的环境中使用它。因此,与纯tcp相比,Websocket具有更高的基础设施兼容性。
此外,http/WebSocket还为您提供一些功能,否则您必须自行指定:
- 重定向 - NAT保活 - 通过URI进行多路复用 - 帧化

什么是帧(framing)? - Olle Härstedt

0

如果您要求从服务器推送某些数据,则通常称为COMET或反向Ajax。

由于存在固有的防火墙问题并且流行浏览器的支持仍然很少,因此Web套接字仍不是非常流行。

您可以查看http://www.ape-project.org/,因为这是最受欢迎的实现之一(但目前仅适用于Unix / Linux原生。对于Windows,他们建议使用基于虚拟机的实现)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接