网络知识点整理

HTML+CSS | 2021-01-27 17:04:58 1393次 5次

一、HTTP 演进过程

HTTP 最早版本是 1991 年发布的 0.9 版,基于 TCP/IP 协议的应用层协议;是一种客户端和服务器之间的通信格式,默认使用80端口。


HTTP 0.9

1、因为 HTTP 都是基于 TCP 协议的,所以客户端先要根据 IP 地址、端口和服务器建立 TCP 连接,而建立连接的过程就是 TCP 协议三次握手的过程。

2、建立好连接之后,会发送一个 GET 请求行的信息,如GET /index.html用来获取 index.html。

3、服务器接收请求信息之后,读取对应的 HTML 文件,并将数据以 ASCII 字符流返回给客户端。

4、HTML 文档传输完成后,断开连接。


HTTP1.0

1994 年底出现了拨号上网服务,同年网景又推出一款浏览器,从此万维网就不局限于学术交流了,而是进入了高速的发展阶段。随之而来的是万维网联盟(W3C)和 HTTP 工作组(HTTP-WG)的创建,它们致力于 HTML 的发展和 HTTP 的改进。

1996年5月,HTTP/1.0 版本发布:

首先,任何格式的内容都可以发送。这使得互联网不仅可以传输文字,还能传输图像、视频、二进制文件。这为互联网的大发展奠定了基础。

其次,除了 GET 命令,还引入了 POST、HEAD 命令,丰富了浏览器与服务器的互动手段。

再次,HTTP请求和回应的格式也变了。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。

其他的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

缺点是每个 tcp 连接只能发送一个请求,请求完毕就断开连接,在大量请求的情况下性能就会很差,因为每次 tcp 连接会经过三次握手\四次挥手的过程。尽管加上了 Connection: keep-alive 保持连接状态,但并不是标准字段。


HTTP 1.1

1999 年推出 HTTP/1.1 版本。

1.持久化连接:

持久连接在 HTTP/1.1 中是默认开启的,不需要为了持久连接去 HTTP 请求头设置信息。客户端和服务端一段时间之后发现没有连接会自动关闭,可以在 HTTP 请求头中加上 Connection: close 主动关闭。目前浏览器中对于同一个域名,默认允许同时建立 6 个 TCP 持久连接。

2.管线机制:

持久连接虽然能减少 TCP 的建立和断开次数,但是它需要等待前面的请求返回之后,才能进行下一次请求。如果 TCP 通道中的某个请求因为某些原因没有及时返回,那么就会阻塞后面的所有请求,这就是著名的队头阻塞的问题。

HTTP/1.1 中试图通过管线化的技术来解决队头阻塞的问题。HTTP/1.1 中的管线化是指将多个 HTTP 请求整批提交给服务器的技术,虽然可以整批发送请求,不过服务器依然需要根据请求顺序来回复浏览器的请求。

FireFox、Chrome 都做过管线化的试验,但是由于各种原因,它们最终都放弃了管线化技术。

3.分块传输:

在设计 HTTP/1.0 时,需要在响应头中设置完整的数据大小,如Content-Length: 901,这样浏览器就可以根据设置的数据大小来接收数据。不过随着服务器端的技术发展,很多页面的内容都是动态生成的,因此在传输数据之前并不知道最终的数据大小,这就导致了浏览器不知道何时会接收完所有的文件数据。

HTTP/1.1 通过引入Chunk transfer 机制来解决这个问题,服务器会将数据分割成若干个任意大小的数据块,每个数据块发送时会附上上个数据块的长度,最后使用一个零长度的块作为发送数据完成的标志。这样就提供了对动态内容的支持。

4.其他:

cookie 和安全机制,请求头信息 host 设置,标识当前域名,服务器可以根据这个设定执行不同的处理,比如可以应用在虚拟主机。

缺点是尽管可以复用连接,但是请求依然是排队进行的,服务器只有处理完一个请求再继续下一个请求,造成“队头阻塞”的问题。

前端一般针对这个问题会进行请求次数减少、压缩文件、图片合并等方式进行优化,后面到了 2.0 这些处理方式已经没有必要且成为了阻碍。


HTTP 2.0

HTTP 2.0 在 2013 年 8 月进行首次合作共事性测试。

1.二进制传输

HTTP/1.1 头信息是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame)头信息帧和数据帧

二进制协议的一个好处是,可以定义额外的帧。HTTP/2 定义了近十种帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦,二进制解析则方便得多。

2.连接共享(多路复用)

HTTP/2 复用 TCP 连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"。

每一个TCP连接中承载了多个双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧是可以交错传输,然后在接收端通过帧头的信息组装成完整的数据。这样就解决了线头阻塞的问题,同时也提高了网络速度的利用率。

举例来说,在一个 TCP 连接里面,服务器同时收到了 A 请求和 B 请求,于是先回应 A 请求,结果发现处理过程非常耗时,于是就发送 A 请求已经处理好的部分, 接着回应 B 请求,完成后,再发送 A 请求剩下的部分。

这样双向的、实时的通信,就叫做多路复用(Multiplexing)。

3.数据流:

因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。

HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。

数据流发送到一半的时候,客户端和服务器都可以发送信号(RST_STREAM帧),取消这个数据流。1.1版取消数据流的唯一方法,就是关闭TCP连接。这就是说,HTTP/2 可以取消某一次请求,同时保证TCP连接还打开着,可以被其他请求使用。

客户端还可以指定数据流的优先级。优先级越高,服务器就会越早回应。

4.head压缩:

HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如Cookie和User Agent,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。

HTTP/2 对这一点做了优化,引入了头信息压缩机制(header compression),采用 hapck 算法。一方面,消息体信息使用 gzip 或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。

5.服务器推送:

HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。

常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请 求。其实,服务器可以预期到客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。


HTTP 3.0

HTTP/3 是基于 UDP 的 QUIC 协议,实现了类似 TCP 的流量控制、传输可靠性的功能。虽然 UDP 不提供可靠性的传输,但 QUIC 在 UDP 的基础之上增加了一层来保证数据可靠性传输。它提供了数据包重传、拥塞控制以及其他一些 TCP 中存在的特性。

集成了 TLS 加密功能。目前 QUIC 使用的是 TLS1.3,相较于早期版本 TLS1.3 有更多的优点,其中最重要的一点是减少了握手所花费的 RTT 个数。

实现了 HTTP/2 中的多路复用功能。和 TCP 不同,QUIC 实现了在同一物理连接上可以有多个独立的逻辑数据流。实现了数据流的单独传输,就解决了 TCP 中队头阻塞的问题。


二、HTTPS 原理

https 是在 http 的基础上进行一层 ssl 加密,加密方式是非对称加密和对称加密共同合作处理。

SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。

TLS与SSL在传输层与应用层之间对网络连接进行加密。

数字证书签发

1. 服务器的运营人员向第三方机构 CA 提交公钥、组织信息、个人信息(域名)等信息并申请认证;

2. CA 通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;

3. 如信息审核通过,CA 会向申请者签发认证文件-证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。 其中签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥信息摘要进行加密,密文即签名;

4. 客户端 Client 向服务器 Server 发出请求时,Server 返回证书文件;

5. 客户端 Client 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥解密签名数据对比证书的信息摘要,如果一致,则可以确认证书的合法性,即服务器的公开密钥是值得信赖的。

6. 客户端还会验证证书相关的域名信息、有效时间等信息; 客户端会内置信任 CA 的证书信息(包含公钥),如果CA 不被信任,则找不到对应 CA 的证书,证书也会被判定非法。


HTTPS 流程

1. Client 发起一个 HTTPS 请求,连接 Server 的 443(默认)端口

2.Server 把事先配置好的公钥证书(public key certificate)返回给客户端

3. Client 验证公钥证书:比如是否在有效期内,证书的用途是不是匹配 Client 请求的站点,是不是在 CRL 吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的 Root 证书或者 Client 内置的 Root 证书)。如果验证通过则继续,不通过则显示警告信息

4. Client 使用伪随机数生成器生成加密所使用的对称密钥,然后用服务端的公钥(存在于证书中)加密这个对称密钥,发给 Server

5. Server 使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client 和 Server 双方都持有了相同的对称密钥

6. Server 使用对称密钥加密“明文内容A”,发送给 Client

7. Client 使用对称密钥解响应的密文,得到“明文内容A”

8. Client 再次发起 HTTPS 的请求,使用对称密钥加密请求的“明文内容B”,然后 Server 使用对称密钥解密密文,得到“明文内容B”


三、通信传输流

微信截图_20210201194558.png


四、DNS 域名解析

域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

解析过程:

1. 当浏览器拿到输入的 https://www.baidu.com 后,首先会去浏览器的 dns 缓存中去查询是否有对应记录,如果查询到记录就可以直接返回 ip 地址,完成解析。

2. 如果浏览器没有缓存,那就再去查询操作系统的缓存,同样的,如果查询到记录就可以直接返回 ip 地址,完成解析。

3. 如果操作系统也没有缓存,那就再去查看本地 host 文件

4. 如果 host 文件也没有相应记录,那就需要求助于本地 dns 服务器了,所以应该要知道本地 dns 的 ip 地址。

5. 本地 dns 又拿着 ip 去找对应的权威服务器,权威服务器最终把对应的主机 ip 返回给本地 dns,至此就完成了域名解析的全过程。

最后一步会涉及到递归查询和迭代查询,如下图:

200910261256520086203.jpg

图片来源于网络


四、强缓存/协商缓存

强缓存是利用 http 的返回头中的 Expires 或者 Cache-Control 来表示资源的缓存时间,不会向服务器发送请求,状态码为 200。

协商缓存则需要向服务器发送请求,根据一些值判断是否命中缓存,命中则状态码为304。


强缓存

Expires

该字段是 http1.0 时的规范,它的值为一个绝对时间的 GMT 格式的时间字符串,比如 Expires:Mon,18 Oct 2066 23:59:59 GMT(是一个绝对时间)。这个时间代表着这个资源的失效时间。缺点是当服务器与客户端时间偏差较大时,就会导致缓存混乱。


Cache-Control

cache-control 是 http1.1 时出现的 header 信息,主要是利用该字段的 max-age 值来进行判断,它是一个相对时间,例如 Cache-Control:max-age=3600,代表着资源的有效期是3600秒。cache-control 除了该字段外,还有下面几个比较常用的设置值:

no-cache:不使用本地缓存

no-store:禁止缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源

public:可以被所有的用户缓存,包括终端用户和 CDN 等中间代理服务器。

private:只能被终端用户的浏览器缓存,不允许 CDN 等中继缓存服务器对其缓存。

Cache-Control 与 Expires 可以在服务端配置同时启用,同时启用的时候 Cache-Control 优先级高。


协商缓存

Last-Modify/If-Modify-Since

浏览器第一次请求一个资源的时候,服务器返回的 header 中会加上 Last-Modified,Last-Modified 是一个时间,标识该资源的最后修改时间,例如 Last-Modified: Thu,31 Dec 2037 23:59:59 GMT。

当浏览器再次请求该资源时,request 的请求头中会包含 If-Modified-Since,该值为缓存之前返回的 Last-Modified。服务器收到 If-Modified-Since 后,根据资源的最后修改时间判断是否命中缓存。

如果命中缓存,则返回304,并且不会返回资源内容,并且不会返回 Last-Modified。没有命中缓存则和从最初的请求一样,状态码 200。


ETag/If-None-Match

ETag 返回的是一个校验码,可以保证每一个资源是唯一的,资源变化都会导致 ETag 变化。服务器根据浏览器发送的 If-None-Match 值来判断是否命中缓存。

与 Last-Modified 不一样的是,当服务器返回 304 的响应时,由于 ETag 重新生成过,response header 中还会把这个 ETag 返回,即使这个 ETag 跟之前的没有变化。

当 Etag 和 Last-Modify 同时存在则优先校验 ETag,ETag 可以校验秒级别的文件修改,更加精确。

5人赞

分享到: