AkiraZheng's Time.

HTTP协议的迭代(HTTP:应用层)

Word count: 2.4kReading time: 8 min
2024/03/09

一、从浏览器输入URL到页面显示的过程

1.1 URL到显示的全过程

  • URL解析:浏览器解析URL,得到服务器的域名(www.baidu.com)和端口号,以及请求资源的路径
    • 缓存找得到该域名对应的IP地址:直接访问服务器发送请求
    • 缓存找不得到该域名:发起DNS迭代查询,得到服务器的IP地址
  • DNS域名解析客户端发起迭代查询DNS服务器之间通过递归查询得到域名对应的IP地址
    • 浏览器 —> 本地DNS
    • 本地DNS —> 根DNS —> 向本地DNS返回顶级DNS的IP地址
    • 本地DNS —> 顶级DNS —> 向本地DNS返回权威DNS的IP地址
    • 本地DNS —> 权威DNS —> 向本地DNS返回域名对应的IP地址
  • 客户端发起TCP连接:三次握手
  • 客户端发送HTTP请求:请求报文
  • 服务器发送HTTP响应:响应报文状态码
  • 浏览器解析渲染页面:解析HTML、CSS、JS等文件
  • 客户端发起断开TCP连接:四次挥手

1.2 DNS域名解析

  • DNS域名解析客户端发起迭代查询DNS服务器之间通过递归查询得到域名对应的IP地址
    • 浏览器 —> 本地DNS
    • 本地DNS —> 根DNS —> 向本地DNS返回顶级DNS的IP地址
    • 本地DNS —> 顶级DNS —> 向本地DNS返回权威DNS的IP地址
    • 本地DNS —> 权威DNS —> 向本地DNS返回域名对应的IP地址

DNS域名解析过程如下:

二、HTTP协议的特点

2.1 Web构建的技术

2.2 HTTP1:HTTP1.0与HTTP1.1

2.3 HTTP2

HTTP2的很大特点是采用了stream技术,可以同时发送多个请求,并且不需要按照顺序来发送,这样可以提高传输效率,并且减少延迟

stream中一个TCP连接可以有多个stream,每个stream都有一个唯一的标识符;一个stream中可以有多个message;每个message可以有多个frame。frame是HTTP2的最小单位。

2.4 HTTP3

HTTP3是基于UDP的,使用了QUIC协议,可以减少延迟,并且提高传输效率

2.5 HTTP1~HTTP3的应用层到链路层的区别

三、HTTP缓存

客户端中存储缓存副本,有效的缓存副本在下一次可以直接使用不需要再次请求服务器

HTTP实现缓存的方式有:强制缓存和协商缓存

  • 强缓存:通过Cache-ControlExpires字段设置缓存时间,当缓存时间未过期时,直接使用缓存,不需要与服务器通信
  • 协商缓存:通过Last-ModifiedEtag字段,向服务器发送请求,服务器判断资源是否能直接使用缓存

HTTP实现缓存的方式如下:

其中HTTP协商缓存的流程图如下:

四、HTTPS

HTTPS是在HTTP的基础上加入了SSL/TLS协议,可以保证数据传输的安全性。具有数据加密、校验、身份认证等特点。

4.1 对称加密

对称加密是指加密解密使用的是同一个密钥,加密和解密的速度非常快,但是密钥的安全是一个问题。

密钥安全问题是指:密钥的传输存储是一个问题,如果密钥被泄露,那么加密的数据也就不安全了。

所以如果要安全使用对称加密,我们需要有一个保证密钥被安全传输到双方的措施,这个措施我们后面会讲,就是通过非对称加密对密钥进行加密,然后将加密后的密钥传输给对方,这样才能保证后续通信过程中的密钥安全

4.2 非对称加密RSA

非对称加密是指加密和解密使用的是不同的密钥,加密使用的是公钥,解密使用的是私钥

RSA加密过程(公钥对密文进行加密)如下:

也就是说RSA加密是对明文进行E次方后求对N的余数,得到密文。

从公式可以知道,EN是公钥,所有人都可以获得,并通过公钥对信息进行加密,所以我们用(E,N)来表示公钥。

神奇的点在于,只有拥有对应私钥的才能对密文进行解密,得到明文。(一般私钥都在服务端处保存)

RSA解密过程(私钥对密文进行解密)如下:

也就是说RSA解密是对密文进行D次方后求对N的余数,得到明文,所以我们用(D,N)来表示私钥。

生成密钥对的过程

生成密钥对需要求NLED的值

  • N的值:N是两个大质数p1的乘积,当pq都是大质数时,N的值很难被分解,也就是基本不可能从公钥N的值反推出pq的值(所以不能反推出私钥的值)
    • N = p * q
  • L的值:Lp-1q-1的最小公倍数
    • L = LCM(p-1, q-1)
  • E的值:E是一个小于L的数,且EL的最大公约数为1
  • D的值:DE的逆元,即E * D % L = 1

求完之后,我们就得到了公钥(E,N)和私钥(D,N)

我们只需要记得私钥D的值是几乎不可能被通过公钥反推回来的就行,且通过公钥加密的密文只有对应的私钥才能解密。

RSA神奇的点就在于,私钥可以解密公钥加密的密文,而公钥可以解密私钥加密的密文。但是由于公钥是公开的,所以我们一般不用私钥进行加密(不然所有拥有公钥的都能解密数据了),只有在数字签名的时候才会用到私钥进行加密。

采用RSA除了加密外,还可以用于数字签名

数字签名其实是加密的反过程,是为了验证服务端的身份(也就是说数据是不是从服务端发送过来的)

最主要的过程是:服务端私钥对数据进行加密(这里说加密其实不准确,我们可以称为签名),然后客户端公钥对数据进行解密(这里说法也不准确,应该称为验证签名),如果解密后的数据和原数据一样(通过同步送过来的哈希值来判断是否一样),那么就说明数据是从服务端发送过来的。

数字签名的过程如下:

  • 服务端用私钥对原始消息的哈希值进行签名
  • 发送给客户端:原始消息签名
  • 客户端用公钥对签名进行解密,并计算同步发送过来的原始消息的哈希值,如果解密后的哈希值同步发送过来的哈希值一样,那么就说明数据是从服务端发送过来的

4.3 HTTPS采用的混合加密模式

HTTPS采用的是混合加密模式,即对称加密非对称加密结合使用。

  • 非对称加密:用于传输对称加密的密钥
    • 服务端发送自己的数字证书给客户端,请求身份认证
    • 客户端用CA认证过的服务端的公钥对服务端的数字证书进行验证(防止中间人发送伪造的证书来伪造服务端)
    • 客户端验证通过后用公钥对自己随机生成的对称加密的密钥进行加密,然后发送给服务端
    • 由于只有服务端有私钥,所以只有服务端能解密得到对称加密的密钥,所以此时只有服务端能解开并得到对称加密的密钥
  • 对称加密:客户端和服务端验证完并获取安全的对称加密的密钥后,就用于后续的传输数据

为什么要采用混合加密模式呢?

因为对称加密的速度很快,但是密钥安全是个问题,所以我们首次建立TLS连接的时候,采用非对称加密用于传输对称加密的密钥,可以确保密钥的安全。然后后面正常通信的时候使用这个安全的密钥,就可以保证在安全情况下进行快速通信。

4.4 HTTPS的数字证书

数字证书是由权威的CA机构颁发的,用于证明服务端身份的一种证书。

如果没有权威公开的CA机构颁发的数字证书,那么就会出现中间人攻击,即中间人有自己的公钥和私钥,然后伪造了一个数字证书,客户端用伪造的公钥验证通过后,就会误认为是服务端发送的数据,这样就会出现中间人攻击安全问题

而如果通过CA的私钥对服务器的公钥进行数字签名,那么这个证书就是只能由权威的CA公钥进行解密验证,所以客户端可以用CA的公钥验证服务端发来的数字证书,验证通过后才会从发来的数据中获取服务端的公钥。SSL/TLS建立安全连接的过程如下:

CA能确保数据安全的图解:

CATALOG
  1. 一、从浏览器输入URL到页面显示的过程
    1. 1.1 URL到显示的全过程
    2. 1.2 DNS域名解析
  2. 二、HTTP协议的特点
    1. 2.1 Web构建的技术
    2. 2.2 HTTP1:HTTP1.0与HTTP1.1
    3. 2.3 HTTP2
    4. 2.4 HTTP3
    5. 2.5 HTTP1~HTTP3的应用层到链路层的区别
  3. 三、HTTP缓存
  4. 四、HTTPS
    1. 4.1 对称加密
    2. 4.2 非对称加密RSA
      1. RSA加密过程(公钥对密文进行加密)如下:
      2. RSA解密过程(私钥对密文进行解密)如下:
      3. 生成密钥对的过程
      4. 采用RSA除了加密外,还可以用于数字签名
    3. 4.3 HTTPS采用的混合加密模式
    4. 4.4 HTTPS的数字证书