上午花了一会把这本书大概阅读了一遍,主要是了解一下HTTP2,简单记了一些笔记,书上讲的很好没什么废话,以后买一本收藏
首先有关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反查压缩
这都不是我笔记重点,就看了一遍没记了
果真看博客啥都学不到,要学真本事还得看原著
正经人谁看博客学习啊哈哈哈哈哈哈