- Mantener el tamaño de un sitio web por debajo de 14 kB puede reducir significativamente el tiempo de carga en comparación con 15 kB
- Este fenómeno se debe al algoritmo de slow start de TCP, y la diferencia de velocidad percibida aparece por el límite de datos en la primera transmisión
- 14 kB corresponde a la capacidad de 10 paquetes TCP que la mayoría de los servidores envían al inicio
- En entornos de alta latencia como internet satelital, un viaje de ida y vuelta adicional (RTT) puede causar una demora de 612 ms o más
- En la práctica, incluir el contenido principal en menos de 14 kB, o ubicar los recursos críticos dentro de los primeros 14 kB, es efectivo para optimizar el rendimiento web
Descripción general y principios clave
- Es bien sabido que mientras más pequeño sea un sitio web, más rápido cargará
- Pero el hecho de que al pasar de 14 kB a 15 kB se produzca una diferencia drástica en la velocidad de la primera respuesta no es algo intuitivo
- La diferencia de velocidad entre una página de 15 kB y una de 16 kB es mínima, pero entre 14 kB y 15 kB puede haber hasta 612 ms de diferencia
Qué es TCP
- Transmission Control Protocol (TCP) funciona sobre IP (Internet Protocol) y se encarga de garantizar la confiabilidad de los paquetes
- Al hacer una solicitud HTTP, el navegador web envía varios paquetes TCP
- Si solo se usara IP, no habría forma de confirmar si los paquetes llegaron, por lo que TCP proporciona la función de acuse de recibo de paquetes (ACK)
- El servidor envía primero una pequeña cantidad de paquetes y, cuando recibe el ACK del navegador, transmite paquetes adicionales
- Si no hay ACK, se ejecuta el procedimiento de retransmisión de paquetes
Qué es TCP slow start
- TCP slow start es un algoritmo mediante el cual el servidor aumenta gradualmente la cantidad de paquetes enviados para detectar la calidad de la conexión de red (ancho de banda)
- Al inicio de la conexión, el servidor envía solo una pequeña cantidad de paquetes (por lo general 10)
- Si la computadora del visitante envía correctamente el ACK, la cantidad de paquetes transmitidos se duplica
- Si se pierde un ACK, después de eso los paquetes se envían a una velocidad más lenta
- El algoritmo real puede variar en detalles según la implementación, pero el concepto es el mismo
Base del umbral de 14 kB
- La mayoría de los servidores envían 10 paquetes TCP de una sola vez durante slow start
- El tamaño máximo de un paquete TCP es de 1500 bytes, pero excluyendo el encabezado (40 bytes), quedan 1460 bytes de datos útiles
- Por lo tanto, 10 x 1460 = 14600 bytes (aprox. 14 kB) es el límite máximo de la primera transmisión
- Si el sitio web o los recursos críticos se mantienen por debajo de 14 kB (o varias decenas de kB de datos originales cuando hay compresión), pueden mostrarse sin retraso adicional de ida y vuelta al inicio
Cuánto retraso puede causar un solo viaje de ida y vuelta
Ejemplo de internet satelital
- Un ejemplo representativo de entorno de alta latencia es el usuario de internet satelital (plataformas petroleras, cruceros, etc.)
- Cuando se solicita la página principal desde un teléfono, el trayecto router → antena satelital → satélite en el espacio → estación terrestre → servidor requiere decenas a cientos de ms en cada tramo
- El viaje completo de ida y vuelta de la transmisión incluye dos trayectos espaciales de ida y vuelta, el movimiento por los segmentos de red y el procesamiento del servidor, lo que añade unos 612 ms de retraso
- Si se usa HTTPS, puede aumentar hasta 1836 ms por el handshake adicional
Latencia en redes terrestres
- En redes móviles como 2G y 3G también puede haber una latencia de 100~1000 ms
- En situaciones de congestión, sobrecarga del servidor, pérdida de paquetes y otros entornos, pueden producirse retrasos adicionales
Estrategias de optimización web aplicando la regla de 14 kB
- La clave es hacer que el sitio web o la página sea lo más pequeño posible
- Lo ideal es diseñar cada página para que su tamaño comprimido transmitido sea de 14 kB o menos
- Con compresión, el contenido real puede llegar hasta ~50 kB
- Reduciendo la mayoría de los elementos innecesarios, como videos con reproducción automática, pop-ups, rastreadores y JS/CSS innecesarios, esto es perfectamente alcanzable
- Si es difícil implementar todo dentro de 14 kB, es importante priorizar los recursos críticos y el contenido principal (CSS, JS, texto principal, etc.) dentro de los primeros 14 kB
- Los encabezados HTTP (no comprimibles) y las imágenes (cargar solo lo mínimo necesario o la parte visible, o usar placeholders) también cuentan dentro de esos 14 kB
Excepciones a la regla de 14 kB y temas de protocolos modernos
- La regla de 14 kB no es una simplificación excesiva, pero sí tiene algunas excepciones
- Algunos servidores amplían la ventana inicial a 30 paquetes
- Mediante el handshake de TLS puede permitirse una ventana mayor
- Se puede hacer caché de la cantidad de paquetes transmisibles por ruta para enviar más en conexiones posteriores
- Incluso en HTTP/2, la práctica de que el servidor comience con 10 paquetes por el slow start de TCP en general no cambia
- En HTTP/3 y QUIC, la regla de 14 kB también se recomienda oficialmente
Resumen y materiales de referencia
- Los fundamentos técnicos y materiales adicionales de explicación pueden consultarse en cada enlace
- Publicación original: 2022-08-25, última modificación: 2022-08-26, autor: Nathaniel, etiquetas relacionadas: rendimiento web, HTTP, TCP
Enlaces de referencia
- Estructura de tramas Ethernet y encabezados TCP, materiales adicionales sobre latencia y ancho de banda, especificaciones de TCP/QUIC, etc.
1 comentarios
Opiniones de Hacker News
Los desarrolladores de software necesitan prestar un poco más de atención a la capa de medios; en particular, fue impresionante lo que el autor señaló sobre la confiabilidad y la latencia de 3G/5G. En radio casi siempre hay retransmisiones, y en la mayoría de las comunicaciones HTTP los paquetes deben llegar en orden para que la UI se actualice. En la práctica, incluso una sola solicitud REST solo se procesa como un único paquete real cuando la solicitud y la respuesta son menores de 1400 bytes. Si supera eso, esa solicitud “única” en realidad se divide en varios paquetes. Si uno de ellos falla, la pantalla solo se actualiza correctamente cuando todos los paquetes llegan en orden. Si quieren experimentarlo, pueden activar el modo 3G y la pérdida de paquetes en las herramientas de desarrollo de Chrome y verán que incluso una optimización pequeña puede mejorar mucho la capacidad de respuesta de la UI. Por eso hay una razón convincente para mantener API y UI lo más pequeñas posible
Mi página principal pesa 7.0kB transferidos con compresión
El objetivo de 14kB es algo desafiante, pero también es interesante la idea de limitarse a las primeras 10 paquetes iniciales. Existe un proyecto enfocado en el tamaño de los sitios web, como el mío, llamado 512kb.club. Es un lugar donde comparan el tamaño de los sitios como si fuera un puntaje de golf. Mi sitio(anderegg.ca) dio 71kB sumando todos los recursos antes de registrarlo. Gracias a este proyecto también conocí Cloudflare Radar, que tiene una buena herramienta para analizar sitios y medir el tamaño de las páginas. Su objetivo principal es ser un dashboard de todo internet, pero también incluye una herramienta de análisis de tamaño de página
Si quieren experimentar con esto de forma más divertida, el tamaño de la ventana inicial (IW) se puede configurar del lado del servidor. Por ejemplo, se puede ajustar así
También aplica lo explicado en este artículo: Blog de Cloudflare - El fenómeno por el cual los ISP rusos solo permiten hasta 16KB y eso vuelve imposible la mayoría de la navegación web. Según el análisis de Cloudflare, los ISP rusos están limitando la velocidad del internet de sus usuarios locales para que solo carguen los primeros 16KB por recurso web
La intersección entre la gente que no sabe qué es TCP Slow Start y la gente a la que le importa tanto la latencia de carga de un sitio web como para afinarla al máximo es muy pequeña. Las startups deberían concentrarse primero en ser startups, y solo las grandes empresas tienen margen para obsesionarse con este tipo de optimizaciones
¡Mi página principal pesa 17.2KB! (sin contar dependencias). De verdad me esforcé mucho optimizando mi página personal y hasta logré un puntaje perfecto de 100 en Lighthouse. Antes pensaba que era imposible, pero lo conseguí. Por cierto, está hecha con Rails. Este tipo de optimización sí vale la pena en la práctica. La experiencia de una página que aparece como un rayo, sin sentirse torpe ni poco responsiva, es muy satisfactoria por sí misma
Creo que el artículo tiene dos debilidades lógicas
La generación actual tiende a hacer incluso sitios web estáticos simples con frameworks como Next.js. Da un poco de pena pensar que la era de HTML+CSS+js ya se está yendo
Además de la latencia, minimizar el consumo de recursos es una condición esencial para un futuro sostenible. El impacto de la red sobre el medio ambiente tampoco es nada pequeño. Da pena que el tono de los comentarios suene burlón. Esta optimización no es la solución definitiva de una era, pero me habría gustado que se enfatizara más el efecto de reducir el consumo energético