Socket/TCP粘包、斷包

TCP(transport control protocol茸歧,傳輸控制協(xié)議)是面向連接的倦炒,面向流的,提供高可靠性服務(wù)软瞎。收發(fā)兩端(客戶端和服務(wù)器端)都要有一一成對的socket逢唤,因此,發(fā)送端為了將多個(gè)發(fā)往接收端的包涤浇,更有效的發(fā)到對方鳖藕,使用了優(yōu)化方法(Nagle算法),將多次間隔較小且數(shù)據(jù)量小的數(shù)據(jù)只锭,合并成一個(gè)大的數(shù)據(jù)塊著恩,然后進(jìn)行封包。這樣蜻展,接收端页滚,就難于分辨出來了,必須提供科學(xué)的拆包機(jī)制铺呵。即面向流的通信是無消息保護(hù)邊界的裹驰。

UDP(user datagram protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是無連接的片挂,面向消息的幻林,提供高效率服務(wù)。不會(huì)使用塊的合并優(yōu)化算法音念, 由于UDP支持的是一對多的模式沪饺,所以接收端的skbuff(套接字緩沖區(qū))采用了鏈?zhǔn)浇Y(jié)構(gòu)來記錄每一個(gè)到達(dá)的UDP包,在每個(gè)UDP包中就有了消息頭(消息來源地址闷愤,端口等信息)整葡,這樣,對于接收端來說讥脐,就容易進(jìn)行區(qū)分處理了遭居。即面向消息的通信是有消息保護(hù)邊界的啼器。

由于TCP無消息保護(hù)邊界, 需要在消息接收端處理消息邊界問題。

粘包的原因

發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去俱萍,造成粘包

接收方不及時(shí)接收緩沖區(qū)的包端壳,造成多個(gè)包接收

斷包的原因

以太網(wǎng)中存在一個(gè)對于幀的有效數(shù)據(jù)大小的限制,即MTU枪蘑,以太網(wǎng)的MTU為1500字節(jié)损谦。所謂斷包就是說發(fā)送端一次發(fā)送的消息長度過大,如果超過了MTU岳颇,那么ip會(huì)對其進(jìn)行分片照捡,導(dǎo)致接收端接收到消息后,無法確定是否是一個(gè)完整的消息话侧。

粘包/斷包的解決思路

粘包/斷包問題的最本質(zhì)原因在與接收對等方無法分辨消息與消息之間的邊界在哪麻敌。

通過使用某種方案給出邊界,例如:

發(fā)送定長包掂摔。如果每個(gè)消息的大小都是一樣的,那么在接收對等方只要累計(jì)接收數(shù)據(jù)赢赊,直到數(shù)據(jù)等于一個(gè)定長的數(shù)值就將它作為一個(gè)消息乙漓;

包尾加上\r\n標(biāo)記。FTP協(xié)議正是這么做的释移。但問題在于如果數(shù)據(jù)正文中也含有\(zhòng)r\n叭披,則會(huì)誤判為消息的邊界;

包頭加上包體長度玩讳。包頭是定長的4個(gè)字節(jié)涩蜘,說明了包體的長度。接收對等方先接收包體長度熏纯,依據(jù)包體長度來接收包體同诫;

使用更加復(fù)雜的應(yīng)用層協(xié)議。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末樟澜,一起剝皮案震驚了整個(gè)濱河市误窖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秩贰,老刑警劉巖霹俺,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毒费,居然都是意外死亡丙唧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門觅玻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來想际,“玉大人培漏,你說我怎么就攤上這事≌恿穑” “怎么了北苟?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長打瘪。 經(jīng)常有香客問我友鼻,道長,這世上最難降的妖魔是什么闺骚? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任彩扔,我火速辦了婚禮,結(jié)果婚禮上僻爽,老公的妹妹穿的比我還像新娘虫碉。我一直安慰自己,他們只是感情好胸梆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布敦捧。 她就那樣靜靜地躺著,像睡著了一般碰镜。 火紅的嫁衣襯著肌膚如雪兢卵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天绪颖,我揣著相機(jī)與錄音秽荤,去河邊找鬼。 笑死柠横,一個(gè)胖子當(dāng)著我的面吹牛窃款,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牍氛,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晨继,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搬俊?” 一聲冷哼從身側(cè)響起踱稍,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悠抹,沒想到半個(gè)月后珠月,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡楔敌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年啤挎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庆聘,死狀恐怖胜臊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伙判,我是刑警寧澤象对,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站宴抚,受9級特大地震影響勒魔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜菇曲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一冠绢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧常潮,春花似錦弟胀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岔留,卻和暖如春夏哭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贸诚。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厕吉,地道東北人酱固。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像头朱,于是被迫代替她去往敵國和親运悲。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

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