文章目录
WebSocket是一种在单个TCP连接上进行全双工通信的协议,是一个持久化的协议
WebSocket
HTTP协议有一个缺陷:通信只能由客户端发起
特点:
- 服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息。全双工通信
- 建立在TCP协议之上,服务器端实现容易
- 与HTTP有良好的兼容性,默认端口也是80和443,握手阶段使用HTTP协议
- 数据格式轻量,开销小
- 可以发送文本,也可以发送二进制数据
- 没有同源策略
- wss添加一个TLS安全层
与HTTP关系
HTTP中一个request对应一个response,而且不能主动发送response。web socket 协议是基于HTTP协议的(借用了HTTP协议来完成一部分握手)
握手阶段
- 在HTTP中添加多几个字段
- Upgrade: websocket
- Connection: Upgrade
- Sec-WebSocket-Key 浏览器随机生成的
- Sec-WebSocket-Protocol 用户定义的字符串,用于区分同URL下,不同服务需要的协议
- Sec-WebSocket-Version 告诉服务器使用websocket的版本
- 服务器返回字段
- Upgrade: websocket
- Connection: Upgrade
- Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= 前面的key经过服务器加密后的
- Sec-WebSocket-Protocol: chat
Ajax 轮询
每个几秒发送一个请求,询问服务器是否有新信息
这个需要服务器有很快处理速度和资源
long poll 长轮询
采用阻塞模型,客户端发起连接后,如果没有消息就一直不返回Response给客户端。直到有消息才返回。返回完之后,客户端再次建立连接
需要服务器具有很高的并发
socket
由于HTTP是没有状态的,所以每次建立连接都要验证身份等等。。
但是websocket在一次连接中,服务器会一直保留你的信息
服务器推送技术
ajax轮询
长轮询(comet)
Server-sent-events(SSE)
- 客户端通过EventSource接口发起连接,服务器以text/event-stream内容类型响应
WebSocket
socket.io
- 无限自动重连
- 心跳机制,允许让服务器和客户端知道哪个已经不需要通信了
- 二进制支持
- socket.io加入了meta packet:type,命名空间,ack id,所以一般websocket不能连接socket.io服务器
- 不仅包含websocket, 封装了轮询等方法
- 可靠性,支持代理和负载均衡,个人防火墙和防病毒软件
- 多路复用支持