最近,我一直在研究WebSockets,我认为它们非常酷。但是,如果我在这里看看,有些事情对我来说还不清楚。
请求:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
Run Code Online (Sandbox Code Playgroud)
响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Run Code Online (Sandbox Code Playgroud)
请求者指定了主机,因此中间服务器将知道请求应到达的位置。请求者发送一个编码为base64的随机字符串,服务器返回一个经过加密的SHA1加密密钥。连接处于活动状态时,是否会在两者之间使用此密钥?如果是这样,即使连接断开,有没有办法可以重用此密钥?
正如您在Wikipedia链接中提到的:
除了“升级”标头之外,客户端还会发送一个Sec-WebSocket-Key标头,其中包含base64编码的随机字节,服务器会在Sec-WebSocket-Accept标头中使用键的哈希值进行回复。这是为了防止缓存代理重新发送以前的WebSocket会话,并且不提供任何身份验证,隐私或完整性。
Sec-WebSocket-Key
仅用于握手期间,不用于实际通信。
密钥旨在通过发送随机密钥来防止代理缓存请求。如果代理仍然返回缓存的响应,则可以通过验证Sec-WebSocket-Accept
标头来对其进行检查。
客户端可以忽略Sec-WebSocket-Accept
标头(并希望响应不会被缓存),并且WebSocket协议仍然可以正常工作。
在这种情况下,服务器可以实现为忽略Sec-WebSocket-Key
标头而不返回Sec-WebSocket-Accept
标头。
Sec-WebSocket-Accept
可以在此答案中阅读如何生成用于响应或验证的标头:
从“ Sec-WebSocket-Key”生成“ Sec-WebSocket-Accept”
归档时间: |
|
查看次数: |
3707 次 |
最近记录: |