websocket是什么?基于什么实现的?

WebSocket是html5新增的协议,能在浏览器和服务器之间建立一个不受限制的双向通信的通道,服务器可以主动向浏览器发送消息。

传统的http协议不能做到websocket实现的功能,因为http协议是一个请求-响应协议,只能由浏览器发起请求,服务器才能响应这个请求把数据发送给浏览器,服务器不能主动发起请求。

ajax轮询:每隔一段时间发起一个http请求,询问服务器有没有新消息,没有的话就一直发

长轮询:采用阻塞的方式,浏览器发起请求后,如果服务器没有新消息,就先拖一段时间一直不返回,直到有消息才返回,返回完之后,浏览器再次建立连接

ajax轮询和长轮询需要服务器有非常快的处理速度和很高的并发。

websocket是基于http协议的,或者说是借用http协议来建立连接。
(http是应用层协议,基于tcp协议,tcp是传输层协议,ip协议是网络层协议)

websocket连接必须由浏览器发起,因为请求协议是一个标准的http协议

  • 浏览器发起请求
    • 请求地址以ws:开头
    • 请求头Upgarde:websocket和Connection:Upgrade,表示这个连接将要被转成websocket连接
    • Sec-WebSocket-Key用于标识这个连接
    • Sec-WebSocket-Version指定webSocket协议版本
GET ws://localhost:3000/ws/chat HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Origin: http://localhost:3000
Sec-WebSocket-Key: client-random-string
Sec-WebSocket-Version: 13
  • 服务器返回
HTTP/1.1 101 Switching Protocols//响应代码101表示本次连接的http协议即将被更改,更改后的协议就是Upgrade: websocket指定的websocket协议
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: server-random-string

版本号和子协议规定了双方能理解的数据格式,是否支持压缩等

这样一个websocket连接就建立成功了,浏览器和服务器都可以主动发消息给对方

为什么http连接不可以实现双向通信呢?http协议是建立在tcp协议上的,tcp协议本身是实现了双向通信的,但是http协议的请求-应答机制限制了双向通信。