Firefox planea dejar de dar soporte a HTTP/2 Push
(groups.google.com)- Firefox desactivará HTTP/2 Push en todas las plataformas en los próximos días debido a su bajo uso y a la creciente carga de compatibilidad, y por ahora dejará el código de implementación en el árbol
- En el ecosistema de navegadores, el soporte ya se ha reducido: Chrome 106 lo desactivó en septiembre de 2022, y la versión más reciente de Safari también rechaza push streams en pruebas locales
- Chrome citó el bajo uso de HTTP/2 Push y recomendó como alternativas rel="preload" y 103 Early Hints
- Firefox había mantenido el soporte porque su costo de mantenimiento no era alto, pero en los últimos meses han aparecido bugs de compatibilidad web que solo ocurren en Firefox por culpa de HTTP/2 Push
- Si servidores y sitios web usan push y omiten probar en Firefox, algunos sitios podrían dejar de funcionar solo en Firefox
Plan de Firefox para desactivar HTTP/2 Push
- Firefox planea desactivar HTTP/2 Push en todas las plataformas
- El trabajo se sigue en Bugzilla: 1915848 - Pref off HTTP/2 push
- Por ahora se apagará mediante una preferencia, y el código de implementación permanecerá en el árbol durante algún tiempo
- Es muy probable que la eliminación completa ocurra antes de la rama ESR 140 de la próxima primavera
Estado del soporte por navegador y motivos de la desactivación
-
Chrome
- Chrome 106 desactivó HTTP/2 Push en septiembre de 2022
- El estado relacionado puede verse en Chrome Platform Status
- Chrome citó su bajo uso y recomendó como alternativas
rel="preload"y 103 Early Hints
-
Safari
- No se pudo confirmar documentación oficial de deprecación, pero la versión actual rechaza push streams en pruebas locales usando un servidor Node.js
-
Firefox
- Firefox había seguido dando soporte a HTTP/2 Push porque la carga de mantenimiento no era alta
- En los últimos meses, HTTP/2 Push ha provocado problemas de compatibilidad web que afectan solo a Firefox
- Un caso relacionado es bug 1915830
- Si servidores y sitios web usan push sin probar en Firefox, un sitio puede quedarse bloqueado solo en Firefox; un ejemplo es bug 1913100
1 comentarios
Opiniones en Hacker News
Es molesto que, incluso después del “descubrimiento repentino” de que HTTP/2 Push al final no funcionaba, no haya ninguna disculpa para quienes desde hace tiempo explicaban por qué no iba a funcionar y fueron ignorados.
Durante años hubo un ambiente de “si la gente más inteligente de Google dice que hace falta, metámoslo en la especificación”, cuando habría que abordar las especificaciones con mucha más cautela. Hay que dejar de meter continuamente objetivos de expansión especulativos que alguna parte de Google considera buenos.
Lo que vuelve lentos a los navegadores son, en su mayoría, los anuncios, rastreadores y basura que aplastan a los sitios, y lo que se usa para arreglar eso no es un invento de Google sino uBlock Origin. Lo que Google empuja últimamente en los estándares web no parece ser para desarrolladores comunes, sino para meter más anuncios o ahorrar 0,1% en costos de centros de datos.
HTTP/2 parece un caso de una empresa intentando seguir controlando, según sus propios intereses, el acceso a un recurso público como la www. Si usas Chrome, te hace probar HTTP/2, y la misma empresa controla el motor de búsqueda, el hardware, el navegador y ahora hasta el protocolo de red. HTTP/2 prácticamente podría verse como HTTP/Chrome.
Nunca me parecieron convincentes las explicaciones que se dieron sobre por qué HTTP/2 Push fracasó. Google suele apuntar al artículo de Jake Archibald, pero ese texto parece más una lista de lo pobre que fue la implementación en los navegadores que una explicación de por qué el protocolo en sí no funciona.
Los navegadores ya admiten enlaces preload, que en la práctica deberían cumplir casi el mismo papel que los encabezados Push. También me pregunto si las dificultades de implementación de 2017, como caché o encabezados de autenticación, no podrían haber reutilizado el código existente de manejo de preload.
https://jakearchibald.com/2017/h2-push-tougher-than-i-though...
HTTP/2 Push consiste en que el servidor envía de forma proactiva recursos que cree que el cliente necesitará, reduciendo un viaje de ida y vuelta, y su objetivo es reducir la latencia enviando recursos independientemente del pipeline DOM→renderizado. El encabezado Preload consiste en que el servidor informa, junto con el cuerpo, qué recursos cargar en paralelo para que se obtengan antes del parseo o la evaluación de JS. 103 Early Hints envía pistas Preload antes de que termine de generarse la respuesta, antes del primer byte del cuerpo, adelantando aún más la fase de obtención.
La diferencia clave está en si es dirigido por el servidor o por el cliente, y si ocurre junto con el cuerpo o antes del primer byte. La razón más simple por la que HTTP/2 Push es débil para cumplir su objetivo es la caché. El navegador no solicita recursos que ya tiene, pero el servidor no sabe qué hay en la caché del cliente. Push tiene un alto riesgo de enviar recursos innecesarios, mientras que con 103/Preload, si se equivoca, solo se desperdician unos pocos bytes de encabezados inútiles, por lo que es más fácil de implementar y de menor costo.
https://github.com/whatwg/fetch/issues/51
También parece que aún había muchas oportunidades en el caso de uso de entrega de contenido en el que todos estaban enfocados. No hubo muchos intentos visibles públicamente, y casi nadie tuvo acceso a bibliotecas o puntos de partida para experimentar con qué cosas convenía enviar por Push.
Con el inicio 0-RTT de HTTP/3 se puede recuperar parte de la velocidad, y con 103 Early Hints el navegador puede precargar assets antes. Esta combinación también tiene la ventaja de ser semánticamente retrocompatible con HTTP/1. Es fácil de manejar incluso en proxies inversos o balanceadores de carga.
Me da un poco de pena ver que HTTP/2 Push finalmente desaparezca. La idea era limpia, pero la adopción por frameworks fue pobre, y era una función que habría merecido más atención.
En .NET al final nunca lo lanzaron, y nginx tenía algo así como una implementación básica. La falta de cache digest también siguió siendo un obstáculo. Chrome lo eliminó en parte con un razonamiento del tipo “de todos modos nadie se va a dar cuenta”, y al parecer era más importante rediseñarlo todo sobre UDP, que siempre funciona maravillosamente detrás de NAT.
Cuando hablé con Mike Belshe antes de que HTTP/2 se estandarizara, ya había una tendencia a quitar esta función de H2 porque era difícil materializar sus beneficios y tenía muchos problemas y trampas.
Uno de los mayores problemas era el Push excesivo: enviar cosas que ya estaban en la caché del navegador, o mandar demasiado contenido poco importante. De hecho, vi casos bastante malos en los que Push hacía que la carga de la página fuera más lenta. También hubo propuestas para que el navegador informara al servidor qué tenía en la caché local, pero chocaron con varios problemas. HTTP Early Hints y Resource Hints sustituyeron en gran medida la necesidad de H2 Push, y son mucho más fáciles de implementar, evitan fetches innecesarios y también son más fáciles de entender.
También es posible interpretarlo como “si los servidores web y los sitios web usan Push y no lo prueban en Firefox, el sitio puede quedar colgado solo en Firefox”, pero también hay otras interpretaciones.
Mientras otros navegadores rechazan HTTP/2 Push y lo ignoran silenciosamente, Firefox se cae de forma importante en algunos casos límite. Por ejemplo, se menciona que “parece que Firefox reinicia la conexión cuando encuentra mayúsculas en los nombres de encabezados”.
El artículo parece describir precisamente esa medida: rechazar H2 Push e ignorarlo silenciosamente, como hacen otros navegadores; no parece que estén ocultando algo.
Me pregunto por qué Push no se adoptó más ampliamente. A pesar de sus grandes defectos, era una de las principales razones por las que HTTP/2 se consideraba una función capaz de cambiar las reglas del juego.
No sé si fue por falta de soporte en navegadores o porque no encajaba bien con las CDN.
En este último caso, sobre todo en móviles, se convierte en una carga perjudicial. El servidor nunca puede saber con precisión si el cliente realmente necesita ese recurso. Early Hints probablemente sea mejor: si el servidor informa rápido qué recursos hacen falta, el cliente puede decidir si los descarga o si ya los tiene.
Index.html, normalmente querrías empujarscript.jsystyle.css, pero eso significa enviar cientos de kbits.Si el usuario vuelve a solicitar
index.html, ¿habría que enviar todo otra vez? Es muy probable que los recursos ya estén en la caché del usuario. Si no los envías, ¿cómo sabes qué deberías enviar? Solo el navegador sabe qué hay y qué no hay en la caché. Al final, las opciones son acelerar la primera visita pero desperdiciar ancho de banda en las visitas posteriores, o dejar lenta la primera visita y acelerar las siguientes.Para casi todos los demás era un enorme aumento de complejidad, y en la práctica se ignoró.
https://developer.chrome.com/blog/removing-push/
Según Wikipedia, el soporte de Push en nginx parece haber llegado alrededor de 2018. Estos cambios necesitan tiempo para bajar a las versiones de distribuciones estables y a las configuraciones predeterminadas. La primera vez que activé HTTP/2 en mi servidor Apache fue en 2020, y en 2024 aún es posible que haya servidores de aplicaciones que no lo soporten directamente.
… en Firefox, claro.
Parece ser contenido relacionado. ¿Habrá más?
Removing HTTP/2 Server Push from Chrome - https://news.ycombinator.com/item?id=32522926 - agosto de 2022, 201 comentarios
A Study of HTTP/2’s Server Push Performance Potential - https://news.ycombinator.com/item?id=32097013 - julio de 2022, 2 comentarios
HTTP/2 Push is dead - https://news.ycombinator.com/item?id=25283971 - diciembre de 2020, 168 comentarios
Blink: Intent to Remove: HTTP/2 and gQUIC server push - https://news.ycombinator.com/item?id=25064855 - noviembre de 2020, 133 comentarios
We're considering removing HTTP/2 Server Push support - https://news.ycombinator.com/item?id=24591815 - septiembre de 2020, 2 comentarios
Performance Testing HTTP/1.1 vs. HTTP/2 vs. HTTP/2 and Server Push for REST APIs - https://news.ycombinator.com/item?id=21937799 - enero de 2020, 71 comentarios
How HTTP/2 Pushes the Web - https://news.ycombinator.com/item?id=18216495 - octubre de 2018, 16 comentarios
Nginx HTTP/2 server push support - https://news.ycombinator.com/item?id=16365413 - febrero de 2018, 63 comentarios
HTTP/2 Server Push on Netlify - https://news.ycombinator.com/item?id=14798271 - julio de 2017, 23 comentarios
The browser bugs and edge cases of HTTP/2 push - https://news.ycombinator.com/item?id=14445728 - mayo de 2017, 20 comentarios
A Guide to HTTP/2 Server Push - https://news.ycombinator.com/item?id=14077955 - abril de 2017, 59 comentarios
HTTP/2 Server Push - https://news.ycombinator.com/item?id=13990074 - marzo de 2017, 2 comentarios
HTTP/2 Server Push and ASP.NET MVC – Cache Digest - https://news.ycombinator.com/item?id=13659962 - febrero de 2017, 9 comentarios
Accelerating Node.js Applications with HTTP/2 Server Push - https://news.ycombinator.com/item?id=12296922 - agosto de 2016, 6 comentarios
Rules of Thumb for HTTP/2 Push - https://news.ycombinator.com/item?id=12224258 - agosto de 2016, 25 comentarios
Google's Rules of Thumb for HTTP/2 Push - https://news.ycombinator.com/item?id=12223352 - agosto de 2016, 2 comentarios
HTTP/2 Protocol for iOS Push Notifications - https://news.ycombinator.com/item?id=11175980 - febrero de 2016, 13 comentarios
No sorprende. Cuando se agrega a un protocolo existente, creado para un propósito específico, una función que casi no tiene relación con su objetivo de diseño original, normalmente termina así
En la mayoría de los casos conviene más partir de un protocolo de bajo nivel y adaptarlo directamente al caso de uso; en ese sentido, creo que WebSockets ya resolvió de forma elegante el problema de la comunicación bidireccional. Para reducir la latencia al cargar jerarquías profundas de archivos/scripts, las etiquetas
rel="preload"orel="modulepreload"son una estructura excelente y simpleLa idea era que el servidor enviara en los headers el contenido que debía precargarse, para empezar a precargarlo incluso antes de que la etiqueta de enlace se transmitiera o se parseara. Sería menos útil en páginas que admiten streaming, pero cuando la solicitud queda detenida hasta que toda la página HTML se renderiza del lado del servidor, podría haber aportado una mejora visible