HTTP详解之HTTP/2(含面试题)

·  阅读 1157

HTTP/2相关知识讲解

我们现在常用的HTTP版本是1.1,HTTP/2是又一次版本升级,那这次升级主要为了解决什么问题呢,让我们分析一下。

HTTP/1.1 相⽐ HTTP/1.0 提⾼了什么性能?

在HTTP/1.0中每次请求都要重新建立TCP连接(三次握手),增加了通信的开销。
HTTP1.1中使用长连接的方式改善了1.0中短连接造成的性能开销。HTTP1.1支持管道网络传输,只要第一个请求发送出去了,不必等待其消息返回,即可开始发出下一次请求,减少了整体的请求时间。但需要注意的是,服务器处理请求还是按照顺序处理的,这就造成如果一旦某个请求响应慢,那么后面的请求都会被阻塞,这就是著名的“队头阻塞”。

分析下HTTP/1.1存在的问题

  • 请求/响应头无法压缩,头字段信息越多延迟就越大。很多请求中,请求头中的字段长度远远大于请求体字段,HTTP成了不折不扣的大头儿子。重要的是,多个请求中,很多请求头中的字段是重复的,非常浪费。
  • 队头阻塞
  • 只能从客户端发出请求,服务端响应请求

简单说一下HTTP/2

公认的HTTP的性能有待提升,所以推出了HTTP/2,HTTP/2的升级分为“语义”和“语法”两个部分,“语义”方面不做改动,与HTTP/1完全一致,比如请求方法、头字段、URI,状态码等概念,这样就消除了再学习成本。在“语法”方面做了相关的改动,如下。
出于兼容考虑,HTTP/2仍旧使用明文,但是由于HTTPS已经是大势所趋,而且各大浏览器公开宣布只支持加密的HTTP/2,所以HTTP/2事实上是加密的。为了区分明文和秘文,HTTP/2 协议定义了两个字符串标识符:“h2”表示加密的 HTTP/2,“h2c”表示明文的 HTTP/2。 http:2.png

HTTP/2是如何解决HTTP/1.1中存在的问题的呢?

  • 头部压缩: HTTP/2会对头部进行压缩,采用的是HPACK算法。在客户端和服务端建立“字典”,所有的字段会存入这个表中,生成一个索引,以后就不会发送重复的字段,用索引来代替,这样就提高了效率。
  • 二进制分帧: HTTP/2不再采用纯文本形式的报文,而是采用二进制格式。将Header和body打散成多个“二进制”帧。这样对人虽然不友好,但是对计算器是非常友好的,计算器就省去了将纯文本转化为二进制的过程,提高了效率。
  • 数据流:消息碎片(上文的二进制帧)到达后如何组装起来呢?HTTP/2为此定义了一个“流(stream)”的概念,它是二进制帧双向传递的一个序列,这些帧按照次序组装起来就是之前的请求头和响应头。因为流是虚拟的,所以HTTP/2可以在一个TCP连接上用“流”同时发送多个碎片化信息,不用按照顺序发送,这就是常说的多路复用。多个请求之间没有了顺序关系,不需要排队等待,也就不会出现“队头阻塞”问题。
  • 服务器推送:服务器不再是完全被动地响应请求,也可以新建“流”主动向客户端发送消息。比如,在浏览器刚请求 HTML 的时候就提前把可能会用到的 JS、CSS 文件发给客户端,减少等待的延迟.

HTTP/2还有哪些缺陷?

用了HTTP/2之后,基本上解决了“队头阻塞”这个大难题,为什么说是基本上呢?因为HTTP是跑在TCP之上的,TCP是可靠的传输协议,也就是说TCP为了保证可靠传输,一旦有包丢失,就会触发“丢包重传机制”,TCP协议栈就会停下来等待重传这个丢失的包,这就又出现了“队头阻塞”。但是这是TCP协议固有的规则,HTTP/2如何设计都不能解决这个问题,这就有了下一个版本HTTP/3.

HTTP/3做了哪些优化?

发明了一个新的协议“QUIC”,让HTTP跑在QUIC上而不是TCP上,这个“HTTP over QUIC”就是HTTP/3,目前HTTP3还处在草案阶段。 http3.png 从上图中可以看出,HTTP/3将TCP移除,换成了UDP。UDP是不管顺序也不管丢包的,所以不会出现上述所说的丢包重传的问题。UDP是简单的不可靠的传输协议,那么基于UDP的QUIC是如何实现可靠传输的呢?

  • QUIC引入的概念,单个流可能会被阻塞,但是其他不受影响
  • QUIC使用TLS1.3。但QUIC并没有使用TLS1.3,而是在内部包含流TLS1.3,它使用自己的帧接管了TLS里的“记录”,省掉了一次开销。
  • 头部压缩算法在 HTTP/3 里升级成了“QPACK”

所以QUIC相当于是⼀个在UDP之上的伪TCP + TLS + HTTP/2的多路复⽤的协议。
HTTPS 要建⽴⼀个连接,要花费 6 次交互,先是建⽴三次握⼿,然后是 TLS/1.3 的三次握⼿。 QUIC 直接把以往的 TCP 和 TLS/1.3 的 6 次交互合并成了 3 次,减少了交互次数。

常见面试题汇总

Q: 谈谈 HTTP/2 是如何解决“队头阻塞”问题的

A: HTTP/1会产生队头阻塞的原因是请求都是排队处理的,所以必须等待之前请求的都返回才能处理后续请求。而HTTP/2是乱序的,彼此并没有依赖,利用可并发的流,同时发送多个流传输数据,也就没有了队头阻塞。但我们需要知道的是,这解决的是应用层的队头阻塞,在其下层,也就是TCP协议中,还有可能发生“队头阻塞”这也是HTTP/3的内容

Q: 简单讲解一下http2的多路复用

A: 简单理解多路复用指的就是在HTTP/2中,一个连接上可以同时发送多个流传输数据,也就是并发多请求,流之间是没有固定关系的,彼此独立,但是流内部的帧是有严格的顺序限制的。为了理解流与传递报文之间的关系,我们可以回头看看二进制分帧相关的知识。
HTTP/2中将报文拆分成了二进制的帧准备传递。HTTP/2中的帧结构很小,只有9个字节,结构如下: zhen.png帧长度”占三个字节,HTTP/2的帧通常不超过16k,最大不超过16M;
帧类型”占一个字节,大致分为数据帧控制帧两类;
帧标志信息”占一个字节,可以存8个标志位,携带简单的控制信息; “流标志符”占四个字节,表示当前帧所属的流,接收方可以使用它从乱序的帧里面识别出来具有相同流id的帧序列,按顺序组装起来就是虚拟的流。
下图显示了连接中无序的帧是如何依据流ID重组成流的。

流.png

分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改