WebSocket 協議詳解

WebSocket 協議詳解

1. WebSocket 協議的幀數據詳解

1.1 幀結構

  0                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-------+-+-------------+-------------------------------+|F|R|R|R| opcode|M| Payload len |    Extended payload length    ||I|S|S|S|  (4)  |A|     (7)     |             (16/64)           ||N|V|V|V|       |S|             |   (if payload len==126/127)   || |1|2|3|       |K|             |                               |+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +|     Extended payload length continued, if payload len == 127  |+ - - - - - - - - - - - - - - - +-------------------------------+|                               |Masking-key, if MASK set to 1  |+-------------------------------+-------------------------------+| Masking-key (continued)       |          Payload Data         |+-------------------------------- - - - - - - - - - - - - - - - +:                     Payload Data continued ...                :+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +|                     Payload Data continued ...                |+---------------------------------------------------------------+

WebSocket 客戶端與服務器通信的最小單位是幀(frame),一條完整消息由一個或多個幀組成:

  • 發送方將消息切割為多個幀發送
  • 接收方接收到消息幀后重新組裝為完整消息
  • 接收方根據 FIN 標識判斷是否接收到消息的最后一個數據幀
幀基本結構

幀由多個字段順序排列構成,字段說明如下:

字段長度描述
FIN1 位表示該幀是否為消息的最后一幀
1:最后一幀,0:還有后續幀
RSV1 - RSV3各 1 位保留位,默認值為 0。需在握手階段協商使用
Opcode4 位定義幀的操作類型(文本/二進制/控制幀等)
Mask1 位指示負載數據是否經過掩碼處理
客戶端發送必須掩碼,服務器發送不需掩碼
Payload length7 位/7+16位/7+64位負載數據長度編碼
0-125:直接使用7位
126:后接2字節表示長度
127:后接8字節表示長度
Masking-key0 或 4 字節當 Mask=1 時存在,用于負載數據掩碼處理
Payload data變長實際傳輸的數據
字段詳細解釋
  1. FIN 字段

    • 標識當前幀是否為消息的最后一幀
    • 1:消息結束幀;0:消息還有后續幀
  2. RSV1-RSV3 字段

    • 保留位,為協議擴展預留
    • 默認值必須為 0,否則接收方應斷開連接
  3. Opcode 字段

    類型描述
    0x0延續幀繼續未完成的消息
    0x1文本幀UTF-8 編碼文本
    0x2二進制幀二進制數據
    0x3-0x7保留幀未來非控制幀擴展
    0x8關閉幀關閉連接
    0x9Ping幀心跳檢測
    0xAPong幀對Ping的響應
    0xB-0xF保留幀未來控制幀擴展
  4. Mask 字段

    • 客戶端發送必須設為 1(掩碼處理)
    • 服務器發送必須設為 0(無掩碼)
  5. Payload length 字段

    • 采用可變長度編碼適應不同數據量
    • 長度在0-125字節時直接使用7位表示
  6. Masking-key 字段

    • 當 Mask=1 時存在(4字節隨機密鑰)
    • 掩碼算法:C[i] = P[i] ^ M[i % 4]
    • 接收方使用相同密鑰進行解掩碼
    示例:文本幀 "Hello"FIN: 1 (單幀消息)
    RSV: 000
    Opcode: 0001 (文本幀)
    Mask: 1 (客戶端發送)
    Payload length: 5 (0000101)
    Masking-key: 0x12345678
    Payload data: "Hello" 掩碼后值
    

1.2 生成數據幀

消息分片機制

目的:

  1. 支持傳輸未知長度的超大數據
  2. 實現流式傳輸(邊生成邊發送)
  3. 避免大數據一次性加載到內存
分片規則
幀類型FINOpcode描述
起始幀0≠0消息的第一幀
中間幀00消息的中間部分
結束幀10消息的最后一幀

重要規則:

  1. 控制幀不允許分片(包括關閉幀/Ping/Pong)
  2. 控制幀可穿插在分片消息中傳輸
  3. 組成消息的所有幀必須是相同數據類型
  4. 消息碎片類型只能是文本或二進制

2. WebSocket 協議控制幀結構詳解

控制幀操作碼:0x08(關閉)、0x09(Ping)、0x0A(Pong)

重要特性:

  1. 所有控制幀負載長度 ≤125 字節
  2. 控制幀禁止分片處理
  3. 控制幀可穿插在消息片之間傳輸

2.1 關閉幀(Opcode 0x08)

功能:正常關閉連接或指示關閉原因

幀結構要求:

  1. 客戶端發送必須掩碼處理
  2. 數據部分(若存在)前2字節為無符號整數(狀態碼)
  3. 可選UTF-8編碼的關閉原因(人類不可讀)
關閉流程
  1. 主動關閉方:發送關閉幀 → 不再發送任何數據
  2. 被動接收方:收到關閉幀后必須響應關閉幀
  3. 雙方關閉:交換關閉幀后關閉TCP連接
  4. 超時處理:服務器應立即關閉TCP連接;客戶端可等待或超時關閉
示例:正常關閉(狀態碼1000)FIN: 1
RSV: 000
Opcode: 1000 (關閉幀)
Mask: 1 (客戶端發送)
Payload length: 2
Payload data: 0x03E8 (1000的16進制)

2.2 Ping幀(Opcode 0x09)

功能:連接狀態檢測(心跳檢測)

重要規則:

  1. 可在連接建立后任意時間發送
  2. 必須包含應用數據(最多125字節)
  3. 接收方收到后必須返回Pong幀(除非已收到關閉幀)
  4. 響應時間:盡快返回Pong幀
示例:帶自定義數據的PingFIN: 1
RSV: 000
Opcode: 1001 (Ping幀)
Mask: 1 (客戶端發送)
Payload length: 9
Payload data: "HEARTBEAT"

2.3 Pong幀(Opcode 0x0A)

功能:對Ping幀的響應

重要規則:

  1. 必須包含與對應Ping完全相同的應用數據
  2. 對于連續多個Ping,只需響應最后一個
  3. 可主動發送(作為單向心跳)
  4. 對主動發送的Pong幀不需要響應
高級行為
  1. 數據一致性:必須完全復制Ping的Payload數據
  2. 延遲響應:可在處理完當前消息后發送
  3. 流控機制:不可用于流量控制

3. WebSocket 心跳機制

機制核心

Client Server Ping幀(含數據) Pong幀(相同數據) Client Server

關鍵規則

  1. 觸發條件:任何一端收到Ping幀
  2. 響應要求:必須立即返回Pong幀(相同Payload數據)
  3. 唯一例外:當連接正處于關閉狀態時可不響應
  4. Pong優先級:高于普通數據幀處理

應用場景

  1. 連接保活:防止中間設備(NAT/防火墻)斷開空閑連接
  2. 狀態檢測:確認對方是否在線/響應
  3. 網絡診斷:通過計算Ping-Pong延時(RTT)測量網絡質量
  4. 雙向驗證:確保連接雙向通信能力

高級實現技巧

  1. Payload設計:包含時間戳(計算RTT)和序列號(匹配請求響應)
  2. 超時機制:Ping發送方應實現響應超時檢測
  3. 頻率控制:推薦間隔15-60秒(視網絡環境調整)
  4. 錯誤處理:連續多次超時后標記連接不可用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86424.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86424.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86424.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【辦公類-105-01】20250626 托小班報名表-條件格式-判斷雙胞胎EXCLE

背景需求: 今天招生主任電話問我,是否可以通過新生的EXCEL判斷幼兒是雙胞胎,便于分在一個班級里。 她試了EXCEL篩選升序,身份證號碼排序了,但是18個數字太多,看不出“雙胞胎” 于是把三個園區的名單發我來…

WPF Binding 的 Mode 屬性

前言 在 WPF 中,Binding 的 Mode 屬性決定了數據綁定的方向和行為。Mode 是 Binding 類的一個重要屬性,它指定了數據如何在源(Source)和目標(Target)之間流動。可用的 BindingMode 枚舉值有以下幾種&#…

C++新紀元:深入C++11/14/17/20核心特性與名企面試精粹(完整版)--8000字硬核解析 | 騰訊/阿里/字節真題實戰

一、右值引用與移動語義:性能革命的核心 面試真題(字節跳動) "如何實現高效字符串拼接?解釋std::move原理及適用場景" 1. 核心概念 左值:具名對象,可取地址(如變量、函數返回值&…

網絡安全之Linux提權由淺入深

前言 在滲透測試與內網攻防中,提權(Privilege Escalation)是至關重要的一環。尤其在 Linux 環境中,權限的嚴格劃分雖然提升了系統安全性,但一旦攻擊者獲得了初始訪問權限,他們往往會試圖通過各種方式實現權…

【streamlit 動態添加/刪除 輸入條目items】

如何動態添加添加條目呢?類似下邊的效果 pip install streamlit 代碼 app.py import streamlit as stdef rule_component(st_ph: st = st):## 添加解析規則, 動態添加元素if

量學云講堂王巖江宇龍2025年第58期視頻 主課正課系統課+收評

量學云講堂王巖江宇龍2025年第58期視頻 主課正課系統課收評資源簡介: 課程目錄: 江宇龍課程 31楓林陽-股票走勢中多空必爭的關鍵要地(1).mp4 32楓林陽-關鍵要地的直觀表現之畫線標準.mp4 33楓林陽-提綱舉領之量線學習的要點綱要.mp4 34楓林陽-主力攻…

Milvus【部署 03】Linux OpenEuler 環境在線+離線安裝及卸載

在線離線安裝及卸載 1. 在線安裝2. 離線安裝3. 卸載 1. 在線安裝 [roottcloud milvus]# yum install ./milvus-2.1.4-1.el7.x86_64.rpm安裝日志: OS …

< 自用文兒 在 Ubuntu 上安裝 Claude Code > 發現了“京東云 JDCloude” 有國內商業云中最低的網絡性能

Claude Code: 最近刷屏這個詞:Claude Code 以后叫 CC,它是 Anthropic 的一款智能編程工具,幾個特點: 在終端運行 像使用命令行工具一樣,無需圖形用戶界面 GUI深度理解整個代碼庫 使用自然語言 讓其修復 b…

Docker部署prometheus+grafana+...

Docker部署prometheusgrafana… prometheus官網 官網 https://prometheus.io/ 中文網址 https://prometheus.ac.cn/ Prometheus簡介 Prometheus(普羅米修斯)是一套開源的監控&報警&時間序列數據庫的組合,由SoundCloud公司開發。 Prometheus基…

Python爬蟲實戰:研究Spynner相關技術

1 引言 1.1 研究背景與意義 隨著互聯網的迅速發展,網頁內容呈現形式日益復雜。傳統的靜態網頁逐漸被動態網頁所取代,大量內容通過 JavaScript 動態生成或 AJAX 異步加載。這使得傳統爬蟲(如基于 Requests 庫的爬蟲)難以獲取完整的網頁信息,因為它們只能獲取頁面的初始 H…

人工智能訓練知識學習-TTS(智能語音合成)

人機對話——TTS(TextToSpeech) 概念: TTS技術,即文本轉語音技術,是一種將文字內容轉換為語音輸出的技術。它通過計算機程序和算法,將文本信息轉化為自然流暢的語音信號,讓用戶能夠聽到文字內…

【Java高頻面試問題】JVM篇

【Java高頻面試問題】JVM篇 類加載機制加載(Loading)連接(Linking)?初始化(Initialization)?使用(Using)與卸載(Unloading) 類加載器和雙親委派模型類加載器…

DBeaver的sql編輯器文本格式字體大小設置

DBeaver的sql編輯器文本格式字體大小設置。開始就沒有找到。早上比較清醒被我發現了。記錄下來

自學Java怎么入門

自學Java其實沒有想象中那么難,只要找對方法,循序漸進地學習,很快就能上手。下面我結合自己的經驗,給你整理一條清晰的學習路徑,咱們一步步來。 一、先了解Java能做什么 在開始之前,建議你先看看Java都能…

操作系統面試知識點(1):操作系統基礎

目錄 1.什么是操作系統: 2.操作系統有哪些功能? 3.常見的操作系統有哪些 4.用戶態和內核態 5.內核態權限這么高,為什么不還要用戶態? 6.用戶態和內核態是如何切換的? 7.系統調用 8,系統調用的過程 ???????1.什么是操作系統: (1)操作系統(OS)是管理計算機軟硬…

Linux 和 Windows 服務器:哪一個更適合您的業務需求?

在選擇服務器操作系統時,Linux 和 Windows 服務器是最常見的兩種選擇。它們各有特點,適合不同的業務需求和使用環境。本文將詳細分析 Linux 和 Windows 服務器的主要差異,包括成本、安全性、性能、定制化能力和用戶界面等方面,幫助…

CertiK聯創顧榮輝將于港大活動發表演講,分享Web3安全與發展新視角

CertiK聯合創始人、哥倫比亞大學教授顧榮輝,將于6月30日出席香港大學經管學院主辦的“Web3革新與商業機遇”活動,并發表主題演講《規模化Web3:面向全球受眾的創新與安全平衡之道》。 本次活動由港大經管學院高層管理教育主辦,Met…

SpringAI系列---【SpringAI如何接入阿里云百煉大模型?】

1.導言 阿里云百煉的通義千問模型支持 OpenAI 兼容接口,您只需調整 API Key、BASE_URL 和模型名稱,即可將原有 OpenAI 代碼遷移至阿里云百煉服務使用。 如果是要接入阿里云百煉模型,首先推薦使用Spring AI Alibaba,而不是使用Spri…

電子電氣架構 --- 實時系統評價的概述

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

Flink SQL執行流程深度剖析:從SQL語句到分布式執行

在大數據處理領域,Flink SQL憑借其強大的處理能力和易用性,成為眾多開發者的選擇。與其他OLAP引擎類似,Flink SQL的SQL執行流程大致都需要經過詞法解析、語法解析、生成抽象語法樹(AST)、校驗以及生成邏輯執行計劃等步…