快速了解HTTP/2

HTTP/2新特性

  1. 二进制分帧
  2. 多路复用(请求和响应复用)
  3. 服务器推送
  4. 头部压缩

二进制分帧(Binary framing layer)

HTTP/2的所有性能增强的核心是新的二进制帧层,它规定了HTTP消息如何客户端和服务端之间封装和传输。HTTP/2通信都被拆分成更小的消息和帧,每个都以二进制格式编码。

二进制分帧到底有啥用?看看后面两个模块就知道了。

流、消息和帧

HTTP/2 术语解释

  • 流(Stream):已建立连接中的双向字节流,可以携带一条或多条消息。
  • 消息(Message):映射到逻辑请求或响应消息的完整序列
  • 帧(Frame):HTTP/2中最小的通信单元,每个都包含一个帧头,它至少标识了该帧所属的流。

术语的关系

  • 所有通信通过一个TCP连接执行,该连接可以携带任意数量的双向流。
  • 每个流都有一个唯一标识符和可选优优先级信息,用于携带双向消息。
  • 每条消息都是逻辑HTTP消息,例如请求或响应,它由一个或多个帧组成。
  • 帧是承载特定类型数据(例如,HTTP标头、消息有效负载等)的最小通信单元。来自不同流的帧可以被交织,然后通过嵌入在每个帧头中的流标识符重新组合

HTTP/2 将 HTTP 协议通信分解为二进制编码帧的交换,然后将其映射到属于特定流的消息,所有这些都在单个 TCP 连接中多路复用。

请求和响应复用(Request and response multiplexing)

HTTP/1.x的交付模型确保了每个连接只能交付一个响应,所有,在HTTP/1.x中客户端想要发出多个并行请求并且高性能发出,就需要使用多个TCP连接。

而在HTTP/2中新的二进制帧层消除了这些限制——让客户端和服务器将HTTP消费分解为独立的帧,交错它们,并在另一端重新组合来实现完整的请求和响应多路复用。

快照在同一连接中捕获多个正在运行的流。客户端向服务器传输DATA帧(stream5),而服务器正在向客户端传输流 1 和 3 的交错帧序列。因此,有三个并行流在传输中。

没错这就是HTTP/2的一个增强点——将 HTTP 消息分解为独立帧、交错并在另一端重新组装它们的能力。

我们可以拿他来:

  • 并行交错多个请求,不会阻塞任何一个
  • 并行交错多个响应,不会阻塞任何一个
  • 使用单个连接并传递多个请求和响应。
  • 删除不必要的HTTP/1.x的解决办法
  • 通过消除不必要的延迟和提高可用网络容量的利用率来缩短页面加载时间。

这里就是二进制分帧作用的体现之处,二进制分帧解决了 HTTP/1.x 中发现的行头阻塞和多个连接的需求,实现以实现请求和响应的并行处理和传递,让应用程序更快、更简单

多路复用简单小栗子

拿百度图片为例子,我们打开百度图片,打开浏览器控制台。通过Network并刷新页面,就可以看到,h2让图片传输通过了一个域名和一个连接标识(Connection ID )。

而h1呢?我们来看看百度搜索,他的传输就要用到不同的连接标识了(就是使用了多个TCP连接)

流优先级

因实现客户端和服务器交错和交付帧的顺序,HTTP/2 标准允许每个流具有关联的权重和依赖关系:

  • 可以为每个流分配 1 到 256 之间的整数权重。
  • 每个流可以被赋予对另一个流的显式依赖。

流依赖和权重的组合能够让客户端构建和传达一个"优先树",它表达了希望如何接收响应。服务器就可以通过这个"优先树"来控制CPU、内存和其他资源的分配来确定流处理的优先级,只要响应数据能够使用,就会分配带宽用来确保向客户端提供优先级高响应。

流量控制

流量控制是一种机制,可防止发送方用它可能不想要或无法处理的数据压倒接收方。

HTTP/2流在单个TCP连接中单路复用,因此原本的TCP流控制就显得不够精细,没有提供必要的程序级API来规范各个流的传递。因此,HTTP/2为了解决这个问题。提供了一组简单的构建模块,运行客户端和服务器实现自己的流和连接级控制。

服务器推送(Server push )

HTTP/2 的另一个强大的新特性是服务器能够为单个客户端请求发送多个响应。除了对原始请求的响应之外,服务器还可以向客户端推送额外的资源。

它可以推送的资源可以是:

  • 客户端缓存(Cached by the client)
  • 跨不同页面重用(Reused across different pages)
  • 其他资源复用(Multiplexed alongside other resources)
  • 服务器优先(Prioritized by the server)
  • 客户端拒绝(Declined by the client)

PUSH_PROMISE 101

所有服务器推送流都是通过PUSH_PROMISE帧发起的。服务器把描述的资源推送到客户端,并且需要在请求推送资源响应数据之前交付。

客户端则需要知道服务器打算推送哪些资源,以避免为这些资源创建重复请求,这里就用到了这样的策略——PUSH_PROMISE在父响应之前发送所有帧,其中仅包含承诺资源的 HTTP 标头(DATA帧)。

客户端收到一个PUSH_PROMISE帧,它就可以选择拒绝流(RST_STREAM帧)。

使用 HTTP/2,客户端仍然可以完全控制服务器推送的使用方式:

  1. 客户端可以限制并发推流的数量;
  2. 调整初始流控窗口,控制首次打开流时推送多少数据;
  3. 完全禁用服务器推送。

这些首选项通过SETTINGSHTTP/2 连接开始时的帧进行通信,并且可以随时更新。

每个推送的资源都是一个流,与内联资源不同,它允许客户端单独对其进行多路复用、优先排序和处理。

头压缩(Header compression )

每个 HTTP 传输都带有一组标头,这些标头描述了传输的资源及其属性。HTTP/2 使用 HPACK 压缩格式压缩请求和响应标头元数据,该压缩格式使用两种简单但强大的技术:

  1. 它允许通过静态 Huffman 代码对传输的标头字段进行编码,从而减少它们各自的传输大小。
  2. 它要求客户端和服务器都维护和更新先前看到的标头字段的索引列表(换句话说,它建立了一个共享的压缩上下文),然后将其用作参考以有效地编码先前传输的值。

霍夫曼编码允许在传输时压缩单个值,并且先前传输值的索引列表允许我们通过传输可用于有效查找和重建完整标题键和值的索引值来对重复值进行编码。

HPACK 压缩上下文由静态和动态表组成:

  1. 静态表在规范中定义,并提供所有连接可能使用的常见 HTTP 头字段列表(例如,有效的头名称);
  2. 动态表最初是空的,并根据特定连接中的交换值进行更新。

因此,通过对以前未见过的值使用静态 Huffman 编码,并用索引替换已经存在于每一侧的静态或动态表中的值,可以减少每个请求的大小。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要创建一个Spring Boot项目,可以按照以下步骤: 1. 打开IDE,如IntelliJ IDEA或Eclipse。 2. 选择创建新项目,选择Spring Initializr。 3. 选择项目的基本信息,如项目名称、组名、描述等。 4. 选择项目的依赖,包括Spring Boot、数据库、Web框架、模板引擎等。 5. 点击生成项目并等待项目生成完成。 6. 编写代码并运行项目。 以下是一个简单的Spring Boot示例: 1. 创建一个Maven项目,选择一个Web应用程序骨架模板。 2. 在pom.xml文件中添加Spring Boot依赖项。 3. 创建一个Java类作为应用程序的入口点,并使用@SpringBootApplication注释标记它。 4. 在Java类中添加一个RequestMapping注释,以定义一个基本的HTTP端点。 5. 启动应用程序,并使用Web浏览器或curl等工具访问定义的HTTP端点。 代码示例: ```java import org.springframework.boot.*; import org.springframework.boot.autoconfigure.*; import org.springframework.stereotype.*; import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration public class Example { @RequestMapping("/") String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(Example.class, args); } } ``` 在以上示例中,@RestController和@RequestMapping注释用于定义HTTP端点。当访问根路径时,返回“Hello World!”。@EnableAutoConfiguration注释告诉Spring Boot要自动配置应用程序。最后,main()方法用于启动Spring Boot应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值