golang,go,博客,开源,编程

认识websocket协议

Published on with views and comments

WebSocket 协议简介

WebSocket 是一种计算机网络通信协议,它在单个 TCP 连接上提供全双工、实时的通信。WebSocket 允许客户端和服务器之间进行持久化的、低延迟的双向通信,并且与传统的 HTTP 协议相比,WebSocket 能够提供更高效的数据交换。

WebSocket 由 IETF (Internet Engineering Task Force) 在 2011 年发布,RFC 6455 规范定义了它的工作方式。它常用于实时应用程序,如在线游戏、即时聊天、金融交易系统、股票市场监控等。

1. WebSocket 协议的特点

1.1 全双工通信

WebSocket 是一个 全双工协议,即客户端和服务器可以在同一连接上同时进行数据的发送和接收。这与传统的 HTTP 协议不同,HTTP 是基于请求-响应模型的,每次通信都需要建立新的连接,而 WebSocket 建立了一个持久的连接,允许双向数据流的持续交换。

1.2 低延迟

WebSocket 协议避免了传统 HTTP 协议的请求-响应模式,减少了通信延迟。当 WebSocket 连接建立后,数据可以在客户端和服务器之间实时传输,而不需要每次发送请求或等待响应。

1.3 单一连接

WebSocket 在建立连接后,通信双方可以通过一个 持久的 TCP 连接 进行多次数据交换。这意味着不需要频繁地建立和断开连接,从而减少了网络开销和资源消耗。

1.4 高效的数据传输

WebSocket 协议在数据传输时没有 HTTP 头的冗余信息,因此比传统的 HTTP 请求响应更加高效,适合需要实时传输大量数据的应用场景。

1.5 兼容性

WebSocket 协议基于 HTTP 协议建立连接,因此它能够在现有的 HTTP 网络架构中运行,并且能够穿越现有的防火墙和代理服务器。

2. WebSocket 工作原理

WebSocket 协议的通信过程通常包含两个阶段:握手数据传输

2.1 握手阶段

WebSocket 连接的建立通过 HTTP 协议的 握手 完成,客户端和服务器通过 HTTP 协议交换一些特定的头部信息来协商是否升级为 WebSocket 协议。WebSocket 的握手过程通常如下:

  1. 客户端发送握手请求: 客户端通过 HTTP 请求发送一个带有特殊头部的请求,请求升级协议到 WebSocket。示例请求如下:

    GET /chat HTTP/1.1
    Host: example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: x3JJHMbDL1EzLkh9K5K1lQ==
    Sec-WebSocket-Version: 13
    
    • Upgrade:告诉服务器,客户端请求协议升级为 WebSocket。
    • Connection: Upgrade:表明希望升级协议。
    • Sec-WebSocket-Key:客户端生成一个随机的 Base64 编码字符串,服务器将基于这个值生成一个响应。
    • Sec-WebSocket-Version:指定 WebSocket 协议的版本(常见版本是 13)。
  2. 服务器回应握手请求: 服务器在接收到客户端的请求后,如果支持 WebSocket 协议并且能够处理该请求,就会发送 HTTP 响应,升级连接到 WebSocket。响应示例如下:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: tYVczR3zV7ckFgM1BG0p0A==
    
    • 101 Switching Protocols:表示协议已经升级。
    • Sec-WebSocket-Accept:服务器使用客户端发送的 Sec-WebSocket-Key 和特定算法生成的回应值,确保连接的合法性。

完成握手后,HTTP 连接就会升级为 WebSocket 连接,通信双方可以开始通过 WebSocket 协议进行数据交换。

2.2 数据传输阶段

一旦握手成功,客户端和服务器之间的通信就不再使用 HTTP 协议,而是采用 WebSocket 协议。WebSocket 连接建立后,客户端和服务器之间的数据交换可以是双向的、实时的,且数据传输非常高效。

WebSocket 数据传输是基于帧的(frame-based),每个帧包含数据包的头部和数据负载。数据帧可以是:

  • 文本帧:用于传输文本数据(通常是 UTF-8 编码的文本)。
  • 二进制帧:用于传输二进制数据(如图像、视频、音频等)。

数据帧的结构如下:

  • 头部:包含了数据帧的基本信息(如是否是最后一帧、数据类型等)。
  • 数据负载:包含实际传输的数据内容。

3. WebSocket 消息格式

WebSocket 消息由若干个帧(Frame)组成,每个帧有一定的格式:

  • FIN(1位):如果为1,表示这是消息的最后一帧。
  • RSV1、RSV2、RSV3(1位):这些字段保留未使用,通常设置为0。
  • Opcode(4位):指示消息的类型,如文本、二进制等。
  • Mask(1位):如果为1,表示消息数据部分是被掩码的,WebSocket 消息在传输时会对数据进行掩码处理,只有客户端发送消息时才需要掩码。
  • Payload length(7位或7+16+64位):表示消息负载的长度,长度可以是1字节、2字节或者8字节,具体根据消息的大小来决定。
  • Payload data:消息的实际数据部分。

4. WebSocket 用途和应用场景

WebSocket 协议非常适合需要实时双向通信的场景,常见的应用包括:

  • 即时聊天应用:如 Slack、WhatsApp 等,允许用户实时发送和接收消息。
  • 实时通知系统:如社交媒体平台的实时通知。
  • 在线游戏:多人在线游戏需要低延迟的实时数据交换,WebSocket 可以提供高效的通信。
  • 股票行情和金融数据:实时股票价格、交易信息等需要通过 WebSocket 高效传输。
  • 协作编辑工具:如 Google Docs 等,可以通过 WebSocket 实现多人实时协作编辑文档。
  • 视频流和音频流:流媒体传输,尤其是实时视频和音频,WebSocket 提供了低延迟的传输能力。

5. WebSocket 与 HTTP 比较

特性WebSocketHTTP
连接方式在握手后通过单个 TCP 连接进行双向通信每个请求都需要建立独立的连接
通信方式全双工、实时、双向通信半双工、请求-响应模式
效率高效,减少了请求-响应的开销相对较低,每个请求都有头部信息的开销
延迟低延迟,实时性强较高,存在请求-响应的延迟
用途实时应用(聊天、游戏、实时通知等)传统的网页请求、数据传输等

6. 总结

WebSocket 是一种提供全双工、实时、低延迟通信的协议,它通过 HTTP 协议的握手建立连接,然后通过单一的持久 TCP 连接进行数据的实时交换。WebSocket 在许多需要实时通信的应用场景中都非常有用,如即时通讯、在线游戏、实时数据流、股票行情等。它比传统的 HTTP 协议更加高效,特别适合用于处理大量实时数据的应用。


标题:认识websocket协议
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/06/1736153607816.html
联系:scotttu@163.com