什么是 WebSocket 子协议?
Posted
技术标签:
【中文标题】什么是 WebSocket 子协议?【英文标题】:What is a WebSocket Subprotocol? 【发布时间】:2021-05-07 14:09:40 【问题描述】:我一直在尝试在 nodejs 中从头开始实现 WebSocket 协议,这样做我有一个问题,那就是自那以后就无人问津了。关于 websocket 的子协议到底是什么? WebSocket 构造函数的第二个参数是您指定“子协议”的位置 -
let socket = new WebSocket("ws://localhost:3000",["http",...]);
谁能告诉我他们有什么目的?
【问题讨论】:
【参考方案1】:Websockets 只是定义了一种交换任意消息的机制。这些消息意味着什么,客户在任何特定时间点可以期待什么样的消息,或者允许他们发送什么样的消息,完全取决于实现的应用程序。因此,您需要在服务器和客户端之间就这些事情达成一致。你可能会说……你需要一个协议规范。 subprotocol 参数只是让客户端正式交换此信息。你可以为任何你想要的协议起任何名字。服务器可以简单地检查客户端在握手期间是否遵守该协议。你也可以用它来向服务器请求不同种类的协议,或者用它来做版本控制(例如当你引入my-protocol-v2
,但仍然需要支持客户端只理解my-protocol-v1
)。
【讨论】:
好的,我明白这是怎么回事了。例如,假设我的客户端有两种基于两种不同情况解析和评估消息的方法,所以在客户端我通过子协议发送了一个基于客户端需求的特定方式之一,所以在服务器端我实现了那些协议。但是当我的服务器收到一个 Sec-WebSocket-Protocol 标头时,它将使用指定的子协议。这会是一个有效的情景/解释吗? 为了更具体一点,您的服务器可能支持发送以 JSON 或 XML 编码的消息。客户端可以告诉服务器它支持哪些方法,然后服务器可以选择一个并同意该特定子协议。 — 或者,您可以使用它来表示客户端期望获取和/或发送的消息类型。或者您能想到的任何其他自定义用途,它可以帮助客户端和服务器协商一组特定的通信规则。 好的,这很有意义。感谢您为我考虑到它!【参考方案2】:解释于MDN here
将子协议视为自定义 XML 架构或文档类型声明。 您仍在使用 XML 及其语法,但您还 受您同意的结构的限制。 WebSocket 子协议是 就这样。他们没有介绍任何花哨的东西,他们只是 建立结构。像 doctype 或 schema 一样,双方必须同意 关于子协议;与文档类型或模式不同,子协议是 在服务器上实现,不能被外部引用 客户。
子协议在规范的 1.9、4.2、11.3.4 和 11.5 部分进行了解释。
客户必须要求特定的子协议。为此,它将发送 像这样作为原始握手的一部分:
http GET /chat HTTP/1.1 ... Sec-WebSocket-Protocol: soap, wamp
或者,等效地:
... Sec-WebSocket-Protocol: soap Sec-WebSocket-Protocol: wamp
现在服务器必须选择客户端的协议之一 建议并支持。如果有多个,发送第一个 客户发送的一份。想象一下我们的服务器可以同时使用soap和wamp。 然后,在响应握手中,它发送:
Sec-WebSocket-Protocol: soap
服务器不能发送多个 Sec-Websocket-Protocol 标头。如果 服务器不想使用任何子协议,它不应该发送任何 Sec-WebSocket-Protocol 标头。发送空白标题是不正确的。 如果没有得到子协议,客户端可能会关闭连接 它想要。
如果您希望您的服务器遵守某些子协议,那么自然而然 您需要在服务器上添加额外的代码。假设我们正在使用 子协议 json。在这个子协议中,所有数据都作为 JSON 传递。如果 客户端请求这个协议并且服务器想要使用它, 服务器需要有一个 JSON 解析器。实际上,这将是 库的一部分,但服务器需要传递数据。
【讨论】:
【参考方案3】:一些示例代码,复制自 https://hpbn.co/websocket/#subprotocol-negotiation,以便清楚。
客户端可以向服务器通告它支持的协议 其初始连接握手的一部分:
var ws = new WebSocket('wss://example.com/socket',
['appProtocol', 'appProtocol-v2']);
ws.onopen = function ()
if (ws.protocol == 'appProtocol-v2')
...
else
...
【讨论】:
以上是关于什么是 WebSocket 子协议?的主要内容,如果未能解决你的问题,请参考以下文章