websocket 实现内部是否使用 http 协议?
是的,最初,他们切换到 webSocket 协议。所有 webSocket 连接都以带有请求升级到 webSocket 协议的标头的 HTTP 请求开始。如果接收服务器同意,则双方将协议从 HTTP 切换到 webSocket,然后连接使用 webSocket 协议。
因此,所有 webSocket 服务器都必须支持初始 HTTP 请求,因为这就是所有 webSocket 连接的启动方式。
webSocket 协议采用这种方式设计有几个原因:
因此,单个主机和端口可用于常规 HTTP 和 webSocket 连接。如果需要,您可以使用单个服务器进程来处理这两种类型的连接。如果它们在不同的端口上,您将需要两个单独的服务器进程。
1234563在常规 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 服务器只能接受带有 Upgrade: webSocket 标头的 HTTP 请求,而其他任何 HTTP 请求都失败。
那么它是如何处理 HTTP 请求的呢?
所有 webSocket 服务器都希望传入的新连接以 HTTP 开头,因此它们必须有一个简单的内置 HTTP 服务器(可以解析初始 HTTP 标头)。