理论上可行吗:通过Websockets提供静态内容是可行/可行的吗?

10
在网络世界中,每个静态文件都需要通过一个新的请求来检索,因此样式表、JavaScript 文件、内嵌图片等都会发起新的服务器请求。虽然我对 Web 的了解相当不错,但像 WebSockets 这样的底层技术对于它们的工作方式和能力还是比较新的。
我的问题有些理论化,但我想知道现在是否可能或者是否将来可能通过 WebSocket 来提供静态文件服务?考虑到 WebSockets 是从客户端(Web 浏览器)到服务器的持久连接,使用 WebSockets 为服务一些甚至所有的静态内容是有意义的,因为这只需要一个连接而不是多个。
稍微澄清一下。
我意识到我的关于连接的措辞是不正确的,正如 Greg 在下面指出的那样。但据我所知,创建 CDN 并仍在使用它们的原因是为了解决浏览器或服务器在并发下载数上有一个硬限制的问题,一旦达到该限制,您的请求就会排队,从而增加页面加载时间。我也知道它们也被创建为提供无 cookie 请求的功能。所以,我的问题应该是:“WebSockets 可以替代 CDN 吗?”

BrowserScope有一些有用的指标,看起来对于大多数现代浏览器甚至IE8,每个主机名的请求限制大约为6个。但是,正如我所说,有时人们会有超过6个资源,这是否意味着它们正在排队并减慢页面加载时间,而WebSockets可能会将其减少到一个?


1
你最初的假设是不正确的 - 每个图像等都是单独的HTTP事务,不一定是单独的请求。请参见HTTP持久连接 - Greg Hewgill
现在是可以的。如果我没记错,网络浏览器和服务器优化了连接的使用,可能早在10年前就已经实现了。它们不会为每个文件打开一个新的连接。 - gbulmer
你说得对,Greg。我完全错误地表达了我的问题的那一部分。不过,持久连接仍然有限制,对吧?所以,如果你有15个静态文件(并不是很多),你就会超过限制。Websockets能否用于更快地提供文件,绕过最大限制,还是我过分考虑了Websockets的能力? - Dwayne Charrington
正如我所说,我对底层Web技术的了解相当有限,我想我只是这些技术的API用户。如果我假设现代浏览器和服务器不能同时下载静态文件,并且这仍然像几年前一样成为瓶颈问题,那么我错了吗? - Dwayne Charrington
建立15个并发Web套接字连接的成本可能比创建少量HTTP连接然后将您的15个GET请求进行管线化要高。对于移动客户端来说,这肯定是正确的。 - simonc
2个回答

10
这肯定是可能的,但有几个原因你可能不想使用它来处理静态资源:
- 你需要至少一个能够通过标准HTTP机制静态传递资源的资源,这意味着你需要一些能够服务于静态资源的东西。通常情况下,你希望将Javascript与HTML分开,这意味着另一个静态负载。或者您可以将WebSocket代码混杂在主页面中,但仍然没有任何改进。 - 在页面上运行脚本之前,你无法打开WebSocket连接。建立WebSocket连接会增加一些初始延迟。 - 大多数浏览器会并行加载非冲突的静态资源(一些较旧的浏览器对并行连接数量有严格限制,但它们仍然具有一定的并行性)。你可以为不同的静态资源打开多个WebSocket连接,但要可靠和高效地执行这个操作需要大量的努力。浏览器已经解决了大部分静态资源加载问题。 - 每个WebSocket连接都是基于消息顺序的传输。结合Javascript执行的序列化特性,这实际上意味着你一次只能处理一个WebSocket消息。你可以使用Web Workers来并行处理多个WebSocket连接,但主渲染脚本仍将在这些连接上被序列化。你当然可以使这个过程高效,但再次强调,这不是一个微不足道的问题,浏览器已经解决了许多这些静态资源加载问题。 - 许多Web服务器支持在传递资源之前对它们进行压缩。WebSocket尚未支持压缩(正在工作组中讨论作为扩展)。这意味着如果你想通过WebSocket压缩你的资源,你将不得不在Javascript中执行此操作,这会增加更多的延迟。
如果您的页面有使用静态资源动态更新的部分(例如,在HTML5画布游戏中加载新图像),那么WebSocket可能是您的最佳选择,因为已经建立的WebSocket连接将具有从服务器推送更新并通过HTTP传递这些更新的低延迟和开销。但我不建议在页面首次加载时使用WebSocket来处理初始静态资源。

4

这个答案并没有真正回答你的WebSocket问题,但它可能会使它变得过时:

下一代技术被认为是解决在单个连接上传输多个资产的问题的SPDY,它曾经是HTTP 2.0的候选者。Chrome和Firefox中已经有了工作实现,并且谷歌和Twitter等公司已经进行了一些实验性的服务器端支持。

编辑:SPDY协议现已被弃用。但您可以考虑研究它。


SPDY协议确实使我的问题过时了。我稍微研究了一下WebSockets,虽然从理论上讲,WebSockets可以用于传递静态资源,但是你需要花费大量时间来确保网站在多个浏览器上正常工作,而这些收益并不值得这么做。 - Dwayne Charrington

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