Page 65 - Web性能权威指南
P. 65
顾名思义,应用层协议协商(ALPN,Application Layer Protocol Negotiation)作为
TLS 扩展,让我们能在 TLS 握手的同时协商应用协议(图 4-2),从而省掉了 HTTP
的 Upgrade 机制所需的额外往返时间。具体来说,整个过程分如下几步:
• 客户端在 ClientHello 消息中追加一个新的 ProtocolNameList 字段,包含自己支
持的应用协议;
• 服务器检查 ProtocolNameList 字段,并在 ServerHello 消息中以 ProtocolName 字
段返回选中的协议。
服务器可以从中选择一个协议名,否则如果不支持其中的任何协议,则断开连接。
只要 TLS 握手完成、建立了加密信道并就应用协议达成一致,客户端与服务器就可
以立即通信。
ALPN 抛开了 HTTP 的 Upgrade 机制,省却了一次往返的延迟。不过,TLS
握手还是必需的。事实上,ALPN 协商不会比基于非加密信道的 HTTP
Upgrade 更快,它只能保证通过 TLS 进行协议协商不会更慢。
NPN 与 ALPN 的渊源
NPN(Next Protocol Negotiation,下一代协议协商)是谷歌在 SPDY 协议中开发的
一个 TLS 扩展,目的是通过在 TLS 握手期间协商应用协议来提高效率。听着耳熟
吗?最终结果与 ALPN 功能等价。
ALPN 是 IETF 在 NPN 基础上修订并批准的版本。在 NPN 中,服务器广播自己
支持的协议,客户端选择和确认协议。而在 ALPN 中,交换次序颠倒过来了,客
户端先声明自己支持的协议,服务器选择并确认协议。这样修改的目的是为了让
ALPN 与其他协议协商标准保持一致。
换句话说,ALPN 是 NPN 的继任者,而 NPN 已经废弃。原来配置为使用 NPN 的
客户端和服务器,都需要重新配置升级到 ALPN。
4.2.2 服务器名称指示(SNI)
网络上可以建立 TCP 连接的任意两端都可以建立加密 TLS 信道,客户端只需知道
另一端的 IP 地址即可建立连接并进行 TLS 握手。然而,如果服务器想在一个 IP 地
址为多个站点提供服务,而每个站点都拥有自己的 TLS 证书,那怎么办?这问题看
似有点怪,但其实一点都不怪。
为了解决这个问题,SNI(Server Name Indication,服务器名称指示)扩展被引入
TLS 协议,该扩展允许客户端在握手之初就指明要连接的主机名。Web 服务器可以
传输层安全(TLS) | 47