60

我不明白RFC 6455中“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”的含义。为什么服务器需要这个魔术字符串?而为什么 WebSocket 协议需要这种机制呢?

4

3 回答 3

31

RFC 对此进行了解释。它是一个 GUID,之所以选择它是因为它“不太可能被不理解 WebSocket 协议的网络端点使用”。请参阅RFC 6455

如果您对此类 GUID 的格式细节感兴趣,请参阅RFC 4122

于 2012-11-19T14:40:27.767 回答
8

来自Quora 的回答

没有理由选择魔线。选择特定的魔法字符串 GUID 是为了向 WebSockets 协议添加某种程度的完整性,因为该字符串是全局唯一的

RFC ( RFC 6455 - The WebSocket Protocol ) 只说:

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

希望这能回答你的问题。

于 2016-02-01T04:20:51.973 回答
3

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


  1. 浏览器请求 websocket 连接,只需使用下面的代码

new WebSocket("wss://echo.websocket.org")

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

Sec-WebSocket-Key: qcq+klmT4W41IrmG3/fseA==

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

在此处输入图像描述


  1. 在服务器端$client_key接收哈希。仅保留哈希值。使用 PHP 的返回值如下所示:

“Sec-WebSocket-接受:”。base64_encode(sha1( $client_key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true))

  1. 浏览器取回响应,(示例)。这是与258EAFA5-E914-47DA-95CA-C5AB0DC85B11websocket唯一GUID 连接的已发送密钥的 sha1。

    Sec-WebSocket-Accept: r1Km05q03xuNRYy7mxkCRRgbh2M=

在此处输入图像描述

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


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

于 2020-06-22T17:57:26.660 回答