发展历史
- 2008年提出,2011年12月11日,被 RFC 6455-the WebSocket Protocol 定位标准
- HTML5 新增 WebSocket 协议,之后其他语言开始支持
作用
可以在浏览器和服务器之间建立一个全双工的通信通道
全双工通信协议:浏览器和服务器之间可以同时发送和接收请求
特点
- 推送功能,支持服务器向客户端推送数据。
- 减少通信量,与 HTTP 相比,减少了每次连接时的总开销。WebSocket 的首部信息很小,通信量也相应的减少了。
通信流程
- 浏览器发起 HTTP 请求,请求建立 WebSocket 连接
- 服务器响应同意协议更改
- 相互发送数据
WebSocket 通信,在 HTTP 连接建立之后,需要完成一次“握手”的步骤。
- 握手·请求,实现 WebSocket 通信,需要用到 HTTP 的 Upgrade 首部字段,告知服务器通信协议发生改变,已达到握手的目的。
- 握手·响应,对于之前的请求,返回状态码 101 Switching Protocols 的响应。
成功握手确立 WebSocket 连接之后,通信时不再使用 HTTP 的数据帧,而是采用 WebSocket 独立的数据帧。
底层原理
- WebSocket 协议建立在 TCP 协议基础上(Socket 通信也是基于 TCP 协议)
- TCP 协议是全双工协议,http 协议也是基于 tcp 的,但他是单向的。
- WebSocket 没有同源限制
同源:同一个IP,同一个端口 跨域异常:前端配置代理或者服务器端如 Nginx 上反向代理去解决跨域问题。
实现方式
- 基于 java 注解实现 WebSocket 服务器端
- 基于 Spring 提供的上层封装