跳转到内容

Web性能权威指南

摘抄和笔记。本书版本于2013,目前只有一版,注意内容的时效性。翻译质量不大行。

第1章 延迟与带宽

我们假设传送分组的光缆恰好是连接两个城市的一条完美的大弧形线路(地球表面两点间最短的距离)。而实际上纽约和悉尼之间是没有这样一条线路的,分组旅行的距离比这要长得多。这条线路中的每一跳都会涉及寻路、处理、排队和传输延迟。结果,纽约到悉尼的实际 RTT, 大约在 200~300 ms 之间。

第2章 TCP的构成

第3章 UDP的构成

数据报(datagram)和分组(packet)是两个经常被人混用的词,实际上它们还是有区别的。分组可以用来指代任何格式化的数据块,而数据报则通常只用来描述那些通过不可靠的服务传输的分组,既不保证送达,也不发送失败通知。正因为如此,很多场合下人们都把 UDP 中 User(用户)的 U,改成 Unreliable(不可靠)的 U, 于是 UDP 就成了“不可靠数据报协议”(Unreliable Datagram Protocol)。这也是为 什么把 UDP 分组称为数据报更为恰当的原因。

事实上,UDP 的特色在于它所省略的那些功能:连接状态、握手、重发、重组、重排、拥塞控制、拥塞预防、流量控制,甚至可选的错误检测,统统没有。这个面向消息的最简单的传输层在提供灵活性的同时,也给实现者带来了麻烦。你的应用程序很可能需要从头实现上述几个或者大部分功能,而且每项功能都必须保证与网络中的其他主机和协议和谐共存。

第4章 传输层安全(TLS)

第5章 无线网络概览

第6章 WIFI

802.11 无线标准主要是作为既有以太网标准(802.3)的扩展来设计的。事实上,以太网通常被称作局域网(LAN)标准,而 802.11 标准族则相应地被称作 无线局域网(WLAN,Wireless LAN )标准。

新的 802.11n 和 802.11ac 标准使用 5 GHz 频段,不仅拓宽了频率范围,而且能保证在多数环境下不发生冲突。

第7章 移动网络

第9章 HTTP简史

第10章 Web性能要点

人类的感知和反应时间:

这个表格解释了 Web 性能社区总结的经验法则:必须 250 ms 内渲染页面, 或者至少提供视觉反馈,才能保证用户不走开!

除了少量数据爆发外,可用连接的带宽利用率很低。这说明性能的限制并不在带宽!难道这是个异常现象,或者浏览器问题?都不是。对大多数应用而言,带宽的的确确不是性能的限制因素。限制 Web 性能的主要因素是客户端与服务器之间的网络往返延迟。

浏览器优化:

第11章 HTTP 1.x

上面每一条建议都经受了时间检验, 无论是该书出版的 2007 年还是今天, 都是适用的。 这并不是巧合,而是因为所有这些建议都反映了两个根本方面:消除和减少不必要的网络延迟,把传输的字节数降到最少。这两个根本问题永远是优化的核心,对任何应用都有效。

HTTP 1.1 管道的好处,主要就是消除了发送请求和响应的等待时间。这种并行处理请求的能力对提升应用性能的帮助非常之大。

我们可以在服务器上并行处理请求。 理论上讲, 没有障碍可以阻止服务器同时处理管道中的请求, 从而再减少 20 ms 的延迟。

实际中, 由于不可能实现多路复用, HTTP 端出现很多微妙的,不见文档记载的问题:

DNS查询和 TCP 慢启动导致的额外消耗对高延迟客户端的影响最大。 换句话说,移动(3G、 4G)客户端经常是受过度域名分区影响最大的!

第12章 HTTP 2.0

HTTP 2.0 不会改动 HTTP 的语义。 HTTP 方法、 状态码、 URI 及首部字段, 等等这些核心概念一如往常。但是, HTTP 2.0 修改了格式化数据(分帧)的方式,以及客户端与服务器间传输这些数据的方式。 这两点统帅全局, 通过新的组帧机制向我们的应用隐藏了所有复杂性。 换句话说, 所有原来的应用都可以不必修改而在新协议运行。这当然是好事。

可是, 我们关心的不止是交付能用的应用, 我们目标是交付最佳性能! HTTP 2.0 为我们的应用提供了很多新的优化机制, 这些机制是前所未有的, 而我们的工作就是把它们都利用好。下面我们就来详细介绍一下这些机制。

之所以要递增一个大版本到 2.0 ,主要是因为它改变了客户端与服务器之间交换数据的方式。为实现宏伟的性能改进目标, HTTP 2.0 增加了新的二进制分帧数据层,而这一层并不兼容之前的 HTTP 1.x 服务器及客户端——是谓 2.0。

要理解 HTTP 2.0, 就必须理解流、消息和帧这几个基本概念。

  • 所有通信都在一个 TCP 连接上完成。
  • 流是连接中的一个虚拟信道,可以承载双向的消息;每个流都有一个唯一的整数 标识符(1、 2… N )。
  • 消息是指逻辑上的 HTTP 消息,比如请求、响应等,由一或多个帧组成。
  • 帧是最小的通信单位,承载着特定类型的数据,如 HTTP 首部、负荷,等等。

简言之, HTTP 2.0 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。相应地,很多流可以并行地在同一个 TCP 连接上交换消息。

浏览器可以在发现资源时立即分派请求,指定每个流的优先级,让服务器决定最优的响应次序。这样请求就不必排队了,既节省了时间,也最大限度地利用了每个连接。

第13章 优化应用的交付

第14章 浏览器网络概述

现代浏览器完全是一个囊括数百个组件的操作系统,包括进程管理、安全沙箱、分层的优化缓存、JavaScript 虚拟机、图形渲染和 GPU 管道、存储系统、传感器、音频与视频、网络机制,等等。

第15章 XMLHttpRequest

XHR 的能力不仅仅表现在能实现浏览器的异步通信,还表现在它极大地简化了这个异步通信过程。XHR 是浏览器提供的应用 API,这就意味着浏览器会自动帮我们完成所有底层的连接管理、协议协商、HTTP 请求格式化,以及更多工作。

第17章 WebSocket

第18章 WebRTC

与其他浏览器通信机制不同,WebRTC 通过 UDP 传输数据。不过,UDP 只是个起点,为了实现浏览器间实时通信,还有很多超出原始 UDP 之外的技术。