ALPN (Application Layer Protocol Negotiation)是TLS的擴展,允許在安全連接的基礎上進行應用層協議的協商。ALPN支持任意應用層協議的協商,目前應用最多是HTTP2的協商。當前主流瀏覽器,都只支持基於 HTTPS 部署的 HTTP/2,因為瀏覽器是基於ALPN協議來判斷服務器是否支持HTTP2協議。
協商原理
在TLS的Say Hello階段增加應用層協議的協商,如下圖所示:
我們可以通過WireShark抓包分析ALPN協商協議交互的過程。
- 瀏覽器在進行SSL連接,第一次發送Client Hello包時,在擴展字段里攜帶瀏覽器支持的版本,其中 h2 代表瀏覽器支持http2協議。
- 服務器在返回Server Hello包時,如果服務器支持http 2,則會返回h2,如果不支持,則從客戶端支持的協議列表中選取一個它支持的協議,一般為http/1.1。
瀏覽器和服務端都支持ALPN 協商,是用上 HTTP/2 的大前提。
- Android 手機從5.0版本開始支持ALPN,OkHttp源代碼里通過以下代碼判斷手機是否支持ALPN:
public static boolean supportsAlpn() { if (Security.getProvider("GMSCore_OpenSSL") != null) { return true; } else { try { Class.forName("android.net.Network"); // Arbitrary class added in Android 5.0.
return true; } catch (ClassNotFoundException ignored) { } } return false; }
- 大部分 Web Server 都依賴 OpenSSL 庫提供 https服務,是否支持 ALPN 完全取決於使用的 OpenSSL 版本,OpenSSL 1.0.2 版本才開始支持 ALPN。
查看網站是否支持HTTP2/ALPN
- 下載Chrome瀏覽器插件(需FQ):HTTP2 and SPDY indicator
- 測試HTTP/2支持的在線工具(需FQ):https://tools.keycdn.com/http2-test