为什么WebSocket需要使用HTTP进行开启握手?为什么它不能成为一个独立的协议?

12

WebSocket的设计是为了让其服务器可以与HTTP服务器共享端口,通过进行有效的HTTP升级请求来完成握手。

我对此设计哲学有疑问。无论如何,WebSocket协议都是一种独立的基于TCP的协议。

为什么我们需要这个HTTP握手(升级请求)和协议切换呢?难道不能直接(并独立地)遵循类似于WebSocket的协议吗?


阅读此内容:http://tools.ietf.org/html/rfc6455#section-1.2 - haim770
3
你好,我已经阅读了这段文字,但是有点像大海捞针。 所以,我要把那个隐藏答案的确切句子放在这里:“在相对简单的设置中,只有一个IP地址和一个服务器用于所有流量到单个主机名的情况下,这(HTTP握手)可能允许基于WebSocket协议的系统部署实现实际的方式。” 参考:http://tools.ietf.org/html/rfc6455#section-1.8 - ratul
1个回答

19

引用自IETF 6455 WebSocket规范:

The WebSocket Protocol attempts to address the goals of existing
bidirectional HTTP technologies in the context of the existing HTTP
infrastructure; as such, it is designed to work over HTTP ports 80
and 443 as well as to support HTTP proxies and intermediaries, even
if this implies some complexity specific to the current environment.
However, the design does not limit WebSocket to HTTP, and future
implementations could use a simpler handshake over a dedicated port
without reinventing the entire protocol.

换句话说,已经存在着大量的 HTTP 和 HTTPS 基础设施(代理、防火墙、缓存和其他中介),为了增加广泛采用的可能性,WebSocket 协议被设计为允许对现有基础设施进行调整和扩展,而无需完全重新创建来支持在专用端口上使用新协议。

值得注意的是,即使 WebSocket 协议摆脱了与 HTTP 兼容的握手,它仍需要几乎等价复杂度的握手来支持现代 Web 的安全要求,这样浏览器和服务器才能相互验证并支持安全的跨源请求共享 (CORS)。甚至“原始”的 Flash socket 在创建实际 socket 之前也会通过安全策略请求与服务器进行握手。


试图理解协议。你的回答真的很有帮助。我想使用一个新的端口和应用程序来处理WebSocket。通过你的回答,我认为我也可以使用apache来处理WebSocket协议。但是是否有任何现有的apache模块可以处理WS数据帧?你有什么建议或链接可以帮助实现这个吗? - ratul
一些WebSocket扩展期望/假设WebSocket是通过HTTP路径(无论是HTTP / 1.1,SPDY还是HTTP / 2)作为升级而建立的。例如,mux扩展具有addChannel逻辑,它希望HTTP请求能够正常运行。 - Joakim Erdfelt

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