Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • 服务器tutorial
  • spring

  • 数据库

  • 运维

  • other

    • nginx
    • elastic

    • websocket
      • websocket 原理
        • 连接过程
      • WebSocket 和 HTTP 的关系?
      • 链接
    • 服务器面试题整理
  • 《server》
  • other
Jacky
2023-09-15
目录

websocket

WebSocket 是一种协议, 用于在 Web 应用程序中创建实时、双向的通信通道

传统的 HTTP 请求通常是一次请求一次响应的, 而 WebSocket 则可以建立一个持久连接, 允许服务器即时向客户端推送数据, 同时也可以接收客户端发送的数据。WebSocket 相比于传统的轮询或长轮询方式, 能够显著减少网络流量和延迟, 提高数据传输的效率和速度

# websocket 原理

WebSocket 是 HTML5 开始推出的基于 TCP 协议的双向通信协议, 其优势在于与 HTTP 协议兼容、开销小、通信高效。WebSocket 让客户端和服务器之间建立连接, 并通过这个持久连接实时地进行双向数据传输。它的原理基于以下几个关键点

  • 握手阶段: WebSocket 连接的建立是通过 HTTP 协议的握手来实现的。客户端发送一个 HTTP 请求, 其中包含一些特殊的头部信息, 告诉服务器它想要升级到 WebSocket 协议。服务器收到请求后, 如果支持 WebSocket, 就会发送 HTTP 101 状态码(Switching Protocols)作为响应, 表示升级成功

  • 双向通信: 一旦 WebSocket 连接建立成功, 客户端和服务器之间就可以实现双向通信, 不再受限于 HTTP 的请求-响应模式。WebSocket 连接保持持久性, 双方可以随时发送消息给对方, 而不需要重新建立连接

  • 帧(Frame): WebSocket 通信使用帧来传输数据。帧是 WebSocket 协议中的基本数据单元, 可以包含文本数据、二进制数据等。WebSocket 帧可以被分成多个片段, 每个片段都包含了数据的一部分, 并可以有不同的类型和用途(例如, 文本帧、二进制帧、Ping 帧、Pong 帧等)

  • 使用 TCP 协议: WebSocket 建立在 TCP 协议之上, 因此它是一种可靠的通信协议, 适用于需要稳定连接和低延迟的应用场景

  • 数据格式: WebSocket 协议的数据格式相对简单, 通常是纯文本或二进制数据, 没有 HTTP 协议中的请求头等复杂结构。这使得 WebSocket 在数据传输效率上相对较高

  • 状态管理: WebSocket 协议定义了一些状态码, 用于表示连接状态和错误情况。例如, 状态码 1001 表示 WebSocket 连接关闭

总结: WebSocket 是一种基于 HTTP 握手的通信协议, 它允许客户端和服务器之间建立持久连接, 实现双向通信。WebSocket 使用 TCP 协议传输数据, 帧是其基本数据单元, 数据格式相对简单。WebSocket 通常用于构建实时互动性应用, 如在线游戏、在线聊天等

# 连接过程

WebSocket 是基于 HTTP/1.1 实现的。WebSocket 连接建立时, 客户端和服务器之间会首先使用 HTTP/1.1 进行握手, 然后协议会升级到 WebSocket 协议。这个握手过程使得 WebSocket 能够通过现有的 HTTP 基础设施进行连接, 然后转换到 WebSocket 协议, 实现双向通信

具体来说, WebSocket 连接建立的过程如下:

  • 客户端发送一个 HTTP 请求, 其中包含特殊的 WebSocket 头部信息, 如 Upgrade 和 Connection 字段

  • 服务器收到请求后, 会检查这些特殊的头部信息, 如果发现 Upgrade 字段的值为"websocket", 并且 Connection 字段包含"Upgrade", 则表示客户端希望升级到 WebSocket 协议

  • 服务器返回一个 HTTP 101 状态码(Switching Protocols)的响应, 表示升级成功, 并且通过 Connection 字段的值确认了协议的切换

  • 客户端和服务器之间的连接现在已经升级到 WebSocket 协议, 双方可以通过 WebSocket 帧进行双向通信

这种方式使得 WebSocket 能够与现有的 HTTP 基础设施兼容, 同时允许建立持久连接, 实现实时双向通信。这是 WebSocket 协议的一个重要特点


【掩码】

在 WebSocket 中, 客户端向服务器传输的数据帧在大多数情况下是需要进行掩码处理的。WebSocket 协议的设计考虑了安全性和隐私保护, 因此规定了以下规则:

  1. 客户端向服务器发送的数据帧必须进行掩码处理
  2. 服务器向客户端发送的数据帧不需要进行掩码处理

掩码处理是为了保护数据的完整性, 防止数据在传输过程中被恶意篡改。当客户端发送数据给服务器时, 客户端会生成一个随机的 32 位掩码密钥, 然后将要发送的数据按字节与这个掩码密钥进行异或操作, 然后才将数据发送到服务器。服务器在接收到数据后, 会根据掩码密钥对数据进行解码, 还原出原始数据

这个掩码处理过程确保了数据在传输过程中不容易被拦截和篡改。服务器不需要对发送给客户端的数据帧进行掩码处理, 因为在 WebSocket 中, 服务器生成的数据通常是受信任的, 不需要额外的保护

需要注意的是, WebSocket 客户端通常会自动处理掩码, 不需要开发者手动操作。WebSocket 库和框架会自动处理数据帧的掩码处理, 开发者只需关注数据的发送和接收即可

# WebSocket 和 HTTP 的关系?

两种协议都是用于网络通信的

  1. HTTP (Hypertext Transfer Protocol) 是一个基于请求和响应模式的协议, 最早用于 Web 应用
  2. WebSocket 是一种双向通信协议, 可以在客户端和服务器之间建立持久的连接, 以实现实时通信
  3. WebSocket 协议在建立连接时需要使用 HTTP 协议。 具体来说, 当客户端想要建立 WebSocket 连接时, 它们需要通过 HTTP 请求发送一个握手请求。如果服务器同意握手, 它将发送一个握手响应, HTTP 协议随后会升级到 WebSocket 协议
  4. HTTP 和 WebSocket 协议在用途上也有所不同。HTTP 协议主要用于客户端和服务器之间的请求和响应通信, 而 WebSocket 协议主要用于实现实时通信和服务器推送。通俗的说, HTTP 协议是"一问一答", WebSocket 协议是"对话"

总之, WebSocket 和 HTTP 是两种不同的协议, 它们在通信模式、用途和建立连接时都有所不同, 但是它们之间也有联系

# 链接

  • WebSocket 原理及技术简介 (opens new window)
  • WebSocket 是什么?你需要知道的一切 (opens new window)
  • WebSocket 是什么原理?为什么可以实现持久连接? (opens new window)
#websocket
上次更新: 2024/12/01, 17:07:39
dsl
服务器面试题整理

← dsl 服务器面试题整理→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式