3. HTTP/2: comunicación optimizada sobre TCP

La especificación HTTP/2 representa el salto más grande del protocolo desde 1999. Mantiene la semántica conocida (métodos, cabeceras, códigos) pero rediseña el formato en el que viajan los mensajes para aprovechar al máximo una única conexión TCP. El resultado es una entrega más rápida y predecible incluso en redes móviles congestionadas.

En esta lección comprenderás cómo funciona la multiplexación, qué resuelve la compresión HPACK, por qué las prioridades importan y cómo medir las mejoras frente a HTTP/1.1. También revisaremos la relación con HTTPS, requisito prácticamente universal para que los navegadores habiliten HTTP/2.

3.1 Multiplexación de múltiples solicitudes en una sola conexión

HTTP/2 introduce el concepto de streams, canales lógicos numerados que se envían entrelazados sobre el mismo socket TCP. Cada stream viaja en pequeños fragmentos llamados frames, lo que permite que el servidor responda a distintas solicitudes sin respetar el orden de llegada. Con esto desaparece el head-of-line blocking típico del pipelining HTTP/1.1.

  • Stream bidireccional: un número de identificación agrupa todos los frames de una solicitud/respuesta.
  • Frames especializados: existen tipos HEADERS, DATA, PRIORITY, PING, etc., que coordinan la sesión.
  • Control de flujo: cada extremo anuncia ventanas para evitar saturar buffers y mantener justo el tamaño de envío.

En la práctica, un navegador puede descargar HTML, CSS, fuentes y datos JSON usando un solo socket, evitando el costo de abrir múltiples conexiones y maximizando el rendimiento de TLS gracias al reuso del canal cifrado.

3.2 Compresión de cabeceras (HPACK)

Para complementar la multiplexación, HTTP/2 utiliza el algoritmo HPACK. Este mecanismo mantiene tablas de cabeceras estáticas y dinámicas para enviar solo referencias y valores nuevos.

  • Tabla estática: contiene campos frecuentes como :method, :path o content-type.
  • Tabla dinámica: se va alimentando con cabeceras propias del sitio como authorization o cookies específicas.
  • Codificación Huffman opcional: reduce aún más los valores cuando son textos largos.

El efecto es notorio en aplicaciones móviles: una cabecera que antes ocupaba cientos de bytes puede reducirse a decenas, liberando espacio para datos útiles y acortando los tiempos de transmisión.

3.3 Prioridad de flujos y control de dependencia

HTTP/2 permite que el cliente declare dependencias entre streams. Cada solicitud se puede marcar con un peso (1 a 256) e indicar de qué flujo depende. El servidor usa esa información para decidir qué frames enviar primero cuando el ancho de banda es limitado.

Estrategias comunes:

  • Árbol de dependencias: los recursos críticos (HTML, CSS base) se colocan en la raíz y el resto depende de ellos.
  • Repriorización dinámica: los navegadores pueden modificar pesos al detectar que el usuario cambió de pestaña o pausó un video.
  • Server push opcional: aunque hoy se usa menos, permite que el servidor envíe proactivamente recursos asociados a un HTML principal.

Esta capacidad reduce el tiempo hasta el Largest Contentful Paint (LCP) porque asegura que los bytes más valiosos lleguen primero.

3.4 Reutilización de conexiones y reducción de latencia

Al consolidar múltiples streams en un socket, HTTP/2 minimiza los handshakes TCP y TLS. Esto se traduce en menores tiempos de ida y vuelta (RTT) y una mejor experiencia especialmente cuando se conecta desde redes de alta latencia como 4G en movimiento.

Recomendaciones para aprovecharlo:

  • Habilitar ALPN en el servidor: el protocolo se negocia durante TLS; sin ALPN los navegadores degradan a HTTP/1.1.
  • Compartir certificados SAN: permite servir múltiples dominios sobre la misma conexión cuando se usan CDNs o reverse proxies multi-tenant.
  • Reducir el uso de domain sharding: ya no es necesario fragmentar recursos en subdominios solo para forzar conexiones adicionales.

También mejora la eficiencia energética: menos conexiones implican menos ciclos de CPU para encriptar, monitorear y cerrar sockets.

3.5 Ejemplo práctico: diferencias de carga entre HTTP/1.1 y HTTP/2

Podemos comparar las versiones usando curl o las DevTools del navegador. El siguiente ejemplo mide el tiempo total que tarda en descargar una página con muchos recursos.

# Solicitud HTTP/1.1 (forzamos la versión)
curl -w "Tiempo total: %{time_total}s\n" -o /dev/null -s --http1.1 https://http2.akamai.com/demo

# Solicitud HTTP/2
curl -w "Tiempo total: %{time_total}s\n" -o /dev/null -s --http2 https://http2.akamai.com/demo

En un entorno de prueba típico se observan resultados como los siguientes:

Métrica HTTP/1.1 HTTP/2
Tiempo total (segundos) 1.82 1.05
Conexiones establecidas 6 1
Bytes en cabeceras 180 KB 62 KB

Las cifras varían según la red, pero siempre se aprecia cómo la multiplexación y HPACK reducen la carga.

3.6 Compatibilidad con HTTPS obligatoria en la mayoría de los navegadores

Aunque HTTP/2 podría operar sin cifrado, los principales navegadores (Chrome, Firefox, Safari, Edge) solo lo habilitan cuando la conexión se establece mediante HTTPS. Esto obliga a contar con certificados válidos, soporte de Application-Layer Protocol Negotiation (ALPN) y suites criptográficas modernas.

Pasos mínimos para activar HTTP/2 en producción:

  1. Actualizar el servidor web o proxy inverso (Nginx, Apache, Envoy, Caddy) a una versión con soporte HTTP/2 estable.
  2. Configurar certificados emitidos por una CA confiable y habilitar TLS 1.2/1.3 con ALPN.
  3. Verificar usando curl --http2 -I https://tu-dominio o desde DevTools > Network > columna Protocol.

Una vez cumplidos estos requisitos, los navegadores negocian HTTP/2 automáticamente sin que los usuarios deban hacer nada, ofreciendo mejores tiempos de carga y mayor estabilidad.