SPDY、HTTP/2、QUIC協議

1 SPDY協議

1.1 概述

SPDYspeedy(單詞原意:快速的)的縮寫,讀音也就是speedy

SPDY協議已發佈過4個草案,分別爲版本1233.1。目前版本4已在試驗階段,但未發佈,Chromium裏已有一些針對版本4的代碼。

SPDY對比HTTP的優勢

  1. 複用連接,可在一個TCP連接上傳送多個資源。應對了TCP慢啓動的特性。
  2. 請求分優先級,重要的資源優先傳送。
  3. HTTP頭部數據也被壓縮,省流量。
  4. 服務器端可主動連接客戶端來推送資源(Server Push)。

缺點:

  1. 單連接會因TCP線頭阻塞(head-of-line blocking)的特性而傳輸速度受限。加上存在可能丟包的情況,其負面影響已超過壓縮頭部和優先級控制帶來的好處。

由於這些缺點,SPDY在小網站(資源文件數量較少)的效果不明顯,有可能比多併發連接更慢。(由此催生了QUIC)

1.2 協議層次

基於安全的考慮SPDY規定建立在TLS之上,即URL schemehttps。發明者表示TLS的握手是在一定程度上佔用了時間和流量,但網絡安全是必然的趨勢,所以不計較這一成本。協議層次如下:

   SPDY  ←  HTTP 
    ↓
   TLS   ←  NPN 
    ↓
   TCP

對比普通的HTTPS協議層次:

    HTTP 
     ↓
  SSL/TLS  
     ↓
    TCP

SPDY協議雖然在TLS基礎上代替了HTTP協議,但SPDY的內容又包含了HTTP協議的內容,用設計模式來理解就是應用裝飾者模式擴展了HTTP。

另外爲了在TLS之上不使用標準規定的HTTP協議,爲TLS擴展出NPN(Next Protocol Negotiation,協議協商)

1.3 NPN

NPN簡單來說就是在TLS的握手階段增加一些字段來表明服務器端和客戶端希望在TLS基礎上使用HTTP之外的(SPDY)協議。NPN同樣是Google提出的,爲SPDY鋪路。

Client端程序的實現是:握手前對OpenSSL(或封裝它的庫)設置可接受哪些協議,握手後獲取服務器選擇了哪個協議,然後按選擇的協議進行通信。

1.4 數據格式

本節不會完整介紹SPDY,只講重點,並假定讀者熟悉HTTP協議而不解釋SPDY中類似HTTP的概念。

SPDY把一次單向傳輸(服務器到客戶端或客戶端到服務器)的內容稱作幀(frame),按協議組裝幀內容稱爲裝幀(framing)。幀內容分爲頭部(header)和載荷(payload),類似於HTTP的頭部(header)和實體(entity),但有以下區別:

  1. SPDY的頭部都是8個字節,根據其中一些位的數值不同來表示不同的信息,並把HTTP的頭部放到SPDY的載荷裏。
  2. HTTP的實體(除POST信息外)是文件數據(data),SPDY的載荷除了可以是文件數據還可以是其它信息。

根據載荷的內容,幀分爲控制幀和數據幀。

控制幀的數據格式:

+----------------------------------+
|C| Version(15bits) | Type(16bits) |
+----------------------------------+
| Flags (8)  |  Length (24 bits)   |
+----------------------------------+
|               Data               |
+----------------------------------+

數據幀的數據格式:

+----------------------------------+
|C|       Stream-ID (31bits)       |
+----------------------------------+
| Flags (8)  |  Length (24 bits)   |
+----------------------------------+
|               Data               |
+----------------------------------+

各數據位的意義:

  • C是第一個bit,值爲0或1分別表示數據幀和控制幀。
  • Version爲SPDY協議版本號,目前爲3。
  • Type用作區分控制幀的類型
  • Flags標記一些操作指示,不同的Type有不同的Flag。常見的是FLAG_FIN表示一個Stream結束。
  • Length表示Data的數據長度。
  • Data也就是payload。數據幀的Data就是一個文件(HTML文檔、圖片、腳本等),控制幀的Data根據Type不同而有不同。
  • Stream-ID記錄流水號。

SPDY把一次HTTP Request/Response來回稱作流(Stream,因爲複用TCP連接,所以一個SPDY連接裏會有多個流。爲了區分不同的流,用Stream-ID來標記流水號(注:因爲可以reload,所以不能以URL來確定一個流)。Stream-ID還存在於4種控制幀(SYN_STREAMSYN_REPLYRST_STREAMHEADERS)的payload裏。

控制幀的8種類型及作用:

  1. SYN_STREAM:創建,在payload裏攜帶請求(Request)。
  2. SYN_REPLY:回覆創建流,在payload裏攜帶HTTP頭部。注意:SPDY把HTTP response拆開,response header放在控制幀SYN_REPLY的payload裏並經過壓縮,response entity放在數據幀裏。
  3. RST_STREAM:報告流錯誤,payload裏攜帶錯誤類型。
  4. SETTINGS:查詢或設置控制信息。可處理的信息有8種:上傳帶寬、下載帶寬、Round Trip時間、最大並行流數量、TCP的CWND值、下載重傳率、初始窗口(Window)值、證書數量。
  5. PING:一種機制來測量Round Trip時間。
  6. GOAWAY:通知即將斷開TCP連接。
  7. HEADERS:可做補充SVN_REPLY中的response header,或傳遞私有信息,特定的應用可用做自定義的擴展。
  8. WINDOW_UPDATE:設置窗口大小。

下圖爲幀格式的整理參考(需對照協議文檔來理解具體意義,可跳過,點擊查看大圖):

相關文章
相關標籤/搜索