天天看點

TCP連接配接後保持連接配接

TCP連接配接

當網絡通信時采用TCP協定時,在真正的讀寫操作之前,server與client之間必須建立一個連接配接,當讀寫操作完成後,雙方不再需要這個連接配接時它們可以釋放這個連接配接,連接配接的建立是需要三次握手的,而釋放則需要4次握手,是以說每個連接配接的建立都是需要資源消耗和時間消耗的

TCP保活的必要性:

TCP的長連接配接理論上隻要連接配接建立後,就會一直保持着。但有時有一些防火牆之類的軟體會自動檢查主機的網絡連接配接狀況,比如說如果發現某個連接配接在幾分鐘之内都沒有資料通訊,則會關閉這個連接配接。有時用戶端與伺服器需要實時的檢測連接配接狀态,就是需要知道對方是否還線上,如果對方不線上了,需要做相應的處理,這是就需要通過發送心跳包的方法監測鍊路的狀态。

導緻 TCP 連接配接斷連的因素 :

理想狀态下,一個 TCP 連接配接可以被長期保持。然而,在實際應用中,用戶端或伺服器端上維持的一個看似正常的 TCP 連接配接可能已經斷連。TCP 連接配接主要受到兩個方面的影響而導緻斷連:網絡中間節點和用戶端 / 伺服器節點參與通信的兩方節點。

在實際網絡應用中,兩個主機之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火牆等。是以,兩個主機之間 TCP 連接配接的保持同樣會受到中間節點的影響,尤其是會受到防火牆(軟體或硬體防火牆)的限制。防火牆是一種裝置,有多種不同的實作方式(軟體實作、硬體裝置實作或是軟硬體相結合實作),它需要依據一系列規則對進出的資訊流進行掃描,并允許安全(符合規則)的資訊互動、阻止不安全(違反規則)的資訊互動。防火牆的工作特性決定了要維護一個網絡連接配接就需要耗費較多的資源,并且企業防火牆常常位于企業網絡的出入口,長時間維護非活躍的 TCP 連接配接必将導緻網絡性能的下降。是以,大部分防火牆預設會關閉長時間處于非活躍狀态的連接配接而導緻 TCP 連接配接斷連。類似的,如果中間節點異常導緻來自用戶端關閉連接配接的請求無法傳遞到伺服器端,也将導緻伺服器端的相應連接配接發生斷連。

另一方面,對于一個 TCP 連接配接兩端的主機而言,建立 TCP 連接配接需要耗費一定的系統資源。如果不再使用某個連接配接,那麼我們總是希望進行通信的兩個主機能夠主動關閉相應的連接配接,以便釋放所占用的系統資源。然而,如果由于用戶端出現異常 ( 例如崩潰或異常重新開機 ) 而導緻連接配接未能正常關閉,這将導緻伺服器端的連接配接斷連。

無論是用戶端節點或是伺服器端節點,斷連的 TCP 連接配接已經不能傳遞任何資訊,是以,維護大量斷連的 TCP 連接配接将導緻系統資源的浪費。這種系統資源的浪費可能并不會對用戶端節點帶來太大問題;然而,對于伺服器主機而言,這可能會導緻系統資源(尤指記憶體資源和 socket 資源)被耗盡而拒絕為新的使用者請求提供服務。是以在實際應用中,伺服器端需要采取相應的方法來探測 TCP 連接配接是否已經斷連。

探測 TCP 連接配接斷連的三種常用方法

探測 TCP 連接配接是否斷連或是工作正常的原理比較簡單:定期向連接配接的遠端通信節點發送一定格式的資訊并等待遠端通信節點的回報,如果在規定時間内收到來自遠端節點的正确的回報資訊,那麼該連接配接就是正常的,否則該連接配接已經斷連。依據該原理,目前常用的探測方法有以下三種。

應用程式的自我探測

應用程式本身附帶探測其自身建立的 TCP 連接配接的功能。這種方法具有極大的靈活性,可以依據應用本身的特點選擇相應的探測機制和功能實作。然而,實際應用中,大部分應用程式均沒有附帶自我探測的功能。

第三方應用程式的探測

此種方法就是在服務節點上安裝相應的第三方應用程式來探測該節點上所有的 TCP 連接配接是否正常或是已經斷連。該方法最大的不足就是需要所有支援探測的用戶端能夠識别來自該探測應用的資料封包,是以,實際應用中比較少見。

TCP 協定層的保活探測

最常用的探測方法就是采用 TCP 協定層提供的保活探測功能即 TCP 連接配接保活定時器。盡管該功能并不是 RFC 規範的一部分,但是幾乎所有的類 Unix 系統均實作了該功能,是以使得該探測方法被廣泛使用。

長連接配接與短連接配接

TCP短連接配接

我們模拟一下TCP短連接配接的情況,client向server發起連接配接請求,server接到請求,然後雙方建立連接配接。client向server發送消息,server回應client,然後一次讀寫就完成了,這時候雙方任何一個都可以發起close操作,不過一般都是client先發起close操作。為什麼呢,一般的server不會回複完client後立即關閉連接配接的,當然不排除有特殊的情況。從上面的描述看,短連接配接一般隻會在client/server間傳遞一次讀寫操作

短連接配接的優點是:管理起來比較簡單,存在的連接配接都是有用的連接配接,不需要額外的控制手段

TCP長連接配接

接下來我們再模拟一下長連接配接的情況,client向server發起連接配接,server接受client連接配接,雙方建立連接配接。Client與server完成一次讀寫之後,它們之間的連接配接并不會主動關閉,後續的讀寫操作會繼續使用這個連接配接。

首先說一下TCP/IP詳解上講到的TCP保活功能,保活功能主要為伺服器應用提供,伺服器應用希望知道客戶主機是否崩潰,進而可以代表客戶使用資源。如果客戶已經消失,使得伺服器上保留一個半開放的連接配接,而伺服器又在等待來自用戶端的資料,則伺服器将應遠等待用戶端的資料,保活功能就是試圖在伺服器端檢測到這種半開放的連接配接。

繼續閱讀