HTTP之持久連線

2022-07-08 04:18:10 字數 2299 閱讀 2186

http/1.1 允許 http 裝置在事務處理結束之後將 tcp 連線保持在開啟狀態,以便為未來的 http 請求重用現存的連線。在事務處理結束後仍然保持在開啟狀態的 tcp 連線被稱為持久連線。非持久連線會在每個事務結束之後關閉。持久連線會在不同事務之間保持開啟狀態,直到客戶端或伺服器決定將其關閉為止。

持久連線降低時延和連線建立的開銷,將連線保持在已調諧狀態,而且減少了開啟連線的潛在數量。

持久連線與並行連線配合使用可能是最高效的方式。持久連線有兩種型別:比較老的 http/1.0+ "keep-alive" 連線,以及現代的 http/1.1 "persistent" 連線。

實現 http/1.0 keep-alive 連線的客戶端可以通過包含 connection: keep-alive 首部請求將一條連線保持在開啟狀態。

如果伺服器願意為下一條請求將連線保持在開啟狀態,就在響應中包含相同的首部。如果響應中沒有 connection: keep-alive 首部,客戶端就認為伺服器不支援 keep-alive,會在發回響應報文之後關閉連線。

keep-alive 首部只是請求將連線保持在活躍狀態。發出 keep-alive 請求之後,客戶端和伺服器並不一定會同意進行 keep-alive 會話。它們可以在任意時刻關閉空閒的 keep-alive 連線,並可隨意限制 keep-alive 連線所處理事務的數量。

可以用 keep-alive 通用首部中指定的、由逗號分隔的選項來調節 keep-alive 的行為:

keep-alive 首部完全是可選的,但只有在提供 connection: keep-alive 時才能使用它。下面示例的 keep-alive 說明伺服器最多還會為另外 5 個事務保持連線的開啟狀態,或者將開啟狀態保持到連線空閒了 2 分鐘之後。

connection: keep-alive

keep-alive: max=5, timeout=120

1. connection 首部和盲中繼

問題出在**上--尤其是那些不理解 connection 首部,而且不知道在沿著**鏈路將其傳送出去之前,應該將該首部刪除的**。很多老的或簡單的**都是盲中繼(blind relay),它們只是將位元組從乙個連線**到另乙個連線中去,不對 connection 首部進行特殊的處理。

**和逐跳首部

為避免這類**通訊問題的發生,現代的**都絕不能** connection 首部和所有名字出現在 connection 值中的首部。因此,如果乙個**收到了乙個 connection: keep-alive 首部,是不應該** connection 首部,或所有名為 keep-alive 首部的。

如下幾個首部不能作為 connection 首部值列出,也不能被****或作為快取相應使用的首部:proxy-authenticate、proxy-connection、transfer-encoding 和 upgrade。

對盲中繼的變通做法是引入了乙個名為 proxy-connection 的新首部,解決了在客戶端後面緊跟著乙個盲中繼所帶來的問題--但並沒有解決所有其他情況下存在的問題。

瀏覽器會向**傳送非標準的 proxy-connection 擴充套件首部,而不是官方支援的著名的 connection 首部。如果**是盲中繼,它會將無意義的 proxy-connection 首部**給 web 伺服器,伺服器會忽略此首部,不會帶來任何問題。但如果是能夠理解持久連線的**,就用乙個 connection 首部取代無意義的 proxy-connection 首部,然後將其傳送給伺服器。

proxy-connection 首部修正了單個盲中繼帶來的問題:

對有多層次**的情況,proxy-connection 仍然無法解決問題:

http/1.1 逐漸停止了對 keep-alive 連線的支援,用一種名為持久連線(persistent connection)的改進型設計取代了它。

http/1.1 持久連線在預設情況下是啟用的。除非特別指明,否則 http/1.1 假定所有連線都是持久的。要在事務處理結束之後將連線關閉,http/1.1 應用程式必須向報文中顯式地新增乙個 connection: close 首部。但是,客戶端和伺服器仍然可以隨時關閉空閒的連線。不傳送 connection: close 並不意味著伺服器承若永遠將連線保持在開啟狀態。

HTTP協議詳解 持久連線與非持久連線

最近寫作完http協議一節,略做總結 非持久連線是在http 1.0中定義,而對於http 1.1中預設的是持久連線 帶流水線 以下是詳細描述 非持久連線 的概念 某網頁由最基本的 html 和10個jpeg 影象構成,10個jpeg 影象檔案存放在同一臺伺服器中。設這個網頁的url為www.ser...

Http的持久連線(Keep Alive模式)

關於持久連線 http 1.1允許http裝置在事務處理結束之後將tcp連線保持在開啟狀態,以便為未來的http請求重用現存的連線。在事務處理結束之後仍然保持在開啟狀態的tcp連線被稱為持久連線。持久連線會在不同事務之間保持開啟狀態,直到客戶端或伺服器決定將其關閉為止。優點 重用已對目標伺服器開啟的...

關於HTTP的持久連線特性

http協議是位於傳輸層之上的應用層協議,其網路層基礎通常是tcp協議。tcp協議是面向連線和流的,因此連線的狀態和控制對於http協議而言相當重要。同時,http是基於報文的,因此如何確定報文長度也是協議中比較重要的一點。persistent connections持久連線 目的 在使用持久連線前...