?;顧C(jī)制是一種在不影響數(shù)據(jù)流內(nèi)容的情況下探測(cè)對(duì)方的方式。
和名字正好相反,是服務(wù)器用來(lái)確認(rèn)什么時(shí)候應(yīng)該斷開(kāi)連接的一種機(jī)制。
保活機(jī)制
?;罟δ茉谀J(rèn)情況下是關(guān)閉的o TCP連接的任何一端都可以請(qǐng)求打開(kāi)這一功能。保活功能可以被設(shè)置在連接的一端、兩端,或者兩端都沒(méi)有。
機(jī)制
在一段時(shí)間(稱(chēng)為?;顣r(shí)間,keepalivetime)內(nèi)連接處于非活動(dòng)狀態(tài),開(kāi)啟保活功能的一端將向?qū)Ψ桨l(fā)送一個(gè)?;钐綔y(cè)報(bào)文。如果發(fā)送端沒(méi)有收到響應(yīng)報(bào)文,那么經(jīng)過(guò)一個(gè)已經(jīng)提前配置好的保活時(shí)間間隔(keepaliveinterval),將繼續(xù)發(fā)送?;钐綔y(cè)報(bào)文,直到發(fā)送探測(cè)報(bào)文的次數(shù)達(dá)到?;钐綔y(cè)數(shù)(keepaliveprobe),這時(shí)對(duì)方主機(jī)將被確認(rèn)為不可到達(dá),連接也將被中斷。
報(bào)文
保活探測(cè)報(bào)文為一個(gè)空?qǐng)?bào)文段(或1個(gè)字節(jié)),序列號(hào)等于對(duì)方主機(jī)發(fā)送的ACK報(bào)文的最大序列號(hào)減1。
因?yàn)檫@一序列號(hào)的數(shù)據(jù)段已經(jīng)被成功接收,所以不會(huì)對(duì)到達(dá)的報(bào)文段造成影響,但探測(cè)報(bào)文返回的響應(yīng)可以確定連接是否仍在工作。接收方收到該報(bào)文以后,會(huì)認(rèn)為是之前丟失的報(bào)文,所以不會(huì)添加進(jìn)數(shù)據(jù)流中。但是仍然要發(fā)送一個(gè)ACK確認(rèn)。
探測(cè)及其響應(yīng)報(bào)文丟失后都不會(huì)重傳。探測(cè)方主動(dòng)不重傳,相應(yīng)方的ACK報(bào)文并不能自己重傳,所以需要保活探測(cè)數(shù)。
?;罱Y(jié)果
- 對(duì)方主機(jī)仍在工作
服務(wù)器端正常收到ACK,說(shuō)明客戶端正常工作。
請(qǐng)求端將?;钣?jì)時(shí)器重置。重新計(jì)時(shí)。 - 對(duì)方主機(jī)已經(jīng)崩潰
對(duì)方的TCP將不會(huì)響應(yīng)ACK。
超過(guò)?;钐綔y(cè)數(shù)以后,認(rèn)為對(duì)方主機(jī)已經(jīng)關(guān)閉,連接也將被斷開(kāi)。 - 客戶主機(jī)崩潰并且已重啟
客戶端響應(yīng)是一個(gè)重置報(bào)文段,請(qǐng)求端將會(huì)斷開(kāi)連接。 - 對(duì)方主機(jī)仍在工作
但是因?yàn)槠渌蚓褪菦](méi)有收到ACK。