把 HTTPS 改成 HTTP 后,带宽减少了 70%,这个现象主要是由以下几个原因引起的:
1. HTTPS 增加的加密开销
- 加密与解密:HTTPS 是基于 TLS(传输层安全)协议的,它在通信过程中会对数据进行加密和解密。这意味着每一次请求和响应都需要进行额外的计算和内存消耗,用来加密发送的数据和解密接收到的数据。由于加密和解密操作消耗一定的计算资源,HTTPS 请求在传输数据时通常会比 HTTP 更加复杂。
- TLS 握手:HTTPS 在每次建立连接时需要进行一次 TLS 握手,这个过程涉及到密钥交换、证书验证等操作,需要额外的数据交换和计算开销。尤其是对于非持久连接(每次请求建立新连接的情况),握手过程会增加额外的带宽消耗。
2. 数据包大小
- HTTP 直接传输明文数据,没有加密和签名过程,因此数据本身相对较小。
- HTTPS 会将数据加密,这意味着传输的每个数据包通常会比相同的 HTTP 数据包要大。加密的数据包通常包含了额外的元数据,例如填充数据、加密的头信息等,这些都导致了加密后数据包的大小增大,尤其是在高频繁的小数据包的请求中,这个开销会比较显著。
例如:
- HTTP 请求 可能只包含你实际需要传输的数据,比如 JSON 数据。
- HTTPS 请求 除了原有数据外,还需要包含加密后的数据、TLS 握手的记录、证书等,这些都会增加数据传输的总量。
3. TCP 连接与持久连接
- HTTP/1.x:传统的 HTTP/1.x 通常是非持久连接,意味着每个请求和响应都需要单独的 TCP 连接,增加了网络延迟和带宽消耗。而 HTTPS 同样需要建立 SSL/TLS 加密连接。
- HTTP/2:HTTP/2 引入了多路复用、头部压缩等技术,能够通过同一个 TCP 连接并行传输多个请求和响应,优化了带宽利用效率。但即使在 HTTP/2 中,HTTPS 仍然会有加密和解密开销,因此带宽利用率不如 HTTP。
4. TLS 握手和加密算法的效率
- TLS 握手过程中的数据交换:在每次建立 HTTPS 连接时,客户端和服务器需要交换密钥和证书信息,这个过程会产生额外的数据开销。尽管在 HTTP/2 中有保持连接的机制,但每次进行新的连接时,仍然需要执行握手,这会带来性能损失。
- 加密算法的效率:加密算法(例如 AES、RSA、ECC)在处理大数据时可能会引起额外的延迟,尤其是在 CPU 性能不高的设备上,可能会导致加密和解密的过程成为瓶颈,进一步影响带宽的利用率。
5. HTTP/2 与 HTTPS
- 虽然 HTTP/2 在性能上相较 HTTP/1.x 有了显著改进,但 HTTP/2 要求加密(即 HTTPS)。在一些情况下,由于 HTTPS 的加密开销,HTTP/2 的优势可能会被削弱,尤其是在加密层的性能成为瓶颈时。
- 头部压缩:HTTP/2 引入的头部压缩技术(HPACK)有助于减少传输的冗余信息,但由于 TLS 协议的限制,这种压缩技术在加密数据中的表现可能不如明文 HTTP 中的效果显著。
总结:
- 加密开销:HTTPS 因为加密和解密过程的存在,会增加额外的计算和带宽消耗。
- TLS 握手:每次建立 HTTPS 连接时都会涉及到握手,这增加了带宽消耗,尤其是在短时间内频繁建立新连接时。
- 数据包大小:HTTPS 数据包较 HTTP 数据包大,带来了额外的带宽负担。
- 性能瓶颈:加密算法的效率问题也可能会影响 HTTPS 的性能,使得其相较于 HTTP 的带宽使用更低。
解决方案和优化:
- 开启 HTTP/2:如果你只关心带宽和性能,并且不关心安全性问题,可以使用 HTTP/2,它可以改善带宽利用效率,尤其是在请求数较多时。但这仍然需要 HTTPS 支持。
- 优化加密性能:如果必须使用 HTTPS,可以通过使用更高效的加密算法(例如 elliptic curve cryptography)或者启用硬件加速来降低加密解密的开销。
- 减少 TLS 握手次数:可以通过持久连接和连接复用来减少握手过程带来的开销。例如,可以使用 HTTP/2 或保持长连接来减少握手的频率。
尽管 HTTP
和 HTTPS
在带宽消耗上有所差异,通常建议在现代应用中使用 HTTPS
,因为它提供了加密、身份验证和数据完整性保护,是确保数据安全的基本保障。