一、关于WebSocket协议
我们需要弄明白,WebSocket本质上一种计算机网络应用层的协议,用来弥补http协议在持久通信能力上的不足。
我们知道http协议本身是无状态协议,每一个新的http请求,只能通过客户端主动发起,通过 建立连接-->传输数据-->断开连接 的方式来传输数据,传送完连接就断开了,也就是这次http请求已经完全结束了(虽然http1.1增加了keep-alive请求头可以通过一条通道请求多次,但本质上还是一样的)。
并且服务器是不能主动给客户端发送数据的(因为之前的请求得到响应后连接就断开了,之后服务器根本不知道谁请求过),客户端也不会知道之前请求的任何信息。
所以说,http协议本身是没有持久通信能力的,但是我们在实际的应用中,是很需要这种能力的,所以WebSocket协议由此而生,于2011年被IETF定为标准RFC6455,并被RFC7936所补充规范。
并且在HTML5标准中增加了有关WebSocket协议的相关api,所以只要实现了HTML5标准的客户端,就可以与支持WebSocket协议的服务器进行全双工的持久通信了。
说明:
1. 这里的持久通信能力指的是协议本身的能力,我们当然可以通过编程的方式实现这种功能,比如轮询的方式,但谁不喜欢原生就支持呢?
2. 计算机网络里还有socket关键字,这里的socket指的是运输层协议的某一端,泛指某个应用程序。
3. unix编程里还有一个socket接口,这里的译名是套接字,泛指应用层协议的端口号。
WebSocket协议的原理
与http协议一样,WebSocket协议也需要通过已建立的TCP连接来传输数据。
具体实现上是通过http协议建立通道,然后在此基础上用真正的WebSocket协议进行通信,所以WebSocket协议和http协议是有一定的交叉关系的。
下面是WebSocket协议请求头:
其中请求头中重要的字段:
而得到的响应头中重要的字段:
二、WebSocket协议的优缺点
优点:
· WebSocket协议一旦建议后,互相沟通所消耗的请求头是很小的
· 服务器可以向客户端推送消息了
缺点:
· 少部分浏览器不支持,浏览器支持的程度与方式有区别
三、WebSocket协议的应用场景
· 即时聊天通信
· 多玩家游戏
· 在线协同编辑/编辑
· 实时数据流的拉取与推送
· 体育/游戏实况
· 实时地图位置
四、参考
WebSocket 教程
http://www.ruanyifeng.com/blog/2017/05/websocket.html
http://websocket.org
http://demos.kaazing.com/portfolio-web/index.html
websocket协议翻译
https://github.com/zhangkaitao/websocket-protocol
网络编程-基于Websocket聊天室(IM)系统
https://www.cnblogs.com/maxzuo/p/13027982.html
WebSocket 是什么原理?为什么可以实现持久连接?
https://www.zhihu.com/question/20215561
nodejs的websocket的服务器端是如何实现的?
https://www.zhihu.com/question/37647173/answer/1403359896
HTTP API 认证授权术
https://coolshell.cn/articles/19395.html#OAuth_2_0
HTTP API认证授权方案
https://www.cnblogs.com/maxzuo/p/14017929.html