HTTP、HTTPS、TCP、TLS 到底谁套着谁
HTTP、HTTPS、TCP、UDP、TLS、SSL,这几个词经常被塞进同一张图里。
图看多了,反而容易产生一种错觉:它们像是同一层的几个选项,互相替代。实际上它们解决的问题完全不同。
先分层
用 TCP/IP 的视角粗略看:
应用层:HTTP/1.1、HTTP/2、HTTP/3、DNS...
安全层:TLS
传输层:TCP、UDP
网络层:IP
链路层:以太网、Wi-Fi...
这不是严格的 OSI 七层图,但足够解释大多数 Web 请求。
HTTP 是应用层协议,定义请求和响应的语义。TCP/UDP 负责传输,IP 负责寻址和路由,TLS 负责在传输之上提供加密、完整性和身份认证。
HTTPS 不是“另一个和 HTTP 并列的协议”,而是 HTTP 通过 TLS 传输。SSL 是 TLS 的前身,现代语境下说 SSL 通常是不准确的旧称。
TCP 和 UDP
TCP 提供面向连接的可靠字节流:
- 建立连接需要握手。
- 有序列号、确认和重传。
- 有流量控制和拥塞控制。
- 适合对顺序和完整性有要求的场景。
UDP 不保证可靠性和顺序,但开销小、延迟低,适合实时音视频、游戏和 DNS 等场景。
HTTP/1.1 和 HTTP/2 通常运行在 TCP 上;HTTP/3 运行在 QUIC 上,而 QUIC 基于 UDP。
三次握手和四次挥手
TCP 建立连接通常概括为三次握手:
客户端 -> SYN
服务端 -> SYN + ACK
客户端 -> ACK
关闭连接通常需要四次挥手,因为 TCP 是全双工的,两个方向可以分别关闭。
这里有个常见误区:SYN flood 不是“只发第一次握手”这么简单,它利用的是服务端为半连接分配资源而客户端不完成握手。现代系统会用 SYN cookie 等机制缓解。
TLS 在做什么
TLS 主要解决三件事:
- 加密:防止内容被窃听。
- 完整性:防止内容被篡改。
- 身份认证:通过证书确认服务器身份。
TLS 握手会协商版本、密码套件,验证证书,并生成会话密钥。TLS 1.3 把握手简化到 1-RTT,支持会话恢复时进一步降低延迟。
握手阶段使用非对称密码学或密钥交换算法,但真正的业务数据通常使用对称加密,因为对称加密更适合大量数据。
HTTPS 不是“把 HTTP 加密一下”这么简单
HTTPS = HTTP over TLS。它带来的变化包括:
- 内容加密。
- 服务器身份验证。
- 数据完整性校验。
- 浏览器对安全上下文的限制,比如部分 API 只在 HTTPS 下可用。
但 HTTPS 不隐藏所有元数据。IP 地址、端口、流量大小、访问时间仍然可能被观察。TLS 1.3 的 Encrypted ClientHello 还在逐步推广,不能假设所有握手信息都不可见。
HTTP/1.1、HTTP/2、HTTP/3
HTTP/1.1:
- 文本协议。
- 连接复用,但存在队头阻塞。
- 常见优化包括合并资源、雪碧图、域名分片。
HTTP/2:
- 二进制分帧。
- 单连接多路复用。
- 头部压缩。
- 仍然受 TCP 层队头阻塞影响。
HTTP/3:
- 基于 QUIC。
- 使用 UDP。
- 把可靠传输和加密集成到 QUIC 中。
- 减少连接建立延迟,并缓解 TCP 层队头阻塞。
证书和常见错误
浏览器验证证书链、域名、有效期、吊销状态和签名算法。自签名证书、过期证书、域名不匹配都会导致安全错误。
生产环境还需要注意:
- 使用足够新的 TLS 版本。
- 禁用弱密码套件。
- 配置 HSTS。
- 正确处理混合内容。
- 证书自动续期。
最后
HTTP 描述“请求什么”,TCP/UDP 负责“怎么传”,TLS 负责“传得是否安全”,HTTPS 是这些机制的组合。
把层次分清,比记住每个缩写的全称更有用。因为排障时,你首先要知道问题出在应用语义、传输连接,还是证书和密钥。