TCP粘包/拆包問題和Netty的解決方案

什么是TCP協(xié)議娘摔?

TCP(Transmission Control Protocol傳輸控制協(xié)議)是Internet協(xié)議組的主要協(xié)議之一。起源于初始的網(wǎng)絡(luò)實現(xiàn)户魏,補(bǔ)充了IP協(xié)議综膀。因此通常稱為TCP/IP協(xié)議。TCP在運(yùn)行在IP通信網(wǎng)絡(luò)的應(yīng)用程序之間提供穩(wěn)定的蛾洛、有序的和錯誤檢查的8字節(jié)流分發(fā)功能⊙丬剑—— from wiki

什么是TCP的粘包和拆包問題轧膘?

TCP是一個“流”協(xié)議,所謂流兔甘,就是沒有邊界的一串?dāng)?shù)據(jù)谎碍。TCP底層不了解業(yè)務(wù)數(shù)據(jù)的含義,只是按照緩沖區(qū)的情況進(jìn)行包的劃分洞焙,那么業(yè)務(wù)上一個完整的數(shù)據(jù)包有可能被劃分成多個包發(fā)出蟆淀,也可能多個包被合并成一個數(shù)據(jù)包發(fā)出,這就是TCP的粘包和拆包問題澡匪。

如何解決粘包和拆包問題熔任?

TCP不知道數(shù)據(jù)包的業(yè)務(wù)含義,所以只能通過上層協(xié)議棧的設(shè)計來結(jié)局唁情,主流方案:

定長消息疑苔,消息長度是固定的,不夠的進(jìn)行補(bǔ)齊

特殊字符分隔甸鸟,如FTP協(xié)議在包尾添加換行符進(jìn)行分隔

將消息分為消息投和消息體惦费,消息頭中包含消息的總長,如前4個字節(jié)表示整個消息的長度(最靈活和常用的方案)

Netty對粘包和拆包問題的處理

Netty對解決粘包和拆包的方案做了抽象抢韭,提供了一些解碼器(Decoder)來解決粘包和拆包的問題薪贫。如:

LineBasedFrameDecoder:以行為單位進(jìn)行數(shù)據(jù)包的解碼

DelimiterBasedFrameDecoder:以特殊的符號作為分隔來進(jìn)行數(shù)據(jù)包的解碼

FixedLengthFrameDecoder:以固定長度進(jìn)行數(shù)據(jù)包的解碼

LenghtFieldBasedFrameDecode:適用于消息頭包含消息長度的協(xié)議(最常用)

所以對使用Netty進(jìn)行網(wǎng)絡(luò)讀寫的程序,可以直接使用這些Decoder來完成數(shù)據(jù)包的解碼刻恭。

由于業(yè)務(wù)程序的復(fù)雜性瞧省,可能協(xié)議也非常復(fù)雜。對于高并發(fā)吠各、大流量的系統(tǒng)來說臀突,每個數(shù)據(jù)包都不應(yīng)該傳輸多余的數(shù)據(jù)(所以補(bǔ)齊的方式肯定不可让阕ァ)贾漏,LenghtFieldBasedFrameDecode更適合這樣的場景。

LenghtFieldBasedFrameDecode提供了靈活的配置來支持業(yè)務(wù)消息的解碼:

實際生產(chǎn)環(huán)境中更多是采用自定義的協(xié)議藕筋,并且編寫自己的Decoder類(一般繼承LenghtFieldBasedFrameDecode)來完成業(yè)務(wù)包的解碼纵散。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伍掀,更是在濱河造成了極大的恐慌掰茶,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜜笤,死亡現(xiàn)場離奇詭異濒蒋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)把兔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門沪伙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人县好,你說我怎么就攤上這事围橡。” “怎么了缕贡?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵翁授,是天一觀的道長。 經(jīng)常有香客問我晾咪,道長收擦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任谍倦,我火速辦了婚禮炬守,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剂跟。我一直安慰自己减途,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布曹洽。 她就那樣靜靜地躺著鳍置,像睡著了一般。 火紅的嫁衣襯著肌膚如雪送淆。 梳的紋絲不亂的頭發(fā)上税产,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音偷崩,去河邊找鬼辟拷。 笑死,一個胖子當(dāng)著我的面吹牛阐斜,可吹牛的內(nèi)容都是我干的衫冻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼谒出,長吁一口氣:“原來是場噩夢啊……” “哼隅俘!你這毒婦竟也來了邻奠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤为居,失蹤者是張志新(化名)和其女友劉穎碌宴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒙畴,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贰镣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了膳凝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片八孝。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸠项,靈堂內(nèi)的尸體忽然破棺而出干跛,到底是詐尸還是另有隱情,我是刑警寧澤祟绊,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布楼入,位于F島的核電站,受9級特大地震影響牧抽,放射性物質(zhì)發(fā)生泄漏嘉熊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一扬舒、第九天 我趴在偏房一處隱蔽的房頂上張望阐肤。 院中可真熱鬧,春花似錦讲坎、人聲如沸孕惜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衫画。三九已至,卻和暖如春瓮栗,著一層夾襖步出監(jiān)牢的瞬間削罩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工费奸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弥激,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓愿阐,卻偏偏與公主長得像微服,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子换况,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容