Netty解決半包(TCP粘包/拆包導致)讀寫問題
TCP粘包/拆包
TCP是個"流"協議,所謂流,就是沒有界限沒有分割的一串資料。TCP會根據緩衝區的實際情況進行包劃分,一個完整的包可能會拆分成多個包進行傳送,也用可能把多個小包封裝成一個大的資料包傳送。這就是TCP粘包/拆包。
TCP粘包/拆包問題說明
客戶端要給服務端傳送資料,假如為兩個資料包。
可能的情況如下:
問題產生的原因:
1-應用程式write寫入的位元組大小 大於 套接字傳送緩衝區大小
2-進行MSS大小的TCP分段
3-乙太網幀的payload大於MTU進行IP分片
TCP粘包/拆包解決辦法
1-定長訊息,例如每個報文長度固定,不夠補空格
2-使用回車換行符分割,在包尾加上分割符,例如Ftp協議
3-訊息分割,頭為長度(訊息總長度或訊息體長度),通常頭用一個int32表示
4-複雜的應用層協議
Netty對於讀寫半包的的處理
提供多種解碼器用於處理半包,如 LineBasedFrameDecoder、DelimiterBasedFrameDecoder、FixedLengthFrameDecoder、ProtobufVarint32FrameDecoder、ByteToMessageDecoder以及LengthFileldBasedFrameDecoder等等。
下面的例子為 我在 ProtoBuf中的使用
1
2
3
4
5
6
7
8
|
//decoder //1-讀半包的解碼器 ch.pipeline().addLast( new LengthFieldBasedFrameDecoder( 1024 , 0 , 4 , 0 , 4 )); //2-進行訊息解碼 ch.pipeline().addLast( new ProtobufDecoder(BoxAuthReqProto.AuthRequest.getDefaultInstance())); //encoder
ch.pipeline().addLast( new LengthFieldPrepender( 4 )); ch.pipeline().addLast( new ProtobufEncoder()); |
相關文章
- TCP 粘包 - 拆包問題及解決方案TCP
- TCP粘包拆包問題TCP
- Netty粘包&半包解決方案Netty
- java nio解決半包 粘包問題Java
- Netty解決粘包和拆包問題的四種方案Netty
- 深入學習Netty(5)——Netty是如何解決TCP粘包/拆包問題的?NettyTCP
- TCP 粘包拆包TCP
- Netty入門系列(2) --使用Netty解決粘包和拆包問題Netty
- Netty拾遺(七)——粘包與拆包問題Netty
- Netty - 粘包與拆包Netty
- Netty如何解決粘包拆包?(二)Netty
- 詳說tcp粘包和半包TCP
- Netty(三) 什麼是 TCP 拆、粘包?如何解決?NettyTCP
- 粘包拆包及解決方案
- TCP的粘包拆包技術TCP
- Netty原始碼學習6——netty編碼解碼器&粘包半包問題的解決Netty原始碼
- Netty 中的粘包和拆包Netty
- Netty2:粘包/拆包問題與使用LineBasedFrameDecoder的解決方案Netty
- 計算機網路 - TCP粘包、拆包以及解決方案計算機網路TCP
- netty 解決粘包 和 分包的問題Netty
- Go TCP 粘包問題GoTCP
- go語言處理TCP拆包/粘包GoTCP
- Netty中使用MessagePack時的TCP粘包問題與解決方案NettyTCP
- socket的半包,粘包與分包的問題
- java nio訊息半包、粘包解決方案Java
- tcp中的粘包、半包的處理方法TCP
- 從零開始netty學習筆記之TCP粘包和拆包Netty筆記TCP
- TCP協議粘包問題詳解TCP協議
- 粘包/拆包問題一直都存在,只是到TCP就拆不動了。TCP
- 結合RPC框架通訊談 netty如何解決TCP粘包問題RPC框架NettyTCP
- 粘包問題
- 粘包問題原因和解決方法
- 64行程式碼實現零拷貝go的TCP拆包粘包行程GoTCP
- TCP通訊處理粘包詳解TCP
- Netty--粘包與分包Netty
- 資料接收中粘包及半包的處理
- 通過大量實戰案例分解Netty中是如何解決拆包黏包問題的?Netty
- Socket 粘包和分包問題