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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TCP长连接,心跳机制介绍

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

TCP長連接,心跳機制介紹

    • 長連接
    • 為何要長連接
    • 心跳
      • 心跳為何設置在服務器端
    • 心跳維持長連接
      • TCP keep-alive的三個參數
      • 參數的具體意義
    • 心跳的使用場景

長連接

  • TCP經過三次握手建立連接,長連接是指不管有無數據包的發送都長期保持建立的連接;
    有長連接自然也有短連接,短連接是指雙方有數據發送時,就建立連接,發送幾次請求后,就主動或者被動斷開連接。

為何要長連接

  • 減少連接建立過程的耗時
    TCP連接建立需要三次握手,三次握手也就說需要三次交互才能建立一個連接通道,同城的機器之間的大概是ms級別的延時,影響還不大,如果是北京和上海兩地機房,走專線一來一回大概需要30ms,如果使用長連接,這個優化還是十分可觀的。

  • 方便實現push數據
    數據交互-推模式實現的前提是網絡長連接,有了長連接,連接兩端很方便的互相push數據,來進行交互。

心跳

  • 心跳是用來檢測一個系統是否存活或者網絡鏈路是否通暢的一種方式,做法是定時向被檢測系統發送心跳包,被檢測系統收到心跳包進行回復,收到回復說明對方存活。心跳能夠給長連接提供保活功能,能夠檢測長連接是否正常,一旦鏈路死了,不可用了,能夠盡快知道,然后做些其他的高可用措施,來保證系統的正常運行。

心跳為何設置在服務器端

  • 心跳包所以實現在服務器側,是因為與客戶端相比,服務器側的壽命更長,因為服務器側需要不間斷地提供服務,而客戶端可能由于用戶下班而合上電腦(TCP沒有來得及發送FIN關閉連接),這樣的話,服務器側就會有很多不可用的TCP連接(established),這樣的連接依然會占用服務器內存資源,于是就設計這個keepalive 來檢測客戶端是否可用,如果幾次重傳keepalive ,客戶端沒有相應,刪除連接,釋放資源。需要指出的是,超時時間是指TCP連接沒有任何數據、控制字傳輸的時間,如果有任何數據傳輸,會刷新定時器,重新走表。

心跳維持長連接

  • TCP的KeepAlive機制(此機制并不是TCP協議規范中的內容,由操作系統去實現)KeepAlive機制開啟后,在一定時間內(一般時間為7200s,參數tcp_keepalive_time)在鏈路上沒有數據傳送的情況下,TCP層將發送相應的KeepAlive探針以確定連接可用性,探測失敗后重試10(參數tcp_keepalive_probes)次,每次間隔時間75s(參數tcp_keepalive_intvl),所有探測失敗后,才認為當前連接已經不可用。這些參數是機器級別,可以調整。KeepAlive的保活機制只在鏈路空閑的情況下才會起到作用。

應用層實現:
如果客戶端已經消失而連接未斷開,則會使得服務器上保留一個半開放的連接,而服務器又在等待來自客戶端的數據,此時服務器將永遠等待客戶端的數據。保活功能就是試圖在服務端器端檢測到這種半開放的連接。

如果一個給定的連接在兩小時內沒有任何動作,服務器就向客戶發送一個探測報文段,根據客戶端主機響應探測4個客戶端狀態:

  • 客戶主機依然正常運行,且服務器可達。此時客戶的TCP響應正常,服務器將保活定時器復位。
  • 客戶主機已經崩潰,并且關閉或者正在重新啟動。上述情況下客戶端都不能響應TCP。服務端將無法收到客戶端對探測的響應。服務器總共發送10個這樣的探測,每個間隔75秒。若服務器沒有收到任何一個響應,它就認為客戶端已經關閉并終止連接。
  • 客戶端崩潰并已經重新啟動。服務器將收到一個對其保活探測的響應,這個響應是一個復位,使得服務器終止這個連接。
  • 客戶機正常運行,但是服務器不可達。這種情況與第二種狀態類似。
  • TCP keep-alive的三個參數

    用man命令,可以查看linux的tcp的參數:

    man 7 tcp

    這些的默認配置值在/proc/sys/net/ipv4 目錄下可以找到。
    其中keep-alive相關的參數有三個:

    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.

    參數的具體意義

    • TCP_KEEPIDLE :這個參數是多久沒有發送數據時,開始發送Keep-Alive包的時間,也就是鏈路空閑時間。
    • TCP_KEEPINTVL:這個參數是指發送Keep-Alive probe后,對方多久沒有回應,然后重新再發送keep alive probe的時間間隔
    • TCP_KEEPCNT:這個參數指,連續發送多少次keep alive probe,對方沒有回應,認為連接已經失效的重試次數

    心跳的使用場景

    • 方案一
      最簡單的策略當然是客戶端定時n秒發送心跳包,服務端收到心跳包后,回復客戶端的心跳,如果客戶端連續m秒沒有收到心跳包,則主動斷開連接,然后重連,將正常的業務請求暫時不發送的該臺服務器上。
    • 方案二
      這樣傳送一些無效的數據包有點多,可以做些優化。因為心跳就是一種探測請求,業務上的正常請求除了做業務處理外,還可以用作探測的功能,比如此時有請求需要發送到服務端,這個請求就可以當作是一次心跳,服務端收到請求,處理后回復,只要服務端有回復,就表明鏈路還是通的,如果客戶端請求比較空閑的時候,服務端一直沒有數據回復,就使用心跳進行探測,這樣就有效利用了正常的請求來作為心跳的功能,減少無效的數據傳輸。

    總結

    以上是生活随笔為你收集整理的TCP长连接,心跳机制介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。