????????一個web頁面上的大部分內(nèi)嵌圖片通常都來自一個Web站點许帐,而且其他對象的超鏈接都指向同一個站點没龙。因此链韭,初始化對某服務(wù)器(這個站點)HTTP請求的應(yīng)用程序可能會在不久的將來排霉,對這臺服務(wù)器發(fā)起更多的請求窍株。這種屬性被稱為站點局部性。
????????因此,HTTP1.1(HTTP1.0增加版本)允許HTTP設(shè)備在事務(wù)處理結(jié)束(下圖中有四個事務(wù))之后夹姥,將TCP連接保持打開的狀態(tài)杉武,以便為未來的HTTP請求重用現(xiàn)在的連接。
????????在事務(wù)處理結(jié)束之后仍保持打開狀態(tài)的TCP連接叫持久連接辙售,非持久連接會在每個事務(wù)結(jié)束之后關(guān)閉轻抱。持久連接會在不同事務(wù)之間保持打開狀態(tài),直到客戶端或服務(wù)器決定將其關(guān)閉為止旦部。
????????重用已對目標(biāo)服務(wù)器打開的空閑持久連接祈搜,就可以避免緩慢的連接建立階段。而已士八,已經(jīng)打開的連接可以避免慢啟動的擁塞和和適應(yīng)階段容燕,以便更快地進(jìn)行數(shù)據(jù)傳輸。
并行連接的缺點
- 每個事務(wù)都會打開/關(guān)閉一個新的連接婚度,會耗費時間和帶寬蘸秘。
- 由于TCP慢啟動特性的存在,每條新連接的性能都會有所降低蝗茁。
- 可打開的并行連接數(shù)據(jù)實際上是有限的醋虏。
????????持久連接比并行連接更好的地方。持久連接降低了時延和連接建立的開銷哮翘,將連接保持在調(diào)諧狀態(tài)颈嚼,而且減少了打開連接的潛在數(shù)量。但持久連接的沒管理得當(dāng)饭寺,會累積出大量的空閑連接阻课,耗費本地以及遠(yuǎn)程客戶端和服務(wù)器上的資源。現(xiàn)在艰匙,好多Web應(yīng)用程序都會打開少量的并行連接限煞,其中每個都是持久連接。
持久連接類型
- 比較老的HTTP/1.0+ Keep-alive
- HTTP1.1 Presistent
HTTP/1.0+ Keep-alive連接
????????大約從1996年開始旬薯,很多支持HTTP/1.0瀏覽器和服務(wù)器進(jìn)行擴(kuò)展晰骑,以支持一種稱為Keep-alive的持久連接(實驗性)适秩。這些早期的持久連接存在操作性設(shè)計方面的缺陷绊序,在HTTP/1.1中得以修正,但很多客戶端和服務(wù)器仍使用早期的Keep-alive連接秽荞。
下面中顯示持久連接與串行連接的性能優(yōu)點骤公,由于去除了連接和關(guān)閉連接的開銷,所以時間線辰所縮減扬跋。也去掉慢啟動階段阶捆。Keep-alive操作
????????Keep-alive已經(jīng)不再使用了,在當(dāng)前的HTTP/1.1規(guī)范中也沒有對它的說明。但很多瀏覽器和服務(wù)器對Keep-alive握手的使用仍然相當(dāng)廣泛洒试,因此倍奢,HTTP的實現(xiàn)者應(yīng)用做好與之操作的準(zhǔn)備。
????????實現(xiàn)HTTP/1.0+ Keep-alive連接的客戶端垒棋,需要在請求報文中加入一條(Connection: Keep-alive)頭部保持打開狀態(tài)(見下圖)卒煞。如果服務(wù)器愿意為下一條請求保持打開狀態(tài),會在響應(yīng)報文中包含相同的頭部叼架。如果響應(yīng)報文中沒有這條頭部畔裕,客戶端就認(rèn)為服務(wù)器不支持Keep-alive,會在發(fā)回(或不發(fā)回)響應(yīng)報文之后乖订,關(guān)閉連接扮饶。
Keep-alive選項
????????Keep-alive首部是請求將連接保持持久狀態(tài)。發(fā)出有Keep-alive首部的報文之后乍构,客戶端或服務(wù)器不一定同意進(jìn)行Keep-alive會話甜无。即將雙方同意,也可以在任意時刻關(guān)閉空閑的Keep-alive連接哥遮,并可隨意限制Keep-alive連接所處理的事務(wù)的數(shù)量毫蚓。
Keep-alive選項:
- Timeout:是在Keep-alive響應(yīng)報文首部發(fā)送的,它估計了服務(wù)器希望將連接保持在活躍狀態(tài)時間昔善。這不是一個承諾值元潘。
- Max:是在Keep-alive響應(yīng)報文首部發(fā)送的,它估計了服務(wù)器還希望為多少個事務(wù)保持此連接的活躍狀態(tài)君仆。這不是一個承諾值翩概。
-
name [=value]: Keep-alive首部也支持任意未處理的屬性,這些屬性主要用于診斷和調(diào)度
Keep-alive首部是可選的返咱,只有在提供了Connection: Keep-alive時才能使用它钥庇。
下面代碼顯示這個服務(wù)器最多為另外5個事務(wù)保持連接的打開狀態(tài),或者將打開狀態(tài)保持到連接空閑2分鐘之后咖摹。
Connection; Keep-alive
Keep-alive: max=5, timeout=120
Keep-alive連接的限制和規(guī)則
- 在HTTP/1.0中评姨,Keep-alive不是默認(rèn)使用的,在客戶端請求中必須發(fā)送一個Connection: Keep-alive首部來激活Keep-alive連接萤晴。
- 如果客戶端的請求報文中沒有Connection: Keep-alive吐句,服務(wù)器會在這個請求之后,關(guān)閉這個連接店读。
- 如果服務(wù)器響應(yīng)報文中沒有Connection: Keep-alive嗦枢,客戶端會在這個響應(yīng)之后,關(guān)閉這個連接屯断。
- 保持持久連接的條件:報文實體的主體部分必須有正確的Content-Length文虏。如果錯誤的Content-Length值侣诺,將是一件糟糕的事情,事務(wù)處理的另一端無法精確地檢測出一條報文結(jié)束和另一條報文的開始氧秘。
-
重要:應(yīng)該忽略所有來自HTTP/1.0設(shè)備的Connection首部字段年鸳,因為它們可能是由比較老的代理服務(wù)器誤轉(zhuǎn)發(fā)的。如果不忽略的話丸相,會產(chǎn)生啞代理問題阻星。
在檢測到HTTP/1.0協(xié)議,并有Connection首部字段時已添,代理和網(wǎng)關(guān)必須在將報文轉(zhuǎn)發(fā)出去或?qū)⑵渚彺嬷巴谆瑒h除在Connection首部中命名的所有的首部字段,以及Connection本身(在服務(wù)器端也可以做限制)更舞。