Skip to content

http/2 入门 #34

@msforest

Description

@msforest

what (http/2是什么)

http 自 1989 年问世以来,就一直霸占了网络通信协议的铁王座。虽然有缺陷在身,但一直针对自身缺陷,
不断地提高、优化,使自己变得更好。而http/2没有改变http原有的任何语义,仅仅优化底层连接方式。
http 经历了以下几个重要历程:

  • http0.9: 第一个被公开露面的版本号,每个 tcp 连接只能支持一个请求响应,且只支持 get 方法,
    仅支持 html 传输。(缺点很明显:dizzy_face:)
  • http1.0: 增加了更多的方法,如 post/head;增加了其他格式内容的传输;(还是短链接)
  • http1.1: 优化了 tcp 连接方式,使得支持长链接和 http 流水线操作;引入了缓存机制;支持响应分块;
    增加 push/delete/options 方法。(引起了head-of-line block)
  • http2: 参考wiki😸 优化底层连接传输方式,
    同域名使用同一个tcp连接;使用二进制消息帧传输;

why (为什么会有http/2)

随着 http1.1 的知名度在逐渐扩大,web 应用程序的资源也在不断增加,浏览器加载资源的性能问题也就
暴露出来了,如 tcp 连接受限,请求头阻塞,请求头资源重复传输;然后又是 ssl 增加了一点难度。
因此,http2 于 2014 年诞生了,极乐降世,普度众生。

how (http/2是如何优化存在的缺陷)

了解了http发展历程,总结了存在这么几点缺陷:

  • 多个连接虽解决了并发现象,但没有解决请求头重复传输的问题
  • 虽然支持长链接,但server处理还是一一执行,而且还造成了head-of-line block

http/2 在 http/1.x 的基础上优化了传输机制,保持了原有的核心功能,但提供了高效优化。
http/2 协议的主要目标是针对 http/1.1 中存在的问题提出了解决方法, 并且还增加了更友好的功能:

  1. Multiplexing - 单个 tcp 连接异步发送多个请求
  2. Header compression - 在每个请求中,不需要发送相同请求头
  3. Binary protocol - 使用二进制分帧传输数据,不再使用 http1.1 的文本格式
  4. Request prioritization - 使得有限的资源定向到最重要的Stream
  5. Server push - 服务器可以异步发送数据到客户端的缓存

how http2 works

  • 客户端通过 http1.1 发送一个升级 http2 的请求,如果服务器支持,服务器返回 101 响应码
    作为同意升级 http2。然后客户端就在相同的 tcp 连接发送/接收请求。
  • 每一个请求和响应提供一个唯一的 stream ID,且把请求和响应信息拆分成 frame;stream
    ID 将和 frame 绑定在一起,用于区分不同的 stream。因为同一域下的请求使用同一个 tcp
    连接。
  • stream 运行设置优先级,那样的话,服务器根据优先级分配 memory/cpu/bandwidth。
  • Header 压缩确保请求头不会冗余。客户端和服务器会共同维护一份 header 表,当有新的请求
    头时,只会发送额外的请求头。
  • 服务端推送,运行客户端以一种高效的方式加载包含的资源。与 websockets 协议的服务器推送
    不同的是,websockets 协议的服务器可以在任何时候向客户端发送数据,即使没有来自客户
    端的请求。相反,http2 服务器推送仍然符合请求响应模式。

issue

  1. 为什么二进制帧可以高效处理message?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions