通訊協議的設計

經常使用的某協議設計以下:  包括幀頭,命令字,幀序號,幀長度,幀數據,校驗字,幀尾。tcp

1Bspa

1B翻譯

2B設計

4Bblog

NBip

2B內存

2Bci

幀頭table

命令字im

幀序號

幀長度

  幀數據

校驗字

幀尾

HEAD

CMD

FRAME_SEQ

DATA_LEN

  DATA

CRC

TAIL

 

通常協議解析時,定位到幀頭,經過幀長度汲取一個幀。而後校驗下校驗字和幀尾確保本幀沒問題。

 

而後這樣設計有一個小風險,就是幀數據也包含幀頭就很尷尬。

一、讀取到錯誤的幀長度有內存溢出風險。

二、讀取到錯誤的幀長度致使後續的幀都被誤讀取。

三、本幀必然發生校驗字錯誤被丟棄。

 

所以,最好能對幀數據進行幀頭的剔除工做。

今天翻看tcp/ip看到一節,SLIP的協議包裝能夠借鑑下。

如圖,每段IP數據段被封裝時,有個END標記「0xC0「,對數據報中的「0xC0」進行加工,翻譯成「0xdb0xdc」,再對報文中的"0xdb"後面加上「0xdd」。

這樣只有在數據包的首尾纔有「0xC0」了。

缺點就是一、報文稍稍變長几個字節,稍微影響點帶寬(取決於保衛中關鍵字的出現頻率)

         二、須要對數據報進行逆向翻譯操做,帶來了必定的工做量。

 

但整體而言仍是有意義的吧,總比報文亂序了好。

相關文章
相關標籤/搜索