日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TCP长连接,心跳机制介绍

發(fā)布時(shí)間:2023/12/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TCP长连接,心跳机制介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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):

  • 客戶主機(jī)依然正常運(yùn)行,且服務(wù)器可達(dá)。此時(shí)客戶的TCP響應(yīng)正常,服務(wù)器將保活定時(shí)器復(fù)位。
  • 客戶主機(jī)已經(jīng)崩潰,并且關(guān)閉或者正在重新啟動(dòng)。上述情況下客戶端都不能響應(yīng)TCP。服務(wù)端將無法收到客戶端對探測的響應(yīng)。服務(wù)器總共發(fā)送10個(gè)這樣的探測,每個(gè)間隔75秒。若服務(wù)器沒有收到任何一個(gè)響應(yīng),它就認(rèn)為客戶端已經(jīng)關(guān)閉并終止連接。
  • 客戶端崩潰并已經(jīng)重新啟動(dòng)。服務(wù)器將收到一個(gè)對其保活探測的響應(yīng),這個(gè)響應(yīng)是一個(gè)復(fù)位,使得服務(wù)器終止這個(gè)連接。
  • 客戶機(jī)正常運(yùn)行,但是服務(wù)器不可達(dá)。這種情況與第二種狀態(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è):

    tcp_keepalive_intvl (integer; default: 75; since Linux 2.4)The number of seconds between TCP keep-alive probes.tcp_keepalive_probes (integer; default: 9; since Linux 2.2)The maximum number of TCP keep-alive probes to send before giving up and killing the connection if noresponse is obtained from the other end.tcp_keepalive_time (integer; default: 7200; since Linux 2.2)The number of seconds a connection needs to be idle before TCP begins sending out keep-alive probes. Keep-alives are sent only when the SO_KEEPALIVE socket option is enabled. The default value is 7200 seconds (2hours). An idle connection is terminated after approximately an additional 11 minutes (9 probes an intervalof 75 seconds apart) when keep-alive is enabled.

    參數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。