
http1 做了哪些优化存在什么问题http1 没有持久的tcp 连接访问一个网页html jpg css js 等资源需要建立多个tcp 连接 访问资源每次请求都会导致两次往返延迟tcp握手和挥手如何解决的优化1keep-alive:长连接一个tcp 连接可以复用消除另一次tcp 慢启动的往返优化2 http1.1 pipling: 管道话的方式由客户端浏览器决定优先访问一些资源管道化c端可以同时发送多个请求到s,s 同时处理两个请求的资源但是s按照请求先来后到把资源返回c如果第一个请求资源阻塞住了后面所有的请求都被阻塞。管道化夭折的原因只是解决了请求发送的并行没有解决响应的并行化。1 只能严格按照请求顺序串行返回响应不允许响应交错到达2 如果第一个请求阻塞了并行发送的后边的所有请求都会阻塞。3 服务端pipeline 需要缓存资源服务端并行处理请求资源但是串行返回资源前边的资源没返回给c的时候剩下的资源需要s 自己缓存服务端资源占用太多。4 并行的几个请求中如果前边的 请求断连了那么即使s 处理了剩余的并行请求的资源c也hui重新发送所有的http 请求造成s重复处理。5 中间如果存在代理若代理不支持管道代理会拒绝这个http 请求或者导致http 请求的串行化。疑问 tcp 慢启动需要再了解tcp 连接建立的时候 tcp 窗口是一点一点的变化最终到一个合适的窗口大小tcp的启动整个过程非常慢优化3 大多数浏览器 为每个域名打开6-8个连接为了突破6个连接的限制会切分子域名提供静态资源。资源消耗比较多客户端需要和每个域名建立tcp 请求多域名的缺点针对那么多tcp 连接c 和s 都是有额外开销每个tcp 连接都要经过建立tcp 连接慢启动阶段页面加载完之后tcp 连接大多数都用不到了74%的连接仅仅处理一次请求资源消耗。整体的效率低优化4 资源组合比如把多个 js css 合并成一个文件达到建立更少的连接的目的 拼接多张图片合为一张更大的图片sprite图优化5 嵌入资源为了减少下载次数直接嵌入到网页里边。维护成本还是有点高现在很多网站都已经启动了http2 了如何禁掉命令行启动浏览器加参数 --disable-http2http2http1升级2环境搭建linux环境工具nghttp2 官网https://www.nghttp2.org/http2二进制分帧就是把原来http1中的请求和响应按照帧格式标准化成格式一样的小包裹。这些小包裹带着帧类型和流ID可以乱序发送和接受不再像http1的pipeline 一样第一个请求没有返回第二个请求的响应就会一直被阻塞真正实现了多路复用。同一个请求响应是一条流其帧的流id是一样的。帧类型 header帧和 data帧。HPACK头部压缩http中请求头很多的header字段和其值是固定的每次发请求都要重复发一次这些header数据占用的带宽较大。HPACK通过对header头部压缩达到减少header带宽的效果。HPACK压缩使用两张表一张静态表 一张动态表两张表用于存储header的字段和对应的值。每次请求值需要使用表中对应的索引即可。静态表是一张预定义的表格硬编码在http2协议中的共1-61个编号。把GET、“Host”、Content-Type这些最常用的头部字段提前编好1-61的固定编号传输时直接发编号代替整串文字。其中部分编号对应的键值对是完整的比如编号2对应:method: GET、编号16对应accept-encoding: gzip, deflatekey和value都已预定义完成。其余大部分编号的value位置为空比如编号1对应:authority、编号32对应cookie这类编号可以直接引用预定义的key再搭配自定义的value使用依然是完整的键值对条目。具体来说当编码器遇到这类头部时它会采用“带索引的字面量表示法”Indexed Name, Literal Value。以下是其存储和传输的具体步骤传输过程Key 用编号Value 用明文或哈夫曼编码在二进制帧中这个头部会被拆成两部分发送第一部分引用 Key发送静态表中该 Key 对应的索引编号。这告诉解码器“我要用的字段名是静态表里第 N 号那个”。第二部分传输 Value紧接着发送具体的 Value 字符串。这个 Value 可以选择直接明文传输。也可以选择使用 Huffman 编码压缩后传输通常为了节省空间都会选 Huffman 编码。是否存入动态表由编码器决定传输完这个 Key(索引) Value(字面量) 的组合后编码器会根据策略决定是否将其存入动态表这对应了 HPACK 的三种指令指令类型行为描述典型场景增量索引 (Incremental Indexing)将完整的 Key Value 作为新条目存入动态表。下次再传相同的 Cookie 时就可以直接用动态表的新索引连 Value 都不用传了。大多数普通请求希望后续复用。不索引 (Without Indexing)不存入动态表仅本次传输使用。Value 依然通过字面量发送。敏感数据如某些 Token防止侧信道攻击推断内容。永不索引 (Never Index)永远不存入动态表且标记该字段为敏感。极高安全要求的场景代理服务器通常会强制使用此模式处理 Cookie。举个直观的例子假设你要发送一个自定义 Cookiecookie: session_idabc123(1). 查找静态表发现 cookie 在静态表中排第 32 号但静态表里没有预设具体的 value。 (2). 编码发送先发送一个特殊的二进制前缀表示“我要引用静态表的 Key并附带一个新的 Value”。发送索引值 32代表 Key 是 cookie。发送 Value session_idabc123通常会经过 Huffman 编码压缩。(3). 解码端操作收到索引 32从静态表取出 Key cookie。收到后面的数据解码出 Value session_idabc123。组合得到完整头部cookie: session_idabc123。(4). 更新动态表可选如果编码器选择了“增量索引”客户端和服务端会将 cookie: session_idabc123 这一整对存入各自的动态表。下次再发同样的 Cookie就直接发动态表的新索引比如 62只需 1 个字节。动态表是分别存储在客户端和服务器端的表格把这次请求里新出现的自定义头部临时存到双方的共享字典里下次再传直接用短编号引用原本几十上百字节的重复头部最后可能只用1-2个字节就能传完头部压缩率最高能达到90%以上弱网环境下的加载速度提升特别明显。http2服务器推送https://www.cnblogs.com/tinywan/p/8599858.html服务器推送配置server{#Ensure that HTTP/2is enabledforthe serverlisten443ssl http2;ssl_certificate ssl/certificate.pem;ssl_certificate_key ssl/key.pem;root/var/www/html;#whenevera client requests demo.html,also push#/style.css,/image1.jpg and/image2.jpg location/demo.html{http2_push/style.css;http2_push/image1.jpg;http2_push/image2.jpg;}}