- HTTP中一个request只能有一个response。而且这个response也是被动的,不能主动发起
- 因此过去的服务端推送信息是通过客户端不停的轮询实现的
- websocket是双向通信协议,提供了服务端主动推送信息的能力
- Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而无状态的HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)
- 默认端口也是 80 和 443
- 需要客户端(浏览器)和服务端同时支持
- 如果经过代理的话,还需要代理支持,否则有些代理在长时间无通信时会自动切断连接
- WebSocket连接建立后,后续数据都以帧序列的形式传输
- HTTP只负责建立WebSocket连接
- 后续不需要发送 HTTP header就能交换数据
- Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手
Sec-WebSocket-Key
是一个浏览器生成的Base64的值,用于验证服务端有效性
Sec-WebSocket-Accept
是服务器确认并加密后的Sec-WebSocket-Key
- 将
Sec-WebSocket-Key
跟258EAFA5-E914-47DA-95CA-C5AB0DC85B11
拼接
- 通过SHA1计算出摘要,并转成base64字符串。
- http请求完成后响应的状态码为
101
,表示切换了协议
- 说明WebSocket协议通过http协议来建立运输层的TCP连接,之后便与http协议无关了
// 客户端请求
GET ws://example.com/ 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
// 服务器应答
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat