[关闭]
@dungan 2021-10-27T02:47:51.000000Z 字数 8629 阅读 93

网络

网络协议- HTTP


一、HTTPS

1. HTTPS 介绍

由于HTTP有如下几个缺陷:

而 HTTPS 就是被设计用来解决 HTTP 如上所述的缺陷。

HTTPS(HTTP Secure)全称超文本传输安全协议,是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

可见 HTTPS,就是身披 SSL 协议外壳的 HTTP 而已,通常,HTTP 会直接和 TCP 通信,但对于 HTTPS 通信则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。

https.png

当然 HTTPS 并不是说没有任何的缺点:


2. HTTPS 原理

HTTPS 的整体过程分为两阶段:证书验证数据传输,HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。

yuanli.png

关于对称加密和非对称加密

  1. 非对称加密:加密和解密用的是不同的密钥,用于加密的密钥叫公钥,用于解密的密钥叫私钥。非对称加密主要有RSA算法,椭圆曲线加密算法等。
  2. 优点:算法公开,加密和解密使用不同的钥匙,私钥不需要通过网络进行传输,安全性很高。
  3. 缺点:计算量比较大,加密和解密速度相比对称加密慢很多。
  4. 对称加密:加密和解密都使用相同的密钥,常用的算法有AESDES,三重DES等算法
  5. 优点:算法公开、计算量小、加密速度快、加密效率高,适合加密比较大的数据。
  6. 缺点:交易双方需要使用相同的密钥,也就无法避免密钥的传输,而密钥在传输过程中无法保证不被截获,因此对称加密的安全性得不到保证。
  7. 由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。
  8. 因此数据传输阶段使用对称加密:
  9. 1、首先,非对称加密的加解密效率是非常低的,而 HTTP的应用场景中通常端与端之间存在大量的交互 ,非对称加密的效率是无法接受的。
  10. 2、其次,在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。

证书验证阶段

数据传输阶段

数据传输阶段很重要的一点是,客户端通过服务端的公钥加密数据后才上传给服务端。但是, 客户端从哪里获得服务端的公钥?如果只是简单的通过服务端下发的方式,那要是公钥被劫持了怎么办?

这就是接下来要介绍的中间人攻击

2.1 什么是中间人攻击

中间人攻击指服务器端发送公钥给客户端时,被中间人调包了。公钥能被调包的原因,是因为我们的客户端无法分辨返回公钥的人到底是中间人,还是真的服务器。

更多细节见 这里

middle.png

2.2 如何避免公钥被中间人掉包

不能直接将服务器的公钥传递给客户端,而是第三方机构使用它的私钥对服务器的公钥进行加密,生成证书后再传给客户端。

客户端使用第三方机构的公钥进行解密。如果能解密,就说明这个公钥没有被中间人调包。如果中间人使用自己的私钥加密后的东西传给客户端,客户端是无法使用第三方的公钥进行解密的。

而这个第三方就是数字证书认证中心,简称CA

2.3 证书生成原理

服务端将自己的摘要信息(包括电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等)发给 CA机构 签发证书,CA 机构首先对摘要信息进行 Hash,生成摘要信息的Hash值,然后CA用自己的私钥对 Hash值和摘要信息进行加密生成证书,然后返回给服务端。这个过程也称之为数字签名

证书内容包含: 申请者公钥、申请者的组织信息和个人信息、颁发机构 CA 的信息、有效时间、证书序列号等明文信息,同时包含一个签名。

整个CA机构颁发证书的流程如下:

  1. 申请者摘要信息(含服务器的公钥)---> hash ---> [摘要信息 + Hash值] ---> CA机构使用自己的私钥加密 ---> [证书]

最后服务端将包含了自身公钥的数字证书,还有自己的身份信息发送给客户端,见下图:

clientVerify.png

除了向 CA机构 申请生成证书外,还可以自己生成证书,简称自签名证书,就是自己扮演 CA 机构,自己给自己的服务器颁发证书,区别在于自己生成的证书需要客户端验证通过后才可以访问,而CA机构颁发的证书则不会弹出提示页面。

可以使用openssl生成自签名证书,各个文件的最终关系为

总结起来就一句话

数字证书是 CA机构 使用自己的私钥加密了服务器的公钥 (xxx.csr)最终生成的文件,而 CA机构的公钥内置在浏览器中 ,通过CA公钥解密数字证书就可以拿到服务器的公钥,进行后续的数据加密。

2.4 证书验证

第一步:客户端根据证书信息中的CA机构在本地查找对应的CA机构的公钥(这种权威机构的公钥一般会内置在浏览器中),用CA机构的公钥解析证书,如果不能解密,说明这个证书有问题。

第二步:然后读取解密后的明文信息,采用相同的hash函数计算得到信息摘要,然后对比证书的Hash值,如果一致,则可以确认证书的合法性,即里面的公钥确实由服务端发出的。

这样就免受中间人攻击了,因为CA机构的私钥中间人无法获取,它生成的非法证书自然也就无法被CA机构的公钥给解密了。

综上所述的这一过程称为验证数字签名

clientVerify.png

2.5 证书验证通过后

最后,客户端通过解密证书拿到服务端的公钥后,会生成一个随机码 (用 KEY 表示,这个 KEY 就是后续双方用于对称加密的密钥),然后客户端使用服务端的公钥把 KEY 加密后再发送给服务端,服务端使用自己的私钥将其解密,这样双方就有了同一个密钥 KEY,之后双方通过使用 KEY 进行对称加密交互数据。

参考


二、 HTTP2.0

http尽管简单,但简单是以牺牲应用性能为代价的:

相比Http/1.x,Http/2 的改进如下:

HTTP/2 的主要目标是通过支持完整的请求与响应复用来减少延迟,通过有效压缩HTTP标头字段将协议开销降至最低,同时增加对请求优先级和服务器推送的支持。

与 HTTP/1.x 相比可以使用更少的TCP连接。这意味着与其他流的竞争减小,并且连接的持续时间变长,这些特性反过来提高了可用网络容量的利用率。

总结起来就是下面这几点:

1. 头部压缩和二进制传输

1.1 头部压缩

HTTP/2 对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量。而 HTTP/1.x 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。

HTTP/2 会在两端维护索引表,用于记录出现过的header,后面在传输过程中就可以传输已经记录过的header的键名,对端收到数据后就可以通过键名找到对应的值。

1.2 二进制传输

HTTP/2 所有性能增强的核心在于新的二进制分帧层,它定义了如何封装 HTTP 消息并在客户端与服务器之间传输
,关键之一在应用层(HTTP/2)和传输层(TCP/UDP)之间增加一个二进制分帧层。

fenceng.png

这个二进制分帧层不会影响原有的HTTP的语义(包括各种动词、方法、标头),不同的是传输期间对它们的编码方式变了。 HTTP/1.x 协议以换行符作为纯文本的分隔符,而 HTTP/2 将所有传输的信息分割为更小的消息和帧 ,并采用二进制格式对它们编码。

http1.x一直都是文本格式,同时头信息和文本内容动辄很长。并且文本的表现形式有多样性,因此要做到健壮性考虑的场景必然有很多,但是二进制则不同,只有0和1的组合,因此选择二进制传输,实现方便且健壮。

2. 多路复用

多路复用的意义:

在 HTTP/1.x 协议中 浏览器客户端在同一时间,针对同一域名下的并发请求有一定数量限制(一般6-8个)。超过限制数目的请求会被阻塞。而 HTTP/2 的多路复用则允许通过同一个连接同时发起多个请求。

HTTP2.0中,有两个重要的概念:帧(frame)流(stream)

帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流是多个帧组成的数据流。

在HTTP/2中所谓的多路复用,指的是一个TCP连接中支持同时发送多个请求,例如同时获取css和js文件,这里的 css 和 js 就可以看作是流,它们会被拆成更小的帧(frame),在客户端,这些帧乱序发送,到对端后再根据每个帧首部的流标识符重新组装。这里要求同一个请求或者响应的帧必须是有序的,要保证FIFO的,但是不同的请求或者响应帧可以互相穿插。

下图中客户端正在向服务器传输一个 DATA 帧(数据流 5),与此同时,服务器正向客户端交错发送数据流 1 和数据流 3 的一系列帧。因此,一个连接上同时有三个并行数据流。

frame.png

综上所述,可见 HTTP/2 对性能的提升显著:

2.1 数据流优先级

HTTP/2 还能对数据流指定优先级,优先级能动态的被改变,例如把CSS和js文件设置得比图片的优先级要高,这样代码文件能更快的下载下来并得到执行。

3. 服务端推送 Server Push

这个功能是为了方便服务端能够更快的把资源推送给客户端。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送这些请求。当客户端需要的时候,它已经在客户端了。

参考


三、 CDN

CDN(Content Delivery Network)全称内容分发网络,它的作用是减少传播时延,找最近的节点,解决了跨运营商和跨地域访问的问题;CDN还有安全方面的好处。内容进行分发后,源服务器的IP被隐藏,受到攻击的概率会大幅下降。而且,当某个服务器故障时,系统会调用临近的健康服务器,进行服务,避免对用户造成影响。

CND 常用于缓存变动很小的静态资源,比如静态页面、图片、资源文件等,起到了分流作用,降低了应用所在服务器的负载。

1. 访问原理

CDN 的本质是在用户和服务器之间增加 Cache 层,因此,为了将请求引导到Cache节点而不是服务器源站点 ,就需要接管 DNS 解析。

通过域名访问网站时,首先通过 DNS 来解析域名获取目标服务器的 IP,DNS 服务器根据用户 IP 地址,将域名解析成离用户最近的那个节点的缓存服务器IP地址,实现用户就近访问。

DNS 解析域名的过程是这样的:

CNAME:

CNAME(Canonical Name) 即别名;用来把一个域名解析到另一个域名,当 DNS 系统在查询 CNAME 左面的名称的时候,都会转向 CNAME 右面的名称再进行查询。

接入 CDN 时,在 CDN 提供商控制台添加完加速域名后,会得到一个 CDN 厂商为你分配的 CNAME 域名, 然后你需要在你的 DNS 解析服务商添加 CNAME 记录,将自己的加速域名指向这个 CNAME 域名 ,这样该域名所有的请求才会都将转向 CDN 的节点,达到加速效果。

DNS 是怎么解析出来一个离用户最近的 IP 地址呢?

普通的 DNS 系统是做不到的,需要一个特殊的 DNS 服务器,CDN 提供商会提供这个特殊的 DNS 服务器,我们叫做 CDN专用DNS服务器

也就是说一个域名首先经过本地 DNS 系统解析,但是 DNS 系统会最终将域名的解析权交给 CNAME 指向的 CDN 专用 DNS 服务器,这样一来 CDN 网络就接管了 DNS 解析

2. 基础架构

最简单的CDN网络由一个DNS服务器和几台缓存服务器组成:

undefined

可以看到,使用 CDN 服务的网站,只需将其域名解析权交给 CDN 的全局负载均衡(GSLB)设备,将需要分发的内容注入 CDN,就可以实现内容加速了。

参考


四、HTTP

1. HTTP 缓存

其实除了 CDN 能缓存静态资源外,浏览器还可以根据 HTTP 协议来跟服务端约定静态资源的缓存策略, 比如,压根没有变动的文件,就没必要每次跑去服务端获取,一来造成带宽的浪费,二来也加重了服务端的负载。

这就要求服务端和客户端要商量好缓存策略,即浏览器如何来确定使用本地文件还是使用服务器上的新文件?

需要注意的是,通常我们只会对 GET 请求资源进行缓存,因为只有 GET 请求不会对资源实体的状态进行改变 ,OPTIONS 请求不返回响应实体没有缓存的意义,而其他诸如 POST、PUT、DELETE、PATCH 会改变资源状态的请求则不能进行缓存。

2. HTTP 缓存策略

HTTP 缓存策略是通过在请求头和响应头中设置相应的字段值来实现的,比如,ExpiresCache-ControlLast-Modified/If-Modified-SinceEtag/If-None-Match 等。

通常我们在浏览器使用 ctrl+f5f5回车,这三种行为其实对应了不同的缓存策略。

接下来我们看下,这些缓存策略间的区别。

2.1 Expires

服务端返回的 Expires 字段是一个特定的日期,例如 07 Aug 2020 03:39:44 GMT 这种,这种缓存策略类似 redis 中的 expireAt 的行为。

Expires 过期之前,浏览器无需向浏览器发出请求,只需要自己判断手中的材料是否过期就可以了.

undefined

不过 Expires 是 HTTP/1.0 的东西,现在浏览器均默认使用 HTTP/1.1,所以它的作用基本忽略。

2.2 Max-age

区别于 Expires 设置的特定日期过期,Cache-Control:max-age 使用来控制过期时间 ,这种缓存测试类似 redis 中的 expire 行为。

例如,Cache-Control : max-age=645672 设置页面经过 645672秒(7.47天)后过期。

undefined

如果在 Cache-Control 响应头设置了 max-age 或者 s-max-age 指令,那么 Expires 头会被忽略。

2.3 Last-Modified/If-Modified-Since

服务端返回的 Last-Modified字段用来告诉客户端资源上次修改的时间,当客户端再次请求该资源时,会在 If-Modified-Since 请求头字段带上这个时间。

如果这个资源自从上次修改后再没有变动,服务器只会返回了一个304的响应头,减少了响应的数据量,提高了响应的速度。如果资源的最后修改时间大于 If-Modified-Since 说明资源又被改动过,则返回完整的资源内容 ,对应响应状态码为 200。

undefined

2.4 Etag/If-None-Match

到目前为止,前面介绍 ExpiresMax-ageLast_Modified 都是依赖于服务器的时间缓存策略,但如果服务器的时钟进行了修改,夏时制DST到来后服务器时间没有及时更新,这些都会引起基于时间的而更新资源的这类缓存策略出问题。

服务端返回的 ETag 字段可以用来解决这种问题。ETag是一个资源的唯一标志符,一旦资源有变动,这个标识符就会变化。之后当客户端再次请求该资源时,会通过 If-None-Match 字段上报这个唯一标识给服务器。

服务器收到这个字段会与被请求资源的唯一标识进行对比,如果不同,说明资源又被改动过,则返回完整的资源内容,对应响应状态码为200;如果相同,说明资源没有做新的修改,则返回状态码 304,告知浏览器使用本地保存的缓存作为响应实体。

undefined

需要指出的是 Etag/If-None-Match 的优先级要高于 Last-Modified/If-Modified-Since, 如果同时出现,以前者为准。

2.5 Cache-Control

Cache-Control 字段来控制缓存的有效期及实现细节,在 Cache-Control 字段中可以设置多个属性值,不同属性值之间通过逗号分隔,不同的属性值来可以定义不同的 HTTP 缓存策略。常见的属性及其含义如下所示:

浏览器缓存刷新

  1. 在地址栏中输入网址后按回车或点击转到按钮

    浏览器以最少的请求来获取网页的数据,浏览器会对所有没有过期的内容直接使用本地缓存,从而减少了对浏览器的请求。所以,Expires,max-age标记只对这种方式有效。

  2. 按F5或浏览器刷新按钮

    浏览器会在请求中附加必要的缓存协商,但不允许浏览器直接使用本地缓存,它能够让 Last-Modified、ETag发挥效果,但是对Expires无效。

  3. 按Ctrl+F5或按Ctrl并点击刷新按钮

    这种方式就是强制刷新,总会发起一个全新的请求,不使用任何缓存。

参考

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注