(一) 初识HTTP/2
2016-01-07 17:46
197 查看
HTTP/2是HTTP协议家族的新成员,按照IETF的HTTP Working Group的规划,它将取代“历史悠久”的HTTP1.1协议。
现在,浏览器打开一个新网页,下载的内容不仅仅包含一个HTML文件和少数资源文件了。实际情况可能是,浏览器发起了数十次,甚至数百次HTTP请求,除了一个HTML主体文件,还有大量的图片、CSS、JavaScript等资源。
HTTP加载这些资源的方式是低效率的,因为它要求同一时间在每个TCP连接上只能有一个正在进行的HTTP请求。相对于HTTP/1.0,HTTP/1.1引入了持久连接和管道等技术,在一定程度上缓解了并发请求的问题,提高了网络传输的效率,但是,同一TCP连接上的请求仍然是有序进行的,队首阻塞(Head-of-line blocking)现象依然存在。因此,在加载同一个网页的大量资源时,为了提高并发以减少延迟,浏览器不得不同时打开多个到相同服务端的TCP连接(浏览器通常会对连接数进行限制,目的是减少网络和内存开销,同时避免影响其它程序的正常工作)。这些并发的TCP连接,以及其上传输的大量类似的HTTP请求(包含大量重复的HTTP头信息),造成了不必要的网络开销,既浪费又低效(大量数据包在遭遇TCP慢启动和拥塞避免机制时,网络延迟可能会更严重)。
使用多路复用技术,而不是有序和阻塞的请求
使用单一的TCP连接来实现并行处理
采用HTTP头压缩技术
允许服务端主动向客户端推送响应
下面这张图很好地展现了HTTP各个版本中获取资源的时间对比,很明显,HTTP/2具有很大的优势。
(注:图片来自http://blog.scottlogic.com/2014/11/07/http-2-a-quick-look.html)
HTTP/2为HTTP语义提供了优化传输,它兼容HTTP/1.1的全部核心特性,并且,在许多方面更加高效。
在HTTP/2中,基本的传输单元是“帧”。HTTP/2定义了多种帧类型,每种帧类型都有自己的二进制格式,用来提供不同的功能。其中,HEADERS和DATA这2种帧构成了HTTP请求和响应的基础,SETTINGS,WINDOW_UPDATE和PUSH_PROMISE等帧类型用于支持其它特性。
通过为每个HTTP请求/响应分配自己的“流”,HTTP/2实现了请求的多路复用。不同的流之间是彼此独立的,因此,一个请求或响应流的阻塞不会影响其它流的处理。
“流量控制”和“优先级”能够确保高效地使用多路“流”。流量控制有助于确保只有接收方能够使用的数据才会被真正传输。优先级确保有限的资源能够优先被最重要的流直接使用。
“服务端推送”允许服务端在预测到客户端需要哪些数据时,主动将这些数据发送给客户端,也就是说,以一些网络传输为代价来避免潜在的网络延迟。服务端通过合成一个包含PUSH_PROMISE帧的请求来实现推送,然后,服务端可以在一个单独的流里面发送响应给这个合成的请求。
在一个TCP连接中,HTTP头域包含大量的冗余数据,因此,包含这些数据的帧是经过压缩的。通常情况下,这样能够显著地减小请求报文。
HTTP/2 TECHNOLOGY DEMO
这是一个HTTP/2技术的演示网站,它可以分别采用HTTP1.1和HTTP/2这两种方式来分别下载由200张小图构成的大图,并对比这两种情况花费的时间。效果图如下:
如果你安装了Chrome浏览器(或其它类似的浏览器),那么可以使用快捷键F12打开开发者工具,并分别观察这两种情况的HTTP协议报头等信息。
HTTP1.1抓包结果(部分图片):
HTTP2抓包结果(部分图片):
通过上面两张图片,可以很清晰地看到,HTTP1.1下载大量图片时基本是串行的,而HTTP/2下载大量图片时几乎是并行的。
对一个HTTP2请求的协议内容进行观察,发现Header部分中包含以英文冒号开头的报头字段,表明这个请求确实是通过HTTP2协议完成的。
也来试试吧!
为什么修改HTTP呢?
HTTP协议的上一个版本是HTTP1.1,在它“服役”超过16年的今天,Web的世界已经发生了巨大的变化。现在,浏览器打开一个新网页,下载的内容不仅仅包含一个HTML文件和少数资源文件了。实际情况可能是,浏览器发起了数十次,甚至数百次HTTP请求,除了一个HTML主体文件,还有大量的图片、CSS、JavaScript等资源。
HTTP加载这些资源的方式是低效率的,因为它要求同一时间在每个TCP连接上只能有一个正在进行的HTTP请求。相对于HTTP/1.0,HTTP/1.1引入了持久连接和管道等技术,在一定程度上缓解了并发请求的问题,提高了网络传输的效率,但是,同一TCP连接上的请求仍然是有序进行的,队首阻塞(Head-of-line blocking)现象依然存在。因此,在加载同一个网页的大量资源时,为了提高并发以减少延迟,浏览器不得不同时打开多个到相同服务端的TCP连接(浏览器通常会对连接数进行限制,目的是减少网络和内存开销,同时避免影响其它程序的正常工作)。这些并发的TCP连接,以及其上传输的大量类似的HTTP请求(包含大量重复的HTTP头信息),造成了不必要的网络开销,既浪费又低效(大量数据包在遭遇TCP慢启动和拥塞避免机制时,网络延迟可能会更严重)。
HTTP/2与HTTP1.1相比,有哪些不同呢?
采用二进制协议,而不是文本协议使用多路复用技术,而不是有序和阻塞的请求
使用单一的TCP连接来实现并行处理
采用HTTP头压缩技术
允许服务端主动向客户端推送响应
下面这张图很好地展现了HTTP各个版本中获取资源的时间对比,很明显,HTTP/2具有很大的优势。
(注:图片来自http://blog.scottlogic.com/2014/11/07/http-2-a-quick-look.html)
HTTP/2概况
HTTP/2协议以SPDY协议为基础,并吸收借鉴了其它一些项目的优点。HTTP/2为HTTP语义提供了优化传输,它兼容HTTP/1.1的全部核心特性,并且,在许多方面更加高效。
在HTTP/2中,基本的传输单元是“帧”。HTTP/2定义了多种帧类型,每种帧类型都有自己的二进制格式,用来提供不同的功能。其中,HEADERS和DATA这2种帧构成了HTTP请求和响应的基础,SETTINGS,WINDOW_UPDATE和PUSH_PROMISE等帧类型用于支持其它特性。
通过为每个HTTP请求/响应分配自己的“流”,HTTP/2实现了请求的多路复用。不同的流之间是彼此独立的,因此,一个请求或响应流的阻塞不会影响其它流的处理。
“流量控制”和“优先级”能够确保高效地使用多路“流”。流量控制有助于确保只有接收方能够使用的数据才会被真正传输。优先级确保有限的资源能够优先被最重要的流直接使用。
“服务端推送”允许服务端在预测到客户端需要哪些数据时,主动将这些数据发送给客户端,也就是说,以一些网络传输为代价来避免潜在的网络延迟。服务端通过合成一个包含PUSH_PROMISE帧的请求来实现推送,然后,服务端可以在一个单独的流里面发送响应给这个合成的请求。
在一个TCP连接中,HTTP头域包含大量的冗余数据,因此,包含这些数据的帧是经过压缩的。通常情况下,这样能够显著地减小请求报文。
HTTP/2的Demo网站
目前网络上支持HTTP/2的网站还不多,幸好,找到了一个HTTP/2的Demo网站,可以让我们直观地观察和分析HTTP/2的行为。HTTP/2 TECHNOLOGY DEMO
这是一个HTTP/2技术的演示网站,它可以分别采用HTTP1.1和HTTP/2这两种方式来分别下载由200张小图构成的大图,并对比这两种情况花费的时间。效果图如下:
如果你安装了Chrome浏览器(或其它类似的浏览器),那么可以使用快捷键F12打开开发者工具,并分别观察这两种情况的HTTP协议报头等信息。
HTTP1.1抓包结果(部分图片):
HTTP2抓包结果(部分图片):
通过上面两张图片,可以很清晰地看到,HTTP1.1下载大量图片时基本是串行的,而HTTP/2下载大量图片时几乎是并行的。
对一个HTTP2请求的协议内容进行观察,发现Header部分中包含以英文冒号开头的报头字段,表明这个请求确实是通过HTTP2协议完成的。
也来试试吧!
相关文章推荐
- Android 网络开源库之-retrofit
- http post不使用库,上传带参数的文件时的消息体样式
- http、TCP/IP协议与socket之间的区别
- Android主流网络请求框架Volley
- 使用httpclient上传文件
- AssetsLibrary从网上下载图片,保存到相册,保存网络图片,
- nginx HTTP Upstream模块
- 使用ASIHTTPRequest 编译提示找不到"libxml/HTMLparser.h"的解决方法
- android BroadcastReceiver动态监听网络连接
- TCP滑动窗口机制
- 一次tcp连接被reset的异常故障排查
- HTTP状态码总结
- 网络编程 java
- iOS9请求出现App Transport ... cleartext HTTP (http://)---HTTPS改HTTP
- mac下搭建http服务器(apache+php)并实现上传功能
- http--发送get请求获取网页
- 网络基础原理
- RNN学习笔记(二)-Gradient Analysis
- 转载 注解@PostConstruct与@PreDestroy讲解及实例 - 云淡风轻、仅此一抹 - 博客频道 - CSDN.NET http://blog.csdn.net/yaerfeng/art
- 404、500、502等HTTP状态码介绍