`

HTTP/2

阅读更多

一, 概念

   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

   

     如何在Apache中启用HTTP/2 ?

 

  五, 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.csdn.net/liujianfei526/article/details/53289350 (发展史,差异)

          http://blog.csdn.net/zqjflash/article/details/50179235   (详解)

          http://www.cnbeta.com/articles/soft/197468.htm  (SDPY)

 

  • 大小: 98.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics