本文转载自:众成翻译
译者:文蔺
连接:http://www.zcfy.cc/article/657
原文:https://daniel.haxx.se/blog/2016/06/15/no-websockets-over-http2/html译者注: 《深刻浅出 Node.js》第七章讲述 WebSocket 服务的构建中,对本文中反复提到的
Upgrade
有比较详细的说明。git
NO WEBSOCKETS OVER HTTP/2.github
我这样说的意思是,在 HTTP/2 协议里,没法像在 HTTP/1.1 中把链接(connection)协商或提高为 WebSocket那样,如RFC 6455 所描述的 —— 这个规范(RFC 6455)详述了在一个 HTTP/1.1 请求中,客户端如何使用 Upgrade:
将连 http 接转换为 WebSocket 链接。web
注意 WebSocket 并不是 HTTP/1 规范的一部分,它只是使用了 HTTP/1 的协议细节将 HTTP 链接转换为 WebSocket 链接。 相似地,HTTP/2 之上的 WebSocket 也不会成为 HTTP/2 规范的一部分,而是成为独立的一部分。api
(附注:Upgrade:
的机制,和在服务端支持的状况下,非 https 的HTTP/1.1 链接能升级为 HTTP/2 是同样的。)浏览器
曾经有一份提交的草案描述了 HTTP/2 下的 WebSocket 如何实现。那时 IETF 工做组并无对它表现出任何特别的兴趣,并且在我看来,不多有工做组有兴趣捡起这个球把它继续滚下去。它就这样,毫无进展了。websocket
这很重要: HTTP/2 下 WebSocket 的缺失,是由于根本没人写出来一份规范 (及其实现)。这些事情不会本身发生,它们须要一群相信这份事业并为之努力工做的人。socket
HTTP/2 下 WebSocket 固然有好处,它只是链接上的一个数据流,这个链接同时也能服务于其余的非 WebSocket 的通讯。而 HTTP/1 链接升级的 WebSocket 独占了整个链接。spa
因此 HTTP/2 下面咱们拿什么来替代 WebSocket 呢?好吧,也有几个选择。可能的状况是,你要么坚持着 HTTP/2, 从 HTTP/1 升级,使用 Web 推送(Web push),要么就走到 WebRTC 这条路上来。翻译
若是你真的必需要坚持使用 WebSocket, 那很简单,你只须要像以前同样,从 HTTP/1 链接升级到 WebSocket。和我交谈过的大部分很是坚持 WebSocket的人都是那些开发者,他们就只须要很基本的单一的链接,因此 HTTP/1 和 HTTP/2 对他们来讲没什么差异。
若是真的很是坚持使用 HTTP/2,你能够像过去使用 长轮询那样,那会儿 WebSocket 还没被发明出来。这曾经是挺糟糕的方案,由于会浪费一个链接,并且有一个大部分时间是空闲着的链接也容易致使错误。在 HTTP/2 下面这样作,问题就少了不少,由于它只是一个不会被使用得太多的单向流,因此不会形成太多浪费。此外,链接极可能为其余数据流使用,这能减小空闲链接被 NATs 或防火墙干掉的问题。
Web Push API 是 W3C 2015年带来的一个和 WebSocket 这样人工化的、“粗糙”的方式相比, 更有 Web 范儿的(more “webby”)推送方式。若是你主要是拿 WebSocket 来推送消息通知,这多是更方便的选择。
WebSocket 以后引入的是 WebRTC。这是用来解决浏览器之间通讯的,不过拿过来作 WebSocket 曾被拿来作过的一些事情确定也是一种选择。
HTTP/2 下的 WebSocket 可能 仍是会被实现。它没被完成的实际状况,只能代表人们尚未足够的兴趣。
想想,浏览器只能在 TLS 之上使用 HTTP/2,而 WebSocket 只需经过普通的 TCP 链接就能完成。实际上,将 HTTP 链接提高到 WebSocket 的惟一途径就是使用 HTTP/1 中 Upgrade:
响应头的小把戏,而不是 HTTP/2 为了减小须要的往返数量而使用的用于 TSL 的应用层协议(ALPN)的办法(ALPN method for TLS)。
若是真有人要把 WebSocket 引入到 HTTP/2 中,他们极可能只能经过浏览器内部使用 TLS 来实现。