㈠ 一文搞懂 HTTP、TCP 的長連接和短連接
HTTP 協議與 TCP/IP 協議的關系在於,HTTP 屬於應用層協議,在傳輸層使用 TCP 協議,在網路層使用 IP 協議。TCP 協議主要解決如何在 IP 層之上可靠地傳遞數據包,確保在網路上的另一端收到所有發端發出的數據包,並且順序與發出順序一致。TCP 有可靠、面向連接的特點。
HTTP 協議是無狀態的,指的是協議對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。這意味著,打開一個伺服器上的網頁與之前打開的伺服器上的網頁之間沒有任何聯系。HTTP 是一個無狀態的面向連接的協議,盡管無狀態不代表 HTTP 不能保持 TCP 連接,也不代表 HTTP 使用的是 UDP 協議(無連接)。
長連接和短連接的解釋如下:
短連接:
建立連接 -> 傳輸數據 -> 關閉連接
HTTP 是無狀態的,瀏覽器和伺服器每進行一次 HTTP 操作,就建立一次連接,任務結束後就中斷連接。如果客戶端瀏覽器訪問的某個 HTML 或其他類型的 Web 頁中包含有其他的 Web 資源,如 JavaScript 文件、圖像文件、CSS 文件等,每遇到這樣一個 Web 資源,就會建立一個 HTTP 會話。
從 HTTP/1.1 起,默認使用長連接,使用長連接的 HTTP 協議在響應頭會加入代碼,以保持連接特性。在使用長連接的情況下,當一個網頁打開完成後,客戶端和伺服器之間用於傳輸 HTTP 數據的 TCP 連接不會關閉。實現長連接需要客戶端和服務端都支持長連接。
HTTP 協議的長連接和短連接,本質上是 TCP 協議的長連接和短連接。
在 TCP 協議中,網路通信時採用 TCP 協議時,在真正的讀寫操作之前,server 與 client 之間必須建立一個連接,當讀寫操作完成後,雙方不再需要這個連接時它們可以釋放這個連接。建立連接需要 3 次握手,而釋放連接需要 4 次握手,因此每個連接的建立和關閉都需要消耗資源和時間。
長連接和短連接的使用場景有所不同。長連接適用於操作頻繁、點對點通訊且連接數不能太多的情況,例如資料庫連接,這樣可以減少建立連接和關閉連接的操作,提高處理速度。短連接適用於伺服器管理較為簡單,存在的連接都是有用的連接,不需要額外控制手段,同時客戶端請求頻繁的情況下,避免在 TCP 的建立和關閉操作上浪費時間和帶寬。
長連接和短連接的生命周期主要由客戶端和服務端的關閉策略決定。正常情況下,一條 TCP 長連接建立後,只要雙方不提出關閉請求並且沒有出現異常情況,這條連接可以持續存在,操作系統不會自動關閉它,甚至經過物理網路拓撲的改變之後仍然可以使用。一條連接可能保持幾天、幾個月、幾年甚至更長時間,只要不出現異常情況或由用戶主動關閉。
檢測長連接是否中斷的方法包括在應用層使用 heartbeat 主動檢測和改變 socket 的 keepalive 選項,以使 socket 檢測連接是否中斷的時間間隔更小,以滿足實時性需求。通過設置 SO_KEEPALIVE 屬性、修改內核關於網路方面的配置參數以及 TCP 層選項 TCP_KEEPIDLE、TCP_KEEPINTVL 和 TCP_KEEPCNT 來實現。
㈡ 長鏈接、短鏈接與連接池
在了解連接池之前,我們需要對長、短鏈接建立初步認識。我們都知道,網路通信大部分都是基於 TCP/IP 協議,數據傳輸之前,雙方通過「 三次握手 」建立連接,當數據傳輸完成之後,又通過「 四次揮手 」釋放連接,以下是「三次握手」與「四次揮手」示意圖:
三次握手建立連接示意圖:
四次揮手釋放連接示意圖:
長、短連接是相對通信時間而言的。長連接相對短連接而言,多了一個 保持連接 的過程,可以在一個連接上可以連續發送多個數據包,在連接保持期間,如果沒有數據包發送,需要雙方發鏈路檢測包。
短連接的操作步驟是:
建立連接——數據傳輸——關閉連接…建立連接——數據傳輸——關閉連接
client向server發起連接請求,server接到請求,然後雙方建立連接。client向server發送消息,server回應client,然後一次請求就完成了。這時候雙方任意都可以發起close操作,不過一般都是client先發起close操作。上述可知,短連接一般只會在 client/server間傳遞一次請求操作。
短連接的優點是:管理起來比較簡單,存在的連接都是有用的連接,不需要額外的控制手段。
長連接的操作步驟是:
建立連接——數據傳輸…(保持連接)…數據傳輸——關閉連接
client向server發起連接,server接受client連接,雙方建立連接,client與server完成一次請求後,它們之間的連接並不會主動關閉,後續的讀寫操作會繼續使用這個連接。
TCP長連接保持的兩種辦法:
自定義心跳消息頭.,一般客戶端主動發送到服務端,伺服器接收後進行回應(也可以不回應),以便能夠偵測連接是否異常斷開。
通過設置TCP keepalive的屬性,並設置發送底層心跳包的時間間隔。TCP keepalive是在底層定時發送心跳報文,伺服器端接收到底層的心跳報文直接丟棄,不關心其內容。
HTTP協議是無狀態的,在HTTP/1.0中默認使用短連接,客戶端和伺服器每進行一次HTTP操作,瀏覽器就會重新建立一個HTTP會話。
而從HTTP/1.1起,默認使用長連接,用以保持連接特性,使用長連接的HTTP協議,會在響應頭加入這行代碼:
在使用長連接的情況下,當一個網頁打開完成後,客戶端和伺服器之間用於傳輸HTTP數據的TCP連接不會關閉,客戶端再次訪問這個伺服器時,會繼續使用這一條已經建立的連接。Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的伺服器軟體中設定這個時間。實現長連接需要客戶端和服務端都支持長連接。
HTTP協議的長連接和短連接,實質上是TCP協議的長連接和短連接。
基於TCP/IP協議,我們可以知道,頻繁的連接創建和銷毀都需要消耗資源,而連接池是將已經創建好的連接保存在池中,當有請求來時,直接使用已經創建好的連接進行訪問,這樣省略了創建連接和銷毀連接的過程。這樣性能上得到了提高。
以資料庫連接池為例,基本原理如下:
連接池技術帶來的好處:
由於連接得到重用,避免了頻繁創建、釋放連接引起的大量性能開銷。在減少系統消耗的基礎上,另一方面也增進了系統運行環境的平穩性(減少內存碎片以及臨時進程/線程的數量)。
連接池在初始化過程中,往往已經創建了若干連接置於池中備用。此時連接的初始化工作均已完成。對於業務請求處理而言,直接利用現有可用連接,避免了連接初始化和釋放過程的時間開銷,從而縮減了系統整體響應時間。
在較為完備的連接池實現中,可根據預先的連接佔用超時設定,強制收回被佔用連接。從而避免了常規連接操作中可能出現的資源泄漏。
以PHP開發為例,基於PHP-FPM機制實現的Web服務,並不容易實現連接池,而常駐內存的開發框架,例如workerman、swoole 則可以簡單實現連接池功能。PHP-FPM機制下的連接池需要藉助第三方Proxy實現,例如:
㈢ 長連接和短連接的區別
品牌型號:華為MateBook D15
系統:Windows 11
1、使用方法不同。長連接是client方與server方先建立連接,連接建立後不斷開,然後再進行報文發送和接收。短連接是Client方與server每進行一次報文收發交易時才進行通訊連接,交易完畢後立即斷開連接。此方式常用於一點對多點通訊。
2、操作過程不同。長連接的操作步驟是:建立連接、數據傳輸..、保持連接、數據傳輸、關閉連接。短連接的操作步驟是:建立連接、數據傳輸、關閉連接、建立連接、數據傳輸、關閉連接。
3、使用時機不同。長連接:短連接多用於操作頻繁,點對點的通訊,而且長連接數不能太多的情況。每個TCP連接的建立都需要三次握手,每個TCP連接的斷開要四次握手。短連接:web網站的http服務一般都用短連接。因為長連接對於伺服器來說要耗費一定的資源。像web網站這么頻繁的成千上萬甚至上億客戶端的連接用短連接更省一些資源。