《HTTP/2 in Action》 阅读笔记

171 阅读5分钟

上午花了一会把这本书大概阅读了一遍,主要是了解一下HTTP2,简单记了一些笔记,书上讲的很好没什么废话,以后买一本收藏

HTTP2.jpeg

首先有关HTTP1.1

简单常识

一些请求方法:GET,POST,PUT,HEAD,DELETE,OPTIONS,TRACE,CONNECT
状态码:

  • 200 OK
  • 204 No Content 请求处理成功但没有内容可以返回
  • 206 Partial Content 返回一部分资源
  • 301永久性重定向,资源路径变了
  • 302 临时性重定向
  • 400 请求有问题
  • 403 请求被服务端拒了
  • 404 无法找到请求的资源
  • 500 服务端执行请求时候出BUG了
  • 502 服务器作为网关或者代理时候收到上游服务器的错误
  • 503 服务端正忙(超载或停机维护),无法处理请求

反正4开头是客户端请求有问题5开头是服务器能力有问题~

HTTP缺点

  • 使用明文,内容会被窃听
  • 不验证通信方的身份,可能被伪装
  • 无法证明报文完整性,可能遭到篡改

HTTP + 加密 + 认证 + 完整性保护 = HTTPS
但我们这里不讨论HTTPS

HTTP阻塞问题

HTTP1.1会因为等待响应而阻塞发送,导致在当前请求完成之前,无法发送另一个请求
虽然可以采用管道的方式传输,但还是免不了要顺序地等待响应,并且浏览器会限制一般最多6个连接

可以使用多个HTTP连接,但缺点很明显,打开TCP需要时间,维护连接需要更多资源。更主要的是没有充分利用底层的TCP协议。还会收到拥塞控制的影响

HTTP存在性能问题、纯文本协议的安全和隐私问题、缺少状态问题

HTTP2

创新点

  • 二进制协议
  • 多路复用
  • 流量控制功能
  • 数据流优先级
  • 首部压缩
  • 服务端推送

HTTP2变成了完全的二进制协议

HTTP消息被分成清晰定义的数据帧发送。收到所有数据帧以后可以组合成完整的HTTP消息。
我认为类似TCP的传输了,就都切成块往连接里扔,然后收到了再组装

多路复用

HTTP2允许在单个连接上同时执行多个请求。每个HTTP请求或者响应使用不同的流。通过二进制分帧层,给每个帧分配一个流标识符,以支持同时发出多个独立请求。每个帧都有标签标明它属于哪个消息(流),这样在一个连接上就可以同时有两个、三个甚至上百个消息。

因为流的存在不需要一直阻塞等待响应再返回,可以将响应混在一起返回。服务器发送响应的顺序完全取决于服务器,但客户端可以指定优先级

流量控制

HTTP2不但有流优先级,还有流量控制,是在流层级的
通过WINDOW_UPDATE帧来设置
如果抓包没发现WINDOW_UPDATE帧说明数据量太小了,还不需要流量控制

常见的帧:SETTINGS帧、HEADER帧、END_STREAM帧、WINDOW_UPDATE帧、DATA帧、PRIORITY帧(设置优先级)

流状态

HTTP2的流在下载完成后不会被重用,而是直接关闭。
流是虚拟概念,是帧上面的数字,也就是流ID

流的优先级有两种方式设置:流依赖和流权重
流依赖顾名思义就是大家都依赖你,那你就是最重要的先传。
流权重是给同时依赖一个父资源的请求设定优先级

题外话:TCP慢启动很慢吗?
慢启动是指数增长的所以并不慢,慢启动实际上指的是开始时候使用的窗口较小,这也是为什么叫慢启动不叫慢增长。是启动的时候从一个较慢(小)的速率(窗口)开始。

服务端推送

允许服务器发回客户端未请求的额外资源。就是我预判你可能要这个资源我主动给你发,比如点菜时候服务员知道你不够吃主动给你多拿一碗米饭,省去了一次沟通也就是请求。

以前HTTP是“一个请求 = 一个响应”,现在服务器可以多个返回来响应一个请求。比如图片往往是在页面渲染差不多以后再被请求的,一开始是空白的,HTTP2可以在页面请求一开始的资源的时候就把图片也发过去,这样省了一次图片的请求。
但注意,如果推送了没必要的资源就会耽误时间。

首部压缩

常见的客户端发给服务器的请求中,一般只有url和请求方式会发生变化,首部字段什么的变化很少,所以可以压缩。但显然有的东西可以一股脑压缩掉因为没用,但有的是重要的不能随便压缩的。

如何区分呢:

  • 查表法
  • 更高效的编码技术
  • lookback反查压缩
    这都不是我笔记重点,就看了一遍没记了

7089436ddd1b36799b60150ec0b32cdb.jpeg
果真看博客啥都学不到,要学真本事还得看原著
正经人谁看博客学习啊哈哈哈哈哈哈