http1 做了哪些优化
-
存在什么问题:http1 没有持久的tcp 连接,访问一个网页(html jpg css js 等资源)需要建立多个tcp 连接 访问资源,每次请求都会导致两次往返延迟(tcp握手和挥手)
如何解决的 -
优化1:keep-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-http2