共计 2428 个字符,预计需要花费 7 分钟才能阅读完成。
导读 | WebSocket 是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术, 一种基于 TCP 连接上进行全双工通信的协议。 |
随着科技发展,人们需求越来越多,生活的方方面面都离不开一些实时信息。比如:疫情期间在家协同办公、疫情监控目标人的实时运动轨迹、社交中的实时消息、多玩家互动游戏、每秒瞬息万变的股市基金报价、体育实况播放、音视频聊天、视频会议、在线教育等等,都可以借用 WebSocket TCP 链接可以让数据飞起来。下面就聊一下 WebSocket 协议。
WebSocket 是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术, 一种基于 TCP 连接上进行全双工通信的协议,相对于 HTTP 这种非持久的协议来说,WebSocket 是一个持久化网络通信的协议。依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信。
它不仅可以实现客户端请求服务器,同时可以允许服务端主动向客户端推送数据。是真正的双向平等对话,属于服务器推送技术的一种。在 WebSocket API 中,客户端和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
「其他特点包括:」
ws://xxx.ayunw.cn:80/some/path
wss://xxx.ayunw.cn:443/some/path
另外客户端不只是浏览器,只要实现了 ws 或者 wss 协议的客户端 socket 都可以和服务器进行通信。
在 Web 应用架构中,连接由 HTTP/1.0 和 HTTP/1.1 处理。HTTP 是客户端 / 服务器模式中 请求一响应 所用的协议,在这种模式中,客户端 (一般是浏览器) 向服务器提交 HTTP 请求,服务器响应请求的资源(例如 HTML 页面)。
HTTP 是无状态的,也就是说,它将每个请求当成唯一和独立的。无状态协议具有一些优势,例如,服务器不需要保存有关会话的信息,从而不需要存储数据。但是,这也意味着在每次 HTTP 请求和响应中都会发送关于请求的冗余信息,比如使用 Cookie 进行用户状态的验证。
随着客户端和服务器之间交互的增加,HTTP 协议在客户端和服务器之间通信所需要的信息量快速增加。
从根本上讲,HTTP 还是 半双工 的协议,也就是说,在同一时刻信息的流向只能单向的:客户端向服务器发送请求(单向),然后服务器响应请求(单向)。半双工方式的通信效率是非常低的。
同时 HTTP 协议有一个缺陷:通信只能由客户端发起。
这种单向请求的特点,注定了如果服务器有状态变化,是无法主动通知客户端的。
为了能够及时的获取服务器的变化,我们尝试过各种各样的方式:
上述方法提供了近乎实时的通信,但是它们也涉及 HTTP 请求和响应首标,包含了许多附加和不必要的首标数据与延迟。此外,在每一种情况下,客户端都必须等待请求返回,才能发出后续的请求,而这显著地增加了延退。同时也极大地增加了服务器的压力。
Websocket 其实是一个新协议,借用了 HTTP 的协议来完成一部分握手,只是为了兼容现有浏览器的握手规范而已。Websocket 是一种自然的全双工、双向、单套接字连接,解决了 HTTP 协议中不适合于实时通信的问题。
「一个典型的 Websocket 握手如下:」
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
其中 Websocket 的核心如下,它告诉 Apache、Nginx 等服务器:注意,我发起的是 Websocket 协议,快点帮我找到对应的助理处理而不是那个老土的 HTTP。
Upgrade: websocket
Connection: Upgrade
「服务器返回如下:」
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
至此,HTTP 已经完成它所有工作了,接下来就是完全按照 Websocket 协议进行了。
![post-qrcode](https://www.xgss.net/wp-content/uploads/2023/07/二维码-微信公众号256x256.jpg)