甩干HTTP、HTTPS、HTTP2和HTTP3

901 阅读14分钟

HTTP

DNS

域名系统,把域名转化为IP地址的过程就是DNS解析过程

核心系统结构

  1. 根域名服务器(Root DNS Server):管理顶级域名服务器,比如com 、net 、cn等顶级域名服务器的 IP 地址
  2. 顶级域名服务器(Top-level DNS Server):管理各自域名下的权威域名服务器,比如 com 顶级域名服务器可以返回 baidu.com 域名服务器的 IP 地址
  3. 权威域名服务器(Authoritative DNS Server):管理自己域名下主机的 IP 地址,比如 baidu.com 权威域名服务器可以返回 www.baidu.com 的 IP 地址。

DNS 查询

  • 先从根域名服务器查询,然后是顶级域名服务器,接着是权威域名服务器。
  • 查询的过程是从域名的右侧向左侧查询

DNS 缓存

  • 公司、代理商都有自己的DNS服务器,用于缓存DNS
  • 操作系统会对DNS解析进行缓存
  • 操作系统里还有一个特殊的 主机映射 文件即我们熟悉的 host 文件
  • 浏览器也有DNS缓存

完整的DNS 查询

  1. 查看浏览器的DNS缓存
  2. 查看操作系统的DNS缓存
  3. 查看 host 文件
  4. 查看公司DNS缓存
  5. 查看运营商DNS缓存
  6. 再从根域名服务器开始查询直到最后

请求方法

  • GET 获取资源
  • POST 传输实体主体
  • PUT 传输文件 和FTP协议一样,在请求报文的主体中包含文件内容
  • HEAD 获取报问首部,返回的只有资源的信息比如修改时间等不包括资源内容
  • DELETE 删除文件,与PUT方法相反
  • OPTIONS 询问服务器支持的请求方法

状态码

1xx

  • 101 切换协议,在使用websocket时会用到

2xx

  • 200 OK 请求已成功,返回正常数据
  • 204 No Content 响应正常,但是没有响应内容,一般 PUT 和 DELETE 方法响应的是204
  • 206 Partial Content 是 HTTP 分块请求,响应的只是部分数据。

状态码 206 通常伴随着头字段 Content-Range ,表示响应报文里 body 数据的具体范围,供客户端确认,例如 Content-Range: bytes 0-999/2000,意思是此次获取的是总计 2000 个字节的前 1000 个字节。

3xx

  • 301 Moved Permanently 永久重定向
  • 302 Found 临时重定向
  • 304 Not Modified 缓存重定向

它用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制

  • 303 See Other 类似 302,要求重定向后的请求改为 GET 方法
  • 307 Temporary Redirect 临时重定向,类似 302,重定向后请求里的方法和实体不变
  • 308 Permanent Redirect 永久重定向,类似 301,重定向后请求里的方法和实体不变

4xx

  • 400 Bad Request 请求报文有错误
  • 401 Unauthorized 需要认证
  • 403 Forbidden 服务器禁止访问资源
  • 404 Not Found 未找到资源
  • 405 Method Not Allowed 服务器禁止了使用当前 HTTP 方法的请求
  • 413 Request Entity Too Large:请求报文里的 body 太大;
  • 414 Request-URI Too Long:请求行里的 URI 太大;
  • 429 Too Many Requests:客户端发送了太多的请求,通常是由于服务器的限连策略;
  • 431 Request Header Fields Too Large:请求头某个字段或总体太大

5xx

  • 500 Internal Server Error 服务器内部错误
  • 501 Not Implemented 请求的方法不被服务器支持
  • 502 Bad Gateway 网关错误
  • 503 Service Unavailable 服务器超负载或停机维护,暂时不能处理请求
  • 504 Gateway Timeout 网关超时

TCP 状态

TCP 协议是有状态的,一开始处于 CLOSED 状态,连接成功后是 ESTABLISHED 状态,断开连接后是 FIN-WAIT 状态,最后又是 CLOSED 状态

分层

  • 应用层

HTTP、DNS、FTP都是应用层

  • 传输层

提供网络连接中的两台计算机之间的数据传输。TCP和UDP都是传输层

  • 网络层

处理网络中的数据包。IP属于网络层

  • 数据链路层

处理连接网络的硬件部分。网卡、光纤是数据链路层

cookie

  • document.cookie 可以访问cookie,易造成 xss 攻击
  • HttpOnly 只能通过 HTTP 协议传输,禁止其他方式访问包括JS访问
  • SameSite 可以防范 跨站请求伪造(XSRF)攻击

设置成 SameSite=Strict 只在访问相同站点时发送 cookie;SameSite=Lax 允许本站上进行发送以及第三方的Get请求也能一起发送;

  • Secure 表示仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送。但 Cookie 本身不是加密的,浏览器里还是以明文的形式存在

请求头

  • Accept 客户端希望接受的格式类型 比如 text/css text/html
  • Accept-Encoding 客户端支持的编码方式 比如 gzip deflate br

If-xxx 条件请求

  • If-Modified-Since 携带浏览器缓存资源的时间,服务器对比时间,相同就返回304。浏览器缓存资源时间是通过响应头的Last-Modified确定
  • If-None-Match 携带ETag值,服务器的ETag值与此值对比,相同返回304
  • If-Range 若指定的此值(ETag或时间)和请求的ETag或时间一致,服务器作为范围请求处理,否则返回全部资源

响应头

  • ETag 服务器计算的资源的唯一标识符,分强ETag和弱ETag,弱ETag的值以W/开头
  • Location 重定向时新的URI
  • Allow 允许客户端的请求方法
  • Content-Encoding 响应资源的编码方式
  • Content-Range 响应资源的范围,主要是针对范围请求的处理
  • Content-Type 响应资源的格式类型 比如 text/css text/html
  • Content-Length 响应资源的大小 单位是字节
  • Last-Modified 响应资源的最后修改时间

缓存

  • 强制缓存如果生效,不需要再和服务器发生交互
  • 协商缓存不管是否生效,都需要与服务端发生交互

强制缓存

  • 强制刷新(ctrl+F5)和刷新(F5)都无效
  • 地址栏回车、页面链接跳转、新窗口打开、前进、后退才有效
  • Pragma
  • expires
  • cache-control
  • 状态码是200

Pragma(已废弃)

  • no-cache: 使用缓存,但是使用前去服务器校验是否有新版本

expires

  • 具体的过期GMT时间,优先级低于 cache-control

cache-control

  • no-store:不允许缓存,必须发送请求到服务器获取新资源
  • no-cache:使用缓存,但是使用前去服务器校验是否有新版本
  • must-revalidate:缓存不过期继续使用,过期就必须去服务器校验。
  • max-age: 缓存时长,单位是秒
  • public: 客户端和代理都可以缓存
  • private: 代理不能缓存

状态码200

  • from memory cache是从内存中获取,生命周期取决于当前的浏览器tab是否关闭
  • from disk cache是从磁盘中获取

协商缓存

  • 强制刷新(ctrl+F5)无效
  • 刷新(F5)、地址栏回车、页面链接跳转、新窗口打开、前进、后退才有效
  • ETag/If-Not-Match
  • Last-Modified/If-Modified-Since
  • 状态码有304

ETag/If-Not-Match

  • ETag由服务器生成,不同的服务器可能生成的值不同
  • 精确识别资源有无修改
  • 计算ETag需要消耗性能
  • 优先级比Last-Modified高

Last-Modified/If-Modified-Since

  • 只要资源修改,无论内容是否变化,都会返回给客户端
  • 优先级低于ETag/If-Not-Match

状态码有304

当客户端请求头中的If-None-Match或If-Modified-Since与服务器的ETag或Last-Modified相同,服务器返回304(Not Modified)

Vary

对缓存进行控制,它决定了对于未来的一个请求头,应该使用一个缓存作为响应还是向源服务器请求一个新的响应。

幂等性

指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。

GET、HEAD、PUT、DELETE,OPTIONS方法是幂等的。

POST 不是幂等的。

请求waterfall图解析

iShot2021-03-26 16.51.01.png

  • Queued、Queueing 是队头阻塞时间,这里花费了1.25秒,才被浏览器处理
  • Stalled 是浏览器分配资源,调度连接花费的时间,这里消耗了2.58毫秒
  • Initial connection 与服务器连接时间,这里花费了17.08毫秒
  • SSL 是SSL握手时间,这里花费了15.84毫秒
  • Request sent 发送数据的时间,这里花费了0.26毫秒
  • Waiting(TTFB) 等待服务器响应的时间,TTFB(Time To First Byte)是首字节响应时间,包括服务器处理时间和网络传输时间,这里花费了105.65毫秒
  • Content Download 接收数据时间,这里花费了1.95毫秒

HTTPS

  • 默认端口号 443
  • HTTP over SSL/TLS

SSL/TLS

  • SSL 即安全套接层(Secure Sockets Layer),在 七层模型中处于第 5 层(会话层)
  • 因发展的原因,1999年改名为TLS(传输层安全,Transport Layer Security
  • 目前应用的是TLS 1.2版本
  • TLS 由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等技术
  • TLS 的密码套件命名规范是“密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法”

浏览器和服务器在使用 TLS 建立连接时需要选择一组恰当的加密算法来实现安全通信,这些算法的组合被称为“密码套件”(cipher suite,也叫加密套件) TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256是一个密码套件,ECDHE是密钥交换算法,RSA是身份验证,AES是对称加密算法,128是强度,GCM是分组模式,SHA256是签名hash算法

  • 记录协议(Record Protocol)规定了 TLS 收发数据的基本单位:记录(record)
  • 握手协议(Handshake Protocol)是 TLS 里最复杂的子协议,要比 TCP 的 SYN/ACK 复杂的多,浏览器和服务器会在握手过程中协商 TLS 版本号、随机数、密码套件等信息,然后交换证书和密钥参数,最终双方协商得到会话密钥,用于后续的混合加密系统

OpenSSL

  • 著名的开源密码学程序库和工具包,几乎支持所有公开的加密算法和协议
  • 是 SSL/TLS 的具体实现,Web 服务器 Apache、Nginx等底层都是基于它来实现TLS的
  • 开源的

对称加密算法

  • 是指加密和解密时使用的密钥是同一个
  • 常用的是 AES
  • AES 的意思是“高级加密标准”(Advanced Encryption Standard),密钥长度可以是 128、192 或 256,安全强度高,性能好,应用最广泛的对称加密算法
  • 最新的加密分组模式被称为 AEAD(Authenticated Encryption with Associated Data),在加密的同时增加了认证的功能,常用的是 GCM、CCM 和 Poly1305
  • 只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换

非对称加密算法

  • 也叫公钥加密算法
  • 一个叫“公钥”(public key),可以公开给任何人使用,公钥加密后只能用私钥解密
  • 一个叫“私钥”(private key)。须严格保密,私钥加密只能用公钥解密
  • “公钥” 和 “私钥” 是不同的,“不对称”
  • TLS中有DH、DSA、RSA、ECC
  • RSA的安全性基于“整数分解”的数学难题,使用两个超大素数的乘积作为生成密钥的材料
  • ECC(Elliptic Curve Cryptography)是基于“椭圆曲线离散对数”的数学难题,使用特定的曲线方程和基点生成公钥和私钥,子算法 ECDHE 用于密钥交换,ECDSA 用于数字签名
  • 解决了密钥交换问题但速度慢

混合加密

  • 通信刚开始的时候使用非对称算法,比如 RSA、ECDHE,首先解决密钥交换的问题
  • 然后用随机数产生对称算法使用的“会话密钥”(session key),再用公钥加密
  • 最后对方用私钥解密,取出会话密钥。这样,双方就实现了对称密钥的安全交换,后续就不再使用非对称加密,全都使用对称加密。

SSL 握手过程

  1. 客户端先给服务端发送一个消息,消息内容包括:客户端支持的加密方式,支持的压缩方法,SSL的版本号,客户端生成的随机数,文本内容“Hello”等;
  2. 服务端接收到消息后,也回发一个Hello,并携带从客户端支持的加密方式中选择的加密方式,服务端生成的随机数,服务端的SSL版本号等信息;
  3. 随后服务器给客户端发送一个Certificate报文,报文中包含服务端的公钥证书;
  4. 紧接着服务器给客户端发送Server Hello Done, 表示最初的协商握手过程结束;
  5. 客户端接收到服务端发送的握手结束的消息后,以Client Key Exchange作为回应,此报文中包含通信加密过程中使用的一种被称为Pre-master secret的随机密码串,并使用第三步接收到的公钥证书进行了加密;
  6. 接着客户端发送Change Cipher Spec报文,告知服务端之后的所有数据将使用第五步中生成的master secret进行加密
  7. 随后客户端发送Finish报文,此报文中包含连接至今所有报文的整体校验值,用于完整性验证;
  8. 服务端接收到客户端发送的Change Cliper Spec报文后,同样以Change Cliper Spec报文作为回应;
  9. 接着服务端发送Finish报文给客户端,表示服务端已正确解析客户端发送的整体校验值,至此,SSL握手的过程结束。
  10. 随后开始使用HTTP协议传输使用master secret加密过的数据。

HTTP2

头部压缩

  • 开发了专门的“HPACK”算法,在客户端和服务器两端建立“字典”,用索引号表示重复的字符串,还釆用哈夫曼编码来压缩整数和字符串,可以达到 50%~90% 的高压缩率。

二进制

  • 请求头和请求体都是二进制

多工

  • 同时发送多个请求,服务器同时回应多个请求且不是安顺序的,解决“队头阻塞”问题

服务器推送

  • 主动向客户端推送资源

数据流

  • 数据包不是按顺序发送的,每个数据包都有一个唯一的ID,用于标记属于哪个数据流。
  • 客户端的数据流ID是奇数,服务端是偶数
  • 客户端和服务端都可以发送一个信号帧,取消当前的数据流,并保持TCP连接仍打开着。
  • 客户端可以指定数据流的优先级,服务端根据优先级进行回应

HTTP3

QUIC

  • 由Google再2013年推出的,全称是Quick UDP Internet Connections。
  • HTTP/3 就是基于 QUIC 协议的 HTTP (HTTP over QUIC)
  • 属于分层结构中的传输层

特点

  • 基于UDP的传输层协议
  • 可靠性 在UDP的基础上做了改造,提供了数据包重传、拥塞控制、调整传输节奏等类似TCP的特性以及可靠性
  • 实现了无序、并发字节流 单个数据流的传输是按序的,多个数据流是无序的
  • 快速握手 提供0-RTT和1-RTT的连接建立

RTT(Round-Trip Time) 数据从网络的一端传输到另一端所需的时间

  • 连接迁移 拥有特定的UUID来标记每一次连接,虽然网络环境发生改变,但UUID不变,就可以继续传输数据,不需要断开连接
  • 使用TLS1.3传输安全协议,它的握手时间更短,降低协议的延迟

欢迎关注微信公众号:闹闹前端