持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情
前面对 WebSocket 技术已经做了很多的介绍,有关其原理前面也提到过,不过我回看了一下,感觉原理的介绍不是很透彻,这次再着重梳理一下......
WebSocket 的通信原理及机制
既然是基于浏览器端的 Web 技术,那么它的通信肯定少不了 Http。WebSocket 本身虽然也是一种新的应用层协议,但是它也不能够脱离 Http 而单独存在。具体来讲,我们在客户端构建一个 WebSocket 实例,并且为它绑定一个需要连接到的服务器地址,当客户端连接服务端的时候,会向服务端发送一个类似下面的一个 Http 报文:
GET ws://echo.websocket.org/?encoding=text HTTP/1.1
Origin: http://websocket.org
Cookie:_utma=99as
Connection: Upgrade
Host: localhost
Sec-WebSocket-Key: uRovscZjNol/umbTt5uKmw==
Upgrade: websocket
Sec-WebSocket-Version: 13
可以看到,这是一个 Http 的 GET 请求报文,注意该报文中有一个 upgrade 首部,它的作用是告诉服务端需要将通信协议切换到 WebSocket,如果服务端支持 WebSocket 协议,那么它就会将自己的通信协议切换到 WebSocket,同时发给客户端类似于以下的一个响应报文头:
HTTP/1.1 101 WebSocket Protocol Handshake
Date: Fri, 21 Oct 2022 19:33:13 GMT
Connection: Upgrade
Server: Kaazing Gateway
Upgrade: WebSocket
Access-Control-Allow-Origin:http://websocket.org
Access-Control-Allow-Credentials:true
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Access-Control-Allow-Headers: content-type
返回的状态码为 101,表示同意客户端协议转换请求,并将它转换为 WebSocket 协议。以上过程都是利用 Http 通信完成的,称之为 WebSocket 协议握手(WebSocket Protocol handshake),经过这握手之后,客户端和服务端就建立了 WebSocket 连接,以后的通信走的都是 websocket 协议了。即 WebSocket 握手需要借助于 Http 协议,建立连接后通信过程使用 WebSocket 协议。而且该 WebSocket 连接还是基于我们刚才发起 Http 连接的那个 TCP 连接。一旦建立连接之后,我们就可以进行数据传输了,WebSocket 提供两种数据传输:文本数据和二进制数据。
WebSocket 能够提供低延迟,高性能的客户端与服务端的双向数据通信。它颠覆了之前 Web 开发的请求处理响应模式,并且提供了一种真正意义上的客户端请求,服务器推送数据的模式,特别适合实时数据交互应用开发。
这次主要是针对 WebSocket 的通信原理做了梳理总结,主要还是结合 Http 来帮助理解,理解重于记忆......
希望本文能够帮到你,如有错误,望指正!
我向你敬礼啊,Salute!