【譯】 WebSocket 協議第六章——傳送與接收訊息(Sending and Receiving Data)

黃Java發表於2019-01-07

概述

本文為 WebSocket 協議的第六章,本文翻譯的主要內容為 WebSocket 訊息傳送與接收相關內容。

有興趣瞭解該文件之前幾章內容的同學可以見:

傳送與接收訊息(協議正文)

6.1 傳送資料

為了通過 WebSocket 連線傳送一條 WebSocket 訊息,終端必須遵循以下幾個步驟:

  1. 終端必須保證 WebSocket 連線處於 OPEN 狀態(見第 4.1 節和第 4.2.2 節)。如果 WebSocket 連線的任意一端的狀態發生了改變,終端必須中止以下步驟。
  2. 終端必須將資料按照第 5.2 節定義的 WebSocket 幀進行封裝。如果需要傳送的資料過大或者在終端希望開始發訊息時,如果資料在整體性這一點上不可用,那麼終端可能會選擇通過在第 5.4 節中定義的一系列幀來進行封裝。
  3. 包含資料的第一幀操作碼(幀操作碼)必須根據第 5.2 節中的內容設定的合適的值,以便接收者將資料解析為文字或者二進位制資料。
  4. 最後一個包含資料的幀的 FIN ( FIN 幀)欄位必須和第 5.2 節中定義的一樣設定為 1 。
  5. 如果資料被髮送到了客戶端,資料幀必須和第 5.3 節中定義的一樣新增掩碼。
  6. 如果在 WebsSocket 連線中有協商擴充套件(第 9 章),在這些擴充套件中的定義和注意事項也許要額外考慮。
  7. 被格式化的幀必須通過底層的網路連線進行傳輸。

6.2 接收資料

為了接收 WebSocket 資料,終端需要監聽底層網路連線。輸入的資料必須通過第 5.2 節定義的 WebSocket 幀進行解析。如果收到了一個控制幀(第 5.5 節),那麼這個幀必須如 5.5 節中定義的方式進行處理。如果收到的是一個資料幀,那麼終端必須注意 5.2 節中的定義在操作碼(幀操作碼)中的資料型別。在這一幀中的“應用資料”被定義為訊息的資料。如果幀中包含未分片的資料(第 5.4 節),那麼就認為:一條 WebSocket 訊息的資料和型別被收到了。如果幀是分片資料的一部分,那麼隨後的幀包含的“應用資料”連起來就是資料的格式。當通過 FIN 欄位(FIN幀)表示的最後一個片段被收到時,我們可以說:一條 WebSocket 訊息的資料(由片段組裝起來的“應用資料”資料組成)和型別(注意分片訊息的第一幀)已經被收到了。接下來的資料幀必須是屬於一條新的 WebSocket 訊息。

擴充套件(第 9 章)可能改變資料如何理解的方式,具體包括訊息的內容邊界。擴充套件,除了在“應用資料”之前新增“擴充套件資料”之外,也可以修改“應用資料”(例如壓縮它)。

像第 5.3 節中說的那樣,服務端在收到客戶端的資料幀時必須去除掩碼。

相關文章