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
   60   61   62   63   64   65   66   67   68   69   70