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