WebSocket 是独立的、创建在 TCP 上的协议,Websocket 通过HTTP/1.1 协议的101状态码进行握手。
websocket可以看做是HTTP为了支持长连接所打的一个大补丁
和HTTP有一些共性,是为了解决之前谈过的为了解决http瓶颈所作的改良设计
websocket和http有交集,是相交的关系,但不是包含的协议
-
非持久化的HTTP
Request = response
一个Request只能有一个response
Connection:keep-alive只是保持tcp连接 -
websocket
基于HTTP协议的,借用HTTP协议完成一部分握手
websocket握手核心:
Upgrade:websocket
Connection:Upgrade
告诉Apache或者nginx注意这是websocket
Sec-WebSocket-Key:x33.....== base64加密
Sec-WebSocket-Protocol:chat,superchat // 用户定义字符串,区分同一个用户不同url所需要的协议
Sec-WebSocket-version:13 //协议的版本
HTTP瓶颈是:被动性,请求只能由客户端主动发起,服务器不能主动向客户端发起连接
处理机制:
- ajax轮询 隔几秒就发请求,询问是否有新消息
- long poll 原理和ajax差不多,采取的是阻塞模型,客户端发起连接之后,如果没消息就等着,一直到有了新消息才返回
优点
避免HTTP的非状态性,都是多次请求和响应都是在一次连接中
避免多次解析重复的请求响应头信息造成的资源浪费
服务端不必等待客户端发送连接,实时性较好
全双工方式
减少通信量(每次解析头部信息)
需要升级为HTML5
多路复用 mult-placy(查),不用的url可以复用相同的url,这些都是http长连接不能做到的
总结:
websokcet使得客户端和服务器之间的数据交换简单,允许服务器主动向客户端推送数据
在WebSocket中,只需要一次握手,就可以创建持久性的连接,并进行双向双工
使用广泛:聊天室、社交网站
握手过程
http阶段:
基于http1.1
- 握手请求:Upgrrade:webcoket。刚开始是http协议,所以由客户端发起连接
- 握手响应:101 Switching Protocols 切换成WebSocket协议
WebSocket阶段:
url格式:ws://example.com wss://example.com/
WebSocket协议支持全双工通信,因此服务器端不必等待请求,可直接发送数据