HTTP鏈接是HTTP報文傳輸的關鍵通道,幾乎全部的HTTP通訊都是由TCP/IP承載。程序員
HTTP鏈接實際上就是TCP鏈接和一些使用鏈接的規則。TCP鏈接是因特網上的可靠鏈接。
TCP爲HTTP提供了一條可靠的比特傳輸管道。從TCP鏈接一端填入的字節會從另外一端以原有的順序、正確地傳送出來。
(1)瀏覽器解析出主機名
(2)瀏覽器查詢這個主機名的IP地址(DNS)
(3)瀏覽器得到端口號
(4)瀏覽器發送到ip:port的鏈接
(5)亂了去年向服務器發送一個HTTP GET報文
(6)瀏覽器從服務器讀取HTTP響應報文
(7)瀏覽器關閉鏈接算法
TCP流是分段的,由IP分組傳送
TCP的數據是經過名爲IP分組(或IP數據報)的小數據塊來發送的。HTTP就是「HTTP over TCP over IP」這個協議棧中的最頂層。
其安全版本HTTPS就是在HTTP和TCP之間插入一個(稱爲TLS或SSL的)密碼加密層。瀏覽器
如圖:安全
HTTP要傳送一條報文時,會以流的形式將報文數據的內容經過一條打開的TCP鏈接按序傳輸。TCP收到數據流以後,會將數據流砍成被稱做段的小數據塊,並將段封裝在IP分組中,經過因特網進行傳輸,。全部這些工做都是由TCP/IP軟件來處理的,HTTP程序員什麼都看不到。
每一個TCP段都是由IP分組承載,從一個IP地址發送到另外一個IP地址的,每一個IP分組中都包括:
(1)一個IP分組首部(一般爲20字節)
(2)一個TCP段首部(一般爲20字節)
(3)一個TCP數據塊(0個或多個字節)服務器
在任意時刻計算機均可以有幾條TCP鏈接誒處於打開狀態。TCP是經過端口號來保持全部這些鏈接的正確運行的。網絡
HTTP緊挨着TCP,位於其上層,因此HTTP事務的性能在很大程度上取決於底層TCP通道的性能。併發
HTTP事務主要的鏈接、傳輸以及處理時延。如圖:性能
與創建TCP鏈接,以及傳輸請求和響應報文的時間相比,事務處理時間多是很短的。除非客戶端或服務器超載,或正在處理複雜的動態資源,不然HTTP時延就是由TCP網絡時延構成的。加密
HTTP事務的時延有如下幾種主要緣由:
(1)客戶端手續須要根據URI肯定Web服務器的IP地址和端口號。若是最近沒有對URI中的主機名進行訪問,經過DNS解析系統將URI中的主機名轉換成一個IP地址可能要花費數十秒的時間。
(2)客戶端會向服務器發送一條TCP鏈接請求,並等待服務器會送一個請求接受應答。每條新的TCP鏈接都會有鏈接創建時延。這個值一般最多隻有一兩秒鐘,但若是有百個HTTP事務的話,這個值會快速地疊加上去。
(3)一旦鏈接創建起來了,客戶端就會經過新創建的TCP管道來發送HTTP請求。數據到達時,Web服務器會從TCP鏈接中讀取請求報文,並對請求進行處理。因特網傳輸請求報文,以及服務器處理請求報文都須要時間。
(4)Web服務器會回送HTTP響應,這也須要花費時間。blog
這些TCP網絡時延的大小取決於硬件速度、網絡和服務器的負載,請求和響應報文的尺寸,以及客戶端和服務器之間的距離。
性能聚焦區域
列出了一些會對HTTP程序員產生影響的、最多見的TCP相關時延。其中包括:
(1)TCP鏈接創建握手:創建一條新的TCP鏈接時,甚至在發送任意數據以前,TCP軟件之間會交換一系列的IP分組。若是鏈接只是用來傳送少許數據,這些交換過程就會嚴重下降HTTP的性能。HTTP程序員永遠不會看到這些分組--這些分組都是由TCP/IP軟件管理,對其是不可見的。HTTP程序員看到的只是建立TCP鏈接時存在的時延。
(2)TCP慢啓動擁塞控制:TCP慢啓動限制了一個TCP端點在任意時刻能夠傳輸的分組數。每成功接收一個分組,發送端就有了發送另外兩個分組的權限。若是某個HTTP事務有大量數據要發送,是不能一次將全部分組都發送出去的。因爲存在這種擁塞控制特性,因此新鏈接的傳輸速度會比已經交換過必定量數據的鏈接慢一些。
(3)數據彙集Nagle算法:Nagle算法會引起集中HTTP性能問題。(a)小的HTTP報文可能沒法填滿一個分組,可能會由於等待哪些永遠不會到來的額外數據而產生時延(b)Nagle算法與延遲確認之間的交互存在問題--Nagle算法會阻止數據的發送,直到有確認分組,但確認分組自身會被延遲確認算法延遲100~200ms。TCP_NODELAY禁用Nagle算法。
(4)用於捎帶確認的TCP延遲確認算法:因爲確認報文很小,因此TCP容許在發往相同方向的輸出數據分組中對其進行「捎帶」。TCP將返回的確認信息與輸出的數據分組結合在一塊兒,能夠更有效地利用網絡,爲了增長確認報文找到同向傳輸數據分組的可能性,不少TCP棧都實現了一種「延遲確認」算法。延遲確認算法會在一個特定的窗口時間(100~200ms)內將輸出確認存放在緩衝區中,以尋找可以捎帶它的輸出數據分組。
(5)TIME_WAIT時延和端口耗盡
有幾種方法能夠提升HTTP的鏈接性能:(1)並行鏈接:經過多條TCP鏈接發起併發的HTTP請求;(2)持久鏈接:重用TCP鏈接,以消除鏈接及關閉時延;在事務處理結束以後仍然保持在打開狀態的TCP鏈接被稱爲持久鏈接。重用已對目標服務器打開的空閒持久鏈接,就能夠避開緩慢的鏈接創建階段。並且,已經打開的鏈接還能夠避免慢啓動的擁塞適應階段,以便更快的進行數據傳輸。(3)管道化鏈接:經過共享的TCP鏈接發起併發的HTTP請求;(4)複用的鏈接:交替傳送請求和響應報文。