一文读懂 HTTP/2 特性

 今天,HTTP 1.1 已经变成互联网中主要的协议。但是在 HTTP 协议诞生初期却被认为是简单直接的协议。1996 年在 RFC 1945 中定义了 HTTP 1.0 规范,仅 60 页,到 1999 年在 RFC 2616 定义了 HTTP 1.1,增长到了 176 页。但是,随着 web 技术的飞速发展。 HTTP 1.1 已经无法满足用户对性能的要求,此后 Google 推出协议 SPDY,意在解决 HTTP 1.1 中广为人知的性能问题。SPDY 得到了 Chrome、Firefox 和 Opera 的支持,很多大型网站(如谷歌、Twitter、Facebook)都对兼容客户端使用 SPDY。SPDY 在被行业采用并证明能够大幅提升性能之后,已经具备了成为一个标准的条件。

在 HTTP/2 中,有了二进制分帧之后,HTTP/2 不再依赖 TCP 链接去实现多流并行了,在 HTTP/2中:

 

这一特性,性能会有极大的提升,因为:

服务器推送

服务端可以在发送页面HTML时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端可以主动把JS和CSS文件推送给客户端,而不需要客户端解析HTML再发送这些请求。服务端可以主动推送,客户端也有权利选择接收与否。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送RST_STREAM帧来拒收。主动推送也遵守同源策略,服务器不会随便推送第三方资源给客户端。

头部压缩

HTTP 1.1请求的大小变得越来越大,有时甚至会大于TCP窗口的初始大小,因为它们需要等待带着ACK的响应回来以后才能继续被发送。HTTP/2对消息头采用HPACK(专为http2头部设计的压缩格式)进行压缩传输,能够节省消息头占用的网络的流量。而HTTP/1.x每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。

HTTP 每一次通信都会携带一组头部,用于描述这次通信的的资源、浏览器属性、cookie 等,例如  

为了减少这块的开销并提升性能, HTTP/2会压缩这些首部:

例如:下图中的两个请求, 请求一发送了所有的头部字段,第二个请求则只需要发送差异数据,这样可以减少冗余数据,降低开销。

我们来看一个实际的例子,下面是用WireShark抓取的访问google首页的包: 

上图是是访问https://www.google.com/抓到的第一个请求的头部,可以看到头部的内容,总共占用了437 bytes,我们选中头部的cookie,可以看到cookie总共占用了118 bytes。接下来我们看看第二个请求的头部:

从上图可以看到,得益于头部压缩,第二个请求中cookie只占用了1个字节,我们来看看变化了的Accept字段: 

由于Accept字段与请求一中的内容不同,需要发送给服务器,所以占用了29 bytes。

PS: 这里有个akamai的HTTP /2 的演示链接,有兴趣的可以点击看看:

浏览器和网络服务支持情况:http2支持清单  

 

结语

又拍云 CDN 当前已全平台支持 HTTP/2,并已默认开启。又因 HTTP/2 是在 HTTPS 协议的基础上实现的,所以只要使用又拍云 HTTPS 加速服务的域名,都可免费享受 HTTP/2 服务,无需做任何特殊配置。而开启HTTPS,只需完成证书申请与管理,无须繁杂流程,轻松实现网站与 Web 应用的 HTTPS 加密部署。

 

参考资料:

  1. Jerry Qu blog 中的HTTP/2专题;

  2. 维基百科:HTTP/2

  3. RFC 7540 – 超文本传输协议第2版(HTTP / 2)

  4. FC 7541 – HPACK:HTTP / 2的头压缩:http://httpwg.org/specs/rfc7541.html

  5. http2讲解:https://ye11ow.gitbooks.io/http2-explained/content/part2.html

  6. http://www.cnblogs.com/yingsmirk/https://www.cnblogs.com/upyun/p/10275783.html

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信