wandres.dev
HTTP MODERNO · De 1.1 a 3 y QUIC

Qué cambia en la práctica para un sitio real

Cómo comprobar qué versión de HTTP sirve realmente a tus usuarios, qué decisiones de arquitectura hay que revisar tras migrar, y qué ganancia esperar de forma realista.

⏱ 16 min

Después de tres lecciones de protocolo, la pregunta operativa es qué haces tú el lunes. La respuesta corta: comprobar qué versión están recibiendo tus usuarios de verdad, que casi nunca es la que crees, y revisar las decisiones de arquitectura que tomaste bajo restricciones que ya no existen. La ganancia de cambiar de protocolo es modesta; la de desmontar las optimizaciones caducadas es grande.

🎯 Al terminar esta lección sabrás
  • Comprobar la versión de HTTP efectiva en laboratorio y en campo.
  • Detectar las degradaciones de protocolo que ocurren sin que nadie se entere.
  • Revisar la lista de decisiones de arquitectura que dependían de HTTP/1.1.
  • Estimar de forma realista la ganancia de cada paso.

Comprobar qué protocolo se usa de verdad

Hay tres niveles de comprobación, de menos a más informativo.

En la línea de comandos, para saber qué ofrece el servidor:

# Version negociada por ALPN sobre TLS.
curl -sI --http2 https://ejemplo.com | head -1

# Forzar HTTP/3. Requiere un curl compilado con soporte.
curl -sI --http3 https://ejemplo.com | head -1

# Ver el anuncio de servicio alternativo.
curl -sI https://ejemplo.com | grep -i '^alt-svc'

# Comprobar si hay registro DNS de tipo HTTPS.
dig +short ejemplo.com type65

En el navegador, para una carga concreta. La columna de protocolo del panel de red la muestra por recurso, y desde JavaScript se obtiene igual:

const porProtocolo = performance.getEntriesByType('resource')
  .reduce((acc, r) => {
    const p = r.nextHopProtocol || 'desconocido';
    acc[p] = (acc[p] || 0) + 1;
    return acc;
  }, {});

console.table(porProtocolo);

En campo, que es lo único que refleja la realidad. Envía nextHopProtocol del documento principal junto con tus métricas y agrégalo por país y por tipo de red. Aquí es donde aparecen las sorpresas.

⚠️
Las tres sorpresas más frecuentes al mirar el protocolo en campo

Primera: un porcentaje no despreciable de usuarios recibe HTTP/1.1 porque un proxy corporativo o un antivirus intercepta el tráfico TLS y no soporta versiones más nuevas. Segunda: algunos usuarios reciben HTTP/2 en lugar de HTTP/3 porque su red bloquea o limita UDP. Tercera: casi todas las primeras visitas van por HTTP/2 aunque tengas HTTP/3, porque el anuncio de servicio alternativo solo surte efecto a partir de la conexión siguiente, salvo que publiques el registro DNS correspondiente.

La lista de revisión tras migrar

Migrar el protocolo es cambiar una configuración. Lo que produce la ganancia es esta lista, y conviene recorrerla entera.

Eliminar el sharding de dominios. Si tus estáticos están repartidos en varios subdominios, consolídalos en uno. Con multiplexación, repartir fragmenta la conexión, multiplica los establecimientos, multiplica los arranques lentos y rompe la priorización. Efecto: alto.

Revisar la concatenación. Un único archivo de JavaScript de trescientos kilobytes se invalida entero cada vez que cambia una línea. Con multiplexación, veinte módulos separados se sirven casi al mismo coste y se cachean por separado, así que un cambio pequeño solo invalida un archivo. Cuidado con pasarse: cientos de módulos minúsculos añaden sobrecarga de cabeceras y cadenas de dependencias. El equilibrio razonable está en decenas de archivos, agrupados por frecuencia de cambio.

Eliminar los sprites de imágenes. Con peticiones baratas ya no compensan, y tienen el mismo problema de invalidación: cambiar un icono invalida la hoja entera.

Revisar las URL de datos incrustadas. Una imagen incrustada como URL de datos dentro del CSS engorda la hoja, no se cachea por separado, y añade un coste de decodificación en base 64. Casi siempre es mejor como archivo aparte.

Comprobar el tiempo de espera de conexión inactiva. Con una sola conexión multiplexada, mantenerla viva vale más que antes. Un tiempo de espera de cinco segundos obliga a reconectar constantemente a usuarios que leen.

Publicar el registro DNS de servicio. Si sirves HTTP/3, este registro permite usarlo desde la primera conexión en lugar de desde la segunda. Es un cambio de DNS y elimina la penalización de la primera visita.

Sustituir el envío desde el servidor por la cabecera de enlace. Si tenías configurado el envío anticipado de HTTP/2, ya no funciona en Chrome. La cabecera Link con rel=preload en la respuesta consigue casi lo mismo respetando la caché del cliente.

La ganancia realista

Con números, para calibrar expectativas antes de vender el trabajo.

Cambio Ganancia típica Dónde se nota
HTTP/1.1 a HTTP/2 en un sitio con muchos recursos 5-20% del tiempo de carga Sobre todo con muchos recursos pequeños
HTTP/1.1 a HTTP/2 sin eliminar el sharding Cerca de cero, a veces negativa En ninguna parte
Eliminar el sharding con HTTP/2 activo 100-400 ms Primera visita
HTTP/2 a HTTP/3 en fibra Decenas de ms Casi solo el viaje ahorrado en el establecimiento
HTTP/2 a HTTP/3 en móvil con pérdida Cientos de ms, a veces segundos Percentil 90 y superiores
Publicar el registro DNS de servicio 1 RTT en la primera visita Primera visita
TLS 1.2 a TLS 1.3 1 RTT por conexión nueva Multiplicado por número de orígenes
Consolidar de cinco orígenes a dos 6-8 RTT Primera visita, todas las redes

Fíjate en la última fila, porque contiene la lección del nivel: consolidar orígenes rinde más que cualquier cambio de versión de protocolo. El protocolo mejora cómo se usa una conexión; consolidar elimina conexiones enteras.

El orden de trabajo

Con todo lo anterior, el orden que maximiza el retorno es este.

  1. Mide qué protocolo reciben tus usuarios de verdad, segmentado. Si hay degradaciones, averigua a quién le pasan antes de tocar nada.
  2. Cuenta tus orígenes en la ruta crítica y consolida los que puedas. Es la palanca más grande y es independiente del protocolo.
  3. Verifica que tienes TLS 1.3. Es configuración y quita un viaje por conexión nueva.
  4. Activa HTTP/2 si no lo tienes, y a continuación desmonta las optimizaciones de HTTP/1.1. Los dos pasos van juntos: el segundo es el que produce la ganancia.
  5. Activa HTTP/3 y publica el registro DNS. Evalúa el resultado en la cola de la distribución, no en el percentil 75.
  6. Considera el 0-RTT solo si tu tráfico es mayoritariamente de lectura y has revisado el riesgo de repetición.

Los pasos 2 y 4 son los que mueven la aguja. Los demás son mejoras honestas de menor magnitud.

Antes de discutir la versión del protocolo, comprueba si estás pagando el establecimiento en cada visita por una razón que nadie ha mirado

Hay un fallo de configuración que anula toda esta lección y que se detecta en dos minutos: un tiempo de espera de conexión inactiva demasiado corto en el servidor o en el balanceador. Con HTTP/2 y HTTP/3, todo el tráfico de la página va por una única conexión, y esa conexión es lo que hace que el protocolo valga la pena. Si tu balanceador la cierra a los cinco segundos de inactividad, un usuario que lee un artículo durante treinta segundos y luego hace clic paga otra vez el establecimiento completo, y la ganancia de la multiplexación se evapora porque no hay nada que multiplexar. Lo he visto en dos sitios que habían migrado a HTTP/3 y no veían mejora: el valor por defecto de su capa de entrada era bajo, nadie lo había revisado porque con seis conexiones de HTTP/1.1 el efecto se diluía, y con una sola conexión se hizo dominante. La comprobación es mirar en tus datos de campo qué proporción de recursos tienen connectStart distinto de connectEnd una vez pasada la carga inicial. Si esa proporción no es cercana a cero, estás reconectando y ninguna optimización de protocolo te va a servir hasta que lo arregles.