当前位置: 首页 > news >正文

WebSocket扫盲

在这里插入图片描述

WebSocket 是一种网络通信协议,它允许在单个 TCP 连接上进行全双工、双向的实时通信。它是为了解决传统 HTTP 协议在实时交互应用中的局限性而设计的。

核心概念和特点

  1. 解决 HTTP 的痛点:

    • 单向性: HTTP 是请求-响应模式。客户端发起请求,服务器响应一次,连接通常就关闭了(短连接)或需要保持长连接但仍然是半双工(请求后等待响应)。
    • 高开销: 每次 HTTP 请求都包含完整的头部信息(如 Cookie、User-Agent 等),即使数据量很小,头部的开销也很大。
    • 实时性差: 服务器无法主动推送数据给客户端(除非使用轮询、长轮询、SSE 等变通方案,但效率低下或不够理想)。
  2. WebSocket 的优势:

    • 真正的双向通信: 一旦连接建立成功,服务器和客户端可以随时、主动地向对方发送数据,就像打电话一样自由对话。
    • 持久化连接: WebSocket 连接在建立后保持打开状态(长连接),直到显式关闭。避免了重复建立连接的开销。
    • 低延迟: 由于连接是持久的且协议设计轻量,数据可以在客户端和服务器之间以极低的延迟传输。
    • 轻量级数据帧: WebSocket 传输的数据帧(Frame)头部开销很小(通常只有 2-10 字节),特别适合高频、小数据量的通信。
    • 基于 TCP: 运行在 TCP 之上,具备 TCP 的可靠性(保证数据包顺序、重传机制等)。
  3. 工作原理:

    • 握手阶段: 连接始于一个特殊的 HTTP 请求(称为 Upgrade 请求)。客户端发送一个包含 Connection: UpgradeUpgrade: websocket 等头部的 HTTP 请求。如果服务器支持 WebSocket,会响应一个状态码为 101 Switching Protocols 的回复,表示协议升级成功。
    • 数据传输阶段: 握手成功后,底层的 TCP 连接保持不变,但通信协议从 HTTP 切换到了 WebSocket。此时,客户端和服务器就可以通过这个连接自由地发送 WebSocket 数据帧(Frame)进行双向通信了。
    • 关闭连接: 任何一方都可以发送一个关闭帧来正常终止连接。

主要应用场景

WebSocket 非常适合需要低延迟、高频率、双向数据流的应用:

  • 实时聊天应用: 消息的即时发送和接收。
  • 多人协作工具: 实时文档编辑、白板协作等。
  • 在线游戏: 玩家动作、游戏状态的实时同步。
  • 实时数据仪表盘: 股票行情、实时监控数据(服务器状态、物联网传感器数据)、体育赛事直播比分更新。
  • 实时通知: 社交媒体动态、系统告警等。
  • 在线拍卖/竞标: 实时出价更新。

与 HTTP 轮询/长轮询/SSE 的对比

  • HTTP 轮询: 客户端定期发送请求询问是否有新数据。效率低(大量空请求),延迟高(取决于轮询间隔)。
  • HTTP 长轮询: 客户端发送请求,服务器在有新数据或超时才响应。减少了空请求,但每次请求仍有头部开销,且服务器连接资源占用多。
  • SSE: 服务器单向推送数据给客户端(基于 HTTP)。只解决服务器到客户端的推送问题,客户端仍需用 HTTP 向服务器发请求。
  • WebSocket: 双向、低延迟、低开销的持久连接。是实时双向通信的首选方案

总结

WebSocket 是现代 Web 应用中实现高效、低延迟、双向实时通信的核心技术。它通过一次 HTTP 握手建立持久化的双向 TCP 连接,克服了传统 HTTP 在实时交互上的缺陷,使得构建聊天室、在线游戏、实时数据可视化等富交互应用成为可能。当你需要数据在客户端和服务器之间快速、自由地双向流动时,WebSocket 通常是理想的选择。

你想了解 WebSocket 的具体实现(例如在前端 JavaScript 或后端语言如 Node.js/Python/Go 中如何使用)吗?

http://www.dtcms.com/a/264230.html

相关文章:

  • 7 项目立项管理
  • MYSQL-JAVAweb1
  • 华为设备 QoS 流分类与流标记深度解析及实验脚本
  • Ubuntu+Nginx+php+SQLite3+typecho手动搭建个人博客
  • 什么是消息队列?
  • 21.合并两个有序链表
  • android RecyclerView隐藏整个Item后,该Item还占位留白问题
  • 变幻莫测:CoreData 中 Transformable 类型面面俱到(七)
  • IDE全家桶专用快捷键----------个人独家分享!!
  • 计算机网络(三)传输层TCP
  • 630,百度文心大模型4.5系列开源!真香
  • Spring Boot 启动加载执行链路分析
  • Spring Boot 集成 Dufs 通过 WebDAV 实现文件管理
  • (第二篇)HMTL+CSS+JS-新手小白循序渐进案例入门
  • C++ 网络编程(13) asio多线程模型IOServicePool
  • Y-Combinator推导的Golang描述
  • 复现一个nanoGPT——model.py
  • postman入门篇
  • 用Fiddler中文版抓包工具掌控微服务架构中的接口调试:联合Postman与Charles的高效实践
  • 2.2.4 Linux 系统日志管理
  • (LeetCode 面试经典 150 题) 42. 接雨水 (单调栈)
  • 【C++】std::vector 全面指南
  • Excel 如何从一个大表里,根据姓名查找到对应的手机号?
  • 【1.5 漫画TiDB分布式数据库】
  • python+uniapp基于微信小程序的流浪动物救助领养系统nodejs+java
  • 蓝牙音频传输协议深度解析:A2DP、HFP、AVRCP 对比与面试核心考点
  • Langgraph 学习教程
  • 日事清驾驶舱模式上线:实时数据更新+项目管理+数据可视化,提升决策效率​
  • 5-TF·IDF关键词算法
  • 强化学习系列--从数值出发,解读 DPO 训练背后的偏好优化逻辑