HTTP 协议的最大弊端就是每一个 TCP 链接只能对应一个 HTTP 请求,即每一个 HTTP 链接只请求一个资源,浏览器只能经过创建多个链接来解决。此外在 HTTP 中对请求是严格的先入先出(FIFO)进行的,若是中间某个请求处理时间较长会阻塞后面的请求html
服务端只能等待客户端发送一个请求,在能够知足预加载的现状是一种桎梏nginx
HTTP 头在同一个会话里是反复发送的,中间的冗余信息,好比 User-Agent、Host 等不须要重复发送的信息也在反复发送,浪费带宽和资源算法
HTTP1.0/1.1在数据传输中使用的是明文,攻击者很容易获取数据内容chrome
有必定的费用浏览器
性能问题缓存
除了安全之外,不能解决HTTP1.0/1.1其余的问题安全
SPDY是Google公司2012年发布的基于TCP/IP的应用层协议。SPDY协议经过压缩、多路复用和优先级来缩短网页的加载时间和安全性。
SPDY是Speedy的音,是更快的意思。服务器
SPDY 协议只是在性能上对 HTTP 作了很大的优化,其核心思想是尽可能减小链接个数,而对于 HTTP 的语义并无作太大的修改。具体来讲是,SPDY 使用了 HTTP 的方法和页眉,可是删除了一些头并重写了 HTTP 中管理链接和数据转移格式的部分,因此基本上是兼容 HTTP 的。
Google 在 SPDY 白皮书里表示要向协议栈下面渗透并替换掉传输层协议(TCP),可是由于这样不管是部署起来仍是实现起来暂时至关困难,所以 Google 准备先对应用层协议 HTTP 进行改进,先在 SSL 之上增长一个会话层来实现 SPDY 协议,而 HTTP 的 GET 和 POST 消息格式保持不变,即现有的全部服务端应用均不用作任何修改。cookie
不论是普通用户仍是开发者均可以像使用HTTP同样使用SPDY。session
如上图SPDY位于HTTP之下,TCP和SSL之上
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 |
+----------------------------------+
各数据位的意义:
Stream-ID记录流水号。
SPDY把一次HTTP Request/Response来回称做流(Stream),由于复用TCP链接,因此一个SPDY链接里会有多个流。为了区分不一样的流,用Stream-ID来标记流水号(注:由于能够reload,因此不能以URL来肯定一个流)。Stream-ID还存在于4种控制帧(SYN_STREAM、SYN_REPLY、RST_STREAM、HEADERS)的payload里。
控制帧的8种类型及做用:
单链接多路复用
在同一个域名下,SPDY只使用一个链接来加载一个页面的全部资源,在这个链接中能够打开多个流来同时传输数据
全双工,支持服务器推送技术
SPDY的流是双向的,容许服务器主动的同客户端创建流。SPDY经过Server Push和Server Hint技术,主动的向客户端推送资源,同时不发送已经缓存的资源
SPDY压缩了HTTP头
HTTP协议只能对HTTP BODY进行压缩,而如今不少网站cookie有很大的数据量,使得HTTP的请求数据愈来愈大。SPDY经过zlib对HTTP头进行了压缩,并强制开启HTTP BODY的Gzip压缩
请求分级,重要的资源优先传送
SPDY经过创建0~7的优先级,使服务器会优先处理优先级高的请求
强制使用 SSL传输协议
SPDY为了安全强制使用安全协议,经过压缩和优先级策略来弥补安全协议的性能问题
多域名请求下一样要创建多条链接
SSL/TLS协议的性能问题
全部头部名都须要小写
客户端必须支持 gzip 压缩
Google已经再也不支持SPDY
国内使用SPDY的大厂是阿里,还开源了一款基于Nginx的服务器Tengine。
wget http://tengine.taobao.org/download/tengine-2.1.2.tar.gz
- ./configure --prefix=/data/tengine --with-http_spdy_module --with-http_v2_module
- make
- make install
先生成ssl证书,略过
server { listen 443 ssl spdy; server_name localhost; ssl_certificate key/server.crt; ssl_certificate_key key/server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
./nginx
最新的chrome中已经不支持SPDY了,所以在firefox中进行验证。
HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工做小组进行开发。是自1999年http1.1发布后的首个更新。HTTP 2.0在2013年8月进行首次合做共事性测试。
在开放互联网上HTTP 2.0将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增长使用加密技术,以提供强有力的保护去遏制主动攻击。护自行发行证书。
HTTP2.0是SPDY的升级,它采用了SPDY不少的特性和技术,但和SPDY有明显的区别:
如上图,HTTP1.x经过文本形式定义了起始行、报文头和实体,而HTTP2.0经过二进制格式定义了Length、Type、Flags、Stream ID、Payload
Length
整个二进制frame的长度
Type
Type定义了frame的类型,共10种
Flags
用bit位定义了一些重要的参数
Stream ID
用于控制流
Payload
Request的正文
HTTP2.0将HTTP1.0的起始行和报文头封装为Headers Frame,把实体封装为Data Frame
如上图,客户端和服务端创建了一条TCP链接,每一个stream都有一个ID,相同的ID表示是同一个资源。
创建链接阶段
客户端同服务端创建一条TCP链接,若是使用SSL/TLS,将创建一条加密的链接
请求数据阶段
客户端向服务端请求数据,发送一个frame,同一域名下的请求都会经过该链接发送到服务端
响应数据阶段
服务端向客户端响应数据,若是发现有其余的数据请求,经过同一TCP链接主动向客户端推送资源
多路复用
同SPDY同样,HTTP2.0支持多路复用,能在单一TCP链接中进行数据的传输
header压缩
同SPDY同样,为了减小报文头的数据量,HTTP2.0也支持header的压缩。但为了防止BREACH4和CRIME攻击,采用HPACK6对头部进行压缩
服务端推送
HTTP2.0一样提供了服务器推送技术
优先级和依赖关系
每一个流都有本身的优先级别,会代表哪一个流是最重要的,客户端会指定哪一个流是最重要的,有一些依赖参数,这样一个流能够依赖另一个流
重置
HTTP2.0引入了一个 RST_STREAM frame 来让客户端在已有的链接中发送重置请求,从而中断或者放弃响应。当浏览器进行页面跳转或者用户取消下载时,它能够防止创建新链接,避免浪费全部带宽。
流量控制
HTTP2.0每一个独立流都有流控制,但只有DATA Frame才受控制。接收端通知发送方还能接收多少数据来控制。
一样经过Tengine来部署HTTP2.0,下载和安装见SPDY的实践。
server { listen 443 ssl http2 fastopen=3; server_name localhost; ssl_certificate key/server.crt; ssl_certificate_key key/server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
./nginx -s reload
在此过程当中,要注意chrome浏览器的版本,若是大于51,则须要服务器使用openssl的alpn
下载openssl-1.0.2 而后从新编译时加入 --with-openssl=path
移动端
最新版本移动端(IOS和Android)都支持SPDY和HTTP2.0,但较低版本的不支持HTTP2.0,但可使用SPDY进行过渡
网页应用
最新的Chrome已经不支持SPDY
多域名
对大型网站和静态资源(图片、JS/CSS文件等等)分离的网站,可能不仅一个域名,这时也会创建多个链接
http://blog.csdn.net/hursing/article/details/22785475/
http://www.williamlong.info/archives/3119.html
http://mt.sohu.com/20160824/n465635124.shtml
http://mrpeak.cn/blog/http2/
http://www.jdon.com/dl/http2.html