雖然HTTP已經得到廣泛的應用,但隨著計算機的快速發展,對網路的需求也越來越高,HTTP協議已經逐漸成為一種瓶頸,目前出現了基於HTTP的一些改進協議,包括Google的SPDY,以及WebSocket通訊,以及已經出現的HTTP/2.0。
###1.HTTP/1.1連線特性 在HTTP的初始版本中,每進行一次HTTP請求就要進行一個TCP的建立到斷開的週期,這是很耗費資源的,建立一個TCP連線要經過三次握手,斷開需要四次握手,為了一個HTTP請求就進行這樣的操作,無疑是很浪費的。如果只是很少的HTTP連線還可以接受,但是現今的網頁中,裡面包含了各種資源比如圖片的下載連結,這樣的流程會造成很嚴重的延遲與資源浪費。
所以在HTTP/1.1中使用到了一項技術,持久連線。 #####1.1 持久連線(HTTP Persistent Connections) 也稱為HTTP keep-alive,特點是隻要任意一端沒有提出斷開,就會保持TCP的連線狀態。目的是建立一次TCP連線後進行多次的HTTP請求和響應。#####1.2HTTP/1.1管線化(HTTP Pipelining) 一般來講,HTTP請求在收到響應之後才會再次發起新的請求,而HTTP Pipelining其實是把多個HTTP請求放到一個TCP連線中一一傳送,而在傳送過程中不需要等待伺服器對前一個請求的響應,但是客戶端還是要按照傳送請求的順序來接收響應。大部分的瀏覽器都會預設關閉這個功能,因為其可能會造成線頭堵塞(Head of line blocking)。
###2.HTTP可能會造成網路傳輸的瓶頸
- 2.1 每一條連線只能傳送一條請求
- 2.2 從客戶端開始請求,客戶端只接受響應的指令
- 2.3 冗長的首部,每次都傳送相同的首部
- 2.4 請求和響應的首部未經壓縮就進行傳送
- 2.5 資料內容可能未經壓縮就進行傳送
- 2.6 線頭阻塞(Head of line blocking):伺服器是要按照順序處理請求的,如果前一個請求非常耗時,那麼後續請求都會受到影響。這樣會造成網路延遲,有一種方式是新建TCP連線,但是新建TCP開銷是很大的,所以新建TCP連線並不能解決問題。
###3.SPDY SPDY是由Google牽頭開發的協議,SPDY已經充分證實了它是一個非常好用的方案,HTTP/2.0便是基於SPDY/3草案進行一些修改之後釋出的。 SDPY沒有完全改寫HTTP協議,而是在TCP/IP 的應用層與運輸層之間通過新加會話層的形式運作,考慮到安全性問題, SPDY 規定通訊中使用 SSL。
- SSL:(Secure Socket Layer,安全套接字層),位於可靠的面向連線的網路層協議和應用層協議之間的一種協議層。SSL通過互相認證、使用數字簽名確保完整性、使用加密確保私密性,以實現客戶端和伺服器之間的安全通訊。該協議由兩層組成:SSL記錄協議和SSL握手協議。 SPDY的優化措施包括以下幾個:- 3.1 多路複用:一個TCP可以處理多個HTTP請求,與HTTP/1.1的持久連線區別在於,持久連線排隊序列化執行,一旦一個請求出現耗時會造成堵塞,而多路複用可以進行並行請求,一部分請求的堵塞不影響其它請求的執行。
- 3.2 請求優先順序設定:可以設定不用請求的優先順序,這樣可以按照指定的順序執行請求。
- 3.3 壓縮HTTP首部:因為HTTP的首部在請求和響應過程都會帶上,而且還特別臃腫,對其進行壓縮在進行傳輸會大大節約資源。
- 3.4 伺服器主動推送:支援伺服器主動向客戶端推送資料。
###4.WebSocket協議 WebSocket是瀏覽器與伺服器之間全雙工通訊標準,即只需要建立一次WebSocket連線,之後所有的通訊都在這個連線上進行,不需要像HTTP一樣不斷的建立連線、斷開連線,因為HTTP是無狀態連線,新建立連線還得被一個大包袱來回趕。 WebSocket其實就是藉助HTTP協議的Upgrade首部欄位告訴伺服器接下來要使用WebSocket協議,後續的操作其實就交給WebSocket協議自己了。 WebSocket的主要特點如下:
- 4.1 主動推送 支援伺服器向客戶端推送訊息,但由於是藉助於HTTP協議,一開始的請求發起方也是客戶端,但建立連線之後就自由自在了。
- 4.2 減少通訊 一方面是隻需要建立一次連線,另一方面是WebSocket連線過程所攜帶的首部本來就很少。