什么是 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 子协议?的主要内容,如果未能解决你的问题,请参考以下文章

websocket协议握手详解

WebSocket是什么,有什么作用和特点?

WebSocket是什么,有什么作用和特点?

WebSocket是什么?

websocket

2.5 websocks协议与服务器实现