通訊協議可以理解兩個節點之間為了協同工作實現資訊交換,協商一定的規則和約定,例如規定位元組序,各個字段型別,使用什麼壓縮演算法或加密演算法等。常 見的有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...