Firefox 中的 WebSockets

以下是关于 WebSockets 的介绍:一个低复杂度、低延迟、双向通信系统,它为 Web 开发者提供了一个 非常简单的 API。让我们来分解一下,然后讨论我们是否以及何时将其包含到 Firefox 中。

低复杂度

WebSocket 协议,通过类似 HTTP 的握手方式启动,具有相对简单的文本数据包来回发送模型。协议的复杂度非常低。没有多路复用,不支持二进制数据,一旦数据连接建立,实际传输非常便宜。

需要注意的是,有些人认为——可能正确——应该添加对多路复用和二进制数据的支持。这显然会增加复杂度,但在某些情况下可能是值得的。但我们稍后会详细说明。

双向通信

WebSocket 的关键方面之一是它支持简单的双向通信。服务器可以轻松地将更新发送给客户端,客户端也可以将更新发送给服务器。许多人构建的 彗星式 应用程序将在这个模型下变得更加简单和快速,因为协议和 API 直接支持它。

虽然允许双向通信,但它也受限于 HTTP 同源模型。也就是说,它不会让浏览器连接到任何端口上的任何网站。

因此,WebSocket 实际上就是带有 HTTP 安全模型的 TCP。

低延迟

这实际上是 WebSockets 的主要价值。关键是发送少量数据的花费也非常低。如今可以通过彗星式应用程序进行双向通信,但少量数据往往需要大量的开销才能做到这一点。

一个二手的故事,让你了解规模:Google Wave,试图通过按键进行实时通信,每次按键都会有几千字节的开销,因为涉及到 TCP 启动、关闭和 HTTP 消息头,而这些信息本应该只需要发送几个字节。

我还没尝试过,但我猜想,如果你在 HTTP 彗星之上构建 Quake,那么交互体验会很差。所以,这就是 WebSockets 真正闪耀的地方。

简单的 API

开发者看到的 实际的 WebSocket API 比较简单。你可以发送消息,可以接收消息,可以在套接字打开、关闭或出现错误时收到事件。额外的复杂性,我相信其他人会开发出来,将会发生在 JavaScript 和后端库中。

(虽然这看起来像是推卸复杂性问题,但实际上这是我们从其他浏览器标准中看到的成功模式:构建一些相对简单的,其他人可以用来实验的东西。当我们了解到哪些东西很慢或哪些东西阻碍了进度时,就可以进行迭代和改进。)

它何时会出现在 Firefox 中?

我们真的非常希望在下一个版本的 Firefox 中支持 WebSockets。很多其他开发者也希望我们包含支持。

第一组测试补丁,由我们优秀的贡献者之一、才华横溢的 Wellington Fernando de Macedo 编写,于 2009 年 4 月首次提交。从那时起,我们一直在对补丁本身进行迭代,并随着规范的变更而更新。

不幸的是,规范本身仍在修订中。WebSockets 已经与版本 4 一起在 Chrome 中发布,我从 Chrome 开发者那里听说它将在 Chrome 5 中包含,并且没有任何修改。不幸的是,Google 在 Chrome 中包含的版本当前草案 不一致。关于如何启动 WebSocket 连接的握手方式已经发生了变化,这主要目的是为了提高服务器的安全性。关于 集成压缩、直接支持二进制数据(而不是将二进制数据编码为字符串)、协议是否应该支持多路复用以及许多其他问题,也正在进行大量的讨论。

由于 WebSocket 还没有被广泛使用,而且 Chrome 的普及率与 Firefox 相似,因此我们希望一旦最新草案通过流程,Chrome 和 Firefox 就可以在同一时间包含一个更新的版本。

简而言之:我们希望发布它,因为 WebSockets 的前景非常光明,但我们还需要看看它是否足够稳定和安全,才能发布。代码不是问题——我们已经有了代码。问题是协议是否已经“足够完善”,可以发布给几亿人。


40 条评论

  1. John Dowdell

    以下是针对跨浏览器 WebSockets 的 JavaScript 控制代码
    http://github.com/gimite/web-socket-js#readme

    jd/adobe

    2010 年 4 月 28 日 下午 10:38

  2. Su-Shee

    好吧,许多 Web 开发者已经开始发布他们的应用程序和实验,而我们这些 Firefox 用户和竞争对手都只能依赖于 Flash 作为后备方案,因为 Chrome 和 Webkit 已经内置了它并运行良好——尽快将代码纳入(并发布),至少给早期采用者提供通过配置激活它的可能性。

    Web 3.5(CSS3、HTML5 :) 也还没有“广泛使用”,而且它还不是已发布的标准或类似的东西,而 FF 支持其中很大一部分——为什么在 WebSockets 之前就止步不前?

    所以,不要发布给那些下载二进制文件的用户,而是给我们 Web 开发者提供使用它的可能性。

    说真的,如果代码不是问题……

    2010 年 4 月 28 日 下午 11:11

  3. SchizoDuckie

    那么,这在服务器端如何扩展?是否有任何方法通过 CDN 代理大量请求?或者每个客户端都需要与服务器建立直接的 TCP 连接?(在流量很大的网站上有点痛苦)

    2010 年 4 月 28 日 下午 1:59

  4. Aaron

    我们正在讨论 HTML5 WebSockets,我想知道现在或者将来,HTML5 是否允许 Web 应用程序建立点对点 HTTP 连接?通过 UDP?

    —— Aaron

    2010 年 4 月 28 日 下午 2:12

  5. Tomer

    虽然 WebSockets 是一项很棒的技术,它将加速 Web 的发展,但我很好奇,结构化存储 API 草案是否有任何进展,它已经被 Chromium 和 Google Gears 实现,但仍存在一些问题,阻止它在 Firefox 中实现。

    Google 已经停止更新 Firefox 版 Gears,除非它在 Firefox 上得到原生支持,否则包括我在内的部分用户将不得不保留一个 Firefox 3.5 安装程序用于旅行,因为这是保持 Gmail 邮箱在离线状态下可用的最佳选择。

    2010 年 4 月 28 日 下午 3:42

  6. Brendan Miller

    我不明白为什么 W3 不直接公开 TCP 套接字……我猜是因为 W3C 真的很希望人们继续使用插件?

    如果没有原始 TCP 支持,你无法在浏览器端实现 telnet/ssh/smtp/bittorrent/ftp/irc 客户端,除非使用插件。

    2010 年 4 月 28 日 下午 3:56

  7. George

    很抱歉说一些不中听的话,但为什么 W3 要重写 Opera 四年前实现的服务器发送事件规范?为什么其他人对此似乎没有兴趣?

    2010 年 4 月 28 日 下午 4:38

  8. Arun

    Firefox 4 是 3.7 吗?还是计划在之后发布?

    2010 年 4 月 28 日 下午 9:10

  9. Lars Gunther

    很遗憾,一些开发者没有从 90 年代吸取教训。发布半生不熟、不安全且不符合标准的技术最终会带来很多麻烦。

    请继续保持冷静,Mozilla!在规范更加成熟之前,不要将其发布给大众。

    但是,像 WebGL 和 HTML5 解析器在几天前那样,在 about:config 中添加一个开关会很不错。

    2010 年 4 月 29 日 上午 0:54

  10. Simon Willison

    SchizoDuckie:服务器端的扩展很困难,但并非不可能——将其与 AIM/Y!M/GTalk 等 IM 服务进行比较,这些服务多年来一直在解决大规模开放连接问题。查看各种基于事件的网络框架,例如 Node.js、Twisted(Python)和 Event Machine(Ruby)。它们可以轻松地在相对不强大的硬件上处理数千个开放连接。

    2010 年 4 月 29 日 上午 4:08

  11. Max Williams

    这真的有点像良性循环,当浏览器支持 WebSockets 时,人们会开始用它们制作很酷的东西。

    我们正在努力打破这种循环,并激发早期采用,因为我们认为 WebSocket 是最好的选择。因此,我们创建了 http://pusherapp.com :)

    非常期待 Firefox 的原生支持!

    2010 年 4 月 29 日 上午 7:22

  12. Cyrus Omar

    我不明白为什么不能公开标准的 TCP/UDP 协议(可能需要一些同源安全考虑)?然后 WebSocket 可以成为一个客户端库。

    2010 年 4 月 30 日 上午 11:01

  13. Brett Zamir

    感谢您又一次提供了关于重要主题的见解文章。Hacks.mozilla.org 是我见过的关于 Mozilla 和 Web 开发人员最有趣、写得最好的网站……

    2010 年 4 月 30 日 下午 10:48

  14. Alexander Schulze

    在浏览器原生支持 WebSocket(如 Chrome)之前,可以使用 http://github.com/gimite/web-socket-js 中的 Flash 桥接器,让所有常用浏览器都能够使用 WebSocket。jWebSocket 是一款跨浏览器兼容的 WebSocket 客户端/服务器解决方案,它具有简单的 API、大量的演示和文档。请访问 http://jWebSocket.org。Alex

    2010 年 5 月 5 日 上午 10:41

  15. puran

    Firefox 也将支持 WebSocket 真是太棒了。我们已经使用 WebSocket 作为通信项目,并实现了良好的 WebSocket 实现。
    http://jwebsocket.org

    2010 年 5 月 5 日 下午 12:18

  16. Vitaliy Kupets

    >> 虽然允许双向通信,但也受 HTTP 同源模型的约束。

    哎,真是太糟糕了。我有一个应用程序,它分布在不同的域上运行,并与一个特定的控制器服务器保持联系。目前,我们使用 Flash 进行套接字通信,效果还不错,但问题是,必须在每个用户的机器上安装 Flash。我真的希望 WebSocket 的规范能够以某种方式允许跨域通信,否则我们将不得不继续使用 Flash,这不是最优的解决方案。

    2010 年 5 月 17 日 上午 8:51

    1. Christopher Blizzard

      据我了解,WebSocket 协议中会有一种跨域方法,就像 HTTP 协议一样。

      2010 年 5 月 17 日 下午 8:13

    2. james

      所以 Flash 必须安装在每台电脑上?这不是行业标准吗?政府和学校都采用了 FP10 用于工作?

      您仍然需要在每台电脑上安装 FF4,这难道不是增加了更多工作量吗?您必须重写现有代码,而且我们还没有看到 WebSocket 在性能和安全性方面的基准测试。没有吗?

      现在就说 Flash 会输掉比赛还为时过早,因为您一定知道所有设计师和开发者都喜欢 IDE 和互操作性。HTML5 可能是另一项技术,但亚马逊、邦迪斯、Facebook 或任何其他商业网站甚至不会考虑,因为它们已经是成熟的技术,并且被广泛使用,Flash 也是如此。

      告诉我,您用 HTML5 开发 3D 应用程序需要多长时间,而用 iPhone SDK 和 Flash 需要多长时间?

      2010 年 7 月 10 日 上午 6:05

      1. james

        我指的是 Vitaliy Kupets 的评论

        2010 年 7 月 10 日 上午 6:06

        1. Vitaliy Kupets

          @james

          – 我们有一些潜在客户,由于他们的安全条款(例如银行),他们不愿意使用 Flash 插件,所以他们就放弃了;
          – 我不是在说 FF4,而是在说标准本身,它规定了“同源”模型;
          – 我并不是说 Flash 会“输掉比赛”,我只是说,如果讨论的 W3C 标准不允许跨域连接,那么它对许多应用程序来说毫无用处;但是,当它允许跨域连接时,我们将很高兴尽快放弃使用 Flash 的“变通方法”,只要主流浏览器都支持 HTML5。
          – 我现在并不关心 3D 开发

          2010 年 7 月 12 日 上午 1:38

        2. Vitaliy Kupets

          @james

          – 我们有一些潜在客户,由于他们的安全条款(例如银行),他们不愿意使用 Flash 插件,所以他们就放弃了;
          – 我不是在说 FF4,而是在说标准本身,它规定了“同源”模型;
          – 我并不是说 Flash 会“输掉比赛”,我只是说,如果讨论的 W3C 标准不允许跨域连接,那么它对许多应用程序来说毫无用处;但是,当它允许跨域连接时,我们将很高兴尽快放弃使用 Flash 的“变通方法”,只要主流浏览器都支持 HTML5。
          – 我现在并不关心 3D 开发;

          2010 年 7 月 12 日 上午 1:39

  17. Vitaliy Kupets

    @james

    – 我们有一些潜在客户,由于他们的安全条款(例如银行),他们不愿意使用 Flash 插件,所以他们就放弃了;
    – 我不是在说 FF4,而是在说标准本身,它规定了“同源”模型;
    – 我并不是说 Flash 会“输掉比赛”,我只是说,如果讨论的 W3C 标准不允许跨域连接,那么它对许多应用程序来说毫无用处;但是,当它允许跨域连接时,我们将很高兴尽快放弃使用 Flash 的“变通方法”,只要主流浏览器都支持 HTML5。
    – 我现在并不关心 3D 开发

    2010 年 7 月 12 日 上午 1:38

  18. Vitaliy Kupets

    哎呀,抱歉我的评论有重复 :) 请删除重复的评论以及这条评论

    2010 年 7 月 12 日 上午 1:45

  19. DerFichtl

    这是我的 WebSocket 示例……但它在 Firefox 4 Beta 中不起作用……我不知道为什么……Chrome 和 Safari(Mac)运行良好……

    http://bohuco.net/blog/2010/07/html5-websockets-example/

    2010 年 7 月 12 日 上午 2:36

  20. James

    @Vitaliy Kupets,当然,我指的是那些安装了 Flash Player 的人。不是没有 Flash Player 的人。

    2010 年 7 月 12 日 上午 5:19

  21. James

    您不必回复,因为我不使用我的电子邮件,也不会再读了

    2010 年 7 月 12 日 上午 5:20

  22. James

    我的意思是不会再读了。

    2010 年 7 月 12 日 上午 5:20

  23. James

    我的意思是不会再读了。

    2010 年 7 月 12 日 上午 5:21

  24. […] HTML5、硬件加速高清视频、WebSocket 和通过 […] 改进的插件支持

    2010 年 7 月 26 日 上午 4:09

  25. […] WebSocket、HTML 历史记录 API 的实现 […]

    2010 年 7 月 27 日 下午 5:37

  26. Nathan Sweet

    我总是觉得,当人们反对 Flash 时,我觉得很有趣,因为它为进行客户端套接字操作提供了最好的解决方案。我不是 Flash 的狂热支持者,我总是更喜欢标准而不是插件(比如 Flash 基于的导航菜单,这些菜单仍然存在,顺便说一句,这是荒谬的,应该尽快消除)。但是,Flash 提供了一些标准浏览器中没有的强大功能。

    Web 越来越复杂,而不是越来越简单。Flash 10 在发展中国家的用户使用率为 97%。我刚完成了一个项目,其中 Flash 10 是我唯一的选择。我必须创建一个套接字连接到一种特殊类型的服务器,并直接操作字节数据,在播放器中进行压缩,并使用 Flash 10 中的新 Vector 类来操作数据。虽然 HTML5 正在蹒跚前进,试图为基本的套接字连接制定标准,但 Flash 正在实现高级功能来操作套接字,这些功能最初只能通过自定义插件来实现。哦,别忘了,我无需做任何事情来确保我的 Flash 应用程序在不同的浏览器中都能正常工作,它在 IE6 中的运行效果与在 Chrome 5 中的运行效果一样好(理论上,使用 IE6 的计算机可能无法处理缓存负载,但这是另一回事)。

    这可能是 HTML5 与 Flash 竞争的最大障碍。我个人认为,问题在于,为像二进制操作这样复杂的东西制定一套标准是不切实际的。我认为,HTML5 应该
    1. 完全放弃套接字
    2. 支持非常基本的套接字连接
    3. 等待 JS Harmony 完成,并允许 JavaScript 承担大部分数据操作的任务。

    在讨论 HTML5 时,隐含着对 JavaScript 甚至不信任。没有人会说出来,但是为什么我会想要让浏览器做如此复杂的事情呢?我明明知道它不会以标准化的方式实现。我们只能等到 JS 2.0 发布之后,HTML5 才能真正取代 Flash。

    2010 年 7 月 29 日 上午 11:52

  27. John Deer Tractor

    我听说 WebSocket 协议最终将能够正确地处理请求
    中断(用户离开页面或
    点击停止按钮)——向
    服务器发送断开连接数据包。这是准确的吗?我还听说 FF4
    还没有正确地实现这种行为,而且无法发送
    断开连接数据包。

    2010 年 8 月 10 日 上午 10:58

  28. Sebastien

    我只能说……像这样的评论总是让我发笑……别介意

    “由于 WebSocket 还没有被广泛使用……”当然它还没有被广泛使用,因为它还没有可用。让它可用,我们就会使用它!然后你就可以判断它是否被广泛使用。哈哈哈!

    2010 年 8 月 10 日 下午 1:54

  29. […] WebSocket 可用于实时 Web 应用程序,例如在线游戏和聊天。[…]

    2010 年 8 月 12 日 上午 6:19

  30. Hector Santos

    我是在最近的 IETF I-D 草案提交中发现 WebSocket 的。当我查阅所有相关文档时,我注意到苹果、谷歌,现在还有微软都参与了进来(他们很可能将目光瞄准了以智能手机为中心的服务器端使用)。

    我认为这项工作很有意义。它应该能够通过将交互式 I/O 设计带回以集中式托管软件包的方式,帮助我们自己的 25 年老软件包。

    不过,我看到两点

    1) (会话)套接字的分配,对于小型到中型系统来说可能不成问题。IP6 可能会起到帮助作用。

    2) 安全性,WebSocket 不应该是跨域攻击的“漏洞”。

    阅读 IETF 工作组的资料,这些问题似乎正在得到解决。

    2010 年 8 月 24 日 上午 4:47

  31. ender

    可能是个愚蠢的问题,但我如果想通过 WebSocket 和 Web 工作线程实现 P2P,是否需要在两个浏览器中都集成一个 WebSocket 服务器,以便直接在浏览器之间传输和接收文件数据部分,因为跟踪器只知道谁拥有哪些文件部分,但不会传输任何文件数据。

    所以我的问题是,浏览器中会实现一个小型的 WebSocket 服务器吗?(因为我需要无服务器的浏览器之间通信)

    谢谢

    2010 年 9 月 10 日 下午 6:04

    1. Adam Rochford

      据我所知,在浏览器中创建客户端服务器违反了标准。这是一个安全问题,他们不希望每个网站都在你的电脑上秘密运行服务器。

      2010 年 9 月 22 日 下午 2:53

  32. ender

    我理解安全隐患,但也许它可以由浏览器轻松地进行监管,因为浏览器实现了 HTML5 WebSocket……这只是一个想法,一个很有意思的想法,不是吗?

    2010 年 9 月 23 日 上午 12:13

  33. […] 嘲笑竞争对手浏览器在 WebSocket 经过充分测试之前就急于添加它的做法。Safari、Firefox、Opera 和 Chrome 都支持 WebSocket,尽管有时默认情况下是禁用的。就在 IE9 […] 之前

    2011 年 3 月 21 日 上午 7:27

  34. […] 比以前更流畅。还有一些幕后的改进,例如对 WebSocket 的支持、改进的 Scratchpad、新的 Web 开发人员菜单项、改进的 Web 控制台以及减少的浏览器 […]

    2011 年 8 月 17 日 上午 2:06

本文的评论已关闭。