精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你真的理解粘包與半包嗎?三分鐘搞懂它

開發(fā) 前端
只有等接收到全部包裹時(shí),這個(gè)東西(傳輸?shù)男畔?才完整,所以半包情況下無法解析出完整的數(shù)據(jù),需要等,等接收到全部包裹。

通俗的例子

這里先舉個(gè)可能不太恰當(dāng),但是很容易理解的例子。

比如,平時(shí)我們要寄快遞,如果東西太大的話,那么就需要拆成幾個(gè)包裹來郵寄。

收件人僅收到個(gè)別包裹的時(shí)候,東西是不完整的,對(duì)應(yīng)到網(wǎng)絡(luò)傳輸中,這種情況就叫半包。

只有等接收到全部包裹時(shí),這個(gè)東西(傳輸?shù)男畔?才完整,所以半包情況下無法解析出完整的數(shù)據(jù),需要等,等接收到全部包裹。

那么問題來了,如何知曉已經(jīng)收到全部包裹了呢?下文我們?cè)僮鞣治觥?/p>

再比如,快過年了,我打算給家里的親戚送點(diǎn)禮物,給每位長輩送個(gè)手表,我們都知道手表的體積不大,并且我家里人都住在一個(gè)村,所以把給各長輩的禮物打包在一個(gè)包裹里郵寄,這樣能節(jié)省運(yùn)費(fèi)。

這種把本應(yīng)該分多個(gè)包傳輸?shù)臄?shù)據(jù)合成一個(gè)包發(fā)送的情況,對(duì)應(yīng)到網(wǎng)絡(luò)傳輸中,就叫粘包。

看完這個(gè)例子之后,應(yīng)該對(duì)粘包與半包有點(diǎn)感覺了,接下來我們看下網(wǎng)絡(luò)中實(shí)際的情況。

實(shí)際情況

粘包與半包只有在 TCP 傳輸?shù)臅r(shí)候才會(huì)有,像 UDP 是不會(huì)有這種情況的,原因是因?yàn)?TCP 是面向流的,數(shù)據(jù)之間沒有界限的,而 UDP 是有的界限的。

如果熟悉 TCP 和 UDP 報(bào)文格式的同學(xué)肯定知道,TCP 的包沒有報(bào)文長度,而 UDP 的包有報(bào)文長度,這也說明了 TCP 為什么是流式。

所以我為什么說上面的例子不太恰當(dāng),因?yàn)楝F(xiàn)實(shí)生活中快遞的包裹之間其實(shí)是有界限的,TCP 則像流水,沒有明確的界限。

然后 TCP 有發(fā)送緩沖區(qū)的概念,UDP 實(shí)際上是沒這個(gè)概念。

假設(shè) TCP 一次傳輸?shù)臄?shù)據(jù)大小超過發(fā)送緩沖區(qū)大小,那么一個(gè)完整的報(bào)文就需要被拆分成兩個(gè)或更多的小報(bào)文,這可能會(huì)產(chǎn)生半包的情況,當(dāng)接收端收到不完整的數(shù)據(jù),是無法解析成功的。

如果 TCP 一次傳輸?shù)臄?shù)據(jù)大小小于發(fā)送緩沖區(qū),那么可能會(huì)跟別的報(bào)文合并起來一塊發(fā)送,這就是粘包。

此時(shí)接收端也無法正常解析報(bào)文,需要將其拆成多個(gè)正確的報(bào)文,才能正常解析。

關(guān)于粘包與半包,我還看到有拿 MTU (最大傳輸單元)說事的,如果發(fā)送的數(shù)據(jù)大于 MTU 那就會(huì)出現(xiàn)拆包,導(dǎo)致半包的情況。

我個(gè)人覺得這里有點(diǎn)不對(duì),簡單理解下,UDP 也是要遵循 MTU 的呀,對(duì)吧?那它咋不會(huì)發(fā)生半包呢?

我們接著來看如何解決粘包與半包。

那如何解決粘包與半包問題呢?

  • 粘包:這個(gè)思路其實(shí)很清晰,就是把它拆開唄,具體就是看怎么拆了,比如我們可以固定長度,我們規(guī)定每個(gè)包都是10個(gè)字節(jié),那么就10個(gè)字節(jié)切一刀,這樣拆開解析就 ok 了。
  • 半包:半包其實(shí)就是信息還不完整,我們需要等接收到全部的信息之后再作處理,當(dāng)我們識(shí)別這是一個(gè)不完整的包時(shí)候,我們先 hold 住,不作處理,等待數(shù)據(jù)完整再處理。這里關(guān)鍵點(diǎn)在于,我們?nèi)绾尾拍苤来藭r(shí)完整了?上面說的固定長度其實(shí)也是一點(diǎn),當(dāng)然還有更多更好的解決方案,我們接著往下看。

實(shí)際常見解決粘包與半包問題有三個(gè)方案:

  • 固定長度
  • 分隔符
  • 固定長度字段+內(nèi)容

為了說明方便,以下沒有按二進(jìn)制的位等單位來描述。

固定長度

這個(gè)其實(shí)很簡單,比如現(xiàn)在要傳輸 ABC、EF 這兩個(gè)包,如果不做處理接收端很可能收到的是 AB、CEF 或者 ABCE、F 等等。

這時(shí)候我們固定長度,我們規(guī)定每個(gè)報(bào)文長度都是 3,如果一個(gè)報(bào)文實(shí)際數(shù)據(jù)不足 3,那么就用空字符填充一下 。

所以我們發(fā)送的報(bào)文是 :

接收到的情況可能是:

但我們是按照 3 位來處理的,所以一次只會(huì)按照 3 位來解析,所以第一次雖然收到的數(shù)據(jù)是 ABCE,但我們就解析 3 位,即解析出 ABC,留著了個(gè) E,等我們要繼續(xù)解析 3 位的時(shí)候,發(fā)現(xiàn)長度不足 3,所以我們暫時(shí)先不管,先等等。

后面等到了 F“”,我們發(fā)現(xiàn)當(dāng)下數(shù)據(jù)又滿足 3 位了,所以我們接著解析 EF“” 。

這樣就解決了粘包與半包問題。

對(duì)應(yīng)到 Netty 中的實(shí)現(xiàn)就是 FixedLengthFrameDecoder,這個(gè)類來實(shí)現(xiàn)固定長度的解碼。

核心邏輯就是我上面說的,我們來看下源碼,很簡單:

固定長度的優(yōu)點(diǎn):簡單。

缺點(diǎn):固定長度很僵硬,不易于擴(kuò)展,且如果設(shè)置過大來滿足業(yè)務(wù)場(chǎng)景的話,會(huì)導(dǎo)致空間浪費(fèi),因?yàn)椴蛔汩L度的需要填充。

分隔符

這個(gè)應(yīng)該很好理解, 還是拿 ABC、EF 這兩個(gè)包舉例,我在寫完 ABC后,插入一個(gè)分號(hào),組成ABC;,EF 同理:

這樣以分隔符為界限來切分無界限的 TCP 流,來解決粘包與半包問題,這個(gè)應(yīng)該很好理解,既然你 TCP 沒界限,我業(yè)務(wù)上給你搞個(gè)界限。

對(duì)應(yīng)到 Netty 中的實(shí)現(xiàn)就是 DelimiterBasedFrameDecoder,具體源碼就不貼了,有點(diǎn)長,不過道理還是簡單的。

一直解析,等識(shí)別到分隔符之后,說明前面的數(shù)據(jù)完整了,于是解析前面的數(shù)據(jù),然后繼續(xù)往后掃描解析。

分隔符的優(yōu)點(diǎn):簡單,也不會(huì)浪費(fèi)空間。

缺點(diǎn):需要對(duì)內(nèi)容本身進(jìn)行處理,防止內(nèi)容內(nèi)出現(xiàn)分隔符,這樣就會(huì)導(dǎo)致錯(cuò)亂,所以需要掃描一遍傳輸?shù)臄?shù)據(jù)將其轉(zhuǎn)義,或者可以用 base64 編碼數(shù)據(jù),用 64 個(gè)之外的字符作為分隔符即可。

分隔符的處理方式在業(yè)界也是常用的,比如 Redis 就用換行符來分隔。

固定長度字段+內(nèi)容

這個(gè)也很好理解,比如協(xié)議規(guī)定固定 4 位存放內(nèi)容的長度,這樣內(nèi)容就可以伸縮:

還是拿 ABC、EF 這兩個(gè)包舉例:

解析流程是:先獲取 4 位,如果當(dāng)前收到的數(shù)據(jù)不夠 4 位,那就再等等,夠 4 位之后解析得到長度是 3,所以我再往后取 3 位,同樣數(shù)據(jù)如果不夠 3 位就再等等,夠了的話就解析,這樣就獲取一個(gè)完整的包了。

然后接著往后獲取 4 位,解析得到 2,同理根據(jù) 2 往后再取 2 位,解析得到 EF。

這種方式就是先解析固定長度的字段,獲得后面內(nèi)容的長度,根據(jù)內(nèi)容長度來獲取內(nèi)容,從而得到一個(gè)完整的報(bào)文。

對(duì)應(yīng)到 Netty 中的實(shí)現(xiàn)就是 LengthFieldBasedFrameDecoder,具體源碼就不貼了,有點(diǎn)長,

固定長度字段+內(nèi)容的優(yōu)點(diǎn):可以根據(jù)固定字段精準(zhǔn)定位,也不用掃描轉(zhuǎn)義字符。

缺點(diǎn):固定長度字段的設(shè)計(jì)比較困難,大了浪費(fèi)空間,畢竟每個(gè)報(bào)文都帶這個(gè)長度,小了可能不夠用。

總結(jié)

好了,我們總結(jié)一下。

因?yàn)?TCP 是面向流的協(xié)議,且利用緩沖區(qū)來提高發(fā)送的效率,所以會(huì)導(dǎo)致粘包/半包情況的發(fā)生。

對(duì)于這種情況,我們可以在報(bào)文上動(dòng)手腳,可以約定固定長度的報(bào)文,或埋入分隔符,或利用固定長度字段+內(nèi)容等常見的三種方式來解決粘包、半包的問題。

以上三種在 Netty 中都有現(xiàn)成實(shí)現(xiàn)類,可直接使用:

FixedLengthFrameDecoder,固定長度

DelimiterBasedFrameDecoder,分隔符

LengthFieldBasedFrameDecoder,定長度字段+內(nèi)容

建議實(shí)驗(yàn)一下,會(huì)有更清晰的認(rèn)識(shí)。

責(zé)任編輯:武曉燕 來源: yes的練級(jí)攻略
相關(guān)推薦

2024-01-16 07:46:14

FutureTask接口用法

2023-12-04 18:13:03

GPU編程

2024-01-12 07:38:38

AQS原理JUC

2024-07-05 09:31:37

2023-12-27 08:15:47

Java虛擬線程

2025-02-24 10:40:55

2023-01-31 08:24:55

HashMap死循環(huán)

2023-12-23 18:04:40

服務(wù)Eureka工具

2025-11-17 01:11:00

Callback異步編程函數(shù)

2024-05-16 11:13:16

Helm工具release

2024-12-18 10:24:59

代理技術(shù)JDK動(dòng)態(tài)代理

2009-11-09 12:55:43

WCF事務(wù)

2021-04-20 13:59:37

云計(jì)算

2022-02-17 09:24:11

TypeScript編程語言javaScrip

2024-08-30 08:50:00

2025-10-27 01:35:00

2020-06-30 10:45:28

Web開發(fā)工具

2013-06-28 14:30:26

棱鏡計(jì)劃棱鏡棱鏡監(jiān)控項(xiàng)目

2023-11-23 19:26:43

2021-12-17 07:47:37

IT風(fēng)險(xiǎn)框架
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本一二三区在线视频| 欧美激情精品久久| 91九色综合| 一区在线中文字幕| 91免费在线观看网站| 久热这里只有精品在线| 无码少妇一区二区三区| 欧美日韩精品高清| 国产美女永久无遮挡| 色视频精品视频在线观看| 青青草精品视频| 九九热r在线视频精品| 精品人妻伦一二三区久| 国产经典一区| 亚洲综合成人网| 日韩国产高清一区| 国产综合在线播放| 久久人人精品| 色综合男人天堂| 免费视频91蜜桃| 精品久久亚洲| 在线观看日产精品| 欧美日韩不卡在线视频| 永久免费av在线| 99视频国产精品| 亚洲影院色无极综合| 亚洲成熟少妇视频在线观看| 欧美99久久| 这里只有精品视频| 中文字幕一区二区人妻在线不卡| 精品一区二区三区中文字幕视频| 欧美性高清videossexo| 亚洲熟妇av日韩熟妇在线| 国产剧情在线| 亚洲欧洲无码一区二区三区| 日韩欧美一区二区三区久久婷婷| 好吊色在线观看| 久久99国产精品免费| 国产成人在线播放| 成人毛片18女人毛片| 欧美不卡在线| 久久久国产精品视频| 69xxx免费| 狠狠综合久久av一区二区蜜桃| 亚洲成人性视频| 特种兵之深入敌后| 亚洲欧洲专区| 欧美体内she精视频| 青青在线视频免费| 超级碰碰久久| 精品美女永久免费视频| 欧美久久久久久久久久久久久久| yellow91字幕网在线| 中文字幕一区在线观看视频| 日韩精品一区二区三区外面| 九九在线视频| 久久婷婷成人综合色| 蜜桃视频在线观看成人| 天天射天天色天天干| gogo大胆日本视频一区| 国产一区二区在线网站| 人妻少妇精品无码专区| av中文字幕在线不卡| 国产伦精品一区二区三区在线| 亚洲国产精品视频在线| 国产精品一区二区三区网站| 91视频最新| 国模人体一区二区| 99国产麻豆精品| 蜜桃精品久久久久久久免费影院| 日本福利在线观看| 久久青草国产手机看片福利盒子 | 粉嫩91精品久久久久久久99蜜桃| 欧美视频13p| 男人操女人免费| 国精产品一区一区三区四川| 欧美午夜电影在线播放| 中文字幕亚洲欧洲| 精品亚洲a∨一区二区三区18| 日韩视频123| 久久久久久久穴| 日本成人a网站| 国产亚洲精品久久久久久777| 我不卡一区二区| 91精品国产91久久综合| 欧美激情视频网| 欧美亚洲精品天堂| 蜜桃91丨九色丨蝌蚪91桃色| 91精品入口蜜桃| 午夜激情在线视频| 国产精品你懂的在线| 一级黄色录像免费看| heyzo高清国产精品| 色综合久久99| 伊人精品视频在线观看| 久久97久久97精品免视看秋霞| 亚洲精美色品网站| 亚洲色图欧美色| 欧美久久九九| 日本视频久久久| 国产精品久久久久久久免费看| 成人永久免费视频| 久久综合毛片| 超碰电影在线播放| 日本高清不卡aⅴ免费网站| 色网站在线视频| 在线看成人短视频| 精品少妇v888av| 亚洲av无码乱码国产精品fc2| 国产精品亚洲午夜一区二区三区| 免费亚洲精品视频| av大大超碰在线| 日本乱码高清不卡字幕| 在线观看一区二区三区视频| 精品国产精品| 国模极品一区二区三区| 亚洲一区综合| 蜜臀视频在线观看| 国产精品美女久久久久久不卡| 久久天天躁日日躁| 69视频免费看| 成人av午夜影院| 中文字幕一区二区三区四区五区| 在线观看v片| 欧美一区二区免费| 亚洲一级黄色录像| 国产精品日本| 国产成人女人毛片视频在线| 337p日本欧洲亚洲大胆鲁鲁| 天涯成人国产亚洲精品一区av| 中文字幕资源在线观看| 妖精视频一区二区三区| 久久噜噜噜精品国产亚洲综合| 一级黄色片网站| 久久久精品免费观看| 激情深爱综合网| 日韩精品一区二区三区中文在线| 日日噜噜噜夜夜爽亚洲精品| 黄色av网站免费| 久久亚洲捆绑美女| 男女高潮又爽又黄又无遮挡| 国产精品宾馆| 欧美肥老妇视频| 国产熟女一区二区三区四区| 中文字幕在线不卡一区| 777视频在线| 日韩国产专区| 国产精品久久久久久久一区探花 | 麻豆精品视频在线观看免费 | 波多野结衣在线观看一区二区三区| 97高清免费视频| 韩国av永久免费| 亚洲成在人线免费| 人妻av一区二区| 亚洲成人资源| 精品一区二区三区视频日产| heyzo高清在线| 亚洲黄页网在线观看| 日本系列第一页| av在线一区二区三区| 欧美爱爱视频免费看| 红杏一区二区三区| 26uuu亚洲国产精品| 欧洲天堂在线观看| 一本色道亚洲精品aⅴ| av女人的天堂| 捆绑调教一区二区三区| 一区二区三区四区久久| 美女日韩一区| 国语自产在线不卡| 男人天堂亚洲二区| 欧美视频自拍偷拍| 二区三区四区视频| 国产jizzjizz一区二区| 欧美一级视频免费看| 亚洲裸色大胆大尺寸艺术写真| 国产成人精品久久二区二区91| av影片在线看| 91精品免费在线| 日韩免费一二三区| 久久久影院官网| 99热手机在线| 欧美激情 亚洲a∨综合| 国产精品一区二区三区四区五区| 精精国产xxxx视频在线野外| 亚洲欧美综合区自拍另类| 一区二区www| 亚洲一二三四区| 色欲av无码一区二区三区| 美女看a上一区| 日本大片免费看| 国产区精品区| 97av自拍| 综合在线影院| 欧美乱妇高清无乱码| 午夜福利一区二区三区| 欧美军同video69gay| 国产成人精品a视频一区| 欧美激情综合五月色丁香 | 日韩护士脚交太爽了| 欧美极品美女视频网站在线观看免费| 飘雪影院手机免费高清版在线观看| 欧美精三区欧美精三区| 五月天激情国产综合婷婷婷| 亚洲欧美国产77777| 性欧美13一14内谢| 国产乱一区二区| 国产福利一区视频| 欧美日韩一区自拍| 亚洲成色www久久网站| 麻豆成人入口| 国产自摸综合网| 中文字幕在线高清| 九色91av视频| 亚洲成人三级| 亚洲欧美一区二区三区在线| 国产熟女一区二区三区五月婷| 色94色欧美sute亚洲13| 精品在线视频免费| 一区二区在线观看视频| 精品国产aaa| 久久无码av三级| 成人在线电影网站| 国产美女在线精品| 在线观看国产一级片| 久久精品91| 可以在线看的av网站| 欧美在线高清| 影音欧美亚洲| 精品视频免费| 免费精品视频一区| 日韩大片在线免费观看| 国产成人精品日本亚洲11 | 一区二区三区导航| 成年人看的毛片| 欧美成人一区二免费视频软件| 亚洲视频小说| 日韩免费高清| 色综合久久av| 精品午夜久久| 色噜噜狠狠色综合网| 国产精品亚洲二区| 蜜桃狠狠色伊人亚洲综合网站| 国产亚洲成av人片在线观黄桃| 91精品久久香蕉国产线看观看| 精品国模一区二区三区欧美| 成人欧美一区二区三区黑人孕妇| 国产情侣一区二区三区| 国产精品你懂得| 免费高清视频在线一区| 国产精品av电影| 影视一区二区三区| 国产精品成人aaaaa网站| 99欧美精品| 国产精品电影一区| 国产精品无码久久久久| 国产精品久久久久久久午夜| 福利精品在线| 国产精品人人做人人爽| 欧美亚洲综合视频| 成人午夜黄色影院| 香蕉免费一区二区三区在线观看| 91网站免费观看| 在线精品自拍| 好吊妞www.84com只有这里才有精品 | 精品国产一区二区三区| 日韩久久精品一区二区三区| 第一sis亚洲原创| 国产精品av免费| 国语自产精品视频在线看8查询8| 免费人成自慰网站| 最新日韩av| 黄色免费网址大全| 国产在线观看一区二区| 精品伦一区二区三区| 99久久精品国产观看| a级在线免费观看| 亚洲欧美在线视频| 久久综合综合久久| 日韩欧美主播在线| 一级黄色大片网站| 亚洲国产精久久久久久 | 综合久久成人| 蜜桃狠狠色伊人亚洲综合网站| 久久激情电影| 妞干网视频在线观看| 午夜在线一区二区| 亚洲小视频网站| 9l国产精品久久久久麻豆| b站大片免费直播| 亚洲色图都市小说| 亚洲欧美在线观看视频| 欧美亚洲高清一区| www.久久久久久久久久| 亚洲老司机av| av在线免费网站| 欧美亚洲激情在线| 国产美女精品视频免费播放软件| 国产精品推荐精品| 日本一区二区免费高清| 日本精品久久久久久久久久| 日韩av一区二区三区四区| 黑人无套内谢中国美女| 中文av一区特黄| 日韩欧美不卡视频| 欧美精品v国产精品v日韩精品| 性感美女福利视频| 欧美成人精品不卡视频在线观看| 成人免费看黄| 不卡视频一区| 成人毛片免费看| 黄色网页免费在线观看| 国产一区91精品张津瑜| 国产精品成人无码免费| 亚洲第一主播视频| 国产精品久久久久久免费播放| 国产午夜精品理论片a级探花| 在线不卡日本v二区707| 国产精品无av码在线观看| 亚洲精品动态| 久久久性生活视频| 国产麻豆精品一区二区| 麻豆视频免费在线播放| 色成年激情久久综合| 爽爽视频在线观看| 久久精品中文字幕免费mv| 青青热久免费精品视频在线18| 欧美高清性xxxxhdvideosex| 亚洲成人原创| 99免费观看视频| 一区二区三区中文在线| 国产又粗又猛又爽| 中文字幕亚洲综合久久筱田步美| 毛片免费看不卡网站| 好看的日韩精品| 国产精品第十页| av电影中文字幕| 亚洲男帅同性gay1069| 国产精品久久久久久久一区二区| 中文字幕欧美精品在线| 欧美xnxx| 日韩在线电影一区| 老牛嫩草一区二区三区日本| 欧美色图亚洲激情| 欧美日韩国产一区在线| 婷婷五月综合激情| 97人洗澡人人免费公开视频碰碰碰| 亚洲欧美日本国产| 欧美另类videosbestsex日本| 韩国v欧美v日本v亚洲v| 亚洲少妇xxx| 在线播放91灌醉迷j高跟美女| 免费大片黄在线观看视频网站| 国产日韩在线观看av| 99久久精品费精品国产| 91精品999| 亚洲日本韩国一区| www.中文字幕| 国色天香2019中文字幕在线观看| 国产精品nxnn| aⅴ在线免费观看| 久久久久久日产精品| 做爰无遮挡三级| 久久久精品久久| 超碰97久久| 国产91在线视频观看| 国产夜色精品一区二区av| 久草视频在线免费| xxx欧美精品| 婷婷综合国产| 欧美成人xxxxx| 亚洲国产激情av| 国产美女三级无套内谢| 久久久久久久电影一区| 久久综合五月婷婷| 无码人妻精品一区二区三区66| 国产精品电影一区二区| 精品欧美一区二区精品少妇| 97视频在线观看视频免费视频| 一本色道久久综合狠狠躁的番外| 久久99爱视频| 亚洲精品国产无天堂网2021 | 国产成人亚洲精品狼色在线| 久久亚洲成人av| 亚洲少妇中文在线| 成人亚洲精品| 91好吊色国产欧美日韩在线| 国产日产欧美一区| 99国产在线播放| 日本久久久a级免费| 午夜国产一区二区| 精品国产av色一区二区深夜久久 | 精品亚洲免a| 色噜噜狠狠永久免费| 亚洲高清一区二区三区| 9色在线视频网站| 国产亚洲自拍偷拍| 麻豆成人在线观看| 日韩成人免费观看| 不卡伊人av在线播放|