IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> http/2相关读书笔记 -> 正文阅读

[网络协议]http/2相关读书笔记

《HTTP/2基础教程》

1 web发生的变化:最早只有几千字节,包含资源只有个位数,主要是基于文本的网页,到如今发展为平均资源大小2MB、包含资源平均140个的富媒体网站。 然而用来传输web的http协议这些年一直没有发生多大变化,于是出现了新的工种:web性能专家?

h2诞生的原因也是基于 为了更好适应今天的复杂页面,同时有不牺牲速度和性能

2 有几本前端性能优化的书籍:《高性能网站建设指南》

3 在spdy之前,人们普遍认为在商业应用中没有必要对http/1.1做出突破性的、不兼容的改变,要兼容浏览器、服务器、网络代理和其他各种中间件,代价极其高昂,然而spdy改变了这一切,很快证明了人们愿意想要更高的协议并且愿意改变。

4 可以从let'encrypt获得自动免费的认证ssl证书,前提是你是拥有 该域名的所属权。

目前尝试的优化手段和动机

1 当前web的现状:每个页面会引用数百个对象,关联数十个域名,网络环境相差迥异,设备处理能力也参差不齐,这里需要先理解客户端获取web页面和渲染的步骤:

获取: 把请求url放入队列->请求域名dns是否在缓存中 -- 指定开启tcp连接获取

渲染:是否为html -- 解析html -- 对页面引用资源优先级排序 -- 关键资源是否已经收到 - 页面渲染

2 http/1的问题

* 队头阻塞:h1是串行模式,尽管支持管道,但受限于各种中间设备的兼容性 基本无实用价值

* tcp效率低消:tcp的成果并不是它传输效率高而是它可靠,拥塞窗口需要慢启动,让新连接搞清楚当前网络状况,避免给已经拥堵的网络继续添乱,这种机制需要好几次往返数据才能获得最佳拥塞窗口,但区区几次往返时间非常宝贵。比如web页面2MB大小,在理想情况下需要大约9次往返请求来传输完成,浏览器一般会对同一个域名开启多个连接,每个连接都需要这种过程。

* 消息首部臃肿

* 优先级受限:如果浏览器先获取优先级高的资源,在处理过程中浏览器并不会发送新的资源请求,所以服务器无法利用这段时间发送低优先级的资源。还比如一个高优先级的资源此时被浏览器发现,但是受制于浏览器的处理方式,它被排在了一个正在获取低优先级资源之后。

附:google会把web性能作为影响页面搜索的重要排序指标,时间就是金钱。

http2迁移

1 tls是必须吗?虽然h2协议并为强制明确要求tls,但主流浏览器不支持非tls的h2,主要有两个原因:1 现实原因是从之前spdy的实践来看使用upgrade通过80通信,通信链路上的中间服务器的终端等因素会导致非常高的错误率,但443的ssl错误率显著降低。2 人们相信安全和隐私是必要考虑,一切都应该被加密,h2被视作一次推动全网加密通信发展的契机。

2 在h1下场景中进行优化的一些手段包括 资源合并、域名拆分、禁用cookie、精灵图等,在h2会变成反模式,比如资源合并(把很多css/js文件合并为一个)能避免浏览器发出多个请求,这对于h1很重要 因为发起请求的代价很高(三次握手)但h2下做了深度优化,放弃资源合并的结果是 针对单个资源发起请求的代价很低,但浏览器可以进行更细粒度的缓存策略。

资源合并:把多个文件(js/css)合并为一个文件(代码)减少http请求。h2下:非必要,因为请求传输的成本很低,且便于客户端做优化。

域名拆分:把资源分布到不同域名上去让浏览器利用更多socket连接。h2下:设计意图是重复利用单个socket连接, 而域名拆分会违背这种意图。建议取消域名拆分。【也不是通用情况】

禁用cookie:为图片之类的资源单独建立域名,这些域名不用cookie减少请求尺寸。h2下:避免单独建立域名,且h2提供了首部压缩,cookie 开销会显著降低

要不要进行域名拆分:这其实在h2下不一定是最优解

http/2协议

1 二进制协议:h2的帧是基于二进制的,方便了机器解析。基于二进制的内在含义是指:帧头部是二进制,即http的头部是二进制的,但包体是透传的

2 h2的连接:每个连接都有一定的开销,包括在进行h2握手时候的preface原语/setting帧的交换等,之所以这么设计是因为其收益远大于开销。

3 表面h2支持的几种方式:101 switch upgrade。alpn。alt-srv头部,返回给客户端的响应首部,表示后续请求获取可以使用更合适的请求地址或协议,这个工具非常灵活,浏览器的支持也在不断增加,他不是用来替代alpn的,但它值得关注。

4 为何握手要先发送preface:

PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n

主要是为了应对 客户端通过纯文本的http1/1升级上来的情况:如果服务器不支持h2,就会产生一个显示的错误,这个消息特意设计为h1的消息格式,如果运行良好的服务器收到这个字符串,他会拒绝这个方法(PRI)或者版本(HTTP/2.0),并返回错误,让h2浏览器明确知道发送了什么错误。

5 为何要基于封装帧:帧格式好解析,相比text,比如解析下面这段:

Host: www.example.com<crlf>

Connection: keep-alive<crlf>

Accept: text/html,appliacationxhtml+xml...<crlf>

Accept-Encoding: gzip,delate,sdch<crlf>

Accept-Language: en-Us,en;q=0.8<crlf>

Cookie: pf_cbc_bli=-jj...<crlf>

解析这种数据不需要高科技,但往往速度慢且容易出错,你需要不断读入字节 知道遇到分隔符号,同时还要考虑一些不太规矩的客户端(只会发送<lf>之类),于是状态机器就比较复杂:

另外解析请求和响应可能出现下列问题

* 无法预判解析需要多少内存。这会带来一系列问题:需要把一行读到多大缓冲区,如果行太长会发生什么;应该增加并重新分配内存,还是返回400。

但是h2就很简单:一开始就能预判知道会收到什么,有固定长度的字节,9个字节的首部,规范严格明确:

loop?

read 9 bytes off the wire

lenght = the first threee bytes

read the payload based on the length

take the appropriate action based on the frame tyoe.

end loop

实现和维护都会简单很多。

6 通过headers帧来启动一个新流。? 问题:为何需要ocntinuation帧而不是多个重复的header帧?TODO

7 在h2里:一切都是头部,没有请求行/响应行,被拆分为了多个头部:scheme method path status头部。没有分块编码(chunked encoding),因为是基于帧的,谁还需要chunked,只要在无法预先知道数据长度的情况下向对方发送数据才会用到分块,但h2帧头里有length不需要了。

8 流:0是保留id号,用于连接级别控制。

9? nghttp -a参数 可以下载html里面同级别域名的资源【自动】。 【编译时需要加入libxml库】

10 h2里没不是host而是authority,authoriy段包扩主机信息,可能还有端口号这样就可以恰好替代Host首部的角色。

11?HTTP/2 中所有头部名称必须小写。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:37:35  更:2021-10-09 16:39:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/29 8:01:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码