經常使用的某協議設計以下: 包括幀頭,命令字,幀序號,幀長度,幀數據,校驗字,幀尾。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」了。
缺點就是一、報文稍稍變長几個字節,稍微影響點帶寬(取決於保衛中關鍵字的出現頻率)
二、須要對數據報進行逆向翻譯操做,帶來了必定的工做量。
但整體而言仍是有意義的吧,總比報文亂序了好。