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:设置窗口大小。

下图为帧格式的整理参考(需对照协议文档来理解具体意义,可跳过,点击查看大图):

相关文章
相关标签/搜索