WebSocket 是一种网络通信协议,允许客户端和服务器之间建立一个持久的、双向的通信通道。与传统的 HTTP 协议不同,WebSocket 允许在建立连接之后,客户端和服务器之间可以进行双向实时通信,且无需重新建立连接。

1. WebSocket 的工作原理

  1. 建立连接: WebSocket 使用 HTTP 协议的升级机制来建立连接。客户端向服务器发送一个 WebSocket 握手请求(HTTP 请求),例如:

    1
    2
    3
    4
    5
    6
    http复制代码GET /chat HTTP/1.1
    Host: example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: x3JJHMbDL1EzLkh9t3rT74tX8gT0tVwG
    Sec-WebSocket-Version: 13

    如果服务器支持 WebSocket 协议并接受该请求,服务器会回复一个 101 状态码(切换协议)并建立 WebSocket 连接:

    1
    2
    3
    4
    http复制代码HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: n3tJ62Dqa2DjsFTv4Fk7K0rGkTQ=
  2. 建立持久连接: 在握手完成后,HTTP 连接被“升级”成 WebSocket 连接,WebSocket 使用基于 TCP 的持久连接。此时,客户端和服务器可以开始交换数据。与 HTTP 不同,WebSocket 在连接建立后并不需要每次请求和响应的开销,因此可以实现持久的、低延迟的双向通信。

  3. 双向通信: 一旦连接建立,客户端和服务器之间就可以互相发送数据,而无需每次都重新发起连接。WebSocket 使用一种轻量级的数据帧格式传输信息,支持文本(如 JSON、XML)和二进制数据(如图像、视频)。这种设计使得 WebSocket 特别适用于实时应用程序,如聊天应用、在线游戏、股票交易系统等。

  4. 关闭连接: WebSocket 连接可以通过双方协商或自动关闭。关闭连接时,双方会交换一个关闭帧(Close frame),确保连接被正确终止。

2. 为什么 WebSocket 可以实现持久连接?

WebSocket 之所以能够实现持久连接,主要得益于以下几个因素:

  1. TCP 连接持久性: WebSocket 基于 TCP 协议,而 TCP 是一个面向连接的协议,一旦建立连接,双方可以持续通信,直到一方主动关闭连接。因此,在 WebSocket 连接建立后,客户端和服务器之间的通信可以持续不断地进行。
  2. 协议的设计: WebSocket 协议本身是专为持久连接设计的。与 HTTP 请求/响应模型不同,WebSocket 的通信模式是全双工的,这意味着双方都可以在同一连接上同时发送和接收数据,且不需要频繁建立和关闭连接。
  3. 轻量级的数据帧: WebSocket 协议的消息是通过数据帧传输的,数据帧非常小且高效,不需要每次通信都传输头部信息,减少了延迟和开销。
    1. 帧类型:WebSocket 定义了多种帧类型,包括数据帧(如文本帧、二进制帧)和控制帧(如关闭帧、ping 帧、pong 帧)。数据帧用于传输实际的数据,控制帧用于控制连接的状态和行为。
    2. 帧头:帧头包含多个字段,如帧类型、数据长度、掩码等。对于客户端发送的数据帧,需要进行掩码处理,以防止恶意服务器对客户端数据进行嗅探。
    3. 帧体:帧体包含实际的数据内容。对于文本帧,数据内容是 UTF-8 编码的文本字符串;对于二进制帧,数据内容是二进制数据。
  4. 升级机制: WebSocket 通过 HTTP 协议的升级机制与服务器建立连接,且建立连接之后不再依赖 HTTP,因此能够突破 HTTP 的短连接限制,避免每次交互都重新建立 TCP 连接。
  5. 连接关闭机制
    • 关闭帧:WebSocket 连接可以通过发送关闭帧来关闭。关闭帧是一个特殊的控制帧,包含一个关闭代码和一个可选的关闭原因说明。关闭代码用于指示关闭的原因,如正常关闭(代码 1000)、协议错误(代码 1002)等。
    • 关闭过程:客户端或服务器都可以主动发送关闭帧,另一方收到后会关闭连接。关闭过程是有序的,确保双方都能正确处理连接关闭的情况。例如:
      • 客户端发送关闭帧给服务器。
      • 服务器收到关闭帧后,发送关闭帧给客户端。
      • 客户端收到服务器的关闭帧后,关闭连接。
  6. 安全机制
    • 加密传输:WebSocket 可以使用 TLS/SSL 加密传输数据,即 WSS(WebSocket Secure)。WSS 在 WebSocket 协议的基础上增加了 SSL/TLS 加密层,确保数据传输的安全性。
    • 密钥交换:在握手过程中,客户端和服务器通过 Sec-WebSocket-KeySec-WebSocket-Accept 头进行密钥交换,确保连接的唯一性和安全性。

总结来说,WebSocket 通过基于 TCP 的持久连接和全双工通信方式,能够实现长期保持的低延迟通信。这使得它特别适合用于需要实时数据交换的场景。

Reference

  1. https://www.zhihu.com/question/20215561

写在最后

欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。
微信公众号