#Node.js 中的 WebSocket 握手流程及其协议
##前言
WebSocket 是一种基于 TCP 连接的新型网络通信协议,它可以在客户端与服务器之间建立双向通信的联接,其通过 HTTP 协议进行 initial handshake,然后使用固定的 TCP 连接来在客户端和服务器之间进行通信,它实现了传统的客户端与服务器在请求和响应之间的双向通信。
Node.js 是一个基于 JavaScript 运行时环境的开源项目,它可以在服务器上运行 JavaScript 脚本,它包括了一个高性能的网络 I/O 库,可以提供支持 Websockets 协议的服务器和客户端。
在本文中,我们将讨论 WebSocket 握手的流程和协议,并提供一些在 Node.js 上实现 WebSocket 的示例代码,帮助读者更好地了解和使用 WebSocket。
##WebSocket 握手协议
WebSocket 握手是一种基于 HTTP/1.1 协议的握手协议,它需要客户端首先发送一个 HTTP 的 GET
请求,请求服务器将升级到 WebSocket 协议。请求的必须包含用于握手的特殊标头字段。
在握手的过程中,客户端和服务器都会发送特定的 HTTP 协议消息,以确保两者之间具有 WebSocket 支持,这个握手过程通常被称为“handshake
”。
以下是 WebSocket 握手协议的步骤:
客户端向服务器发出 HTTP/1.1 的
GET
请求,以请求开始 WebSocket 握手请求。客户端将在请求的标头中包含一个名为
Upgrade
的标头和一个名为Sec-WebSocket-Key
的标头:GET /chat HTTP/1.1 Host: example.com:8000 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ== Sec-WebSocket-Version: 13 Origin: http://example.com:8000
Upgrade
标头将告诉服务器请求是一个 WebSocket 请求,并要求服务器升级到 WebSocket。Connection
标头告诉服务器,客户端与服务器之间的连接应该升级到 WebSocket。Sec-WebSocket-Key
标头是一个随机值,它将用于来自服务器的响应。Sec-WebSocket-Version
标头包含客户端使用的 WebSocket 版本的数字版本号,因为支持 WebSocket 的浏览器和服务器必须至少支持版本 13,所以该值始终为 13。Origin
标头是可选的,它包含某个 URL 地址,说明这个 WebSocket 相关请求的起源。
服务器返回一个 HTTP/1.1
101
响应,以响应客户端的请求,并与客户端建立 WebSocket 连接。此响应包含以下标头:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: fXc++ux0a2/cEtKwEwF0JQ== [websocket data]
* `Upgrade` 标头指示服务器已将连接升级为 WebSocket 协议。 * `Connection` 标头指示服务器希望在新协议上保持连接。 * `Sec-WebSocket-Accept` 标头包含使用 Sec-WebSocket-Key 标头值与 WebSocket GUID 执行 SHA-1 哈希的结果,并将其表示为一个字符串。这使服务器能够验证来自客户端的请求,并确保响应来自与之通信的客户端。 * 在这个响应中,随后的任何数据(`[websocket data]`)将被视为与 WebSocket 相关的数据。
此外,WebSocket 还支持多个子协议、自定义头、消息压缩等高级协议特性,详情可以查看相关的官方文档。
##Node.js 实现 WebSocket 的示例代码
Node.js 包括原生的 WebSocket 模块,可以让我们快速构建 WebSocket 服务器或客户端,下面是一个简单的示例代码可以帮助你进一步了解 WebSocket 在 Node.js 中的实现。
###WebSocket Server
-- -------------------- ---- ------- ----- --------- - -------------- ----- ------ - --- ------------------ ----- ---- --- ----------------------- -------- -------------- - ---------------------- ------------- ---------------- -------- ----------------- - ---------------------- ---- --------- --- --------------- ------------- ---
这段代码使用 Node.js WebSocket 模块创建了一个名为 server
的 WebSocket 服务器,并将其绑定到本地机器的 localhost:8080
端口。当客户端连接到该服务器时,将触发 connection
事件,在此事件中,我们将输出信息表明已成功连接。
然后,当 WebSocket 连接收到来自客户端的消息时,会触发 message
事件,我们将输出该消息。最后,我们将向客户端发送一条 Hello, WebSocket!
的消息。
###WebSocket Client
-- -------------------- ---- ------- ----- --------- - -------------- ----- ------ - --- --------------------------------- ----------------- -------- ------ - ---------------------- ------------- ------------------- ---------- --- -------------------- -------- ----------------- - ---------------------- ---- --------- ---
这段代码使用 Node.js WebSocket 模块创建了一个名为 client
的 WebSocket 客户端,并在本地连接到 localhost:8080
端口的 WebSocket 服务器。当 WebSocket 认证通过后,将触发 open
事件,在此事件中,我们将输出信息表明已成功连接。
然后,我们将向 WebSocket 服务器发送一条 Hello, Server!
的消息。最后,当客户端接收到来自 WebSocket 服务器的消息时,会触发 message
事件,我们将输出该消息。
##总结
至此,我们已经了解了 WebSocket 握手的流程和协议,并掌握了在 Node.js 上实现 WebSocket 的简单示例代码。希望本文可以帮助你更好地了解和使用 WebSocket。如果您对此有任何疑问或建议,请在下面的评论中留言。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6454473d968c7c53b08404aa