以下是关于 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 条评论