HTTP/2 on IIS (HTTP/2 en IIS)

por David So

Compatibilidad

Versión Notas
IIS 10.0 La compatibilidad con HTTP/2 se introdujo en IIS 10.0
IIS 8.5 y versiones anteriores No se admite HTTP/2 antes de IIS 10.0

¿Qué es HTTP/2?

HTTP/2 es una reelaboración de cómo fluye la semántica HTTP en las conexiones TCP, y la compatibilidad con HTTP/2 está presente en Windows 10 y Windows Server 2016. HTTP/2 es una actualización importante después de casi dos décadas de uso de HTTP/1.1 y reduce el impacto de la latencia y la carga de conexión en los servidores web.

El avance principal de HTTP/1.1 fue el uso de conexiones persistentes para atender varias solicitudes en una fila. En HTTP/2, se puede usar una conexión persistente para atender varias solicitudes simultáneas. En el proceso, HTTP/2 presenta varias características adicionales que mejoran la eficacia de HTTP a través de la red.

Una conexión para varias solicitudes

Cada conexión TCP requiere un recorrido de ida y vuelta para configurar. Si usa el cifrado, el protocolo de enlace TLS toma otros recorridos de ida y vuelta de 1 a 2. Todo esto sucede antes de que se pueda enviar el primer byte de la primera respuesta. Al reutilizar una conexión existente en lugar de configurar una nueva, muchas solicitudes pueden compartir esta sobrecarga. HTTP/2 reduce considerablemente la necesidad de que una solicitud espere mientras se establece una nueva conexión o espere a que una conexión existente esté inactiva. Dado que una sola conexión se multiplexa entre muchas solicitudes, la solicitud normalmente se puede enviar inmediatamente sin esperar a que finalicen otras solicitudes.

Compresión de encabezado con HPACK

HTTP admite la compresión de datos para edades. Sin embargo, los encabezados se envían como texto sin comprimir, con mucha redundancia entre solicitudes. (Muchos de los encabezados más largos se envían exactamente con el mismo valor en cada solicitud). HTTP/2 presenta HPACK, un esquema de compresión para encabezados HTTP que reduce la redundancia entre las solicitudes.

La compresión ayuda a multiplexar, ya que las solicitudes son más pequeñas. Esto permite a los clientes realizar muchas solicitudes en sus primeros paquetes en una conexión, mientras que las ventanas de control de flujo TCP siguen siendo pequeñas.

Server push

Las solicitudes vienen en patrones. Si un cliente solicita un recurso, el servidor a menudo puede predecir que necesitará otros recursos a los que se hace referencia en la página. En HTTP/1.1, la inserción se usó para entregar estos recursos a los clientes como parte de la primera respuesta. La inserción tiene sus inconvenientes, en particular, que el recurso insertado no se puede almacenar en caché para su uso en otras páginas en las que también se puede hacer referencia.

HTTP/2 presenta el concepto de "inserción": el servidor que responde a las solicitudes que el cliente aún no ha realizado, pero predice que el cliente lo hará. Esto permite a los servidores seguir proporcionando las ventajas de latencia de inserción, pero en un formulario que el cliente puede almacenar en caché y reutilizar en otras páginas.

¿Cómo se usa HTTP/2?

¡Podría estar ya! Puesto que casi todos los navegadores ya admiten HTTP/2 en su versión más actual, y los datos actuales muestran que más del 50 % de los usuarios ya utilizan navegadores compatibles con HTTP/2.

En el servidor, IIS que se ejecuta en Windows 10 o Windows Server 2016 admite HTTP/2.

IIS actualmente solo admite HTTP/2 a través de TLS. Al realizar una conexión HTTPS a un servidor web que ejecuta IIS en Windows 10, se usa HTTP/2 si el cliente y el servidor lo admiten. En IIS, hemos implementado HTTP/2 lo más transparente posible: no es necesario cambiar nada en la aplicación para que HTTP/2 funcione. Algunas optimizaciones HTTP/1.1 (particionamiento de dominios, inserción, etc.) ya no se recomiendan en HTTP/2, por lo que debe planear quitarlas en el futuro.

¿Qué pasa con la inserción?

Dado que Server Push es una nueva función de HTTP/2, existen nuevas API a las que debe llamar para aprovecharla. Cuando llama a la API PushPromise en ASP.NET o a la API HttpDeclarePush API desde un módulo nativo de IIS, usted proporciona la URL y las cabeceras de solicitud opcionales para la solicitud que prevé que realice el cliente. Si la conexión subyacente admite la inserción, suceden dos cosas:

  • Se envía un PUSH_PROMISE al cliente, por lo que el cliente puede comprobar si el recurso ya existe en la memoria caché.
  • Se agrega una nueva solicitud a la cola de solicitudes para el recurso insertado.

Si la conexión subyacente no admite la inserción (inserción deshabilitada por el cliente o el cliente HTTP/1.1), la llamada no hace nada y devuelve el éxito, por lo que puede llamar a la API de forma segura sin necesidad de preocuparse de si se permite la inserción.

Configuración de IIS

No hay nuevas opciones de configuración de IIS específicas de HTTP/2.

En Windows Server 2016 Tech Preview, se mencionó la configuración de una clave del Registro "DuoEnabled". Esto ya no es necesario. Como se mencionó anteriormente, siempre que la configuración de cliente y servidor admita HTTP/2, IIS usará HTTP/2 (o reserva a HTTP/1.1 si no es posible).

Versión del protocolo de registro

El registro de IIS tiene un campo "Versión del protocolo", que está desactivado de forma predeterminada. Habilitar este campo es útil si desea realizar un seguimiento de las solicitudes que van a través de HTTP/2, HTTP/1.1, etc.

En la interfaz de usuario de Internet Services Manager, puede encontrarse en la característica Registro, a través de Seleccionar campos.

Image of I I S Logging page displaying Select Fields drop down with Protocol Version C S dash Version selected from the W 3 C Logging Fields menu.

Después de realizar los cambios, haga clic en Aplicar en el panel Acciones situado en el extremo derecho.

Esta es la salida del archivo de registro de ejemplo con el campo Versión del protocolo habilitado:

#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2015-08-13 18:46:11
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2015-08-13 18:46:11 ::1 GET / - 443 - ::1 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+Touch;+rv:11.0)+like+Gecko - 200 0 0 391
2015-08-13 18:46:11 ::1 GET /iisstart.png - 443 - ::1 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+Touch;+rv:11.0)+like+Gecko https://localhost/ 200 0 0 100

Tutorial de demostración de IIS con HTTP/2

  1. Si está ejecutando Windows 10, puede encontrarlo a través de Programas y características, luego Activar o desactivar características de Windows y, a continuación, activando la casilla de verificación Internet Information Services. Si está ejecutando Windows Server 2016, inicie Administrador de servidores, luego Añadir roles y características en el panel de control y, a continuación, seleccione Servidor web (IIS) de la lista.

    Image of Turn Windows features on or off page with Internet Information Services selected and highlighted.

  2. Una vez finalizada la instalación, inicie el Administrador de servicios de Internet y cree un certificado autofirmado seleccionando la opción Certificados de servidor en la vista Características del servidor. Tenga en cuenta que el uso de un certificado autofirmado en este ejemplo solo es para fines de demostración o pruebas (no se recomienda proteger los sitios de producción).

    Image of Server Features view in Internet Service Manager page with Server Certificates highlighted.

    Image of dialog for Self Signed Certificate displaying Name box with Create Self Signed Certificate option highlighted.

  3. Vaya al sitio web predeterminado y, en Enlaces, cree un nuevo enlace TLS con el certificado autofirmado que acaba de crear.

    Screenshot of dialog box for Add Site Binding with Type of I P Address highlighted and Local I I S Server selected from the drop down.

  4. Inicie el explorador desde la máquina Windows 10 o Windows Server 2016 y presione F12 (o vaya a Configuración y habilite Herramientas de desarrollo F12) y cambie a la pestaña Red. Navegue hasta https://localhost y voilá, ¡ya está en HTTP/2!

    Screenshot of Local Host dash F 12 Developer Tools with Network tab displayed and H T T P 2 selected.

¿Cuándo no se admite HTTP/2?

En algunos casos, HTTP/2 no se puede usar en combinación con otras características. En estas situaciones, Windows volverá a HTTP/1.1 y continuará la transacción. Esto puede implicar negociar HTTP/1.1 durante el protocolo de enlace o enviar un código de error al cliente que le indique que vuelva a intentarlo a través de una conexión HTTP/1.1.

  • Autenticación de Windows (NTLM/Kerberos/Negotiate) no se admite con HTTP/2. En este caso, IIS volverá a HTTP/1.1.
  • Texto no cifrado: como se mencionó anteriormente, IIS actualmente solo admite HTTP/2 a través de TLS. De nuevo, IIS volverá a HTTP/1.1.
  • Limitación de ancho de banda: IIS tiene una característica para limitar el ancho de banda (en Inetmgr, seleccione el sitio, "Límites" en Configurar el panel Acción). Esto se aplica a HTTP/1.1, pero no se aplica para HTTP/2 (continuará sin errores ni limitación de ancho de banda).

Para obtener más información

Consulte la charla de Build 2015 HTTP/2 en Windows 10: Navegador, aplicaciones y servidor web para conocer más a fondo HTTP/2 y las implementaciones de cliente y servidor en Windows.

Autores: Mike Bishop, David So (con contribuciones y confirmaciones a Rob Trace, Baris Caglar, Nazim Lala)