精品欧美一区二区三区在线观看 _久久久久国色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)

国产精品99在线观看| 91精品店在线| 久久男人中文字幕资源站| 国产精品视频一区国模私拍| 小早川怜子一区二区的演员表| 久久天堂久久| 色综合久久久久久久久久久| 中文字幕一区二区三区有限公司 | 黄色a级片在线观看| 2023国产精华国产精品| 欧美午夜片在线观看| 日韩一级片免费视频| av网站在线免费观看| 国产99精品在线观看| 国产成人精品免高潮在线观看| 精品一区在线观看视频| 精品国产美女| 亚洲国产成人精品久久| 加勒比av中文字幕| 二区三区不卡| 亚洲mv大片欧洲mv大片精品| 在线观看日韩片| 国产天堂在线| av成人免费在线观看| 91视频国产一区| 免费一级a毛片| 亚洲少妇一区| 欧美激情videoshd| 亚洲怡红院在线观看| 精品影片在线观看的网站| 欧美成人r级一区二区三区| 亚洲欧美日韩一级| 久久久一本精品| 黄色成人av在线| 日本a在线天堂| 成人高清免费在线| 国产欧美日韩综合精品一区二区| 国产一区二区高清视频| 性一交一乱一精一晶| 精品无人码麻豆乱码1区2区 | 爱福利视频一区| 国产熟女一区二区| 国产一区二区电影在线观看| 亚洲精品91美女久久久久久久| 亚洲av无一区二区三区久久| 欧洲精品久久久久毛片完整版| 色综合久久久久久久| 欧美日韩亚洲一| 末成年女av片一区二区下载| 亚洲韩国精品一区| 国产免费黄色一级片| 牛牛在线精品视频| 一区二区三区精密机械公司| 亚洲av首页在线| av免费在线免费观看| 亚洲精品伦理在线| 国产一区二区三区在线免费| 18视频在线观看| 艳妇臀荡乳欲伦亚洲一区| avav在线播放| 超碰在线99| 好吊成人免视频| 国产男女在线观看| 成人交换视频| 欧美一区二区三区公司| 乱码一区二区三区| 老司机成人在线| 日韩大片在线观看视频| 30一40一50老女人毛片| 精品日本12videosex| 色爱av美腿丝袜综合粉嫩av| 成人免费黄色小视频| 在线欧美不卡| 国产999在线观看| 亚洲手机在线观看| 国产剧情一区二区三区| 国产乱码精品一区二区三区不卡| 天天操天天操天天| 日本一区二区高清| 99热一区二区三区| 麻豆国产在线| 欧美色精品在线视频| 国产老头和老头xxxx×| 亚洲三级性片| 日韩色av导航| 日本五十熟hd丰满| 日韩av不卡在线观看| 91在线视频一区| 亚洲 另类 春色 国产| 欧美高清在线精品一区| 欧洲精品在线播放| 国产精品久久久久av电视剧| 欧美一区二区日韩| 黄色正能量网站| 在线国产一区二区| 欧美一级在线亚洲天堂| 国产一区二区在线视频聊天| av中文字幕在线不卡| 亚洲欧美日韩精品在线| 超碰高清在线| 欧美一级午夜免费电影| 男人操女人动态图| 欧美天堂亚洲电影院在线观看| 国产成人精品在线播放| 亚洲高清视频网站| 国产精品看片你懂得| 久久亚洲中文字幕无码| 宅男噜噜噜66国产精品免费| 亚洲美女在线看| 免费一级a毛片夜夜看| 男女男精品视频网| 久久久久高清| www.8ⅹ8ⅹ羞羞漫画在线看| 欧美人妇做爰xxxⅹ性高电影| 星空大象在线观看免费播放| 香蕉久久网站| 国产精品福利小视频| 天天操天天干天天干| 亚洲女厕所小便bbb| 亚洲福利精品视频| 五月激激激综合网色播| 久久久久久国产精品久久| 97超视频在线观看| 欧美激情一区二区三区蜜桃视频| av免费观看网| 精品三级av在线导航| 欧美高清视频免费观看| 国产精品自产拍| 国产精品久久毛片a| 妺妺窝人体色www在线观看| 人人精品亚洲| 97国产精品视频人人做人人爱| 精品国产亚洲AV| 亚洲欧美视频在线观看视频| 亚洲视频一二三四| 日韩伦理一区| 国产精品一区二区三区成人| 成a人v在线播放| 欧洲亚洲国产日韩| 手机看片福利视频| 日韩精品91亚洲二区在线观看| 精品一区二区三区日本| 免费一二一二在线视频| 亚洲精品午夜精品| 中文字幕一区二区人妻电影| 久久综合久久99| 中文字幕乱码人妻综合二区三区| 日韩最新在线| 日韩av手机在线| 国产香蕉在线| 欧美日韩日本视频| 在线观看亚洲网站| 国产精品夜夜嗨| 美女av免费观看| 成人精品毛片| 97不卡在线视频| 可以在线观看的黄色| 色欧美88888久久久久久影院| 波多野结衣福利| 日韩高清一区二区| 亚洲高清资源综合久久精品| 青青伊人久久| 久久视频精品在线| 性一交一乱一色一视频麻豆| 亚洲成人免费看| 国产伦精品一区二区三区妓女| 99精品免费视频| 日本不卡一区二区三区视频| 日韩毛片一区| 欧美巨大黑人极品精男| 日韩中文字幕观看| 日本黄色一区二区| 麻豆网址在线观看| 成人性生交大片免费看中文 | 亚洲毛片在线观看.| 国语对白做受69按摩| 亚洲欧美成aⅴ人在线观看| www日本在线观看| 先锋a资源在线看亚洲| 亚洲欧美日韩国产yyy| 2020国产精品极品色在线观看| 欧美亚洲激情在线| 欧美三级理伦电影| 亚洲国产欧美一区二区三区同亚洲| 99精品在线播放| ...xxx性欧美| 少妇精品一区二区| 久草这里只有精品视频| 日日摸日日碰夜夜爽无码| 国产一区二区精品久| 亚洲在线免费观看| 成人免费看黄| 欧美黄色片免费观看| 国产youjizz在线| 日韩免费看网站| 久草热在线观看| 亚洲一区二区三区在线看| www.99热| 成人精品国产福利| 999这里有精品| 欧美中文字幕| 中文精品无码中文字幕无码专区| 少妇一区二区视频| 国产精品手机在线| av国产精品| 国产成人jvid在线播放| 青青在线视频| 日韩在线观看免费高清完整版| 欧美一级性视频| 91精品久久久久久久91蜜桃| 国产免费一区二区三区四区五区| 一区二区三区日本| 99热这里只有精品4| 久久久高清一区二区三区| 97精品人妻一区二区三区蜜桃| 久久国产日韩欧美精品| 337p粉嫩大胆噜噜噜鲁| 欧美一区久久| 欧美日韩亚洲国产成人| 欧美日韩高清| 欧美日韩一区二区三区免费| 高清精品xnxxcom| 亚洲影视九九影院在线观看| yiren22亚洲综合| 日本免费久久高清视频| 性欧美18xxxhd| 91精品国产高清久久久久久久久| 羞羞网站在线免费观看| 久久国产色av| 日韩精品黄色| 日韩一区二区久久久| 国产大学生校花援交在线播放| 精品视频偷偷看在线观看| 天天爱天天干天天操| 亚洲国产精品99| 欧美一级性视频| 亚洲第一国产精品| 高h调教冰块play男男双性文| 欧美一区二区三区小说| 国产区精品在线| 91精品国产aⅴ一区二区| 国产精品九九九九| 337p亚洲精品色噜噜| 88av在线视频| 欧美一区二区三区小说| 午夜精品在线播放| 精品91自产拍在线观看一区| 黄频网站在线观看| 亚洲国产精品久久精品怡红院| 秋霞视频一区二区| 日韩精品在线观| 九色视频在线观看免费播放| 国产一区二区三区日韩欧美| 成人18在线| 北条麻妃99精品青青久久| 亚洲资源一区| 国内偷自视频区视频综合| а√天堂资源官网在线资源| 欧美一性一乱一交一视频| 欧美xxxxxx| 国产欧美日韩丝袜精品一区| 91麻豆精品国产综合久久久| 97视频中文字幕| 韩国女主播一区二区三区| 欧美精品一区二区三区四区五区| 国产一卡不卡| 51xx午夜影福利| 中文亚洲免费| 久久国产精品国产精品| 国内精品视频666| 精品久久久久一区二区| 91色.com| 国产探花在线视频| 亚洲综合精品久久| www.久久精品视频| 欧美一区二区三区思思人| 全部免费毛片在线播放一个| 亚洲日本aⅴ片在线观看香蕉| 夜级特黄日本大片_在线| 美女国内精品自产拍在线播放| а√在线中文在线新版| 国产精品成人一区二区| 精品一区二区三区亚洲| 免费99视频| 一区二区国产在线| 黄在线观看网站| 国产一区二区在线电影| 蜜桃传媒一区二区亚洲av| 中文字幕免费一区| xxxx 国产| 欧美视频你懂的| 成人久久精品人妻一区二区三区| 亚洲免费视频在线观看| av免费在线观| 国产精品高潮在线| 久久亚洲黄色| 一区精品在线| 国产精品综合色区在线观看| 狠狠操狠狠干视频| 久久女同性恋中文字幕| 久久aⅴ国产紧身牛仔裤| 精品一区久久久久久| 日本欧美国产| 亚洲 欧美 日韩 国产综合 在线| 美女一区二区视频| 朝桐光av一区二区三区| 成人免费视频在线观看| 视频一区二区三区四区五区| 日韩亚洲欧美成人一区| 国产中文字幕在线视频| 国内精品久久久久久久| 91麻豆精品| 亚洲激情一区二区| 亚洲主播在线| 国产免费a级片| 最好看的中文字幕久久| 中文字幕在线天堂| 日韩精品在线影院| 成人福利电影| 999视频在线观看| 婷婷成人基地| 久热精品在线播放| 久久久精品2019中文字幕之3| 久久精品无码人妻| 波多野结衣一二区| 亚洲男女性事视频| 忘忧草在线影院两性视频| 国产经品一区二区| 最新国产精品| 一级黄色特级片| 国产精品你懂的在线| 中文字幕一区二区三区人妻四季 | 神马久久久久久久久久| 欧美日韩国产va另类| 国产亚洲观看| 美女在线免费视频| 国产一区二区三区观看| 久久99久久99精品免费看小说| 欧美三级电影网站| 国产一级在线| 国产精品成人播放| 欧美猛男同性videos| 草草草在线视频| 久久久久久免费网| 国产熟妇一区二区三区四区| 亚洲欧洲xxxx| 影视一区二区三区| 色综合电影网| 麻豆精品视频在线| 久久国产高清视频| 日韩一区二区免费视频| 超碰在线最新| 国产精品播放| 亚洲深夜福利| 最新中文字幕av| 欧美日韩免费观看一区二区三区| 日本a级在线| 91原创国产| 亚洲美女一区| caopeng视频| 91精品欧美一区二区三区综合在| 天堂av最新在线| 九九久久99| 日韩激情av在线| 中文字幕观看av| 精品国产1区2区3区| 日本在线啊啊| 亚洲一区3d动漫同人无遮挡| 国产乱码精品1区2区3区| 久久精品这里有| 亚洲网站在线观看| 国产精品美女久久久久人| www.在线观看av| 久久久99精品久久| 国产精品国产三级国产普通话对白| 欧美激情综合色| 国产一区二区亚洲| 特级西西444www| 香蕉影视欧美成人| 都市激情一区| 亚洲综合精品一区二区| 亚洲国产二区| 日本爱爱爱视频| 欧美电影精品一区二区| 男人最爱成人网| 糖心vlog在线免费观看| 91在线视频官网| 97人妻人人澡人人爽人人精品| 久久噜噜噜精品国产亚洲综合| 久久99国产精品视频| 成人高清在线观看视频| 欧美性高潮在线| 欧美极品少妇videossex| 欧美性色黄大片人与善| 国产精品一卡二卡在线观看| 99re这里只有精品在线| 九九热视频这里只有精品| blacked蜜桃精品一区| 亚洲精品乱码久久久久久蜜桃欧美| 欧美亚洲一区二区三区四区|