1 SPDY協議
1.1 概述
SPDY爲speedy(單詞原意:快速的)的縮寫,讀音也就是speedy。
SPDY協議已發佈過4個草案,分別爲版本1、2、3、3.1。目前版本4已在試驗階段,但未發佈,Chromium裏已有一些針對版本4的代碼。
缺點:
由於這些缺點,SPDY在小網站(資源文件數量較少)的效果不明顯,有可能比多併發連接更慢。(由此催生了QUIC)
1.2 協議層次
基於安全的考慮,SPDY規定建立在TLS之上,即URL scheme爲https。發明者表示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),但有以下區別:
根據載荷的內容,幀分爲控制幀和數據幀。
控制幀的數據格式:
+----------------------------------+
|C| Version(15bits) | Type(16bits) |
+----------------------------------+
| Flags (8) | Length (24 bits) |
+----------------------------------+
| Data |
+----------------------------------+
數據幀的數據格式:
+----------------------------------+
|C| Stream-ID (31bits) |
+----------------------------------+
| Flags (8) | Length (24 bits) |
+----------------------------------+
| Data |
+----------------------------------+
各數據位的意義:
SPDY把一次HTTP Request/Response來回稱作流(Stream),因爲複用TCP連接,所以一個SPDY連接裏會有多個流。爲了區分不同的流,用Stream-ID來標記流水號(注:因爲可以reload,所以不能以URL來確定一個流)。Stream-ID還存在於4種控制幀(SYN_STREAM、SYN_REPLY、RST_STREAM、HEADERS)的payload裏。
控制幀的8種類型及作用:
下圖爲幀格式的整理參考(需對照協議文檔來理解具體意義,可跳過,點擊查看大圖):