web性能权威指南-读书笔记

Author Avatar
Peipei Wong 4月 30, 2019
  • 在其它设备中阅读本文章

首先买这本书是看了推荐来的,名字是“web性能权威指南”,翻了目录之后,看到里面是tcp、ip的相关的网络的东西,第一感觉是啊,web性能优化和网络有很大关系吗?直到今天,我看到英文名“high performace browser networking”…额,这个翻译名字…

HTTP简史

http 0.9只有一行协议,其主要功能是:

  • 客户端/服务器、请求/响应协议
  • ASCII协议,运行于TCP/IP链接之上
  • 设计用来传输超文本文档(HTML)
  • 服务器和客户端之间的连接在每次请求之后都会关闭

因为传输类型的局限性,人们需要一种协议,它不仅能访问超文本文档,还能提供有关请求和享用的各种元数据,还要支持内容协商。于是HTTP1.0出现了,但HTTP 1.0最大的问题是对每个请求都打开一个新的TCP连接严重影响性能,经过修订,出现了HTTP 1.1。

HTTP 1.1标准厘清了之前版本中的很多歧义的地方,而且加入了很多重要的优化:持久连接、分块编码传输、字节范围请求、增强的缓存机制、传输编码及请求管道(详细内容请查阅HTTP权威指南)。

web性能要点

更宏观的web性能优化(之前对与web性能优化从来没有关注过以下几点)有:

  • 延迟和带宽对web性能的影响
  • 传输协议(tcp)对http的限制
  • HTTP协议自身的功能和缺陷
  • web应用的发展趋势及性能需求
  • 浏览器局限性和优化思路

限制web性能的主要因素是客户端和服务器之间的网络往返延迟。

现代浏览器为我们做了一些优化,我们可以在文档中嵌入提示,以触发浏览器提供的优化:

  • 资源预取和排定优先次序
  • DNS预解析
  • TCP预连接
  • 页面预渲染

HTTP 1.x

steve souder的“高性能网站建设指南”中的优化规则,有一半是针对网络优化的

  • 减少DNS请求
  • 减少HTTP请求
  • 使用CDN
  • 添加Expires首部并配置ETag标签
  • Gzip资源
  • 避免HTTP重定向

以上建议都反映在两个根本方面:消除和减少不必要的网络延迟,把传输的字节数降到最少,这两个根本问题是永远优化的核心,对任何应用都有效。

这让我想起了,在写api的时候,我为了不在js中拼接html和共用模版,就直接在后端返回拼接好的html,相对于json数据,html的传输字节数较大,所以,类似这样的api,是选择json还是html是否存在一个中和?

持久连接的优点

HTTP 1.1的一个主要改进就是引入持久的HTTP连接,一个新的TCP连接发送的HTTP请求所花的总时间,最少等于两次网络往返的时间:一次用于握手,一次用于请求和响应。你也许在请求头中看到过connection:Keep-Alive,这是在声明使用持久连接。

图片大小计算

RGBA图片的像素需要占用4个字节,红黄蓝通道各占一个字节,Alpha通道占用1个字节,这样算下来,一个图片占用的内存量是:像素宽度 像素高度 4字节

度量和控制协议的开销

HTTP 0.9当初是一行简单的只有一行的ASCII请求,用于取得一个超文本,这样导致的开销是最小的。HTTP 1.0增加了请求和响应头部,以便双方能够交换有关请求和响应的元信息,最终HTTP 1.1把这种格式变成标准:服务器和客户端都可以轻松的扩展首部,而且始终以纯文本形式发送,以保证与之前HTTP版本兼容。

今天,浏览器发起的HTTP请求,都会携带额外的500-800字节的HTTP元数据:用户代理字符串、很少改变的接受和传输首部、缓存指令等等。这还不算上http cookie。现在应用中有时候会使用cookie进行会话管理,综合在一起,所有这些未经压缩的HTTP元数据经常会给每个HTTP请求增加几千字节的协议开销。

cookie在很多应用中都是常见的性能瓶颈。

TCP

TCP(传输层控制协议),负责在不可靠的传输信道上提供可靠的抽象层。

三次握手

客户端与服务器在交换应用数据之前,必须就起始分组徐海以及其他的一些连接相关的细节达成一致,出于安全的考虑,序号由两端随机生成。

  • SYN:客户端随机选择一个随机序列号x,并发送一个SYN分组,其中还包括其他的TCP标志和选项。
  • SYN ACK:服务器给x加1,并选择自己的一个随机序列号y,并追加自己的标志和选项,然后返回响应。
  • ACK:客户端给x和y加1并发送握手期间的最后一个ACK分组。

三次握手完成后,客户端与服务器之间就可以通信了。客户端可以在发送ACK分组之后立即发送数据,而服务器必须等到接收到ACK分组之后才进行发送数据。

SYN ACK名词我也不清楚是什么,再考虑一下握手为什么是三次而不是二次或者四次?