8.1.2 Что такое ALPN и для чего он необходим

TheHost HTTP2 Banner

ALPN (сокр. Application-Layer Protocol Negotiation) – это расширение Transport Layer Security (TLS), позволяющее на прикладном сетевом уровне согласовывать какой протокол следует использовать через защищенное соединение, таким образом, избегая дополнительных двусторонних запросов. Одновременно с этим ALPN не зависит от других протоколов прикладного уровня.

ALPN был описан в RFC 7301 и является прямой эволюцией NPN (Next Protocol Negotiation), разработанным Google для использования в их экспериментальном протоколе SPDY.

На практике, ALPN в первую очередь нужно для безопасных соединений по протоколу HTTP/2, что улучшает сжатие веб-страниц и уменьшает их задержку по сравнению с предыдущим поколением HTTP/1.1 и HTTP/1.0. Без наличия на сервере библиотеки поддерживающей ALPN работа по протоколу HTTP/2 невозможна.

Детально: как на пратике работает ALPN

В начале процесса установки безопасного соединения между клиентом и сервером происходит процесс TLS Handshake. В ходе этого процесса клиент и сервер договариваются о параметрах шифрования, аутентификации и других настроек безопасности.

Первым шагом в TLS Handshake является отправка сообщения ClientHello от клиента к серверу. ClientHello включает в себя список поддерживаемых протоколов прикладного уровня, включая те, которые поддерживает ALPN. Сервер отвечает сообщением ServerHello, которое содержит выбранные параметры соединения, включая протоколы прикладного уровня.

Если сервер и клиент поддерживают ALPN, клиент включает в ClientHello расширение ALPN с перечислением поддерживаемых протоколов прикладного уровня, таких как HTTP/1.1, HTTP/2 и т. д. Сервер может либо выбрать один из предложенных протоколов, либо выбрать альтернативный протокол.

Сервер анализирует предложенные клиентом протоколы прикладного уровня и выбирает наиболее подходящий протокол. Он может выбрать протокол, который наиболее эффективно поддерживается сервером и клиентом, например, HTTP/2 вместо HTTP/1.1, что улучшит скорость и производительность соединения.

После выбора протокола прикладного уровня сервер отправляет сообщение ServerHello с выбранным протоколом. После этого процесс TLS Handshake завершается, и клиент и сервер могут начать обмен данными в рамках выбранного протокола прикладного уровня.

ALPN поддерживается начиная с версии TLS 1.2. Для более ранних версий TLS используется NPN.

На текущий момент поддержка ALPN реализована следующими библиотеками:

  • OpenSSL: с версии 1.0.2.
  • GnuTLS: с версии 3.2.0.
  • MatrixSSL: с версии 3.7.1.
  • Network Security Services: с версии 3.15.5.
  • LibreSSL: с версии 2.1.3.
  • mbedTLS/PolarSSL: с версии 1.3.6.
  • s2n: все версии.
  • wolfSSL/CyaSSL: с версии 3.7.0.
  • BearSSL: с версии 0.3.
  • Win32 SSPI: начиная с Windows 8.1 и Windows Server 2012 R2.
  • SChannel: под управлением Windows 8.1 / Windows Server 2012 R2.