一、websocket是什么?
websocket 是一种建立在单个TCP连接上进行全双工通信的网络协议(即为ws或wss)。ws和 http 协议可以说是兄弟的关系,但是这个兄弟有点依赖 http ,因为ws协议利用了http 的三次握手的通信连接。所以,我们会先用 HTTP 先进行三次握手,再向服务器请求升级为websocket 协议。
二、websocket 的功能
我们都知道Http协议是靠三次握手、四次挥手 的方式来建立和关闭连接的,而且支持长连接和短连接两种连接方式,同时还有同源策略(Same origin policy)的限制(在web开发中算是经常遇到的问题),重要的是,它只支持单向通信(只能由任意一方发起请求,另一方发起响应)
简单的说,电影里面警察之间进行通话的呼叫机就相当于http,只能一方说完说后,对方才能收到消息,才能回复一条消息给对方;而ws就不是这样,ws就相当于我们平时的打电话,我们并不是只能说完话后对方才能说话,而是打电话的双方都可以随时说话,也可以随时听到对方的消息
那么放在网络中,二者有一个明显的区别就是同源策略的区别,这种同源策略会导致请求的一方在不同的端口、不同的域名、不同的协议的情况下发起的请求会有限制,这就需要进行跨源访问了,比如ajax跨域,cors跨域等等。但是ws就没有这种限制,它支持任何域名或者端口的访问(协议固定了只能是 ws/wss)。
总的来说,http具有的功能,ws也有,http没有的功能,ws还有。
三、案例
具体来说,ws请求头中,会有区别于http协议的几个字段,如图:
Sec-WebSocket-Extensions:客户端通过该请求头字段进行请求扩展,请求头字段遵守 HTTP 的规则,它的值是通过 ABNF 定义的。如果我们客户端或者服务端在协商扩展收到了一个没有符合下面的 ABNF 规则的值,接收到错误的数据的这一方需要立刻让ws关闭连接
Sec-WebSocket-Key:是一个基于Base64格式编码的值,是浏览器随机生成的,没有太大的作用
Sec-WebSocket-Vision:是ws协议的版本号
四、文本格式
json xml 纯文本
自定义格式
字节码格式,比如protobuf、TLV
五、标志
一般会先new一个ws变量,然后里面必然会有以下标志:
Socket.onopen:连接建立时触发
Socket.onmessage:客户端接收服务端数据时触发
Socket.onsend():使用连接发送数据