HTML5能够让Web应用程序建立点对点的HTTP连接吗?

101

是否可以创建一个 web 应用程序,通过中央服务器的帮助,与同一 web 应用程序的其他用户创建直接连接?我想象的过程类似于UDP打洞。

我已经阅读了 HTML5 中的新 WebSockets API,但似乎必须使用 WS 兼容服务器来初始化连接,才能开始完全双向的连接。我更关注的是一种在客户端之间建立直接连接的过程,而服务器仅在初始握手时介入。

注意:Java applets 不算。我只对标准浏览器技术感兴趣。


6个回答

112

不是基于猜测,这里有一个知情的答案:

HTML5计划允许使用JavaScript进行点对点连接,但这些连接将不是原始的TCP连接。

完整的规范可以在http://dev.w3.org/html5/websockets/找到。

编辑:关于点对点连接,请查看以下链接:

重要的是要注意,功能仍在协商中。能够创建“本地聊天”Web应用程序将是很好的。

jrh


46
不是凭空猜测,这里有一个知情的答案。 - Ionuț G. Stan
2
WebSocket允许连接到任何主机吗?我相信规范只允许服务器。 - hegemon
4
WebSocket不再是HTML5的一部分,而是一个独立的规范。 - Sergey Ilinsky
8
WebSockets 不是点对点的,仍然是客户端与服务器之间的通信,而浏览器不实现服务器端。 - Alnitak
4
WebSockets不能进行点对点通讯,但是一个更加新的规范WebRTC专门为此而设计。 - Eric Mill

29

更新于10/17/2012: 此功能现在已在Chrome Stable v22中存在。为了在Chrome中使用此功能,必须在chrome://flags中启用两个标志:

  • 启用MediaStream
  • 启用PeerConnection

然后,您可以访问AppRTC演示页面来尝试演示。有关设置Chrome以使用点对点功能和启用设备捕获的更详细说明,请参见WebRTC - 运行演示文稿页面。


更新: Ericcson Labs的工程师们在WebKit构建中提供了一个概念验证,HTML5点对点对话视频

他们在博客中展示了这项技术的演示,以及有关该技术如何工作的图表和解释。

他们正在努力稳定该技术并将其提交到WebKit存储库中。


你估计这个什么时候能加入到WebKit? - Alistair
我不知道。我建议与Ericcson联系。链接在我的回答中。他们的论坛上可能有关于那个的信息。 - jamesmortensen
需要特殊的浏览器配置/标志设置并不意味着它是工作中的Web标准规范的一部分。如果它不在HTML5、WebSockets或WebRTC中,那么你就不能进行点对点通信而不使用hack技巧。幸运的是,WebRTC似乎正在朝着正确的方向发展。 - Beejor

18

是的,终于。

截至本文撰写时(2017年),WebRTC现在成为大多数现代浏览器的标准部分(使用率约为70%),并允许进行多媒体流、点对点和打洞。

有关WebRTC的文档、示例代码和实时示例可在html5rocks.com找到。

根据caniuse.comhtml5rocks.com,以下浏览器支持WebRTC:

完全支持:Edge 14,Firefox 22,Firefox Android 55
部分支持:Android Browser 56,Chrome 20,Chrome Android 29,Edge 12,Firefox 17,Opera 18,Opera Android 20,Opera Mobile 12,UC Browser Android 11.4
未来支持(2017年第3季度):Chrome for iOS 11,Safari 11 for iOS 11 and OS X 10.11
不支持:IE,IE Mobile,Opera Mini

WebRTC在苹果设备上的饱和率受限,因为Safari 11尚未发布,并且需要iOS 11或OS X 10.11。但根据过去的升级趋势,到2018年,WebRTC应该在大约75%的iOS设备上可用,并在2020年达到100%。


4

这将是非常棘手的问题,原因如下:

  1. 防火墙(即使是普通的NAT)会使得这种连接在比HTTP更低级别的协议层面上变得困难。从IT安全的角度来看,这似乎是打开机器上任意端口的绝佳方法,只需访问一个网站 - 因此几乎所有企业IT系统都会积极地阻止它。
  2. HTTP本质上是一种客户端-服务器协议。虽然使用长轮询(以及其他一些技术)可以相对容易地模拟双工通信,但效率并不高。
  3. 这将为XSS攻击打开一个大洞。

WebSockets旨在解决第二个问题,但(我预计是故意的)不解决其他两个问题。当HTML5规范中谈到点对点(peer-to-peer)时,他们谈论的是服务器和客户端之间的全双工通信,而不是一个客户端和另一个客户端之间的通信。

然而,在WebSocket上实现适当的网络堆栈很简单,但前提是所有通信仍然必须通过服务器进行。我曾经见过使用长轮询(我在大学时的一个朋友编写了一个完整的TCP/IP堆栈)来完成这项工作。


P2P不是客户端-服务器模式;前者在对等方之间移动流量,后者通过服务器将流量传输到一个或多个客户端。 P2P的主要优点是服务器可以充当匹配器,同时重要的流量在客户端之间传输(这对于隐私和带宽来说是一大福利)。 - Beejor

0

0

我赞同 harshath.jr 的观点:你可以很好地将服务器作为目录(公开每个连接代理的“起源”;起源是指如 draft-abarth-origin 中的方案+主机+端口,其中方案可以是“ws”或“wss”)。然后,您可以启动点对点 WebSocket 连接;通过 CORS 工作的 SOP。当然,这意味着每个代理(即浏览器)都必须嵌入自己的 WebSocket 服务器(类似于 Opera Unite)。

同时,可以使用 XMPP/IRC 等方式:没有点对点连接,而是使用 WebSocket 连接到中央服务器(或网络!)以将消息传递给已连接的代理(最终使用某些特定的 WebSocket“子协议”)

编辑:请注意,所有这些实际上都超出了 HTML5 的范围(所有这些东西曾经是 HTML5 的一部分,但已被拆分成它们自己的规范)


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