我不明白RFC 6455中“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”的含义。为什么服务器需要这个魔术字符串?而为什么 WebSocket 协议需要这种机制呢?
3 回答
来自Quora 的回答:
没有理由选择魔线。选择特定的魔法字符串 GUID 是为了向 WebSockets 协议添加某种程度的完整性,因为该字符串是全局唯一的。
RFC ( RFC 6455 - The WebSocket Protocol ) 只说:
...将其与字符串形式的全局唯一标识符(GUID, [RFC4122])“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”连接起来,不理解 WebSocket 协议的网络端点不太可能使用它。
希望这能回答你的问题。
为什么 WebSocket 协议需要这种机制?
- 浏览器请求 websocket 连接,只需使用下面的代码
new WebSocket("wss://echo.websocket.org")
从调试器中我们可以看到一个101 GET
,并且通过检查请求头,我们可以看到这个特定的条目:
Sec-WebSocket-Key: qcq+klmT4W41IrmG3/fseA==
这是一个唯一的哈希,用于标识浏览器。
- 在服务器端
$client_key
接收哈希。仅保留哈希值。使用 PHP 的返回值如下所示:
“Sec-WebSocket-接受:”。base64_encode(sha1( $client_key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true))
浏览器取回响应,(示例)。这是与
258EAFA5-E914-47DA-95CA-C5AB0DC85B11
websocket唯一GUID 连接的已发送密钥的 sha1。Sec-WebSocket-Accept: r1Km05q03xuNRYy7mxkCRRgbh2M=
然后浏览器会检查哈希是否与他自己的计算相匹配,这是在后台完成的。如果是这样,握手完成,远程服务器实际上是一个真正的 websocket 服务器,因此隧道被创建并保持活动状态。
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers