Socket心跳包機(jī)制總結(jié)

Tcp的斷線檢測

tcp的斷線檢測,分為兩種:

① 利用tcp自帶的keep –alive機(jī)制

② 自己組建心跳包的方式向?qū)Χ税l(fā)送

通過Keep-alive機(jī)制對tcp的連接保持楼誓,也就是Tcp的心跳包柔纵,見MSDN:

If keep-alive is enabled for a TCP socket with SO_KEEPALIVE, then the default TCP settings are used for the keep-alive timeout and interval unless these values have been changed by calling the WSAIoctl function with the SIO_KEEPALIVE_VALS option. The default settings when a TCP socket is initialized sets the keep-alive timeout to 2 hours and the keep-alive interval to 1 second.

也就是說協(xié)議棧會在2小時后發(fā)送向?qū)Χ税l(fā)送請求包。默認(rèn)情況下脖旱,此Keep-alive機(jī)制是關(guān)閉的。

Keep-alive默認(rèn)下是關(guān)閉的娩怎,也就是本端與對端是除非程序主動send帕识,是不會發(fā)送數(shù)據(jù)包(心跳包)泛粹,既是,處理本端與對端的系統(tǒng)里的socket狀態(tài)是不會變化肮疗,這里晶姊,如果對端當(dāng)機(jī)(或者網(wǎng)線斷掉),本端是無法知道對端socket已經(jīng)關(guān)閉伪货,所以本端的socket會一直的存在们衙。

通過實(shí)驗(yàn)發(fā)現(xiàn),客戶端網(wǎng)線拔掉之后,此時服務(wù)端的連接依然存在碱呼。

所以砍艾,tcp只是數(shù)據(jù)的發(fā)送與接收,包括握手巍举,斷開以及rst脆荷,time_wait,close_wait 等等懊悯。

心跳包機(jī)制

心跳包之所以叫心跳包是因?yàn)椋核裥奶粯用扛艄潭〞r間發(fā)一次蜓谋,以此來告訴服務(wù)器,這個客戶端還活著炭分。事實(shí)上這是為了保持長連接桃焕,至于這個包的內(nèi)容,是沒有什么特別規(guī)定的捧毛,不過一般都是很小的包观堂,或者只包含包頭的一個空包。

在TCP的機(jī)制里面呀忧,本身是存在有心跳包的機(jī)制的师痕,也就是TCP的選項:SO_KEEPALIVE。系統(tǒng)默認(rèn)是設(shè)置的2小時的心跳頻率而账。但是它檢查不到機(jī)器斷電胰坟、網(wǎng)線拔出、防火墻這些斷線泞辐。而且邏輯層處理斷線可能也不是那么好處理笔横。一般,如果只是用于备篮穑活還是可以的吹缔。

心跳包一般來說都是在邏輯層發(fā)送空的echo包來實(shí)現(xiàn)的。下一個定時器锯茄,在一定時間間隔下發(fā)送一個空包給客戶端厢塘,然后客戶端反饋一個同樣的空包回來,服務(wù)器如果在一定時間內(nèi)收不到客戶端發(fā)送過來的反饋包,那就只有認(rèn)定說掉線了俗冻。 其實(shí)礁叔,要判定掉線,只需要send或者recv一下迄薄,如果結(jié)果為零琅关,則為掉線。

但是讥蔽,在長連接下涣易,有可能很長一段時間都沒有數(shù)據(jù)往來。理論上說冶伞,這個連接是一直保持連接的新症,但是實(shí)際情況中,如果中間節(jié)點(diǎn)出現(xiàn)什么故障是難以知道的响禽。更要命的是徒爹,有的節(jié)點(diǎn)(防火墻)會自動把一定時間之內(nèi)沒有數(shù)據(jù)交互的連接給斷掉
。在這個時候芋类,就需要我們的心跳包了隆嗅,用于維持長連接,焙罘保活胖喳。

在獲知了斷線之后,服務(wù)器邏輯可能需要做一些事情贮竟,比如斷線后的數(shù)據(jù)清理呀丽焊,重新連接呀……當(dāng)然,這個自然是要由邏輯層根據(jù)需求去做了咕别。

總的來說技健,心跳包主要也就是用于長連接的保活和斷線處理顷级。一般的應(yīng)用下凫乖,判定時間在30-40秒比較不錯。如果實(shí)在要求高弓颈,那就在6-9秒。

心跳檢測步驟

1删掀、 客戶端每隔一個時間間隔發(fā)生一個探測包給服務(wù)器
2翔冀、 客戶端發(fā)包時啟動一個超時定時器
3、 服務(wù)器端接收到檢測包披泪,應(yīng)該回應(yīng)一個包
4纤子、 如果客戶機(jī)收到服務(wù)器的應(yīng)答包,則說明服務(wù)器正常,刪除超時定時器
5控硼、 如果客戶端的超時定時器超時泽论,依然沒有收到應(yīng)答包,則說明服務(wù)器掛了

服務(wù)端主動發(fā)送心跳包卡乾,還是客戶端發(fā)送比較好翼悴?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市幔妨,隨后出現(xiàn)的幾起案子鹦赎,更是在濱河造成了極大的恐慌,老刑警劉巖误堡,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件古话,死亡現(xiàn)場離奇詭異,居然都是意外死亡锁施,警方通過查閱死者的電腦和手機(jī)陪踩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悉抵,“玉大人肩狂,你說我怎么就攤上這事』埽” “怎么了婚温?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長媳否。 經(jīng)常有香客問我栅螟,道長,這世上最難降的妖魔是什么篱竭? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任力图,我火速辦了婚禮,結(jié)果婚禮上掺逼,老公的妹妹穿的比我還像新娘吃媒。我一直安慰自己,他們只是感情好吕喘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布赘那。 她就那樣靜靜地躺著,像睡著了一般氯质。 火紅的嫁衣襯著肌膚如雪募舟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天闻察,我揣著相機(jī)與錄音拱礁,去河邊找鬼琢锋。 笑死,一個胖子當(dāng)著我的面吹牛呢灶,可吹牛的內(nèi)容都是我干的吴超。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸯乃,長吁一口氣:“原來是場噩夢啊……” “哼鲸阻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起飒责,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赘娄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宏蛉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遣臼,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年拾并,在試婚紗的時候發(fā)現(xiàn)自己被綠了揍堰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗅义,死狀恐怖屏歹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情之碗,我是刑警寧澤蝙眶,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站褪那,受9級特大地震影響幽纷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜博敬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一友浸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偏窝,春花似錦收恢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至硼补,卻和暖如春默赂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背括勺。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工缆八, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疾捍。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓奈辰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乱豆。 傳聞我的和親對象是個殘疾皇子奖恰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

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

  • 1、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)宛裕、netstat -nat 查看TCP各個狀態(tài)的數(shù)量2)瑟啃、lso...
    北辰青閱讀 9,427評論 0 11
  • HTTP Keep-Alive 在http早期,每個http請求都要求打開一個tpc socket連接揩尸,并且使用一...
    jiangmo閱讀 4,757評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蛹屿,服務(wù)發(fā)現(xiàn),斷路器岩榆,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 初涉IM错负,首先我有這么幾個問題需要弄明白: Socket 和 WebSocket 有哪些區(qū)別和聯(lián)系? WebSoc...
    夜幕青雨閱讀 11,119評論 8 39
  • 最近計劃把《把時間當(dāng)作朋友》重讀一遍勇边,今天讀了后有個點(diǎn)印象深刻犹撒。 李笑來作者從微觀和宏觀層面分析了...
    茵茵1125閱讀 350評論 0 0