对 HTTP 的理解

远子 â€¢  2021å¹´11月09日

从 URL 输入到页面展示到底发生了什么

第一个环节:浏览器发出请求

  1. 浏览器会首先查看本机缓存是否可用
  2. 浏览器从 URL 中解析出域名
  3. 域名经过 DNS 服务器,查询到 IP
  4. 浏览器向 IP 地址发起请求
  5. 服务器返回含有公钥的 CA 证书
  6. 浏览器校验证书的合法性(颁发机构、域名、有效期等等)
  7. 如果合法,生成随机数,把随机数+公钥加密后发送给服务器
  8. 服务器通过私钥解密出随机数,然后通过非对称加密生成密文
  9. 浏览器解密,和本机的随机数比对
  10. 建立安全的链接后,浏览器生成HTTP报文
  11. HTTP 报文在传输层,包一层 TCP 报文
  12. TCP 采用三次握手的机制,和服务器建立连接
  13. TCP 将报文分隔,将每段报文准确送达出去
  14. 二进制的数据,经过网络层、委托操作系统经过网卡发送出去
  15. 然后经过路由器、接入网、网络运营商、防火墙到达服务器

这中间如果遇到 CDN 链接,是另一码事:浏览器向 CDN 专用 DNS 服务器查询负载均衡的IP,浏览器拿到负载均衡的 IP 后,向负载均衡设备发起请求,负载均衡设备根据用户的 IP 地址选择距离最近的服务器,浏览器向邻近的服务器发起请求。如果这台服务器没有用户需要的资源,这台服务器会向上级服务器请求并缓存到本机。

第二个环节:服务端接收 URL 并返回资源

  1. 服务器收到 URL 后,可能经过负载均衡
  2. 然后把请求转交给网关
  3. 由网关决定具体哪台服务器处理
  4. HTML 资源可能是静态的,也可能是动态的
  5. 服务器还需要解析请求头,判断文件的缓存情况,有可能走到缓存服务器
  6. 服务器有可能对文件压缩
  7. 还会生成一些响应头,比如 set-cookie
  8. 最后把响应报文按照相反的流程发送给服务器

第三个环节:页面渲染数据

  1. 服务器收到 HTML 后,首先根据响应头判断是否要缓存起来
  2. 如果是 gzip 压缩,则解码
  3. 解析 HTML 文档,构建 DOM 树
  4. 解析过程中,如果遇到图片、CSS、JS 等资源则下载
  5. 下载 CSS 构建 CSS 树
  6. 根据 DOM 树和 CSS 树生成渲染树
  7. 下载 JS,如果遇到 defer 的 script 则跳过继续解析 HTML,如果遇到同步的脚本,则下载并解析,直到解析完成后才继续解析 HTML
  8. 如果 JS 中会修改 CSS,则触发重绘

HTTP 的问题

  1. 明文传输,可能被监听
  2. 不管对方身份,可能被攻击
  3. 数据可能被篡改

HTTPS 的原理

HTTPS = HTTP + SSL,HTTP 加了一层安全套接层。

因为多了加解密,HTTPS 的速度会慢。

HTTPS 不是绝对安全的,中间人攻击,拦截客户端请求,利用中间人获取CA 证书、公钥、私钥。

HTTPS 抓包的原理就是中间人攻击。

HTTP2

  1. 多路复用

    1. HTTP1 里并发的请求需要建立多个 TCP 链接,浏览器有连接数限制,超出后需要排队。
    2. HTTP2 里一个域名一个TCP 链接,多路复用,并且单个链接可以接受,也可以发送。
  2. 服务端推送

    1. HTTP1 只能由客户端主动发起
    2. HTTP2 允许服务端发起
  3. 头部压缩

    1. HTTP1 同样的请求头会被发送多次,有些浪费
    2. HTTP2 里请求头会被压缩

HTTP 的特点

  1. 无状态,用户通过 Cookie 识别
  2. Method 告知意图,restful

常见状态码

  1. 200
  2. 301:永久重定向
  3. 302:临时重定向
  4. 400:无法解析
  5. 401:未提供授权参数
  6. 403:禁止访问
  7. 404
  8. 500

控制缓存

  1. 强制缓存

    1. Cache-Control(Pragma)
    2. Expires
  2. 协商缓存

    1. 文件的修改时间,Last-Modify
    2. 浏览器发送 If-Match,服务器根据 Etag 决定

(完)