杂谈:HTTP1.1 与 HTTP2.0 知多少?

作者 : 开心源码 本文共2654个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共58人阅读

HTTP是应使用层协议,是基于TCP底层协议而来。

TCP的机制限定,每建立一个连接需要3次握手,断开连接则需要4次挥手。

HTTP协议采使用“请求-应答”模式,HTTP1.0下,HTTP1.1非Keep-Alive模式下,每个请求都要新建一个连接,完成之后立即断开连接。假如有新的请求,则要重新创立请求连接(HTTP协议为无连接的协议)。

这样不免造成了网络传输数据肯定的推迟,1999年推出HTTP1.1,尽管可以通过设置推迟时间,让连接推迟关闭。但依然有线头阻塞,max-connection最大连接限制了并行请求数量等痛点,难以应对日益增长的大数据实时传输。

新一代HTTP2.0协议应运而生,提高HTTP应对高并发场景下的数据传输能力。

杂谈:HTTP1.1 与 HTTP2.0 知多少?

「 HTTP1.1」

Pipelining管道化

提出管道化方案处理连接推迟,服务端能设置Keep-Alive来让连接推迟关闭时间,但由于浏览器自身的Max-Connection最大连接限制,同一个域名 (host) 下的请求连接限制(同域下谷歌浏览器是一次限制最多6个连接),只能通过多开域名来实现,这也就是我们的静态资源选择放到CDN上或者其它域名下,来提高资源加载速度。

pipelining方案需要前后台支持,但绝大部分的HTTP代理商器对pipelining的支持并不友好。

只支持GET/HEAD

pipelining只支持GET/HEAD方式传送数据,不支持POST等其它方式传输。

头部信息冗余

HTTP是无状态的,用户端/服务端只能通过HEAD的数据维护获取状态信息,这样就造成每次连接请求时都会携带大量冗余的头部信息,头部信息包括COOKIE信息等。

超文本协议

HTTP1.X是超文本协议传输。超文本协议传输,发送请求时会找出数据的开头和结尾帧的位置,并去除多余空格,选择最优方式传输。假如用了HTTPS,那么还会对数据进行加密解决,肯定程度上会造成传输速度上的损耗。

线头阻塞

pipelining通过推迟连接关闭的方案,尽管可同时发起对服务端的多个请求,但服务端的response仍旧遵循FIFO(first in first out)规则 依次返回。

举个例子用户端发送了1、2、3、4四个请求,假如1没返回给用户端,那么2,3,4也不会返回。这就是所谓的线头阻塞。高并发高推迟的场景下阻塞显著。

HTTP1.X传输优化方法

  1. 多个资源合并成一个请求连接,如前台Spriting雪碧图,JS/CSS压缩成一个文件等
  2. Inlining内联的方式,采使用inline css/inline js等并入html中,减少对css/js文件的请求
  3. CDN资源多域名转发,静态资源分布存储在多个域下。

以上三种三种方法尽管能使HTTP1.X协议传输速度提高,但也有对应的不足。

  1. 如雪碧图,将多个小图合并成一张大图,降低多张小图请求的高推迟,但是假如我只想要两个icon小图,却需要加载一整张大图,就会造成资源冗余。合并的JS/CSS文件也有相似的问题。
  2. 内联的方式,会让我们的代码变得难以维护,让html文件变得更大,代码混合严重。
  3. 多域名下可缓解Max-Connection,但不同域会让Cookie信息无法彼此共享。

理解完HTTP1.1的痛点,接下来就是我们新一代的HTTP协议HTTP2.0


「 HTTP2.0」

前身SPDY

SPDY是2012年谷歌推出的是基于SSL/TLS的传输协议,SPDY有降低推迟,多路复使用,头部压缩,服务端推送等特点,这些特点也称为了后续HTTP2.0的功能基石,HTTP2.0是SPDY/3 draft的优化版。

HTTP2.0 与 SPDY的区别:

  1. HTTP2.0 头部压缩采使用HPACK, 而SPDY采使用DELEFT。
  2. HTTP2.0 理论上支持明文HTTP传输,而SPDY强制用HTTPS。

多路复使用

(一个域只需一个TCP连接)实现真正的并发请求,降低延时,提高了带宽的利使用率。

头部压缩

用户端/服务端进行渐进升级维护,采使用HPACK压缩,节省了报文头占使用流量。

  1. 相同的头部信息不会通过请求发送,延使用之前请求携带的头部信息。
  2. 新添加/修改的头部信息会被加入到HEAD中,两端渐进升级。

两端会共同维护一个head list,每次请求时都会进行检查。
该list包括:

  1. static (既定的头部信息)
  2. dynamic (自己设置的头部信息)

请求优先级

每个流都有自己的优先级别,用户端可指定优先级。并可以做流量控制。由于HTTP2.0的传世允许请求并发,但是应使用场景中我们要解决少量主要文件的优先级权重,以及资源板块依赖等。所以我们可通过设置优先级来提高主要文件的权重,使其优先加载请求。

服务端推送

请求不是来自用户端“明确”的请求,是从服务端PUSH_PROMISE帧中提供。例如我们加载index.html, 我们可能还需要index.js, index.css等文件。传统的请求只有当拿到index.html,解析html中对index.js/index.css的引入才会再请求资源加载,但是通过服务端数据,可以提前将资源推送给用户端,这样用户端要使用到的时候直接调使用就可,不使用再发送请求。

  • push的资源能缓存在浏览器中
  • 不同的网页能用该缓存,不使用重新发起
  • push的资源通过multiplexed进行传输
  • push的资源能够进行priority标识
  • client有权取消push资源的加载
  • push的资源必需同域

二进制协议

HTTP2.0 传输协议采使用二进制协议,区别与HTTP1.X的超文本协议。更易于帧,数据包的发送接收。HTTP2.0是运行在TCP连接上的应使用层协议,接受服务器或者发送请求时,会自动将头部信息/request body分成HEAD帧和DATA帧。

用户端/服务端发送/接收数据时,会将数据打散乱序发送,接收数据时接收一端再通过streamID标识来将数据合并。

HTTP2.0环境要求

HTTP2.0理论上支持明文HTTP传输,但由于其前身SPDY是在TLS上,他们的主人Google 和 Firefox 都支持TLS架构,所以需要搭建HTTP2.0 + TLS成了标准。

  1. Nginx > 1.10
  2. OpenSSL > 1.0.2
  3. CA证书

参考文档

  • HTTP协议头部与Keep-Alive模式详解
  • HTTP,HTTP2.0,SPDY,HTTPS你应该知道的少量事
  • 前台应该理解的HTTP2
  • 一文读懂 HTTP/2 特性

作者:以乐之名
本文原创,有不当的地方欢迎指出。转载请指明出处。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 杂谈:HTTP1.1 与 HTTP2.0 知多少?

发表回复