当前位置: 首页 > 图灵资讯 > 技术篇> 一文解读HTTP2 (转)

一文解读HTTP2 (转)

来源:图灵教育
时间:2023-06-14 09:43:39

作为一个经常处理网络的程序员,有必要理解这些协议,本文将介绍这些协议的区别和基本概念,本文可能不局限于前端知识,还包括一些操作和维护,协议知识,希望给读者带来一些收获,如果有错误,请指出。

1.web始祖HTTP

全称:超文本传输协议(HyperText Transfer Protocol) 随着计算机网络和浏览器的诞生,HTTP1.在计算机网络中的应用层中,HTTP是基于TCP协议的,因此HTTP协议的瓶颈及其优化技巧都是基于TCP协议本身的特点,例如,TCP建立连接三次握手,断开连接四次挥手,以及每次建立连接带来的RTT延迟时间。

2. HTTP和现代浏览器

早在HTTP成立之初,主要是为了标记超文本语言(HTML)文档从Web服务器传输到客户端浏览器。也就是说,对于前端,我们写的HTML页面将被放置在我们的网络服务器上,用户通过浏览器访问URL地址来获取网页的显示内容,但自WEB2.0以来,我们的页面变得复杂,不仅是一些简单的文本和图片,而且我们的HTML页面有CSS,Javascript,丰富我们的页面显示,当ajax出现时,我们有另一种方法可以从服务器端获取数据,这实际上是基于HTTP协议的。同样,在移动互联网时代,我们的页面可以在移动浏览器中运行,但与PC相比,移动网络的情况更加复杂,这使得我们开始深入了解和优化HTTP。

3. 基本优化HTTP

影响HTTP网络要求的主要因素有两个:带宽和延迟。

  • 带宽:如果我们仍处于拨号互联网阶段,带宽可能会成为严重影响请求的问题,但现在网络基础设施的建设大大提高了带宽,我们不再担心带宽会影响网络速度,所以只有延迟。
  • 延迟:
  1. 浏览器阻塞(HOL blocking):由于某些原因,浏览器会阻止请求。浏览器只能同时拥有相同的域名 4 一个连接(根据浏览器内核可能会有所不同),超过浏览器最大连接数的限制,后续请求将被阻塞。
  2. DNS 查询(DNS Lookup):浏览器需要知道目标服务器 IP 建立连接。将域名分析为 IP 这个系统就是 DNS。DNS缓存结果通常可以用来减少这个时间。
  3. 建立连接(Initial connection):HTTP 是基于 TCP 如果达成协议,浏览器必须在第三次握手时尽快携带 HTTP 请求报告,以实现真正的连接,但这些连接不能重复使用,将导致每个请求经历三次握手和缓慢启动。三次握手在高延迟的情况下有明显的影响,而缓慢启动对大型文件请求有很大的影响。
4. HTTP1.HTTP1.1与HTTP1的一些区别

HTTP1.0第一次在网页上使用是在1996年,当时只使用一些相对简单的网页和网络请求,而HTTP1.1在1999年开始广泛应用于当前的主要浏览器网络请求,而HTTP1.1也是目前使用最广泛的HTTP协议。主要的区别主要体现在:

  1. header中的If主要用于缓存处理,HTTP1.0-Modified-Since,HTTP1作为缓存判断的标准.Entityy等缓存控制策略引入了更多的缓存控制策略 tag,If-Unmodified-Since, If-Match, If-None-更多可供选择的缓存头来控制缓存策略,如Match。
  2. HTTP1用于带宽优化和网络连接.在0中,有一些浪费带宽的现象。例如,客户端只需要某个对象的一部分,而服务器发送整个对象,不支持断点传输功能。HTTP1.1.range头域被引入请求头,允许只要求资源的一部分,即206年返回码(Partial Content),这样,开发者就可以自由选择,充分利用带宽和连接。
  3. HTTP1.1中增加了24个错误状态响应码,如409(Conflict)要求的资源与资源的当前状态发生冲突;410(Gone)这意味着服务器上的资源被永久删除。
  4. Host头处理认为,HTTP1.0中的每个服务器都绑定了唯一的IP地址。因此,请求消息中的URL没有传输主机名称(hostname)。然而,随着虚拟主机技术的发展,多个虚拟主机可以存在于物理服务器上(Multi-homed Web Servers),并且它们共享IP地址。HTTP1.1.请求信息和响应信息应支持Host头域,如果没有Host头域,请求信息将报告错误(400 Bad Request)。
  5. 长连接,HTTP 1.1支持长连接(PersistentConnection)以及要求的流水线(Pipelining)处理可以在TCP连接上传输多个HTTP请求和响应,减少建立和关闭连接的消耗和延迟,并在HTTP1.1中默认打开Conection: keep-alive,在一定程度上弥补了HTTP1.0每个请求都要创建连接的缺点。以下是常见的HTTP1.0:
5. HTTP1.0和1.1存在的一些问题
  1. 上面提到的HTTP1.x在传输数据时,每次都需要重建连接,这无疑会增加很多延迟,尤其是在移动端。
  2. HTTP1.x传输数据时,所有传输的内容都是明确的,客户端和服务器端不能验证对方的身份,这在一定程度上不能保证数据的安全。
  3. HTTP1.x使用时,header携带的内容太大,在一定程度上增加了传输成本,每次要求header基本变化不大,尤其是在移动终端增加用户流量。
  4. 尽管HTTP1.x支持keep-alive,为了弥补多次创建连接造成的延迟,但keep-alive的使用也会给服务端带来很大的性能压力,并不断要求单个文件的服务(如图片存储网站),keep-alive可能会对性能产生很大的影响,因为它在文件被要求后长时间保持不必要的连接。
6. HTTPS应声而出

为解决上述问题,网景于1994年创建了HTTPS,并应用于网景导航浏览器。 起初,HTTPS与SSL一起使用;当SSL逐渐演变为TLS时(事实上,两者是一件事,但名称不同),最新的HTTPS也在2000年5月发布 2818正式确定。简单来说,HTTPS是HTTP的安全版,由于当今时代对安全的要求更高,chrome和firefox都大力支持网站使用HTTPS,苹果也在ios。 强制app在10系统中使用HTTPS传输数据,说明HTTPS势在必行。

7. HTTPS和HTTP有一些区别
  1. HTTPS协议需要向CA申请证书,一般免费证书很少,需要付费。
  2. HTTP协议在TCP上运行,所有传输内容均为明文,HTTPS在SSL/TLS上运行,SSL/TLS在TCP上运行,所有传输的内容都加密了。
  3. HTTP和HTTPS使用完全不同的连接方式,使用不同的端口,前者是80,后者是443。
  4. HTTPS能有效防止运营商劫持,解决防劫持大问题。
8. HTTPS改造

如果一个网站要用HTTP代替HTTPS,可能需要注意以下几点:

  1. 安装CA证书,一般证书需要收费,这里推荐一个更好的购买证书网站:1)Let's Encrypt,免费快捷,支持多域名(不是通配符),三个命令立即签署+导出证书。缺点是暂时只有三个月的有效期,到期需要续签。2comodo PositiveSSL,但是收费比较稳定。
  2. 购买证书后,在证书提供的网站上配置自己的域名,下载证书后,配置自己的web服务器,同时进行代码转换。
  3. HTTPS 降低用户访问速度。SSL握手,HTTPS 只要经过合理的优化和部署,速度就会有一定程度的降低,HTTPS 对速度的影响是完全可以接受的。在许多情况下,HTTPS 速度一点也不逊色 HTTP,如果使用 SPDY,HTTPS 甚至比 HTTP 快。
  4. 事实上,与HTTPS相比,更需要关注服务器端的CPU压力。HTTPS中大量的密钥算法会消耗大量的CPU资源,只有足够的优化,HTTPS 机器成本不会显著增加。

推荐一篇关于淘宝改造HTTPS的文章。

9. 使用SPDY来加快你的网站速度

2012年,google提出了SPDY解决方案,大家开始积极看待和解决旧版HTTP协议本身的问题。SPDY可以说是HTTPS和HTTP的传输协议,主要解决方案是:

  1. 针对HTTP高延迟的问题,SPDY优雅地采用了多路复用(multiplexing)。通过多个请求stream共享tcp连接,多路复用解决了HOL blocking的问题降低了延迟,提高了带宽的利用率。
  2. 请求优先级(request prioritization)。多路复用带来的一个新问题是,关键请求可能会在连接共享的基础上被阻塞。SPDY允许为每个request设置优先级,以便优先响应重要请求。例如,当浏览器加载主页时,应优先显示主页的html内容,然后加载各种静态资源文件和脚本文件,以确保用户能够在第一时间看到网页内容。
  3. header压缩。前面提到了HTTP1.x的header经常重复多余。选择合适的压缩算法可以减少包的大小和数量。
  4. 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。
  5. 服务端推送(server push),使用SPDY网页,比如我的网页有sytle.css请求,在客户端收到sytle.在css数据的同时,服务器将sytle.js文件推送给客户端,当客户端再次尝试获取sytle时.js可以直接从缓存中获得,无需再发请求。

SPDY位于HTTP、TCP和SSL之下,可以轻松兼容旧版HTTP协议(HTTP1.x的内容包装成新的frame格式),现有的SSL功能可以同时使用。

10. HTTP2.0的前世今生

顾名思义,HTTP1.x,然后HTTP2.0自然会出现。HTTP2.0可以说是SPDY的升级版(其实原本是基于SPDY设计的),但是HTTP2.0跟 SPDY 主要有以下两点:

  • HTTP2.0支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
  • HTTP2.0 HPACK是消息头的压缩算法,而不是 SPDY DEFLATE采用DEFLATE
11. HTTP2.0的新特性
  • 新的二进制格式(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的大小,通信双方都有自己的cacheheheader fields表不仅避免了重复header的传输,而且减少了需要传输的尺寸。
  • 服务端推送(server push),和SPDY一样,HTTP2.也有serverer push功能。目前,大多数网站都使用了HTTP2.0,如YouTube、淘宝等网站。您可以使用chrome控制台查看是否使用H2:

更多关于HTTP2的问题可供参考:HTTP2奇妙的日常生活,以及HTTP2.0的官方网站。

12. HTTP2.0的升级改造

与HTTPS升级改造相比,HTTP2.也许有点简单,你可能需要注意以下问题:

  1. 上面提到HTTP2.0实际上可以支持非HTTPS,但现在主流浏览器如chrome,firefox表示只支持基于 TLS 部署HTTP2.0协议,所以最好先升级HTTP2.0。
  2. 当您的网站升级HTTPS时,升级HTTP2.0要容易得多。如果您使用NGINX,只需在配置文件中启动相应的协议。您可以参考NGINX白皮书和NGINX配置HTTP2.0的官方指南。
  3. 如果使用HTTP2.0,原HTTP1.x该怎么办?其实不用担心这个问题。HTTP2.完全兼容HTTP10.NGINX将自动向下兼容不支持HTTP2.0的浏览器。
后记
  1. 以上是关于HTTP,HTTP2.0,SPDY,HTTPS的一些基本理论,有些内容没有深入解释,可以跟进参考链接具体查看。
  2. 关于HTTP1.x的一些优化方法,如文件合并压缩、资源cdn、js,与HTTP2.0和HTTPS相比,css优化等等,因此web前端的优化还需要继续进行。
  3. 事实上,随着WEB的快速发展,一些技术真的需要与时俱进,就像苹果宣布ios一样 10必须从HTTPS开始,web协议创新已经开始。为了更好的性能和更好的方式,现在就开始升级改造吧

参考资料:

  • http://www.nihaoshijie.com.cn/index.图灵/archives/630
  • https://www.nginx.com/blog/7-tips-for-faster-http2-performance/
  • https://www.gitbook.com/book/ye11ow/http2-explained/details
  • http://op.baidu.com/2015/04/https-s01a01/