http權威指南-http鏈接管理

HTTP鏈接管理瀏覽器

瀏覽器解析URL流程:

  1. 瀏覽器解析出域名;
  2. 瀏覽器查詢這個主機名的IP地址;
  3. 瀏覽器得到端口號;
  4. 瀏覽器發起到主機名IP地址端口的80鏈接;
  5. 瀏覽器向服務器發送一條HTTP–GET報文;
  6. 瀏覽器從服務器讀取HTTP響應報文;

HTTP 鏈接實際上就是 TCP 鏈接和一些使用鏈接的規則。TCP 爲 HTTP 提供了一條可靠的比特傳輸管道。從 TCP 鏈接一端填入的字節會從另 一端以原有的順序、正確地傳送出來。緩存

TCP 的數據是經過名爲 IP 分組(或 IP 數據報)的小數據塊來發送的。這樣的話, 如圖 4-3a 所示,HTTP 就是「HTTP over TCP over IP」這個「協議棧」中的最頂層 了。其安全版本 HTTPS 就是在 HTTP 和 TCP 之間插入了一個(稱爲 TLS 或 SSL 的)密碼加密層安全

HTTP事物的時延有如下幾種主要緣由:

  1. 客戶端首先要根據URL肯定Web服務器的IP地址和端口號;
  2. 客戶端會向服務器發送一條TCP鏈接請求;
  3. 鏈接創建後,客戶端就會經過新創建的TCP管道來發送HTTP請求;
  4. Web服務器會回送HTTP響應;

大多數HTTP客戶端都有一個小的DNS緩存,用來保存近期全部訪問站點的IP地址。服務器

TCP網絡時延的大小取決於硬件速度、網絡和服務器的負載、請求和響應保存的尺寸、以及客戶端和服務器之間的距離。網絡

HTTP鏈接方式

並行鏈接

並行鏈接:並行地執行多個事務,每一個事務都有本身的TCP鏈接。多個鏈接會產生一些額外的開銷,使用並行鏈接裝載整個頁面的時間極可能並串行下載時間更長。優化

持久鏈接

持久鏈接:在事務處理結束以後仍然保持在打開狀態的TCP鏈接被成爲持久鏈接。非持久鏈接會在每一個事務結束以後關閉,持久鏈接會在不一樣事務之間保持打開狀態,直到客戶端或服務器決定將其關閉爲止。重用持久鏈接,就能夠避開緩慢的鏈接創建階段。並且已經打開的鏈接還能夠避免慢啓動的擁擠適應階段,以便更快地進行數據的傳輸。編碼

持久以及並行鏈接:漸進式圖片應用:先顯示低分辨率的近似圖像,而後再逐漸增減圖片的分辨率。加密

持久鏈接兩種類型:

  1. Keep-alive
  2. 持久鏈接

Keep-alive:實現 HTTP/1.0Keep-alive 鏈接的客戶端能夠經過包含 Connection:Keep-Alive 首部請求將一條鏈接保持在打開狀態。若是服務器願意爲下一條請求將鏈接保持在打開狀態,就在響應中包含相同的首部,若是響應中沒有 Connection:Keep-Alive,客戶端就會認爲服務器不支持Keep-alive。會在相應報文後關閉鏈接。spa

Keep-Alive限制和規則:

  1. 默認不使用,發送 Connection:Keep-Alive 激活;
  2. 首部必須隨全部但願保持持久鏈接的報文一塊兒發送;
  3. 實體的主體部分必須有正確的 Content-Length
  4. 代理和網關必須執行 Connection 首部的規則。

HTTP/1.1 逐漸中止了對 Keep-alive 鏈接的支持,用一種名爲 持久鏈接 的改進型設計取代了它。在 HTTP/1.1 中,持久鏈接默認是激活的。設計

持久鏈接的規則和限制:

  1. 發送了 Connection:close 請求首部以後,客戶端就沒法在那條鏈接上發送更多的請求了;
  2. 若是客戶端不想在鏈接上發送其它請求了,就應該在最後一條請求中發送一個 Connection:close 首部;
  3. 只有當實體部分的長度和相應的 Content-Length 一致,或是用分塊傳輸編碼方式編碼的狀況下,鏈接才能持久保持;
  4. 一個客戶端對任何服務器或代理最多隻能維護兩條持久鏈接,以防服務器過載;

管道化鏈接:

HTTP/1.1 容許在持久化上可選地使用請求管道。這是在 Keep-Alive 鏈接上的進一步想能優化,在響應到達以前,能夠將多條請求放入隊列,當第一條請求經過網絡流向另外一端服務器時,第二條和第三條請求也能夠開始發送了。

規則和限制:

  1. 若是客戶端沒法確認鏈接是持久的,就不該該使用管道;
  2. 必須按照與請求相同的順序回送HTTP響應;
  3. 客戶端必須可以應付持久鏈接過早關閉,並從新發送爲完成請求;

冪等的概念:

若是一個事務,不論是執行一次仍是不少次,獲得的結果都相同,這個事務就是冪等的。

冪等請求: GET HEAD PUT DELETE TRACE OPTIONS

非冪等請求: POST,非冪等方法或序列不能自動重試。好比:大多數瀏覽器都會在重載一個緩存的POST相應時提供一個對話框,詢問用戶是否但願再次發起事務處理。

徹底關閉和半關閉:

應用程序能夠關閉 TCP 輸入和輸出信道中任意一個,或者將兩個都關閉。

套接字調用 close() 會將 TCP鏈接的輸入和輸出傳到都關閉了,稱爲「徹底關閉」,還能夠調用 shutdown() 單獨關閉輸入或輸出信道,成爲 「半關閉」。

相關文章
相關標籤/搜索