WebSocket梳理
WebSocket 是基于TCP的协议,可以用来做即时通信;同时基于HTTP协议也是基于TCP协议的,WebSocket依赖于HTTP连接。
# 常见问题
- WebSocket 依赖于HTTP连接,那么它如何从连接的HTTP协议转化为WebSocket协议的?
每个WebSocket 连接都始于一个HTTP请求。具体来说,WebSocket协议在第一次握手连接时,通过HTTP协议在传送WebSocket支持的版本号、协议的字版本号、原始地址、主机地址等等一些列字段给服务器端:
GET /chat http/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Protocol: chat, superchat
origin: http://example.com
Sec-WebSocket-Version: 13
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Upgrade、Connention字段:这个是WebSocket的核心,告诉Apache、Nginx等服务器,发起的请求要用WebSocket协议,让服务器找到对应的协议处理;
Sec-WebSocket-key字段,它是一个base64 encode的值,这个是浏览器随机生成的,发送给服务器用以验证是否为WebSocket协议通信;
Sec-WebSocket-Protocol字段:是用户定义的字符串,用来区分同一个url下,不同的服务所需要的协议。
Sec-WebSocket-Version:告诉服务器所使用的WebSocket Draft(协议版本)。
然后服务器会返回下列信息,表示已经接收到请求,成功建立WebSocket:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
1
2
3
4
5
2
3
4
5
其中Upgrade、Connection字段告诉客户端,已经成功切换协议到WebSocket;
Sec-WebSocket-Accept:经过服务器确认,并且加密过后的Sec-WebSocket-key;用以客户端确认校验;
Sec-WebSocket-Protocol:最终使用的协议。
至此,HTTP完成了它所有的工作,接下来就是完全按照WebSocket协议进行了。
- WebSocket为什么要依赖于HTTP协议的连接?
编辑 (opens new window)
上次更新: 2022/04/22, 16:59:50