http 进化史

  • 超文本:以一种无约束的方式联系起来的人类可读信息

  • 超媒体:表示“不限于文本”

HTTP/0.9

  • 只有get()

  • 没有首部

  • 仅获取HTML(没有图片,只有文本)

HTTP/1.0

  • 首部

  • 响应码

  • 重定向

  • 错误

  • 条件请求

  • 内容编码(压缩)

  • 更多的请求方法

  • 不能让多个请求共用一个连接

  • 缺少强制的 Host 首部

  • 缓存的选择相当简陋

HTTP/1.1

  • 缓存相关首部的扩展

  • OPTIONS 方法

  • Upgrade 首部

  • Range(范围)请求

  • 压缩和传输编码

  • 管道化:允许客户端一次发送所有的请求

SPDY

  • 多路复用

  • 首部压缩

HTTP/2

HTTP/2 快速入门

  1. openssl genrsa -out key.pem 2048
  2. openssl req -new -x509 -sha256 -key privkey.com -out cert.pem -days 365 -subj "/CN=fake.example.org"
  • 从数字证书认证机构(CA)申请一张证书
  1. wget https://dl.eff.org/certbot-auto
  2. chmod a+x certbot-auto
  3. ./certbot-auto certonly --webroot -w <your web root> -d <your domain> # 执行 certbot-auto

新制作的证书和私钥会被放到 /etc/letsencrypt/live/yoursite.com

  • 获取并安装一个支持 h2 的 web 服务器(nghttp2)
    1. # Ubuntu 16
    2. sudo apt-get install nghttp2
    3. ./nghttp2 -v -d <webroot> <port> <key> <cert>
    4. ./nghttp2 -v -d /usr/local/www 8443 /etc/letsencrypt/live/yoursite.com/privkey.pem /etc/letsencrypt/live/yoursite.com/cert.pem

web 优化“黑魔法”的动机与方式

剖析 Web 页面请求

HTTP/2 基础教程 - 图1

关键性能指标

依赖网络

延迟:延迟是指 IP 数据包从一个网络端点到另一个网络端点所花费的时间。与之相关的是往返延时(RIT), 是延迟时间的2倍
带宽:依据引用资源的大小和网络连接的传输能力
DNS 查询:一个域名只需转换一次
建立连接时间:TCP 三次握手
TLS 协商时间:额外的往返传输

依赖页面内容及服务器性能

首字节时间
内容下载时间
开始渲染时间
文档加载完成时间
更多的字节
更多的资源
更高的复杂度
更多的域名
更多的TCP socket

HTTP/1 的问题

队头阻塞
低效的TCP利用
TCP避免拥塞机制:即使在最差的网络状况下仍能起作用,并且如果有需求冲突也保证相对公平。
拥塞窗口:在接收方确认数据包之前,发送方可以发出的 TCP 包的数量。例如拥塞窗口指定为1,发送方发出1个数据包之后,只有接收方确认了那个包,才能发送下一个