# 8. http 的各个版本

# 1. cdn 快的原理

lianjie(opens new window)

DN 网络由一个 DNS 服务器和几台缓存服务器组成:

  • 当用户点击网站页面上的内容 URL,经过本地 DNS 系统解析,DNS 系统会最终将域名的解析权交给 CNAME 指向的 CDN 专用 DNS 服务器。
  • CDN 的 DNS 服务器将 CDN 的全局负载均衡设备 IP 地址返回给用户。

  • 用户向 CDN 的全局负载均衡设备发起内容 URL 访问请求。

  • CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的内容 URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。

区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户 IP 地址,判断哪一台服务器距用户最近;根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。

基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的 IP 地址。全局负载均衡设备把服务器的 IP 地址返回给用户。

用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。

# 2. http 缓存、强缓存、协商缓存

强制缓存时,服务端会在 Response Headers 中的 cache-control 对缓存时间、缓存方式等进行定义

协商缓存主要表现在 Response Headers 中的 etag 和 last-modified,在客户端重新向服务端发起请求时,会在 Request Headers 中换个 key 名:if-none-matched 和 if-modified-since

两种缓存的共同点:都从客户端缓存中读取资源;区别是强缓存不会向服务器发请求,协商缓存会发请求

# 3. http1.0、http1.1、http2、http3、https

# http1.0

  • 无状态:服务器不跟踪不记录请求过的状态,对于无状态的特性可以借助 cookie/session 机制来做身份认证和状态记录
  • 无连接:浏览器每次请求都需要建立 tcp 连接

无连接导致的性能缺陷有两种:

  1. 无法复用连接:每次发送请求,都需要进行一次 tcp 连接(即 3 次握手 4 次挥手),使得网络的利用率非常低

  2. 队头阻塞:http1.0 规定在前一个请求响应到达之后下一个请求才能发送,如果前一个阻塞,后面的请求也给阻塞的

# http1.1 特性:

  • 长连接:新增 Connection 字段,可以设置 keep-alive 值保持连接不断开,http1.1 默认保持长连接,继续用这个通道传输数据

  • 管道化:基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回

  • 缓存处理:新增字段 cache-control,先看是否有缓存的资源,如果有缓存,直接取,不会再发请求,如果没有缓存,则发送请求
  • 断点传输:在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以从已经上传/下载好的地方继续请求,不用从头开始,提高效率。在 Header 里两个参数实现的,客户端发请求时对应的是 Range 服务器端响应时对应的是 Content-Range

# http2.0 特性

  • 二进制分帧:将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码
  • 多路复用: 在共享 TCP 链接的基础上同时发送请求和响应,基于二进制分帧,在同一域名下所有访问都是从同一个 tcp 连接中走,http 消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来
  • 头部压缩
  • 服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求

# http3.0 特性

基于 UDP 协议的 QUIC 协议,并且使用在了 HTTP/3

  • 0-RTT 建立连接,实现了快速握手功能

  • 实现了类似TCP的流量控制、传输可靠性的功能。

  • 集成了TLS加密功能,目前QUIC使用的是TLS1.3。

  • 多路复用,彻底解决TCP中队头阻塞的问题(阻塞是因为在tcp协议中)

  • 某个请求丢包不会影响到其他请求,因为QUIC(Quick UDP Internet Connection)有一个"向前纠错"(opens new window) 机制

# 区别

  • http1.0 到 http1.1 的主要区别,就是从无连接到长连接

  • http2.0 对比 1.X 版本主要区别就是多路复用、头部压缩

  • h2到h3升级在于传输层由tcp传输改到udp传输,彻底解决头部阻塞问题,并且做到消耗0RTT(round-trip time)建立连接,一个请求丢包不会影响到其他连接

# https,https 主要的思想是在 http 基础上增加了 tls 安全层:

a. 客户端使用 https 的 url 访问 web 服务器,要求与服务器建立 tls 连接

b. web 服务器收到客户端请求后, 会将网站的证书(包含公钥)传送一份给客户端

c. 客户端收到网站证书后会检查证书的颁发机构以及过期时间, 如果没有问题就随机产生一个秘钥

d. 客户端利用公钥将会话秘钥加密, 并传送给服务端, 服务端利用自己的私钥解密出会话秘钥

e. 之后服务器与客户端使用秘钥加密传输

tls 握手过程 详细见链接(opens new window)

# 4. h2丢包影响其它请求原因?h3某个请求丢包不会影响其它请求原因?

前者因为TCP有“丢包重传”(opens new window) 机制, 后者因为QUIC有"向前纠错"(opens new window) 机制