一, 概念
HTTP/2: 超文本传输协议第二版,最初命名HTTP 2.0.
主要基于SPDY协议(是google开发的基于TCP协议,以最小的网络延迟,提升网速,优化用户体验)
二, HTTP 发展史
HTTP/0.9: 1991年发布,极其简单,只有一个命令GET
e.g. GET /index.html /协议规定,服务器只能回应html格式的字符串,服务器发送完就关闭.
HTTP/1.0: 1996年五月发布. 引入了POST和HEAD命令,丰富了互动
请求和回应格式改变,除数据部分,每次通信必须包括头信息,用来描述一些元素
status, authorization, cache, content encoding......
HTTP/1.1: 1997年一月, 引入了持久连接,即TCP连接默认不关闭
HTTP/2: 2015年发布
三, HTTP/2新特性
- 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
- 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面
- header压缩. HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
- 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。目前,有大多数网站已经启用HTTP2.0,例如YouTuBe,淘宝网等网站,利用chrome控制台可以查看是否启用H2:
四, 如何实现HTTP/2
HTTP/2 的版本标识: 对应URI中的http或https,HTTP/2有2个版本标识
- “h2”对应以”https”开头的URI,表示HTTP/2是运行在TLS之上的,由TLS提供认证和加密等安全保障;
- “h2c”对应以”http”开头的URI,表示HTTP/2是运行在明文TCP之上的。
可通过查看protocol是否采用的是HTTP/2
HTTP2还未被所有浏览器所支持,因此在实施时要支持多种协议并存.
需要Http Server端支持HTTP2协议,据我所知Tengine尚未支持,
已支持的Server列表 https://github.com/http2/http2-spec/wiki/Implementations。
五, JAVA对HTTP/2的支持
java 9已有对此支持,涉及三个类:HTTPClient, HTTPRequest, HTTPResponse
e.g.
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://labs.consol.de/"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandler.asString());
System.out.println(response.statusCode());
System.out.println(response.body());
更多? http://www.linuxidc.com/Linux/2017-10/147686.htm
六, 扩展
1, HTTPS
HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题
再扩展: 如何把HTTP转HTTPS?
2, SPDY
SPDY的设计是为了解决HTTP的缺陷(每次请求都新建连接等)
SPDY的核心是帧管理层,管理两个端点间的连接和数据的传输.
两个端点间可以有多个数据流
如何启动支持: 启用Apache的 mod_spdy模块,
mod_spdy通过钩子(hook)修改了Apache的默认请求/响应处理过程并添加了SPDY处理。
3, 影响一个HTTP网络请求的因素
1, 带宽
2, 延迟
浏览器阻塞: 浏览器对同一个域名最多同时又4个连接(根据浏览器内核可能有一些差异),
超过最大连接限制,后续请求就会被阻塞
DNS查询: 浏览器需要知道目标服务器IP,才能建立连接,解析IP的系统就是DNS.
建立连接: HTTP 是基于 TCP 协议的,
浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的建立连接,
但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。
三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。
参考: http://web.jobbole.com/87695/
https://www.cnblogs.com/frankyou/p/6145485.html
http://www.sohu.com/a/161201715_714863
http://blog.youkuaiyun.com/liujianfei526/article/details/53289350 (发展史,差异)
http://blog.youkuaiyun.com/zqjflash/article/details/50179235 (详解)
http://www.cnbeta.com/articles/soft/197468.htm (SDPY)