学习笔记
WebSocket通信协议
00 分钟
2024-1-14
2024-6-29
type
status
date
summary
slug
tags
category
password
URL
icon

背景

在公司开发项目中涉及到聊天对话功能,因此需要调研下WebSocket通信协议,了解与常用的HTTP协议的区别。
 

WebSocket协议介绍

 

连接建立原理

客户端发起 WebSocket 连接请求,请求头中包含 Upgrade 和 Connection 两个字段。Upgrade 字段指明协议升级,Connection 字段指明协议连接类型,如下所示:
服务端接收到请求后,进行协议升级确认。如果服务端支持 WebSocket 协议,则返回状态码 101 Switching。Protocols 响应,表明接受协议升级请求,同时也会发送服务端的 Sec-WebSocket-Accept 头信息加密结果,如下所示:
客户端收到服务端响应后,进行协议升级确认,验证服务端的 Sec-WebSocket-Accept 头信息加密结果是否正确。如果正确,表明连接已经升级成功,可以进行数据传输。
数据传输过程中,客户端和服务端可以双向发送或接收数据,数据格式为帧(Frame),帧是 WebSocket 传输的最小单位,包含了真实数据的二进制流以及控制信息,数据传输完毕后,可以关闭连接。

优点

  • 双向通信: WebSocket允许服务器主动推送数据到客户端,而不必等待客户端请求,从而实现了双向通信。
  • 实时性: 与HTTP请求–响应协议不同,WebSocket可以在客户端和服务器之间建立长久的连接,从而大大减少了通信延迟,实现实时性。
  • 性能: 与轮询(Polling)和长轮询(Long-polling)相比,WebSocket连接是一次性的,只需要建立一次连接,之后通信过程中不用不断地发送请求进行数据交换,减少了服务器的负载,提高了性能。
  • 节约流量: 由于WebSocket连接始终保持打开状态,因此不需要在每个HTTP请求中重复发送标头信息,从而减少数据包的大小。

缺点

  • 兼容性问题: WebSocket技术还没有普及,一些老旧的浏览器不支持WebSocket,需要进行降级处理,同时也有些防火墙和代理可能会阻止WebSocket协议的使用。
  • 保持连接: WebSocket连接始终保持打开状态,需要保持长久连接,长时间运行可能会导致资源消耗或权限被滥用。
  • 安全性: WebSocket连接要求服务器端和客户端都具备保密性和数据完整性保护机制,因此在资源限制或网络不安全的环境下有可能会导致安全问题。
 

Java代码示例(基于SpringBoot)

WebSocketConfig类,用于设置WebSocket路由,比如当前可通过ws://localhost:8080/myWebSocketPath进行访问
MyWebSocketHandler类为具体的逻辑处理类,这里只是简单的对客户端请求的内容进行包装然后返回,代码如下:
我们可以使用Postman或者其他请求工具进行连接。
notion image
 
 
参考资料
  1. https://apifox.com/apiskills/websocket-protocol/
  1. https://www.cnblogs.com/chyingp/p/websocket-deep-in.html
  1. https://github.com/0voice/cpp_backend_awsome_blog/blob/main/【NO.23】一篇文章彻底搞懂websocket协议的原理与应用(一).md
 
上一篇
RAG近期发展综述
下一篇
2023年度总结&&2024年度规划