# 8. http 的各个版本
# 1. cdn 快的原理
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 连接
无连接导致的性能缺陷有两种:
无法复用连接:每次发送请求,都需要进行一次 tcp 连接(即 3 次握手 4 次挥手),使得网络的利用率非常低
队头阻塞:http1.0 规定在前一个请求响应到达之后下一个请求才能发送,如果前一个阻塞,后面的请求也给阻塞的
# http1.1 特性:
长连接:新增 Connection 字段,可以设置 keep-alive 值保持连接不断开,http1.1 默认保持长连接,继续用这个通道传输数据
管道化:基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回
- 缓存处理:新增字段 cache-control,先看是否有缓存的资源,如果有缓存,直接取,不会再发请求,如果没有缓存,则发送请求
- 断点传输:在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以从已经上传/下载好的地方继续请求,不用从头开始,提高效率。在 Header 里两个参数实现的,客户端发请求时对应的是 Range 服务器端响应时对应的是 Content-Range
# http2.0 特性
- 二进制分帧:将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码
- 多路复用: 在共享 TCP 链接的基础上同时发送请求和响应,基于二进制分帧,在同一域名下所有访问都是从同一个 tcp 连接中走,http 消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来
- 头部压缩
- 服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求
- 丢包会影响同一个同一个tcp连接中的其它请求,因为在tcp中有“丢包重传”机制,因为出现队头阻塞的问题
# http3.0 特性
基于 UDP 协议的 QUIC 协议,并且使用在了 HTTP/3
0-RTT 建立连接,实现了快速握手功能
实现了类似TCP的流量控制、传输可靠性的功能。
集成了TLS加密功能,目前QUIC使用的是TLS1.3。
多路复用,彻底解决TCP中队头阻塞的问题(阻塞是因为在tcp协议中)
某个请求丢包不会影响到其他请求,因为QUIC(Quick UDP Internet Connection)有一个"向前纠错"机制
# 区别
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 握手过程 详细见链接