常见网络通信协议
HTTP和HTTPS都属于应用层协议,它们都是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。它们都是基于TCP/IP协议来传递数据的,支持客户端-服务器模式的通信。
HTTP和HTTPS的区别主要在于HTTPS在HTTP的基础上增加了SSL/TLS安全层,使得数据传输更加安全。HTTPS需要申请证书,一般需要付费,而HTTP不需要。HTTP传输的数据是明文,容易被窃取或篡改,而HTTPS传输的数据是加密的,可以防止数据泄露和篡改。
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,HTTP是80端口,HTTPS是443端口。HTTPS在建立连接时需要进行SSL握手,比HTTP多了9个包的交换,所以HTTPS比HTTP更耗费服务器资源和时间。
1. HTTP 协议
1.1 HTTP 协议简介
HTTP 协议(Hypertext Transfer Protocol:超文本传输协议)是一种用于在万维网(WWW)上交换信息的应用层协议。它是基于 TCP/IP 协议的(TCP),也就是说,它利用 TCP/IP 协议提供的可靠的数据传输服务来发送和接收数据。
HTTP 协议的主要特点有:
简单:HTTP 协议的语法和结构都很简单,易于实现和扩展。
无状态:HTTP 协议不保存客户端和服务器之间的交互状态,每个请求都是独立的,这样可以减少服务器的负担和资源消耗。
可扩展:HTTP 协议可以通过添加新的请求方法、头部字段、状态码等来增加新的功能,也可以通过协商机制来支持不同的数据格式和编码方式。
灵活:HTTP 协议可以承载任何类型的数据,不仅限于文本、图片、视频等,还可以传输二进制数据、压缩数据、加密数据等。
一般来说,一个 HTTP 请求是由客户端和服务器之间协商决定的。客户端可以在请求头中指定自己支持的 HTTP 版本,如 Upgrade: h2 表示希望升级到 HTTP/2.0,服务器可以在响应头中指定自己使用的 HTTP 版本,如 HTTP/1.1 200 OK 表示使用 HTTP/1.1 协议。如果客户端和服务器之间有代理或中间设备,它们也可能影响 HTTP 版本的选择。
HTTP主要版本对比:
版本 | 特点 | 区别 |
---|---|---|
HTTP/1.0 | 无状态、无连接、明文、支持 GET、HEAD、POST 方法、支持请求头和响应头 | 相对于 HTTP/0.9,增加了请求头和响应头,支持多种类型的数据,支持 POST 方法 |
HTTP/1.1 | 长连接、管道化、缓存处理、Host 字段、支持更多的方法和头部字段 | 相对于 HTTP/1.0,增加了长连接和管道化技术,优化了性能,增加了缓存机制,支持虚拟主机,修复了一些错误 |
HTTP/2.0 | 二进制分帧、多路复用、头部压缩、服务器推送、优先级和依赖 | 相对于 HTTP/1.1,采用了二进制格式的编码,实现了真正的并行传输,减少了头部冗余和延迟,增加了服务器主动推送资源的能力,增加了流的优先级和依赖控制 |
HTTP/3.0 | 基于 QUIC 协议,使用 UDP 代替 TCP,实现可靠传输、快速握手、拥塞控制、加密等功能 | 相对于 HTTP/2.0,采用了 QUIC 协议,解决了 TCP 协议在高延迟网络中的一些问题,如队头阻塞、握手延迟等 |
1.2 HTTP 协议的工作流程
HTTP 协议的工作流程是基于客户端-服务器模式的:客户端发起请求,服务器返回响应。客户端通常是一个浏览器,服务器通常是一个 Web 服务器。在客户端和服务器之间,可能还有一些代理(Proxy),它们可以执行一些额外的功能,如缓存、过滤、负载均衡等。
一个典型的 HTTP 协议的工作流程如下:
客户端(浏览器)通过 DNS 服务器解析域名,获取服务器的 IP 地址。
客户端和服务器通过 TCP 协议建立连接,一般使用 80 端口。TCP 连接的建立需要进行三次握手,即客户端发送 SYN 包,服务器回复 SYN+ACK 包,客户端发送 ACK 包。
客户端向服务器发送 HTTP 请求报文,包含请求行、请求头和请求体等信息。
服务器接收并解析 HTTP 请求报文,根据请求内容进行相应的处理,并返回 HTTP 响应报文,包含状态行、响应头和响应体等信息。
客户端接收并解析 HTTP 响应报文,根据响应内容进行相应的展示或处理。
客户端和服务器通过 TCP 协议断开连接,一般使用四次挥手,即客户端发送 FIN 包,服务器回复 ACK 包,服务器发送 FIN 包,客户端回复 ACK 包。
3次握手
进行三次握手的原因是为了实现 TCP 连接的可靠性和双向性,以及同步双方的序列号和确认号。三次握手的过程可以简述如下:
- 客户端发送一个 SYN 包,携带一个随机的序列号 seq=x,表示请求建立连接,并进入 SYN_SENT 状态。
- 服务器收到 SYN 包,回复一个 SYN+ACK 包,携带一个随机的序列号 seq=y 和一个确认号 ack=x+1,表示同意建立连接,并进入 SYN_RECV 状态。
- 客户端收到 SYN+ACK 包,回复一个 ACK 包,携带一个确认号 ack=y+1,表示确认建立连接,并进入 ESTABLISHED 状态。
- 服务器收到 ACK 包,也进入 ESTABLISHED 状态,此时连接建立成功,双方可以开始传输数据。
进行三次握手的原因可以从以下几个方面理解:
-
防止已失效的连接请求报文段突然又传到服务器端,造成服务器端资源的浪费。
-
确保连接是双工的,即双方都能发送和接收数据。
-
确保连接是可靠的,即双方都能确认对方已经收到了自己发送的数据。
-
同步双方的初始序列号和确认号,以便后续的数据传输和校验。
4次挥手:
四次挥手是指断开一个 TCP 连接时,需要客户端和服务器总共发送4个包以确认连接的断开。四次挥手的过程可以概括为以下几个步骤:
- 客户端发送一个 FIN 包,表示不再发送数据,请求关闭连接,并进入 FIN_WAIT_1 状态。
- 服务器收到 FIN 包,回复一个 ACK 包,表示同意关闭连接,并进入 CLOSE_WAIT 状态。
- 服务器发送一个 FIN 包,表示不再接收数据,请求关闭连接,并进入 LAST_ACK 状态。
- 客户端收到 FIN 包,回复一个 ACK 包,表示确认关闭连接,并进入 TIME_WAIT 状态。
- 服务器收到 ACK 包,进入 CLOSED 状态,连接释放。
- 客户端等待一段时间(2MSL),确保服务器收到 ACK 包,然后进入 CLOSED 状态,连接释放。
进行四次挥手的原因可以从以下几个方面理解:
-
TCP 是全双工的协议,即双方都可以发送和接收数据。因此,当一方请求关闭连接时,仅表示该方不再发送数据,但仍可以接收数据。另一方可能还有数据要发送或处理,因此需要先确认对方的关闭请求,然后再发送自己的关闭请求。
-
TCP 需要保证数据的可靠传输,即双方都能确认对方已经收到了自己发送的数据。因此,在关闭连接时,也需要双方互相确认对方的 FIN 和 ACK 包。
-
TCP 需要防止已失效的连接请求报文段突然又传到服务器端,造成服务器端资源的浪费或错误。因此,在关闭连接时,主动方需要等待一段时间(2MSL),以确保对方已经收到自己的最后一个 ACK 包。
进行四次挥手的过程中,有两个状态比较特殊:TIME_WAIT 和 2MSL。TIME_WAIT 是主动关闭连接的一方在发送最后一个 ACK 包后进入的状态,表示等待一段时间后再释放连接。2MSL 是指报文段在网络中的最大生存时间(Maximum Segment Lifetime),一般取值为 2 分钟。TIME_WAIT 的持续时间正好是 2MSL。这样做的目的是为了保证网络中的所有报文段都能够消失,避免对后续连接造成影响。
1.3 HTTP 协议的常用方法
HTTP 协议定义了多种请求方法,用来表示客户端想要对服务器上的资源执行什么操作。常用的方法有:
请求方法 描述
GET 用于从服务器获取数据。
POST 用于向服务器提交数据,通常用于创建新资源。
PUT 用于向服务器更新或替换指定资源或创建新资源。
DELETE 用于请求服务器删除指定资源。
HEAD 与 GET 方法类似,但只请求获取响应头信息,不包括实际数据。
PATCH 用于部分更新服务器上的资源。
OPTIONS 用于获取服务器支持的请求方法列表,通常用于跨域请求预检。
CONNECT 用于建立网络连接,通常由代理服务器使用。
TRACE 用于在路径上对消息进行跟踪,通常用于诊断和调试。
1.4 HTTP 协议的常见状态码
HTTP 协议定义了多种状态码,用来表示服务器对请求的处理结果。状态码由三位数字组成,第一位数字表示状态码所属的类别。常见的类别有:
1xx:信息类,表示接收到请求并继续处理。
2xx:成功类,表示请求已被成功接收、理解、并接受。
3xx:重定向类,表示需要客户端采取进一步的操作才能完成请求。
4xx:客户端错误类,表示客户端发送的请求有错误,服务器无法处理。
5xx:服务器错误类,表示服务器在处理请求的过程中发生了错误。
常见的状态码有:
200 OK:请求成功。
301 Moved Permanently:请求的资源已被永久移动到新位置,响应中会给出新的 URL。
302 Found:请求的资源临时移动到新位置,响应中会给出新的 URL。
304 Not Modified:请求的资源没有修改,可以直接使用缓存的版本。
400 Bad Request:请求格式错误,服务器无法理解。
401 Unauthorized:请求需要用户身份认证。
403 Forbidden:服务器拒绝执行请求,通常是因为权限不足。
404 Not Found:请求的资源不存在,或者 URL 错误。
500 Internal Server Error:服务器内部错误,无法完成请求。
503 Service Unavailable:服务器暂时不可用,通常是因为过载或维护。
1.5 HTTP 的缺点
HTTP 协议是一种无状态的、明文的、基于请求-响应模式的应用层协议,它有以下几个主要的缺点:
-
通信使用明文,内容可能会被窃听或篡改。 HTTP 协议没有加密机制,所以传输的数据都是明文,容易被中间人截获或修改。这样就会导致隐私泄露、数据损坏、身份伪装等安全问题。
-
不验证通信方的身份,可能遭遇伪装。 HTTP 协议没有认证机制,所以无法确定请求或响应的发送方是否是真实的服务器或客户端。这样就会导致欺骗、钓鱼、中间人攻击等风险。
-
无法保证报文的完整性,可能已遭篡改。HTTP 协议没有校验机制,所以无法确定传输的数据是否完整和正确。这样就会导致数据丢失、错误、篡改等问题。
-
性能低效,存在队头阻塞和重复传输的问题。HTTP/1.0 协议每次请求都需要建立新的 TCP 连接,造成额外的开销和延迟。HTTP/1.1 协议虽然引入了持久连接和流水线技术,但仍然存在队头阻塞的问题,即同一个连接上的请求必须按顺序发送和接收,不能并行处理。HTTP/1.x 协议也没有有效利用缓存机制,导致重复传输相同或相似的数据。
为了解决 HTTP 协议的缺点,有以下几种对策:
- 使用 HTTPS 协议代替 HTTP 协议。HTTPS 协议是在 HTTP 协议的基础上加入了 SSL/TLS 层,实现了通信的加密、认证和完整性保护。HTTPS 协议可以有效防止窃听、篡改、伪装等攻击。
- 使用 HTTP/2.0 协议代替 HTTP/1.x 协议。HTTP/2.0 协议是在 HTTP/1.x 协议的基础上进行了优化和改进,实现了二进制分帧、多路复用、头部压缩、服务器推送等特性,提高了传输的效率、灵活性和安全性。
- 使用 HTTP/3.0 协议代替 HTTP/2.0 协议。HTTP/3.0 协议是在 HTTP/2.0 协议的基础上使用了 QUIC 协议代替 TCP 协议,实现了基于 UDP 的可靠传输、快速握手、拥塞控制、加密等功能,解决了 TCP 协议在高延迟网络中的一些问题,如队头阻塞、握手延迟等。
2. HTTPS 协议
2.1 HTTPS 协议简介
HTTPS(HyperText Transfer Protocol Secure),是一种在 HTTP 的基础上增加了 SSL/TLS 层的网络协议,用于在客户端和服务器之间进行安全的数据传输。HTTPS 的安全基础是 SSL/TLS,因此加密的详细内容就需要 SSL/TLS 来实现。
2.2 HTTPS 协议的工作原理
HTTPS 协议的工作原理可以分为两个阶段:握手阶段和传输阶段。
握手阶段
握手阶段是 HTTPS 协议建立连接时进行的一系列交互过程,主要目的是为了协商出双方共同使用的加密算法和密钥,并进行身份认证。握手阶段涉及到非对称加密、对称加密、哈希算法、数字签名等技术。
非对称加密是指使用一对不同的密钥(公钥和私钥)来进行加密和解密的过程,公钥可以公开给任何人使用,私钥必须保密。非对称加密算法有 RSA、DSA、ECDSA 等。
对称加密是指使用相同的密钥来进行加密和解密的过程,对称加密算法有 DES、AES-GCM、ChaCha20-Poly1305 等。
哈希算法是指将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。哈希算法有 MD5、SHA-1、SHA-2、SHA-256 等。
数字签名是指对信息进行哈希后,再使用私钥对哈希值进行加密的过程,可以证明信息没有被篡改,并确认发送者的身份。数字签名可以使用公钥进行解密和验证。
握手阶段的具体过程如下:
-
客户端向服务器发送一个 ClientHello 消息,包含客户端支持的 SSL/TLS 版本、加密套件(包括非对称加密算法、对称加密算法和哈希算法)、压缩方法和一个随机数 ClientRandom。
-
服务器向客户端发送一个 ServerHello 消息,包含服务器选择的 SSL/TLS 版本、加密套件、压缩方法和一个随机数 ServerRandom。
-
服务器向客户端发送一个 Certificate 消息,包含服务器的证书,证书中包含了服务器的公钥和由证书颁发机构(CA)签发的数字签名。
-
服务器向客户端发送一个 ServerKeyExchange 消息,包含服务器使用的非对称加密算法(如 DH 或 ECDHE)生成的临时公钥。
-
服务器向客户端发送一个 ServerHelloDone 消息,表示服务器握手消息结束。
-
客户端收到服务器的消息后,首先验证服务器的证书是否有效,是否由可信任的 CA 签发,是否过期等。如果验证失败,客户端会给出警告或终止连接。如果验证成功,客户端会提取出服务器的公钥。
-
客户端向服务器发送一个 ClientKeyExchange 消息,包含客户端使用服务器的公钥加密的一个随机数 PreMasterSecret。
-
客户端和服务器根据 PreMasterSecret 和两个随机数(ClientRandom 和 ServerRandom)计算出主密钥 MasterSecret,并用主密钥生成四个密钥:客户端加密密钥、客户端解密密钥、服务器加密密钥和服务器解密密钥。
-
客户端向服务器发送一个 ChangeCipherSpec 消息,表示客户端将使用协商好的加密套件和密钥来加密后续的消息。
-
客户端向服务器发送一个 Finished 消息,包含所有握手消息的哈希值,用于让服务器验证握手过程是否完整。
-
服务器向客户端发送一个 ChangeCipherSpec 消息,表示服务器也将使用协商好的加密套件和密钥来加密后续的消息。
-
服务器向客户端发送一个 Finished 消息,包含所有握手消息的哈希值,用于让客户端验证握手过程是否完整。
至此,握手阶段结束,双方已经建立了安全的连接,并准备好进行数据传输。
传输阶段
传输阶段是 HTTPS 协议在建立连接后进行数据交互时进行的过程,主要目的是为了保护数据的保密性和完整性。传输阶段涉及到对称加密、哈希算法等技术。
传输阶段的具体过程如下:
-
客户端或服务器在发送数据时,首先使用对称加密算法对数据进行加密,然后使用哈希算法对数据生成校验码(MAC),并将校验码附在数据后面一起发送。
-
客户端或服务器在接收数据时,首先使用对称解密算法对数据进行解密,然后使用哈希算法对数据生成校验码,并与接收到的校验码进行比较。如果校验码一致,则说明数据没有被篡改,可以继续处理。如果校验码不一致,则说明数据可能被篡改,应该丢弃或报错。
2.3 HTTPS 协议的优势
HTTPS 协议是为了解决 HTTP 协议的安全问题而设计的,它在 HTTP 和 TCP 之间增加了一个 SSL/TLS 层,用于对数据进行加密、身份认证和完整性保护。SSL/TLS 是一种安全协议套件,它包括了多种加密算法和认证机制,可以根据不同的场景和需求进行选择和组合。
HTTPS 协议具有以下几个优势:
数据保密性:保证数据内容在传输过程中不会被第三方查看,只有通信双方才能解密数据。
数据完整性:保证数据内容在传输过程中不会被第三方篡改,通信双方可以通过校验码来验证数据是否完整。
身份认证:保证数据到达用户期望的目的地,通信双方可以通过证书来验证对方的身份是否合法。
2.4 HTTPS 协议的缺陷
HTTPS 的缺点:
HTTPS 需要申请和维护 SSL 证书,增加了网站的成本。(【SSL证书】给网站安装SSL证书(Nginx服务器))
HTTPS 需要进行加密和解密的计算,增加了服务器和客户端的资源消耗。
HTTPS 在握手阶段耗时较长,会影响页面的加载速度。
HTTPS 会影响缓存的效率,增加数据的开销和功耗。
2.5 拓展问题
为什么用户好像什么都不用做就可以使用HTTPS?
要开启HTTPS服务,通常是在服务器上安装证书、并修改web服务器的配置文件,用户好像什么都没做,就可以享受数据的安全传输?
原因是:
HTTPS 的连接是基于 SSL/TLS 协议的,这是一种使用公钥和私钥的非对称加密技术。
服务器端需要有一个由 CA 机构颁发的证书,这个证书包含了服务器的公钥和域名等信息。
客户端访问服务器时,会收到服务器的证书,并验证其有效性和合法性。
如果证书有效,客户端会使用服务器的公钥加密一个随机数,并发送给服务器。
服务器收到客户端的消息后,会用自己的私钥解密得到随机数,并用它作为对称加密的密钥。
之后,客户端和服务器就可以用这个对称加密的密钥来加密和解密通信的内容。
所以,用户不需要证书,只需要信任 CA 机构,并使用浏览器来验证服务器的证书即可。 用户不需要向服务器提供自己的身份信息,只需要用服务器的公钥来协商一个对称加密的密钥。这样,HTTPS 连接就可以实现数据的安全性和完整性,防止中间人攻击、数据篡改、信息泄露等风险。