TCP協(xié)議粘包與拆包

產(chǎn)生的背景

正常發(fā)送

粘包

1.要發(fā)送的數(shù)據(jù)小于TCP發(fā)送緩沖區(qū)的大小,TCP將多次寫入緩沖區(qū)的數(shù)據(jù)一次發(fā)送出去,將會發(fā)生粘包;

2.接收數(shù)據(jù)端的應(yīng)用層沒有及時讀取接收緩沖區(qū)中的數(shù)據(jù),將發(fā)生粘包;

拆包

1.要發(fā)送的數(shù)據(jù)大于TCP發(fā)送緩沖區(qū)剩余空間大小,將會發(fā)生拆包;

2.待發(fā)送數(shù)據(jù)大于MSS(最大報文長度),TCP在傳輸前將進行拆包。即TCP報文長度-TCP頭部長度>MSS。


MSS(最大報文段長度):

最大報文段長度(MSS)是TCP協(xié)議的一個選項,用于在TCP連接建立時,收發(fā)雙方協(xié)商通信時每一個報文段所能承載的最大數(shù)據(jù)長度(不包括文段頭)。

解決方案:

LineBasedFrameDecoder

LineBasedFrameDecoder的工作原理是它一次遍歷ByteBuf中的可讀字節(jié),判斷看是否有“\n”或者“\r\n”, 如果有,就以此位置為結(jié)束位置,從可讀索引到結(jié)束位置區(qū)間的字節(jié)就組成了一行。它是以換行符為結(jié)束標(biāo)志的解碼器,支持?jǐn)y帶結(jié)束符或者不攜帶結(jié)束符兩種解碼方式,同時支持配置單行的最大長度。如果連續(xù)讀取到最大長度后仍然沒有出現(xiàn)換行符,就會拋出異常,同時忽略掉之前讀到的異常碼流。

StringDecoder的功能非常簡單,就是將接收到的對象轉(zhuǎn)換成字符串,然后繼續(xù)調(diào)用后面的Handler。LineBasedFrameDecoder+StringDecoder組合就是按行切換的文本解碼器,它被設(shè)計用來支持TCP的粘包和拆包。

ch.pipeline().addLast( new LineBasedFrameDecoder(1024));

ch.pipeline().addLast( new StringDecoder());

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容