hursing的博客

1 SPDY协议1.1 概述

SPDY为(单词原意:快速的)的缩写,读音也就是speedy。

SPDY协议已发布过4个草案,,分别为版本1、2、3、3.1。目前版本4已在试验阶段,但未发布,Chromium里已有一些针对版本4的代码。

SPDY对比HTTP的优势:

缺点:

单连接会因TCP线头阻塞(head-of-line blocking)的特性而传输速度受限。加上存在可能丢包的情况,其负面影响已超过压缩头部和优先级控制带来的好处。

由于这些缺点,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铺路。

是:握手前对OpenSSL(或封装它的库)设置可接受哪些协议,握手后获取选择了哪个协议,然后按选择的协议进行通信。

1.4 数据格式

本节不会完整介绍SPDY,只讲重点,并假定读者熟悉HTTP协议而不解释SPDY中类似HTTP的概念。

SPDY把一次单向传输(服务器到客户端或客户端到服务器)的内容称作帧(frame),按协议组装帧内容称为装帧(framing)。帧内容分为头部(header)和载荷(payload),类似于HTTP的头部(header)和实体(entity),但有以下区别:

SPDY的头部都是8个字节,根据其中一些位的数值不同来表示不同的信息,并把HTTP的头部放到SPDY的载荷里。 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|+———————————-+

各数据位的意义:

SPDY把一次HTTP Request/Response来回称作流(Stream),因为复用TCP连接,所以一个SPDY连接里会有多个流。为了区分不同的流,用Stream-ID来标记流水号(注:因为可以reload,所以不能以URL来确定一个流)。Stream-ID还存在于4种控制帧(、、、)的payload里。

控制帧的8种类型及作用:

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

1.5 流程

普通流程如下图:

Server Push的server端流程:回复client端的之后,再在server端发起SYN_STREAM,并在payload中用字段Associated_To_Stream_ID表示这个推送与哪个stream关联。

2 HTTP/22.1 概述

HTTP/2准第11版草案于2014年3月17日更新在。

HTTP/2由标准化组织来制定,是基于SPDY的,差别是:

HTTP/2文档带有一些示例和详细说明,这是SPDY没有的。

Chromium最新代码和Google网站已支持HTTP2-10(HTTP/2第10版草案)。

2.2 ALPN

ALPN第5版草案于2014年3月3日发布在。 它是基于NPN的,并做了流程优化,但原则没变,就是在TLS握手过程增加一种协商协议的手段。标准流程为:

ClientServerClientHello——–>ServerHello(ALPN extension &(ALPN extension &list of protocols)selected protocol)Certificate*ServerKeyExchange*CertificateRequest*<——–serverhellodone certificate* clientkeyexchange* certificateverify* [changecipherspec] finished——–>[ChangeCipherSpec]<——–Finished Application Data<——->Application Data

目前Chromium的PC发布版已经在使用ALPN,不用NPN了。

2.3 TCP上的应用

HTTP/2可使用http或https scheme作为URL。

当使用http scheme时,client先用HTTP/1.1的request发给server,但要加入header Upgrade和HTTP2-Settings。格式为:

GET /default.htm HTTP/1.1Host: server.example.comConnection: Upgrade, HTTP2-SettingsUpgrade: h2cHTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>

如果server支持HTTP/2,则以状态码101回复,形式如下:

HTTP/1.1 101 Switching ProtocolsConnection: UpgradeUpgrade: h2[ HTTP/2 connection …

然后双方开始以HTTP/2作为传输协议。否则以HTTP/1.1回复response,即HTTP/1.1 200 OK。

3 QUIC

QUIC是Quick UDP Internet Connections的缩写,读作quick。由Google开发,概要设计文档放在google docs https://docs.google.com/document/d/1RNHkx_VvKWyWg6Lr8SZ-saqsQx7rFV-ev2jRFUoVD34/edit,还在不断更新。传输格式的详细设计文档放在。

概要设计文档从TCP/UDP特性、网络安全等考虑出发,做了非常多设计思路方面的论述,开头就阐述了SPDY的4个缺点:

而现在我喜欢深邃的夜空,包容一切的黑暗和隐忍,留下眼泪也没人看见。

hursing的博客

相关文章:

你感兴趣的文章:

标签云: