HTTP 性能优化

一个 HTTP/1.1 请求/响应包含:
  • Method Request-URI HTTP-Version CRLF / HTTP-Version Status-Code Reason-Phrase CRLF
  • headers CRLF
  • message-body
第一行叫做 请求行request line)/状态行status line

为了减少 http 链接握手,使用 Connection: keep-alive,这个链接可以用多次,默认超时断开
但是为了提供响应结束信号使用 Content-Length
但是动态/网络资源长度算不准,而且耗服务器资源,所以使用:

Transfer-Encoding: chunked // HTTP streaming

报文中的实体需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。最后一个分块长度值必须为 0,对应的分块数据没有内容,表示实体结束,完成一个响应。
Content-Encoding 和 Transfer-Encoding 二者经常会结合来用,其实就是针对 Transfer-Encoding 的分块再进行 Content-Encoding(gzip,deflate,brotli)。

在 HTTP/1 时代,连接数优化不外乎两个方面:开源节流

因为浏览器限制同域名连接数(公平性考虑),开更多的源,往往我们还会对静态资源做域名散列,将页面静态资源分散在多个子域下加载。还会用独立域名加载静态资源,它不会共享主域的 Cookie,可以有效减小请求头大小,这个策略一般称之为 Cookie-Free Domain。多域名能提高并发连接数,也会带来很多问题。

节流:
  • 异步接口合并(Batch Ajax Request);
  • 图片合并,雪碧图(CSS Sprite);
  • CSS、JS 合并(Concatenation);
  • CSS、JS 内联(Inline);
  • 图片、音频、字体内联(Data URI);

启用压缩

使用 HTTP 缓存

Last-Modified(最后修改时间) 或者 ETag(内容特征) 标记实体,弱缓存。Cache-Control: Max-age=xxx,强缓存

减少 DNS 查询

减少重定向

浏览器基本都会缓存通过 301 Moved Permanently 指定的跳转,所以对于永久性跳转,可以考虑使用状态码 301。对于启用了 HTTPS 的网站,配置 HSTS(浏览器自动跳转HTTPS) 策略,也可以减少从 HTTP 到 HTTPS 的重定向。