本文主要粗浅的介绍WebSocket特点及建立连接进行总结和回顾,皆在帮助读者构建出对webSocket协议的整体认识,至于webSocket扩展,心跳检测,数据加密,身份认证等知识点并不涉及。
1:基础了解——HTTP
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。在这一过程中通常请求和响应消息的头以ASCII形式给出,而消息内容则具有一个类似MIME的格式。
对于WebSocket我们首先需要明白其本质还是一种协议.主要功能还是为了完成通信。我们都知道的HTTP的通信方式概括来看就是请求——应答式的模型。即当客户端有需要时,就先服务器端发送请求,进而获取资源数据。
此时其实消息传送的主动权在与客服端,而服务器端则是显得很高冷,从来不会向客户端主动发送任何的请求信息。
客户端在这个过程中相当于一个“舔狗”,主动向服务器发送消息,而服务器在不“宕机”的情况下还是很礼貌的,基本有求必应。
客户端:我在上课,知道上的 什么课么?
服务器端:上的什么课?
客户端:想你的每一刻
服务器端:..........(宕机)
2:升级之路——WebSocket
WebSocket本质是一种通信协议,可在单个TCP连接上进行全双工通信。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接, 并进行双向数据传输。
WebSocket是一种通信协议区别于HTTP协议来看HTTP协议只能实现客户端请求,服务端响应的这种单项通信。
WebSocket可以实现客户端与服务端的双向通讯。其最大的优势在于:可以主动将信息推送至客户端。
3:WebSocket出现前的实时通讯
在WebSocket出现之前如果想实时获取后台数据信息 ,则最常用的方式有两种:ajax定时查询,long poll长查询。
ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息
日志:客户端舔狗日记:2021-6-18 晴
客户端:在?吃饭了吗?(Request)
服务端:没有(Response
客户端:在?下班了吗?(Request)
服务端:没有。(Response)
客户端:在?一起出去玩么?(Request)
服务端:你好烦啊,不去 。(Response)
客户端:在?有没有有趣的事?(Request)
服务端:有,最近全网纷传“校长爱情”。(Response)
客户端:在?睡了吗?(Request)
服务端:。。。。。。。。。。。。(Response) —- loop
long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型。 通常客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始
场景再现:
客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)
服务端:额。。 等待到有消息的时候。。来 给你(Response)
客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request) -loop
从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,服务端不会主动联系客户端,只能有客户端发起。
4:WebSocket连接过程
在建立连接过程中首先客户端发起HTTP握手,告诉服务端进行WebSocket协议通讯,并告知WebSocket协议版本。服务端确认协议版本,升级为WebSocket协议。之后如果有数据需要推送,会主动推送给客户端。
连接开始时客户端使用HTTP协议和服务端升级协议,升级完成后,后续数据交换遵循WebSocket协议。我们看看Request Headers
建立连接的过程相当于客户端和服务器进行了一次协商,即当有消息的时候再通知,而无需客户端每次实时查询处理。
webSocket请求信息中:关键的字段就是Upgrade,Connection,告诉 Apache 、 Nginx 等服务器:注意啦,我发起的是Websocket协议,不使用原先的HTTP。
而Sec-WebSocket-Key:对应服务端响应头的Sec-WebSocket-Accept,由于没有同源限制,websocket客户端可任意连接支持websocket的服务。这个就相当于一个钥匙一把锁,避免多余的,无意义的连接。
服务器收到信息后会返回下列东西,表示成功建立Websocket。
在服务器端响应信息中 字段Sec-WebSocket-Accept: 用来告知服务器愿意发起一个websocket连接, 这个值主要根据客户端请求头的Sec-WebSocket-Key计算出来。
至此,在响应头信息中也表明协议升级到WebSocket之下,此时客户端和服务器端的WebSocket连接也已经建立完成。"舔狗"http的爱情连接也开始成功迈入到双向通信的阶段~~