TDEngine數據包的詳細說明


NetMsg為TDEngine傳輸數據的數據結構

數據組成

包頭

數據的前12位為包頭

前4位為數據包的長度,供數據讀取的時候獲取讀取的長度

接下來2位為seq_fd,客戶端與網關服通訊時會保證包序是正常的,即下一個包的seq是符合標准的,防止作弊重復發送包,在網關服與邏輯服通訊時seq_fd表示網關服接受客戶端的fd值。邏輯服根據seq_fd值來獲取用數據包的來源用戶。

其它字段為預留字段,后續可能有加密字段

包數據

包數據的第一個元素存儲的是一個str的值,也就是數據包的名稱,可根據數據包的名稱獲取有幾個參數,參數的類型為何種類型,用以數據驗證。

接下來為若干個數據值,數據為小端結構

數據值解析

讀取字段

首先讀取字段頭,字段頭為兩個16進制的值,第一個16進制為index,第二個16進制對應類型的pattern

若為map類型的數據,第一個index用來解析對應的key的字符串值,對於其它類型index固定為0,不作解析

第二個pattern類型則表示下一個值的數據類型,程序會根據pattern值進行下一步值的解析

類型解析

若類型為u8,i8,則會讀取后面1個字節做為值

若類型為u16,i16,則會讀取后面2個字節做為值

若類型為u32,i32,則會讀取后面4個字節做為值

若類型為float,則會讀取后面4個字節做為i32值,然后把這個值除以1000得出float的值,float沒有用內存直接做轉換,只保留了3位的精度,若精度要求高的請勿使用此類型,可在打包的時候轉成字符串,解析的時候做相應的解析

若類型為str,raw,則后面2個字節為字符串的長度,再根據長度讀取相應的字節做為字符串的值

若類型為map

  1. 遍歷字段頭,若頭為nil類型,則表示讀完map,退出循環,跳到5
  2. 根據字段頭,讀取相應的類型
  3. 根據字段頭的index,從配置中讀取相應的key,若配置中不存在key,則繼續執行1
  4. 把key和相應的值存到HashMap,繼續執行1
  5. 數據成功讀取

若類型為數組類型

  1. 得出對應的子類型,如u8[]對應的子類型為u8
  2. 遍歷讀取字段的值,若讀取到的類型為None,退出循環,跳到4
  3. 把讀取到的值存在Vector,繼續執行1
  4. 數據成功讀取

至此,數據解析完成

項目地址

TDEngine

td_proto rust 實現

td_proto cpp 實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM