深入 RPC 訊息協議

Lewis77發表於2018-11-01

file
對於一串訊息流,我們必須能確定訊息邊界,提取出單條訊息的位元組流片段,然後對這個片段按照一定的規則進行反序列化來生成相應的訊息物件。
每個訊息都有其內部欄位結構,結構構成了訊息內部的邏輯規則,程式要按照結構規則來決定欄位序列化的順序。

訊息邊界

RPC 需要在一條 TCP 連結上進行多次訊息傳遞。在連續的兩條訊息之間必須有明確的分割規則,以便訊息接收方可以將訊息分割開來。
比較常用的兩種分割方式是特殊分割符法(可讀性強)和長度字首法(傳輸便捷)。
file
比如最為常見的分割符是\r\n。當接收端遍歷位元組陣列時發現了\r\n,就立即可以斷定\r\n 之前的位元組陣列是一條完整的訊息,可以傳遞到上層邏輯繼續進行處理。HTTP 和 Redis 協議就大量使用了\r\n 分割符。一般用於文字訊息。
file
訊息傳送端在每條訊息的開頭增加一個 4 位元組長度的整數值,標記訊息體的長度。這樣訊息接受者首先讀取到長度資訊,然後再讀取相應長度的位元組陣列就可以將一個完整的訊息分離出來。常用於二進位制訊息。
HTTP 協議是一種基於特殊分割符和長度字首法的混合型協議。比如 HTTP 的訊息頭採用的是純文字外加\r\n 分割符,而訊息體則是通過訊息頭中的 Content-Type 的值來決定長度。HTTP 協議雖然被稱之為文字傳輸協議,但是也可以在訊息體中傳輸二進位制資料資料的,例如音視訊影像,所以 HTTP 協議被稱之為「超文字」傳輸協議。

訊息結構

訊息壓縮

訊息優化

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章