websocket和http都是基于tcp传输协议的应用层协议。websocket和http是并列的关系。都用于服务器和浏览器之间的通信。
websocket一次握手,浏览器和服务器建立好tcp连接之后,就会向服务器发送数据包,服务器返回response数据包,websocket握手完成,就可以保持长连接。
浏览器发送的数据包中有几个字段需要特别注意。
- Upgrade:websocket。表示浏览器要和服务器建立websocket连接
- Sec-WebSocket-Key:XXX。这是浏览器经过Base64加密后的密钥,用来和response里面的Sec-WebSocket-Accept进行比对验证
服务器收到浏览器发送数据包,就会返回response数据包
- Sec-WebSocket-Accept:xxx。这是服务端根据浏览器发送的Sec-WebSocket-Key加密后的密钥。
至此websocket握手完成,建立好了连接,并且此连接可以一直保持。
websocket的出现就是为了解决http的以下缺点。
http的缺点:
- http通信只能由浏览器发起,浏览器请求数据,服务器返回数据,断开连接。
- 浏览器每次向服务器请求数据,都会重新和服务器建立新连接,造成服务器的资源浪费。
- http1.1之后就支持长连接了,设置一个time_out,如果time_out时间内重新请求会刷新计时,time_out内没有新请求,就会关闭tcp连接