1. 程式人生 > >基於Netty的RPC架構筆記8之自定義資料包協議

基於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攻擊,位元組流式攻擊