← 返回题目列表

TLS ALPN 是什么?HTTPS 如何协商使用 HTTP/1.1 还是 HTTP/2?

高频 中等 第 10 / 29 题 更新于 2026/07/31
TLSALPNHTTP2HTTPS协议协商

简化版

ALPN 是 TLS 扩展,用来在 TLS 握手阶段协商应用层协议,例如 http/1.1h2。客户端在 ClientHello 中声明自己支持的协议列表,服务器选择一个并在握手中返回。HTTPS 使用 ALPN 可以在同一个 443 端口上决定后续跑 HTTP/1.1 还是 HTTP/2。没有 ALPN,客户端和服务器可能无法可靠协商 HTTP/2,或需要额外升级机制。

详细版

ALPN 全称 Application-Layer Protocol Negotiation。它发生在 TLS 握手期间:

ClientHello: ALPN = ["h2", "http/1.1"]
ServerHello: ALPN = "h2"
TLS 握手完成
后续使用 HTTP/2 语义传输

它的价值是把应用层协议选择放进 TLS 握手,减少额外往返,并支持同一个域名、同一个端口服务不同协议。常见追问包括:SNI 协商证书,ALPN 协商应用协议;SNI 解决“用哪个证书”,ALPN 解决“TLS 之上跑什么协议”。

完整版教学

一、ALPN 要解决什么问题

HTTPS 的底层是 TLS,但 TLS 之上可以跑不同应用层协议:

  • HTTP/1.1
  • HTTP/2
  • gRPC over HTTP/2
  • 其他基于 TLS 的应用协议

客户端和服务器必须先协商“TLS 握手完成后说哪种应用层语言”。ALPN 就是在 TLS 握手里完成这件事。

二、ALPN 在握手中的位置

简化流程:

ClientHello
  SNI: www.example.com
  ALPN: h2, http/1.1
        |
        v
ServerHello
  ALPN: h2

客户端告诉服务器自己支持哪些协议,服务器从中选择一个。握手完成后,双方按选中的协议解释后续字节流。

SNI 像是在问“我要访问哪个站点”,ALPN 像是在问“加密通道里我们用哪种应用协议”。

三、HTTPS 如何协商 HTTP/2

浏览器访问 https://example.com 时,如果支持 HTTP/2,通常会在 ALPN 里带:

h2, http/1.1

如果服务器也支持 HTTP/2,就选择 h2;否则选择 http/1.1。这让客户端可以在同一个 443 端口上平滑回退。

常见协议标识:

ALPN 标识含义
h2HTTP/2 over TLS
http/1.1HTTP/1.1
h3HTTP/3,基于 QUIC,不跑在传统 TLS over TCP 上

HTTP/2 在浏览器 HTTPS 场景里通常依赖 ALPN 协商。

四、ALPN 和 NPN、Upgrade 的区别

早期还有 NPN,后来被 ALPN 替代。HTTP/1.1 也有 Upgrade 机制,例如 WebSocket 升级,但它和 ALPN 层次不同。

机制所在阶段常见用途
ALPNTLS 握手阶段协商 h2/http1.1
UpgradeHTTP 请求阶段WebSocket 等协议升级
NPN旧 TLS 扩展已被 ALPN 取代

ALPN 的优势是更早完成协议选择,不需要先发 HTTP 请求再升级。

五、ALPN 和 SNI 的区别

这两个扩展都在 TLS 握手里,所以经常一起被问。

扩展解决的问题示例
SNI服务器选择哪个证书或虚拟主机www.example.com
ALPNTLS 之上使用哪个应用层协议h2http/1.1

如果一台服务器托管多个域名,需要 SNI 来知道返回哪个证书;如果同一个站点同时支持 HTTP/1.1 和 HTTP/2,需要 ALPN 来选择协议。

六、排查 HTTP/2 不生效时看什么

如果浏览器没有使用 HTTP/2,可以检查:

  • 服务端是否启用 HTTP/2;
  • TLS 配置是否支持 ALPN;
  • 证书和域名是否正确;
  • 反向代理是否把 HTTP/2 终止后转成 HTTP/1.1;
  • 客户端或中间设备是否不支持 HTTP/2;
  • 是否使用明文 HTTP 而不是 HTTPS。

命令行常见观察方式:

openssl s_client -alpn h2 -connect example.com:443
curl -I --http2 https://example.com

七、常见误区与追问

  • 误区:ALPN 用来选择证书。 选择证书主要看 SNI,ALPN 用来选择应用层协议。
  • 误区:HTTP/2 必须使用新的端口。 HTTPS 场景下 HTTP/2 通常仍走 443,通过 ALPN 协商。
  • 误区:ALPN 发生在 HTTP 请求之后。 ALPN 是 TLS 握手扩展,发生在应用层数据传输前。
  • 误区:支持 TLS 就一定支持 HTTP/2。 HTTP/2 还需要客户端、服务端和中间代理都支持,并正确协商。
  • 追问:客户端同时支持 h2 和 http/1.1 时怎么选? 客户端在 ALPN 列表中声明,服务器选择一个共同支持的协议。
  • 追问:SNI 和 ALPN 可以同时出现在 ClientHello 里吗? 可以,SNI 表示访问域名,ALPN 表示可接受的应用协议。

八、加强记忆

ALPN 是 TLS 握手里的应用协议协商。SNI 决定“访问哪个域名、用哪个证书”,ALPN 决定“TLS 之上跑 HTTP/2 还是 HTTP/1.1”。浏览器访问 HTTPS 时常带 h2, http/1.1,服务器选择 h2 就进入 HTTP/2。排查 HTTP/2 不生效,要看服务端配置、TLS ALPN、代理链路和客户端能力。