"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"在WebSocket协议中的含义是什么

Hak*_* Oh 43 guid magic-string websocket

我不理解RFC 6455中"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"的含义.为什么服务器需要这个神奇的字符串?为什么WebSocket协议需要这种机制?

Dav*_*rtz 20

RFC解释了它.选择GUID是因为它"不太可能被不了解WebSocket协议的网络端点使用".请参阅RFC 6455.

如果您对GUID格式的详细信息感兴趣,请参阅RFC 4122.

  • 为什么WebSocket协议需要这种机制? (4认同)

cha*_*ryp 6

Quora回答

没有理由选择魔术弦。选择特殊的魔术字符串GUID可以为WebSockets协议增加一定程度的完整性,因为该字符串是全局唯一的

RFC(RFC 6455-WebSocket协议)仅表示:

...将其与字符串形式的全局唯一标识符(GUID, [RFC4122])“ 258EAFA5-E914-47DA-95CA-C5AB0DC85B11”结合在一起,不理解WebSocket协议的网络端点不太可能使用它。

希望这能回答你的问题。

  • 当然,它是全球唯一的,除了该站点的 html,它恰好包含相同的纯文本 guid (2认同)

NVR*_*VRM 5

为什么WebSocket协议需要这种机制呢?


  1. 浏览器请求 WebSocket 连接,只需使用以下代码

new WebSocket("wss://echo.websocket.org")
Run Code Online (Sandbox Code Playgroud)

从调试器中我们可以看到一个101 GET,通过检查请求标头,我们可以看到这个特定的条目:

Sec-WebSocket-Key: qcq+klmT4W41IrmG3/fseA==
Run Code Online (Sandbox Code Playgroud)

这是一个唯一的哈希值,用于识别浏览器。

在此输入图像描述


  1. 在服务器端$client_key接收哈希值。仅保留哈希值。使用 PHP 时返回值如下所示:
Sec-WebSocket-Key: qcq+klmT4W41IrmG3/fseA==
Run Code Online (Sandbox Code Playgroud)
  1. 浏览器返回响应(示例)。258EAFA5-E914-47DA-95CA-C5AB0DC85B11这是与WebSocket唯一GUID连接的发送密钥的 SHA1 。
Sec-WebSocket-Accept: r1Km05q03xuNRYy7mxkCRRgbh2M=
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后浏览器检查哈希值是否与他自己的计算相匹配,这是在幕后完成的。如果是这样,则握手完成(远程服务器实际上是真正的 WebSocket 服务器),因此隧道已创建并保持活动状态。


https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers

  • 为什么要这样设计呢?如果协议不连接 guid 而只是简单地对客户端密钥进行编码怎么办? (2认同)
  • 注意:echo.websocket.org 服务不再可用 (2认同)