websocket实现是否在内部使用http协议



要建立WebSocket连接,客户端会发送WebSocket握手请求,服务器会返回WebSocket的握手响应,如下例所示。[30]

客户端请求(就像在HTTP中一样,每行都以\r\n结尾,结尾必须有一个额外的空行):

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

服务器响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

我无法理解。为了初始化连接,发送了HTTP GET请求。但如果我不托管HTTP服务器,而只托管WebSocket服务器呢?那么它是如何处理HTTP请求的呢?

根据设计,WebSocket协议握手使用HTTP,因此WebSocket可以在现有的HTTP服务器和其他基于HTTP的技术中使用:

WebSocket协议旨在取代现有的双向通信技术,这些技术使用HTTP作为传输层,以受益于现有的基础设施(代理、过滤、身份验证)。这些技术被实现为效率和可靠性之间的权衡,因为HTTP最初并不用于双向通信(请参阅[RFC6202]了解更多讨论)。WebSocket协议试图在现有HTTP基础设施的上下文中解决现有双向HTTP技术的目标;因此,它被设计为在HTTP端口80和443上工作,并支持HTTP代理和中介,即使这意味着特定于当前环境的一些复杂性。然而,该设计并没有将WebSocket限制为HTTP,未来的实现可以通过专用端口使用更简单的握手,而无需重新设计整个协议。最后一点很重要,因为交互式消息传递的流量模式与标准HTTP流量不太匹配,并且可能会在某些组件上引发异常负载。

但是,一旦WebSocket握手完成,就只使用WebSocket协议,不再使用HTTP。

因此,使用支持WebSocket的HTTP服务器或专用WebSocket服务器都无关紧要ANYWebSocket实现必须使用HTTP(以及其中的所有语义,包括身份验证、重定向等)进行初始握手。它是由WebSocket协议规范RFC 6455强制要求的。

开放式握手旨在与基于HTTP的服务器端软件和中介兼容,以便与该服务器对话的HTTP客户端和与该服务器交谈的WebSocket客户端都可以使用单个端口。为此,WebSocket客户端的握手是一个HTTP升级请求

因此,专用的WebSockets服务器至少必须能够在握手阶段处理HTTP请求。实施起来并不难。

websocket实现内部使用http协议吗?

是的,最初,然后他们切换到webSocket协议。所有webSocket连接都以一个HTTP请求开始,该请求带有一个请求升级到webSocket协议的标头。如果接收服务器同意,那么双方将协议从HTTP切换到webSocket,从此连接使用webSocket协议。

所以,所有的webSocket服务器都必须支持初始的HTTP请求,因为所有的webSocket连接都是这样启动的。

webSocket协议是这样设计的,原因有两个:

  1. 因此,一个主机和端口可以用于常规HTTP和webSocket连接。如果需要,可以使用单个服务器进程来处理这两种类型的连接。如果它们位于不同的端口,则需要两个独立的服务器进程。

  2. 因此,webSockets可以在端口80或443(以及HTTP服务器)上运行,以最大限度地兼容各种已经部署的网络基础设施,如公司代理、防火墙等……这些基础设施可能只允许在常规HTTP端口上进行通信。

正如您所看到的,webSocket请求以如下HTTP请求开始:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

注意Upgrade: websocket标头。这告诉接收的HTTP服务器,这是对webSocket连接的请求。如果服务器想要接受该连接,它将返回101响应,该响应告诉客户端他们现在可以切换协议:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

在该响应之后,客户端和服务器都切换协议(在同一个TCP连接上),从那时起,它们只使用webSocket协议,TCP连接保持打开,直到客户端或服务器明确关闭它(通常是长寿命连接)。

我无法理解。为了初始化连接,会发送HTTP GET请求。但如果我不托管HTTP服务器,而只托管WebSocket服务器呢?

所有webSocket服务器都必须接受HTTP请求,因为所有的webSocket连接都以HTTP请求开始。因此,不存在不接受HTTP请求的webSocket服务器。纯webSocket only服务器只能接受具有Upgrade: webSocket标头的HTTP请求,并使任何其他HTTP请求失败。

那么它是如何处理HTTP请求的?

所有webSocket服务器都希望传入的新连接以HTTP开始,因此它们必须内置一个简单的HTTP服务器(可以解析初始HTTP标头)。

最新更新