Linux下用tlv協議封包

2021-10-05 17:24:23 字數 2103 閱讀 8659

通訊協議可以理解兩個節點之間為了協同工作實現資訊交換,協商一定的規則和約定,例如規定位元組序,各個字段型別,使用什麼壓縮演算法或加密演算法等。常 見的有tcp,udo,http,sip等常見協議。協議有流程規範和編碼規範。流程如呼叫流程等信令流程,編碼規範規定所有信令和資料如何打包/解包。

tlv是指由資料的型別tag,資料的長度length,資料的值value組成的結構體,幾乎可以描任意資料型別,tlv的value也可以是乙個tlv結構,正因為這種巢狀的特性,可以讓我們用來包裝協議的實現,如圖:

一般來說資料傳輸的方式分為字元流傳輸和位元組流傳輸,

字元流一般是以字串的形式傳輸和儲存,如:hello world

位元組流一般是以位元組的形式傳輸和儲存,如0x00,0xff

tlv協議是以位元組流的形式傳輸的

我們直接傳送tlv資料,如0x01(t) 0x03(l) 0x03(v),就很容易出現錯誤,比如0x01(t) 0x03(l) 0x03(v)資料之前如果有個0x01的廢資料,變成0x01 0x01(t) 0x03(l) 0x03(v),伺服器在讀的時候會誤把廢資料0x01當作tlv資料的開頭0x01(t)解讀,這樣就得不到準確的資料,一般我們會在tlv協議之前加乙個幀頭(head),這個幀頭用乙個不常用到位元組來做,比如0xff,0xfd之類的,報文:0xff(h) 0x01(t) 0x04(l) 0x03(v);如果是需要更加嚴謹(比如航空之類的)的資料傳送,可以用兩個(或以上)位元組做幀頭,如0xff 0xff (h) 0x01(t) 0x05(l) 0x03(v)

同時傳輸過程中可能會出現資料丟失的情況,為了檢測出資料是否有丟失的情況,我們常在tlv協議後加上乙個crc校驗和,crc校驗和是由tlv的資料計算出的結果,感興趣的朋友可以深究。

crc校驗和參考部落格:

最後發來的資料就是[幀頭] [tag] [length] [value] [crc校驗和],用前面[幀頭] [tag] [length] [value]可以算出乙個crc的值,用來跟tlv報文最後的[crc校驗和]做比較,任何一位出錯都會導致這兩個不相等,就可以知道資料錯誤。這就是乙個比較完備的tlv協議了

#include

#include

#define pack_header 0xfd

#define tlv_fixed_size 5

#define tlv_min_size (tlv_fixed_size+1)

#define off 0

intpacktlv_msg

(char

*buf,

int size,

int ***)

/* 幀頭 */

buf[ofset]

= pack_header;

ofset +=1

;/* tag */

buf[ofset]

= tag_ack;

ofset +=1

;/* length */

pack_len = tlv_fixed_size +1;

buf[ofset]

= pack_len;

ofset +=1

;/* value */

buf[3]

=(off==cmd)

?0x00

:0x01

;//如果這是乙個開關,那麼傳進來的***

是0,則把0變成位元組流0x00並表示關閉,反之則是開啟

/*crc校驗和 */

crc16 =

crc_itu_t

(magic_crc, buf, ofset)

;/* 把crc校驗和放入報文buf後 */

ushort_to_bytes

(&buf[ofset]

, crc16)

; ofset +=2

;/* 返回tlv報文長度 */

return ofset;

}

備註:ack是如果對伺服器傳送資料成功並且正確,伺服器就對客戶端傳送ack,返回nak就是資料傳送失敗,

參考部落格:

Linux下http協議實現

include include include string h include include socket h include errno h include include include include include include ctype h int main int argc,ch...

Linux下http協議實現

include include include string h include include socket h include errno h include include include include include include ctype h int main int argc,ch...

Linux下用speedtest cli測網速

在linux 的命令列中使用speedtest cli來測試寬頻連線速度。wget chmod a rx speedtest cli.py sudo mv speedtest cli.py usr local bin speedtest cli sudo chown root root usr lo...