TCP长连接,心跳机制介绍
TCP長連接,心跳機(jī)制介紹
- 長連接
- 為何要長連接
- 心跳
- 心跳為何設(shè)置在服務(wù)器端
- 心跳維持長連接
- TCP keep-alive的三個(gè)參數(shù)
- 參數(shù)的具體意義
- 心跳的使用場景
長連接
- TCP經(jīng)過三次握手建立連接,長連接是指不管有無數(shù)據(jù)包的發(fā)送都長期保持建立的連接;
有長連接自然也有短連接,短連接是指雙方有數(shù)據(jù)發(fā)送時(shí),就建立連接,發(fā)送幾次請求后,就主動(dòng)或者被動(dòng)斷開連接。
為何要長連接
-
減少連接建立過程的耗時(shí)
TCP連接建立需要三次握手,三次握手也就說需要三次交互才能建立一個(gè)連接通道,同城的機(jī)器之間的大概是ms級別的延時(shí),影響還不大,如果是北京和上海兩地機(jī)房,走專線一來一回大概需要30ms,如果使用長連接,這個(gè)優(yōu)化還是十分可觀的。 -
方便實(shí)現(xiàn)push數(shù)據(jù)
數(shù)據(jù)交互-推模式實(shí)現(xiàn)的前提是網(wǎng)絡(luò)長連接,有了長連接,連接兩端很方便的互相push數(shù)據(jù),來進(jìn)行交互。
心跳
- 心跳是用來檢測一個(gè)系統(tǒng)是否存活或者網(wǎng)絡(luò)鏈路是否通暢的一種方式,做法是定時(shí)向被檢測系統(tǒng)發(fā)送心跳包,被檢測系統(tǒng)收到心跳包進(jìn)行回復(fù),收到回復(fù)說明對方存活。心跳能夠給長連接提供保活功能,能夠檢測長連接是否正常,一旦鏈路死了,不可用了,能夠盡快知道,然后做些其他的高可用措施,來保證系統(tǒng)的正常運(yùn)行。
心跳為何設(shè)置在服務(wù)器端
- 心跳包所以實(shí)現(xiàn)在服務(wù)器側(cè),是因?yàn)榕c客戶端相比,服務(wù)器側(cè)的壽命更長,因?yàn)榉?wù)器側(cè)需要不間斷地提供服務(wù),而客戶端可能由于用戶下班而合上電腦(TCP沒有來得及發(fā)送FIN關(guān)閉連接),這樣的話,服務(wù)器側(cè)就會(huì)有很多不可用的TCP連接(established),這樣的連接依然會(huì)占用服務(wù)器內(nèi)存資源,于是就設(shè)計(jì)這個(gè)keepalive 來檢測客戶端是否可用,如果幾次重傳keepalive ,客戶端沒有相應(yīng),刪除連接,釋放資源。需要指出的是,超時(shí)時(shí)間是指TCP連接沒有任何數(shù)據(jù)、控制字傳輸?shù)臅r(shí)間,如果有任何數(shù)據(jù)傳輸,會(huì)刷新定時(shí)器,重新走表。
心跳維持長連接
- TCP的KeepAlive機(jī)制(此機(jī)制并不是TCP協(xié)議規(guī)范中的內(nèi)容,由操作系統(tǒng)去實(shí)現(xiàn))KeepAlive機(jī)制開啟后,在一定時(shí)間內(nèi)(一般時(shí)間為7200s,參數(shù)tcp_keepalive_time)在鏈路上沒有數(shù)據(jù)傳送的情況下,TCP層將發(fā)送相應(yīng)的KeepAlive探針以確定連接可用性,探測失敗后重試10(參數(shù)tcp_keepalive_probes)次,每次間隔時(shí)間75s(參數(shù)tcp_keepalive_intvl),所有探測失敗后,才認(rèn)為當(dāng)前連接已經(jīng)不可用。這些參數(shù)是機(jī)器級別,可以調(diào)整。KeepAlive的保活機(jī)制只在鏈路空閑的情況下才會(huì)起到作用。
應(yīng)用層實(shí)現(xiàn):
如果客戶端已經(jīng)消失而連接未斷開,則會(huì)使得服務(wù)器上保留一個(gè)半開放的連接,而服務(wù)器又在等待來自客戶端的數(shù)據(jù),此時(shí)服務(wù)器將永遠(yuǎn)等待客戶端的數(shù)據(jù)。保活功能就是試圖在服務(wù)端器端檢測到這種半開放的連接。
如果一個(gè)給定的連接在兩小時(shí)內(nèi)沒有任何動(dòng)作,服務(wù)器就向客戶發(fā)送一個(gè)探測報(bào)文段,根據(jù)客戶端主機(jī)響應(yīng)探測4個(gè)客戶端狀態(tài):
TCP keep-alive的三個(gè)參數(shù)
用man命令,可以查看linux的tcp的參數(shù):
man 7 tcp這些的默認(rèn)配置值在/proc/sys/net/ipv4 目錄下可以找到。
其中keep-alive相關(guān)的參數(shù)有三個(gè):
參數(shù)的具體意義
- TCP_KEEPIDLE :這個(gè)參數(shù)是多久沒有發(fā)送數(shù)據(jù)時(shí),開始發(fā)送Keep-Alive包的時(shí)間,也就是鏈路空閑時(shí)間。
- TCP_KEEPINTVL:這個(gè)參數(shù)是指發(fā)送Keep-Alive probe后,對方多久沒有回應(yīng),然后重新再發(fā)送keep alive probe的時(shí)間間隔
- TCP_KEEPCNT:這個(gè)參數(shù)指,連續(xù)發(fā)送多少次keep alive probe,對方?jīng)]有回應(yīng),認(rèn)為連接已經(jīng)失效的重試次數(shù)
心跳的使用場景
- 方案一
最簡單的策略當(dāng)然是客戶端定時(shí)n秒發(fā)送心跳包,服務(wù)端收到心跳包后,回復(fù)客戶端的心跳,如果客戶端連續(xù)m秒沒有收到心跳包,則主動(dòng)斷開連接,然后重連,將正常的業(yè)務(wù)請求暫時(shí)不發(fā)送的該臺(tái)服務(wù)器上。
- 方案二
這樣傳送一些無效的數(shù)據(jù)包有點(diǎn)多,可以做些優(yōu)化。因?yàn)樾奶褪且环N探測請求,業(yè)務(wù)上的正常請求除了做業(yè)務(wù)處理外,還可以用作探測的功能,比如此時(shí)有請求需要發(fā)送到服務(wù)端,這個(gè)請求就可以當(dāng)作是一次心跳,服務(wù)端收到請求,處理后回復(fù),只要服務(wù)端有回復(fù),就表明鏈路還是通的,如果客戶端請求比較空閑的時(shí)候,服務(wù)端一直沒有數(shù)據(jù)回復(fù),就使用心跳進(jìn)行探測,這樣就有效利用了正常的請求來作為心跳的功能,減少無效的數(shù)據(jù)傳輸。
總結(jié)
以上是生活随笔為你收集整理的TCP长连接,心跳机制介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue父子组件及非父子组件之间的传值
- 下一篇: mac壁纸每天自动更换