基於Netty的RPC架構筆記8之自定義資料包協議
由於資料在網路傳輸過程中,因為客戶端和服務端沒有約定好一個數據結構,就有可能粘包現象或分包現象,這樣就需要定義資料包協議
比如我要傳遞一句話:I want to learn English and you?
粘包現象就是 I want tolearn English and you?
分包現象就是I want to learn English and you?
粘包和分包出現的原因是:沒有一個穩定資料結構,
一般解決辦法就是採取分隔符 如 I want to learn English|and you?|
另一種方法就是長度 + 資料23I want to learn English13give me a tea
然後一般基於netty開發程式都會定義資料包格式,格式如下
/**
*
* <pre>
* 資料包格式
* +——----——+——-----——+——----——+——----——+——-----——+
* | 包頭| 模組號 | 命令號 | 長度 | 資料 |
* +——----——+——-----——+——----——+——----——+——-----——+
* </pre>
* 包頭4位元組
* 模組號2位元組short
* 命令號2位元組short
* 長度4位元組(描述資料部分位元組長度)
*
*
*/
Netty中的 FrameDecoder 這個decoder可以協助我們解決粘包分包問題
1問:訊息如何在管道中流轉?當前的一個handler如何往下面的一個handler傳遞一個物件?
答:一個管道中會有多個handler,handler往下傳遞物件的方法是sendUpstream(event)
2為什麼FrameDecoder return的物件就是往下傳遞的物件
答:還是呼叫了sendUpstream
3 buffer裡面資料未被讀取完怎麼辦? 為什麼return null就可以快取buffer?
答:cumulation快取 FrameDecoder裡面的cumulation其實就是一個快取的buffer物件
4由於資料包格式包頭+長度+資料,假如有的使用者每次傳輸長度都是Intger.max,這種資料包,通常被稱為socket攻擊,位元組流式攻擊