能讲讲 HTTP/2 吗?

涉及问题

  1. 说说你对 HTTP/2 的理解
  2. HTTP1.1 在性能上存在哪些问题
  3. HTTP/2 是如何提高性能的

出现原因

1. 原有缺陷

HTTP1.0 中,采用短连接的形式,即一次请求对应完成一次 TCP 连接建立关闭,如此一来,在 TCP 三次握手四次挥手的过程会浪费很多时间,降低传输效率。

因此,在 HTTP1.1 中引入了长连接,多个请求复用一次 TCP 连接建立与关闭,由此来提升传输效率。

但是,改用长连接后,依然会存在队头阻塞问题,这是由 HTTP 使用的 “请求-应答”模型引起的。

一次请求发送后,必须等待对应的响应抵达后,才能发送下一次请求,所以会造成阻塞。

HTTP1.1 中提出了管道,来缓解这一问题,可以不用等上一次请求的响应抵达,就可发送下一个请求,但是在服务端依然会存在队头阻塞,即如果前一个响应没有发出去,后一个响应依然只能等待。

2. 主要目标及特点

因此,HTTP/2 主要解决 HTTP1.1 传输效率不高的问题,提升性能。

HTTP/2 在语义上几乎与之前一致,如请求方法,状态码等,也没有引入新的协议名,依然使用 httphttps 来表示明文及加密协议,且没有强制要求加密(虽然主流浏览器只支持加密)。

主要的变更集中于报文的传输形式

优化措施

头部压缩,二进制格式 => 减小尺寸

流 => 传输效率

1. 头部压缩

使用 HPACK 算法压缩头部数据:在客户端和服务器两端各维护一份索引表,用索引号表示重复的字符串。

将原有起始行中的一些字段,转换为头字段的形式,在名称前加 :,和其他头字段做区分。

报文头全部变为键值对形式后,将常用头字段定为“静态表”,同时维护一“动态表”

2. 二进制格式

由原来的纯文本 ASCII 格式变为二进制格式,计算机更容易解析,且体积小

将一个报文分解为多个二进制帧

3. 流

引入流的概念,即二进制帧的双向传输序列,它是虚拟的,实际并不存在。

  • 一个流,对应原来的一次请求响应;流之间是彼此独立的,但内部的帧依然是顺序的。因此,是从应用层角度解决队头阻塞问题
  • 流可并发,因此可以实现“多路复用”,不需要再借助管道或长连接
  • 客户端和服务端都可以创建流,可以用于实现服务器推送,即将可能用到的资源提前发送给客户端,来提高响应速度,对应有 push cache
  • 同时,流可以设置优先级,更加灵活

如何升级

  • TCP 连接

  • TLS 连接

  • 连接前言

    • 请求方法使用 PRI
    • 报文为纯文本的 ASCII 编码
    PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n
    

致谢

透视 HTTP 协议

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值