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ù)器掛了