計(jì)算機(jī)網(wǎng)絡(luò)之 基礎(chǔ)知識(shí)點(diǎn) tcp長(zhǎng)連接心跳包機(jī)制

轉(zhuǎn)載自 https://blog.csdn.net/alpha_love/article/details/77202857 如有侵權(quán) 聯(lián)系刪除

當(dāng)網(wǎng)絡(luò)通信時(shí)采用TCP協(xié)議時(shí),在真正的讀寫操作之前,server與client之間必須建立一個(gè)連接几于,當(dāng)讀寫操作完成后灸芳,雙方不再需要這個(gè)連接時(shí)它們可以釋放這個(gè)連接痹仙,連接的建立是需要三次握手的,而釋放則需要4次握手惊奇,所以說(shuō)每個(gè)連接的建立都是需要資源消耗和時(shí)間消耗的

經(jīng)典的三次握手示意圖:


三次握手

經(jīng)典的四次握手關(guān)閉圖:


四次揮手
一荆几、長(zhǎng)連接與短連接

長(zhǎng)連接: 指在一個(gè)TCP連接上可以連續(xù)發(fā)送多個(gè)數(shù)據(jù)包,
在TCP連接保持期間赊时,如果沒(méi)有數(shù)據(jù)包發(fā)送吨铸,需要雙方發(fā)檢測(cè)包以維持此連接;
一般需要自己做在線維持。
短連接: 指通信雙方有數(shù)據(jù)交互時(shí)祖秒,就建立一個(gè)TCP連接诞吱,數(shù)據(jù)發(fā)送完成后,則斷開(kāi)此TCP連接;
一般銀行都使用短連接竭缝。
它的優(yōu)點(diǎn)是:管理起來(lái)比較簡(jiǎn)單房维,存在的連接都是有用的連接,不需要額外的控制手段

比如http的抬纸,只是連接咙俩、請(qǐng)求、關(guān)閉湿故,過(guò)程時(shí)間較短,服務(wù)器若是一段時(shí)間內(nèi)沒(méi)有收到請(qǐng)求即可關(guān)閉連接阿趁。
其實(shí)長(zhǎng)連接是相對(duì)于通常的短連接而說(shuō)的,也就是長(zhǎng)時(shí)間保持客戶端與服務(wù)端的連接狀態(tài)坛猪。

長(zhǎng)連接與短連接的操作過(guò)程
通常的短連接操作步驟是:

連接→數(shù)據(jù)傳輸→關(guān)閉連接脖阵;

而長(zhǎng)連接通常就是:

連接→數(shù)據(jù)傳輸→保持連接(心跳)→數(shù)據(jù)傳輸→保持連接(心跳)→……→關(guān)閉連接; 

這就要求長(zhǎng)連接在沒(méi)有數(shù)據(jù)通信時(shí)墅茉,定時(shí)發(fā)送數(shù)據(jù)包(心跳)命黔,以維持連接狀態(tài)呜呐,
短連接在沒(méi)有數(shù)據(jù)傳輸時(shí)直接關(guān)閉就行了

什么時(shí)候用長(zhǎng)連接,短連接悍募?

長(zhǎng)連接多用于操作頻繁蘑辑,點(diǎn)對(duì)點(diǎn)的通訊,而且連接數(shù)不能太多情況坠宴。
每個(gè)TCP連接都需要三步握手以躯,這需要時(shí)間,如果每個(gè)操作都是先連接啄踊,再操作的話那么處理速度會(huì)降低很多忧设,
所以每個(gè)操作完后都不斷開(kāi),下次次處理時(shí)直接發(fā)送數(shù)據(jù)包就OK了颠通,不用建立TCP連接址晕。

例如:數(shù)據(jù)庫(kù)的連接用長(zhǎng)連接,
如果用短連接頻繁的通信會(huì)造成socket錯(cuò)誤顿锰,而且頻繁的socket 創(chuàng)建也是對(duì)資源的浪費(fèi)谨垃。

二、發(fā)送接收方式

1硼控、異步
報(bào)文發(fā)送和接收是分開(kāi)的刘陶,相互獨(dú)立的,互不影響牢撼。這種方式又分兩種情況:
(1)異步雙工:接收和發(fā)送在同一個(gè)程序中匙隔,由兩個(gè)不同的子進(jìn)程分別負(fù)責(zé)發(fā)送和接收
(2)異步單工:接收和發(fā)送是用兩個(gè)不同的程序來(lái)完成。

2熏版、同步
報(bào)文發(fā)送和接收是同步進(jìn)行纷责,既報(bào)文發(fā)送后等待接收返回報(bào)文。
同步方式一般需要考慮超時(shí)問(wèn)題撼短,即報(bào)文發(fā)出去后不能無(wú)限等待再膳,需要設(shè)定超時(shí)時(shí)間,
超過(guò)該時(shí)間發(fā)送方不再等待讀返回報(bào)文曲横,直接通知超時(shí)返回喂柒。

在長(zhǎng)連接中一般是沒(méi)有條件能夠判斷讀寫什么時(shí)候結(jié)束,所以必須要加長(zhǎng)度報(bào)文頭禾嫉。
讀函數(shù)先是讀取報(bào)文頭的長(zhǎng)度灾杰,再根據(jù)這個(gè)長(zhǎng)度去讀相應(yīng)長(zhǎng)度的報(bào)文。

三. 單工夭织、半雙工和全雙工

根據(jù)通信雙方的分工和信號(hào)傳輸方向可將通信分為三種方式:
單工吭露、半雙工吠撮、全雙工尊惰。

在計(jì)算機(jī)網(wǎng)絡(luò)中主要采用雙工方式讲竿,其中:
局域網(wǎng)采用半雙工方式,
城域網(wǎng)和廣域網(wǎng)采用全雙工方式弄屡。

  1. 單工(Simplex)方式:
    通信雙方設(shè)備中發(fā)送器與接收器分工明確题禀,只能在由發(fā)送器向接收器的單一固定方向上傳送數(shù)據(jù)。
    采用單工通信的典型發(fā)送設(shè)備如早期計(jì)算機(jī)的讀卡器膀捷,典型的接收設(shè)備如打印機(jī)迈嘹。

  2. 半雙工(Half Duplex)方式:
    通信雙方設(shè)備既是發(fā)送器,也是接收器全庸,兩臺(tái)設(shè)備可以相互傳送數(shù)據(jù)秀仲,但某一時(shí)刻則只能向一個(gè)方向傳送數(shù)據(jù)。
    例如壶笼,步話機(jī)是半雙工設(shè)備神僵,因?yàn)樵谝粋€(gè)時(shí)刻只能有一方說(shuō)話上陕。

  3. 全雙工(Full Duplex)方式:
    通信雙方設(shè)備既是發(fā)送器常潮,也是接收器,兩臺(tái)設(shè)備可以同時(shí)在兩個(gè)方向上傳送數(shù)據(jù)甩挫。
    例如责语,電話是全雙工設(shè)備炮障,因?yàn)殡p方可同時(shí)說(shuō)話。

而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接坤候,因?yàn)殚L(zhǎng)連接對(duì)于服務(wù)端來(lái)說(shuō)會(huì)耗費(fèi)一定的資源胁赢,
而像WEB網(wǎng)站這么頻繁的成千上萬(wàn)甚至上億客戶端的連接用短連接會(huì)更省一些資源,
如果用長(zhǎng)連接白筹,而且同時(shí)有成千上萬(wàn)的用戶徘键,如果每個(gè)用戶都占用一個(gè)連接的話,那可想而知吧遍蟋。
所以并發(fā)量大吹害,但每個(gè)用戶無(wú)需頻繁操作情況下需用短連好。

總之虚青,長(zhǎng)連接和短連接的選擇要視情況而定它呀。

心跳包機(jī)制

跳包之所以叫心跳包是因?yàn)椋核裥奶粯用扛艄潭〞r(shí)間發(fā)一次,以此來(lái)告訴服務(wù)器棒厘,這個(gè)客戶端還活著纵穿。事實(shí)上這是為了保持長(zhǎng)連接,至于這個(gè)包的內(nèi)容奢人,是沒(méi)有什么特別規(guī)定的谓媒,不過(guò)一般都是很小的包,或者只包含包頭的一個(gè)空包何乎。

在TCP的機(jī)制里面句惯,本身是存在有心跳包的機(jī)制的土辩,也就是TCP的選項(xiàng):SO_KEEPALIVE。系統(tǒng)默認(rèn)是設(shè)置的2小時(shí)的心跳頻率抢野。但是它檢查不到機(jī)器斷電拷淘、網(wǎng)線拔出、防火墻這些斷線指孤。而且邏輯層處理斷線可能也不是那么好處理启涯。一般,如果只是用于笔研活還是可以的结洼。

心跳包一般來(lái)說(shuō)都是在邏輯層發(fā)送空的echo包來(lái)實(shí)現(xiàn)的。下一個(gè)定時(shí)器叉跛,在一定時(shí)間間隔下發(fā)送一個(gè)空包給客戶端补君,然后客戶端反饋一個(gè)同樣的空包回來(lái),服務(wù)器如果在一定時(shí)間內(nèi)收不到客戶端發(fā)送過(guò)來(lái)的反饋包昧互,那就只有認(rèn)定說(shuō)掉線了挽铁。

其實(shí),要判定掉線敞掘,只需要send或者recv一下叽掘,如果結(jié)果為零,則為掉線玖雁。但是更扁,在長(zhǎng)連接下,有可能很長(zhǎng)一段時(shí)間都沒(méi)有數(shù)據(jù)往來(lái)赫冬。理論上說(shuō)浓镜,這個(gè)連接是一直保持連接的,但是實(shí)際情況中劲厌,如果中間節(jié)點(diǎn)出現(xiàn)什么故障是難以知道的膛薛。更要命的是,有的節(jié)點(diǎn)(防火墻)會(huì)自動(dòng)把一定時(shí)間之內(nèi)沒(méi)有數(shù)據(jù)交互的連接給斷掉补鼻。在這個(gè)時(shí)候哄啄,就需要我們的心跳包了,用于維持長(zhǎng)連接风范,弊傻活。

在獲知了斷線之后硼婿,服務(wù)器邏輯可能需要做一些事情锌半,比如斷線后的數(shù)據(jù)清理呀,重新連接呀……當(dāng)然寇漫,這個(gè)自然是要由邏輯層根據(jù)需求去做了刊殉。

總的來(lái)說(shuō)殉摔,心跳包主要也就是用于長(zhǎng)連接的保活和斷線處理冗澈。一般的應(yīng)用下钦勘,判定時(shí)間在30-40秒比較不錯(cuò)陋葡。如果實(shí)在要求高亚亲,那就在6-9秒。

心跳檢測(cè)步驟:

1 客戶端每隔一個(gè)時(shí)間間隔發(fā)生一個(gè)探測(cè)包給服務(wù)器
2 客戶端發(fā)包時(shí)啟動(dòng)一個(gè)超時(shí)定時(shí)器
3 服務(wù)器端接收到檢測(cè)包腐缤,應(yīng)該回應(yīng)一個(gè)包
4 如果客戶機(jī)收到服務(wù)器的應(yīng)答包捌归,則說(shuō)明服務(wù)器正常,刪除超時(shí)定時(shí)器
5 如果客戶端的超時(shí)定時(shí)器超時(shí)岭粤,依然沒(méi)有收到應(yīng)答包惜索,則說(shuō)明服務(wù)器掛了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剃浇,隨后出現(xiàn)的幾起案子巾兆,更是在濱河造成了極大的恐慌,老刑警劉巖虎囚,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件角塑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淘讥,警方通過(guò)查閱死者的電腦和手機(jī)圃伶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒲列,“玉大人窒朋,你說(shuō)我怎么就攤上這事』柔” “怎么了侥猩?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)抵赢。 經(jīng)常有香客問(wèn)我拭宁,道長(zhǎng),這世上最難降的妖魔是什么瓣俯? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任杰标,我火速辦了婚禮,結(jié)果婚禮上彩匕,老公的妹妹穿的比我還像新娘腔剂。我一直安慰自己,他們只是感情好驼仪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布掸犬。 她就那樣靜靜地躺著袜漩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪湾碎。 梳的紋絲不亂的頭發(fā)上宙攻,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音介褥,去河邊找鬼座掘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛柔滔,可吹牛的內(nèi)容都是我干的溢陪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼睛廊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼形真!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起超全,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咆霜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嘶朱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛾坯,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年见咒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偿衰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡改览,死狀恐怖下翎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宝当,我是刑警寧澤视事,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站庆揩,受9級(jí)特大地震影響俐东,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜订晌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一虏辫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锈拨,春花似錦砌庄、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)佩微。三九已至,卻和暖如春萌焰,著一層夾襖步出監(jiān)牢的瞬間哺眯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工扒俯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奶卓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓陵珍,卻偏偏與公主長(zhǎng)得像寝杖,于是被迫代替她去往敵國(guó)和親违施。 傳聞我的和親對(duì)象是個(gè)殘疾皇子互纯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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