文章

面试题学习笔记 | 计算机网络 HTTP 协议

之前我们了解到,在 HTTP 请求的请求行中包含了 HTTP 协议的版本号。不同版本的 HTTP 协议具有不同的特性,因此,了解常见 HTTP 版本之间的区别是必要的

HTTP 1.0 和 2.0 有什么区别?

作为相对早期的 HTTP 版本,HTTP/1.0 主要具有以下特点:

  • 增加了 HEAD、POST 等新方法

  • 增加了响应状态码

  • 引入了请求头和响应头

  • 在请求中加入了 HTTP 版本号

  • 引入了 Content-Type 头部,使得传输的数据类型不再局限于文本

然而,HTTP/1.0 存在严重的性能问题——每请求一个资源都需要新建一个 TCP 连接,且请求必须串行执行。为了解决这些问题,HTTP/1.1 进行了如下优化:

  • 新增了 Connection: Keep-Alive 头部,实现持久连接,避免频繁建立 TCP 连接

  • 支持请求流水线(pipeline),允许在第一个请求未返回时继续发送后续请求,提高吞吐量

  • 允许分块传输(chunked transfer encoding),服务器可以在不提前声明 Content-Length 的情况下逐步发送数据,适用于大文件传输

  • 增强了缓存管理,引入 Cache-Control 头部

  • 引入 Host 头部,支持同一 IP 地址下托管多个网站,解决虚拟主机访问问题

尽管 HTTP/1.1 的优化提升了性能,但仍存在瓶颈。随着互联网的高速发展,这些瓶颈逐渐显现,促使了 HTTP/2 的诞生。

HTTP/2 主要优化点如下:

  • 采用二进制协议而非文本协议,提高解析效率

  • 在单个 TCP 连接上支持多路复用,允许多个请求并行进行,避免队头阻塞

  • 采用 HPACK 进行头部压缩,减少冗余数据,提高传输效率

  • 允许服务器主动推送资源(Server Push),减少不必要的请求等待

HTTP 2.0 和 3.0 有什么区别?

HTTP/2 通过多路复用、二进制帧、头部压缩和服务器推送等机制提升了性能,但仍然存在以下问题:

  1. 队头阻塞问题

    • 虽然 HTTP/2 解决了应用层的队头阻塞问题(即同一连接中的多个请求可以交错发送),但仍然受制于 TCP 的丢包重传机制

    • 在 TCP 连接中,一旦发生丢包,所有数据流都必须等待该数据包重传,导致整体延迟增加

  2. 连接建立延迟

    • 在 HTTPS 连接中,TCP 三次握手完成后,还需要进行 TLS 握手,通常需要额外 1~2 个 RTT(往返时延)

    • 在高延迟网络环境下,建立连接的成本较高

  3. 连接迁移限制

    • TCP 连接由四元组(源 IP、源端口、目标 IP、目标端口)标识,一旦网络环境发生变化(如设备切换 Wi-Fi 到移动数据),连接会断开并需要重新建立

HTTP/3 针对这些问题进行了优化:

  • 基于 UDP 取代 TCP,使用 QUIC 协议,避免了 TCP 队头阻塞,同时提供了类似 TCP 的可靠传输机制

  • 默认集成 TLS 1.3 加密,相比 HTTP/2 可选 TLS,HTTP/3 强制使用 TLS,增强安全性

  • 减少连接建立时间,QUIC 结合 TLS 1.3,使连接建立与加密握手同时进行,大幅降低首次连接延迟

  • 支持连接迁移,QUIC 通过连接 ID 识别连接,而不是依赖 IP 和端口,使其在网络切换时无需重新建立连接

HTTP 和 HTTPS 有什么区别?

有时在访问网站时,会看到如下提示:

该网站未使用私密连接。其他人可能会查看或修改您通过该网站发送和接收的信息

这是因为该网站使用的是 HTTP,而不是 HTTPS。二者的主要区别如下:

  • 数据传输安全性

    • HTTP 采用明文传输,容易被监听和篡改

    • HTTPS 通过 SSL/TLS 协议对数据进行加密,确保数据的机密性和完整性

  • 端口号

    • HTTP 默认使用端口 80

    • HTTPS 默认使用端口 443

  • 性能

    • HTTP 由于无需加密,连接建立速度较快

    • HTTPS 需要进行 SSL/TLS 握手,带来额外的计算开销,但现代优化已降低了性能差距

  • SEO 影响

    • 搜索引擎通常降低 HTTP 站点的排名

    • Google 等搜索引擎更倾向于优先展示 HTTPS 网站

扩展:HTTPS 的握手过程

HTTPS 使用 TLS 进行握手,以 RSA 方式举例,握手过程如下:

  1. 客户端 Hello

    • 客户端向服务器发送 ClientHello 消息,包括支持的 TLS 版本、加密算法套件和随机数

  2. 服务器 Hello

    • 服务器响应 ServerHello 消息,确认 TLS 版本和加密算法,并返回一个随机数和数字证书(包含公钥),证明自身身份

  3. 客户端密钥交换 & 生成对称密钥

    • 客户端验证服务器证书后,生成一个 pre-master 密钥,并使用服务器公钥加密,发送给服务器

    • 服务器使用私钥解密 pre-master,双方根据协商的算法生成最终的对称密钥

  4. 开始安全通信

    • 双方交换 Finished 消息,确认加密通道建立,从此使用对称加密传输数据

HTTPS 的核心在于:服务器依赖 CA 机构获取公私钥,客户端通过 CA 机构验证服务器身份,利用公钥加密密钥,服务器通过私钥解密,从而建立安全的对称加密通信

总结

今天我们了解了 HTTP 各个版本的特点及其演进过程。可以发现,早期协议设计较为简单,只能满足基本需求,而随着互联网的发展,新的性能瓶颈不断出现,促使协议进行优化升级。

每次协议的迭代都旨在解决已有问题,但新技术的引入往往也会带来新的挑战。如何平衡性能、可靠性与安全性,是协议设计中必须慎重考虑的核心问题。在实际应用中,我们需要根据业务需求选择合适的 HTTP 版本,并关注未来的技术趋势,以便更好地优化网络通信性能

License:  CC BY 4.0