HTTP 2

推荐阅读:https://segmentfault.com/a/1190000011172823?utm_source=tag-newest

进来支持 HTTP 2 的网站越来愈多了,这是一个很好的趋势。虽然 HTTP 2 的 RFC 写得很厚,但是总的来说可以总结为以下几点:

1. 通过 TCP 多路复用,降低延迟

3. 强制使用 TLS,保证安全性问题

4. 头部压缩

5. Server Push

多路复用

简单的来说,就是所有HTTP请求都走同一个TCP。

在 HTTP 1.1

实现并发,一般是通过建立多个TCP连接来实现,现代浏览器支持最大并发数一般达到6~10(chrome 最多6个)。

虽然 HTTP 1.1 规范给出来 Pipelining,但是受限于出现的一些问题,浏览器都是默认关闭的 :

A client that supports persistent connections MAY "pipeline" its requests (i.e., send multiple requests without waiting for each response).
A server MUST send its responses to those requests in the same order that the requests were received.
一个支持持久连接的客户端可以在一个连接中发送多个请求(不需要等待任意请求的响应)。收到请求的服务器必须按照请求收到的顺序发送响应。

因为 HTTP 1.1 是基于文本的,所以并不能区分Response对应的是哪个请求,因此,只能规定必须按顺序返回响应,这样就会有一个“队首阻塞”的问题。

即使靠后接受到的请求,已经处理完毕,也得需要前面的请求处理好了,才能往回响应。

这样的话,实际TCP只能串行响应请求。

在 HTTP 2

改变 HTTP 基于文本的特性,变成基于流。

每一个请求都是一个流,每个流由多个帧组成,可以简单理解成每一次传输就是一帧。

帧头会有标识,来表示这一帧是属于那个流(请求)的。

这样的话,一个TCP连接就不会因为一个HTTP请求响应慢,而阻塞了,因此对于并发,我们完全可以用一个TCP请求就可以了。

我们来看看下面的图:

HTTP/1.1通过pipelining管道技术实现一次性发送多个请求,以期提高吞吐和性能,如上图中的序列2。

如果,第一个请求被堵塞了,则后面的请求即使处理完毕了,也需要等待,如上图中的序列3。

那么,HTTP/2是怎么解决这个问题的呢?

那就是数据分帧:多个请求复用一个TCP连接,然后每个request-response都被拆分为若干个帧发送,这样即使一个请求被阻塞了,也不会影响其他请求,如上图序列4所示。

PS:值得注意的是“多路复用”,仅仅解决了 HTTP 1.1 在应用层上的限制(不允许响应数据交错到达),而如果 HTTP 的传输层仍然采用TCP的话,TCP在传输层的“队首阻塞”也仍然存在(就是丢包的时候,需要后续的包等待丢的包重传到达。)如果这样的话,这个丢包的影响,在HTTP 2 甚至比 HTTP  1.1 更严重,因为只有一个 TCP连接,而这个 TCP 发生了 对首阻塞”。

推荐阅读:https://www.zhihu.com/question/65900752/answer/255085226

        https://www.jianshu.com/p/11c2614ef3f2

TLS 和 SSL

对于 HTTP 2 浏览器会强制使用TLS(实际上现在我们用的都是TLS,但是由于历史上的习惯,我们都叫它做SSL)

SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。

头部压缩

1. 使用 HPACK 压缩格式,对 header 进行压缩

2. 双方维护一份头部索引表,如果是已经发送过的相同的头部,用索引号来代替(例如cookie只需要发送一次,如果没有发生变化,下次用索引号代替)

服务端 Push

如果服务端接收到客户端主请求,能够“预测”主请求的依赖资源,在响应主请求的同时,主动并发推送依赖资源至客户端。客户端解析主请求响应后,可以”无延时”从本地缓存获取依赖资源, 减少访问延时, 提高访问体验,也加大了链路的并发能力。

server push 和 websocket 的区别:https://blog.csdn.net/axman/article/details/79875463

HTTP 3

如果底层始终是基于TCP的话,那么我们始终存在“队首阻塞”的问题。

因此,google 另起炉灶,搞了一个基于UDP的QUIC协议,因此我们所提到的HTTP 3还有一个名字叫做HTTP-over-QUIC

QUIC

之前我们了解过 UDP 协议的内容,知道这个协议虽然效率很高,但是并不是那么的可靠。QUIC 虽然基于 UDP,但是在原本的基础上新增了很多功能:

多路复用

HTTP 2 支持多路复用,但是TCP终究不能真正满足多路复用(在网络畅通的时候可以,但是一旦丢包就会出现“对首阻塞“,从而影响到后续的请求,不能真正做到每个请求之间互不影响)QUIC 原生就实现了多路复用这个功能,并且传输的单个数据流可以保证有序交付且不会影响其他的数据流,这样的技术就解决了之前 TCP 存在的问题。

并且 QUIC 在移动端的表现也会比 TCP 好。因为 TCP 是基于 IP 和端口去识别连接的,这种方式在多变的移动端网络环境下是很脆弱的。但是 QUIC 是通过 ID 的方式去识别一个连接,不管你网络环境如何变化,只要 ID 不变,就能迅速重连上。

0-RTT

通过使用类似 TCP 快速打开的技术,缓存当前会话的上下文,在下次恢复会话的时候,只需要将之前的缓存传递给服务端验证通过就可以进行传输了。

纠错机制

假如说这次我要发送三个包,那么协议会算出这三个包的异或值并单独发出一个校验包,也就是总共发出了四个包。

当出现其中的非校验包丢包的情况时,可以通过另外三个包计算出丢失的数据包的内容。

当然这种技术只能使用在丢失一个包的情况下,如果出现丢失多个包就不能使用纠错机制了,只能使用重传的方式了。

http2 3的更多相关文章

  1. 前端性能优化的另一种方式——HTTP2.0

    最近在读一本书叫<web性能权威指南>谷歌公司高性能团队核心成员的权威之作. 一直听说HTTP2.0,对此也仅仅是耳闻,没有具体研读过,这次正好有两个篇章,分别讲HTTP1.1和HTTP2 ...

  2. HTTP、HTTP2

      HTTP.HTTP2.0.SPDY.HTTPS 你应该知道的一些事 原文链接:http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-readi ...

  3. 两年来的core折腾之路几点总结,附上nginx启用http2拿来即用的配置

    序:一年多没更新博客园的内容了,core已经发生了翻天覆地的变化,想起2014年这时候,我就开始了从当时还叫k的那套preview都不如的vnext搭建这套系统,陆陆续续它每一次升级,我也相应地折腾, ...

  4. HTTP2特性预览和抓包分析

    背景 近年来,http网络请求量日益添加,以下是httparchive统计,从2012-11-01到2016-09-01的请求数量和传输大小的趋势图: 当前大部份客户端&服务端架构的应用程序, ...

  5. HTTP2试用小记

    原文:https://www.clarencep.com/2016/11/17/upgrade-nginx-to-support-http2/ 这两天把公司的网站升级到了全站https. 顺便瞄到了H ...

  6. http2协议翻译(转)

    超文本传输协议版本 2 IETF HTTP2草案(draft-ietf-httpbis-http2-13) 摘要 本规范描述了一种优化的超文本传输协议(HTTP).HTTP/2通过引进报头字段压缩以及 ...

  7. HTTP2.0的二进制分帧

    1.帧的类型: 在二进制分帧的结构中,头部有8个字节(64Bit),其中有一个字节(8Bit)来标志帧的类型: HTTP2.0规定了如下帧类型: DATA: 用于传输HTTP消息体 HEADERS:用 ...

  8. HTTP2.0介绍

    HTTP2.0的所有通信都是在一个TCP连接上完成的. 1.信息传输术语 1.1 流 虚拟信道,可以承载双向消息,每个流都有一个唯一的整数标识符(1.2....N); 1.2 消息 逻辑上的HTTP消 ...

  9. 或许是 Nginx 上配置 HTTP2 最实在的教程了

    导读 从 2015 年 5 月 14 日 HTTP/2 协议正式版的发布到现在已经快有一年了,越来越多的网站部署了 HTTP2,HTTP2 的广泛应用带来了更好的浏览体验,只要是 Modern 浏览器 ...

  10. HTTP2 学习

    一.HTTP1.x存在的问题 Http1.0时Connection无法复用,同一时间一个Connection只能处理一个request.Http1.1引入了Request pipelining来解决这 ...

随机推荐

  1. 文件流CopyTo

  2. IdentityServer4实现OAuth2.0四种模式之授权码模式

    接上一篇:IdentityServer4实现OAuth2.0四种模式之隐藏模式 授权码模式隐藏码模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token ...

  3. 5_PHP数组_3_数组处理函数及其应用_1_快速创建数组的函数

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 一.快速创建数组的函数 1. range() 函数 程序: <?php $numbers = range(1 ...

  4. 【CF1095F】 Make It Connected(最小生成树)

    题目链接 如果没有特殊边的话显然答案就是权值最小的点向其他所有点连边. 所以把特殊边和权值最小的点向其他点连的边丢一起跑最小生成树就行了. #include <cstdio> #inclu ...

  5. 基于【 springBoot +springCloud+vue 项目】一 || 后端搭建

    缘起 本项目是基于之前学习的一个Dubbo+SSM分布式项目进行升级,基于此项目对前后端分离项目.微服务项目进一步深入学习.之前学习了vue.springBoot.springCloud后,没有进行更 ...

  6. JQ分页的使用

    <script src="../js/pageMe.js"></script> <script src="../js/comjq.js&qu ...

  7. paroot忘记root密码

    打开虚拟机在倒计时进入系统前按下e键然后按照下图修改即可 crtl+x重启 mount –rw –o remount /保证磁盘可读写 然后执行passwd

  8. vscode编辑器中文乱码问题

    设置配置自动格式化: "[javascriptreact]": { "editor.defaultFormatter": "esbenp.pretti ...

  9. 解决mysql跟php不在同一台机器上,编译安装php服务报错问题:configure: error: Cannot find MySQL header files under /application/mysql.

    在编译安装php服务时报错: configure: error: Cannot find MySQL header files under /application/mysql. Note that ...

  10. CRM-Q模糊查询

    Q查询-模糊查询 示例一 q=Q() # 实例化一个Q的对象q,我们可以给它加条件 q.children.append(("name","xxx")) # 添加 ...