重用已對目標服務器打開的空閒鏈接,就能夠避開緩慢的鏈接創建階段。並且,已經打開的鏈接還能夠避免慢啓動的擁塞適應階段,以便更快速地進行數據的傳輸。瀏覽器
HTTP/1.0 keep-alive鏈接的客戶端能夠經過包含Connection: Keep-Alive首部請求將一條鏈接保持在打開狀態。
HTTP/1.1客戶端默認Keep-Alive是打開的安全
1. 參數timeout是在Keep-Alive響應首部發送的。它估計了服務器但願將鏈接保持在活躍狀態的時間。這並非一個承諾值。 2. 參數max是在Keep-Alive響應首部發送的。它估計了服務器還但願爲多少個事務保持此鏈接的活躍狀態。這並非一個承諾值。
1. 發送了Connection: close請求首部以後,客戶端就沒法在那條鏈接上發送更多的請求了。 2. 只有響應報文的主體長度(Content-Length)肯定或者能夠肯定響應報文何時能發送完(Transfer-Encoding),這樣才能創建持續鏈接,不然不能 3. 每一個持久鏈接都只適用於一跳傳輸。 4. 除非請求有反作用,不然若是請求在完成以前鏈接關閉了,瀏覽器會自動從新發送該請求 5. 一個用戶客戶端對任何服務器或代理最多隻能維護兩條持久鏈接,以防服務器過載
HTTP/1.1容許在持久鏈接上可選地使用請求管道。這是相對於keep-alive鏈接的又一性能優化。在響應到達以前,能夠將多條請求放入隊列。當第一條請求經過網絡流向地球另外一端的服務器時,第二條和第三條請求也能夠開始發送了。在高時延網絡條件下,這樣作能夠下降網絡的環回時間,提升性能。
性能優化
HTTP應用程序要作好正確處理非預期關閉的準備。若是在客戶端執行事務的過程當中,傳輸鏈接關閉了,那麼,除非事務處理會帶來一些反作用,不然客戶端就應該從新打開鏈接,並重試一次。對管道化鏈接來講,這種狀況更加嚴重一些。客戶端能夠將大量請求放入隊列中排隊,但源端服務器能夠關閉鏈接,這樣就會留下大量未處理的請求,須要從新調度。服務器
反作用是很重要的問題。若是在發送出一些請求數據以後,收到返回結果以前,鏈接關閉了,客戶端就沒法百分之百地肯定服務器端實際激活了多少事務。有些事務,好比GET一個靜態的HTML頁面,能夠反覆執行屢次,也不會有什麼變化。而其餘一些事務,好比向一個在線書店POST一張訂單,就不能重複執行,否則會有下多張訂單的危險。網絡
若是一個事務,不論是執行一次仍是不少次,獲得的結果都相同,這個事務就是冪等的。實現者們能夠認爲GET、HEAD、PUT、DELETE、TRACE和OPTIONS方法都共享這一特性。客戶端不該該以管道化方式傳送非冪等請求(好比POST)。不然,傳輸鏈接的過早終止就會形成一些不肯定的後果。性能