HTTP sobre UDP: hacer un buen uso del protocolo QUIC

HTTP sobre UDP: hacer un buen uso del protocolo QUIC

QUIC (Quick UDP Internet Connections) es un protocolo además de UDP que admite todas las funciones de TCP, TLS y HTTP/2 y resuelve la mayoría de sus problemas. A menudo se le llama protocolo nuevo o "experimental", pero ya ha sobrevivido a la etapa experimental: el desarrollo ha estado en curso durante más de 7 años. Durante este tiempo, el protocolo no logró convertirse en un estándar, pero aun así se generalizó. Por ejemplo, gigantes como Google y Facebook utilizan QUIC para acelerar el tráfico y reducir los retrasos en las redes móviles, y el IETF declaró que su bifurcación del protocolo era la base del estándar HTTP/3 (aunque HTTP/2 utiliza solo el 44.8% sitios).

Concepto

QUIC se desarrolló como reemplazo del TCP heredado, que se diseñó originalmente para redes cableadas de bajas pérdidas. TCP entrega los paquetes en orden, por lo que si se pierde un paquete, se detiene toda la cola (bloqueo de cabeza de línea), lo que afecta negativamente a la calidad y estabilidad de la conexión. Para evitar pérdidas masivas, las redes celulares recurren al uso de grandes buffers, lo que a su vez conduce a redundancia y respuestas falsas negativas del protocolo (hinchar el búfer). Además, TCP dedica mucho tiempo a establecer una conexión: las solicitudes SYN/ACK y TLS se procesan por separado, lo que requiere tres viajes de ida y vuelta en lugar de uno, como lo hace QUIC.

HTTP sobre UDP: hacer un buen uso del protocolo QUIC

Dado que QUIC combina un reemplazo de TCP y una implementación de TLS 1.3, todas las conexiones siempre están cifradas y descifrar dicho tráfico no es más fácil que si fuera a través de HTTPS. Además, QUIC se implementa a nivel de aplicación, ya que un reemplazo completo de la pila TCP requeriría eternidad.

A pesar del soporte para multiplexación en HTTP/2, el problema del bloqueo de cabecera de línea persistió debido a la necesidad de entregar los paquetes en orden. QUIC se implementa sobre UDP, por lo que en principio no tiene bloqueo y, para evitar que los paquetes se pierdan para siempre, están numerados y pueden contener partes de "vecinos", lo que proporciona redundancia. Además, QUIC divide la cola monolítica en varios subprocesos para diferentes tipos de solicitudes dentro de una única conexión. Por lo tanto, si se pierde un paquete, pueden surgir problemas solo para una cola (por ejemplo, para transferir un archivo específico):

HTTP sobre UDP: hacer un buen uso del protocolo QUIC

el uso de

Inicialmente, QUIC se desarrolló dentro de Google y en gran medida se adaptó para su uso dentro de la empresa. En 2013, se transfirió al IETF para su estandarización (que aún está en curso), y ahora todos pueden participar en el desarrollo del protocolo proponiendo lo que les falta. El grupo de trabajo del IETF organiza reuniones anuales durante las cuales se aprueba un nuevo estándar y se discuten innovaciones. Esta implementación de QUIC se considera la principal y es en base a ella que se certifica el estándar HTTP/3.

Hasta el momento, no se habla de incluir HTTP/3 como protocolo principal, porque aún no está terminado y casi no es compatible:

HTTP sobre UDP: hacer un buen uso del protocolo QUIC

Pero QUIC se puede implementar como un transporte entre la aplicación y el servidor, lo que se hizo con éxito en Uber:

Comentario de Uber sobre la introducción de QUIC

Para integrar QUIC con éxito y mejorar el rendimiento de las aplicaciones en entornos de conectividad deficiente, reemplazamos la pila anterior (HTTP/2 sobre TLS/TCP) con el protocolo QUIC. Usamos la biblioteca de la red. cronet de Proyectos de cromo, que contiene la versión original de Google del protocolo: gQUIC. Esta implementación también se mejora constantemente para seguir la última especificación del IETF.

Primero integramos Cronet en nuestras aplicaciones de Android para agregar soporte para QUIC. La integración se llevó a cabo de tal manera que se redujeran al máximo los costos de migración. En lugar de reemplazar completamente la antigua pila de redes que usaba la biblioteca OkHTTP, hemos integrado Cronet BAJO el marco API OkHttp. Al hacer la integración de esta manera, evitamos cambios en nuestras llamadas de red (que son utilizadas por reequipamiento) a nivel de API.

De manera similar al enfoque para dispositivos Android, implementamos Cronet en aplicaciones de Uber en iOS, interceptando el tráfico HTTP de la red. APIUso NSURLProtocolo. Esta abstracción, proporcionada por la Fundación iOS, maneja datos de URL específicos del protocolo y garantiza que podamos integrar Cronet en nuestras aplicaciones iOS sin costos de migración significativos.

tomado de esta traducción Artículos sobre Uber

En el backend detectaron conexiones QUIC a través de Google Cloud lb, que soporta protocolo desde mediados de 2018.

No sorprende que Google Cloud funcione muy bien con el protocolo desarrollado por Google, pero ¿cuáles son las alternativas?

Nginx

No hace mucho CloudFlare intenté cruzar nginx (que no soporta HTTP/3 de forma predeterminada) con su herramienta Quiche. La implementación está disponible como un único archivo .patch, que viene con un tutorial de instalación:

curl -O https://nginx.org/download/nginx-1.16.1.tar.gz
tar xvzf nginx-1.16.1.tar.gz
git clone --recursive https://github.com/cloudflare/quiche
cd nginx-1.16.1
patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch

Aquí podrás conectar tus módulos si es necesario

./configure                          	
   	--prefix=$PWD                       	
   	--with-http_ssl_module              	
   	--with-http_v2_module               	
   	--with-http_v3_module               	
   	--with-openssl=../quiche/deps/boringssl 
   	--with-quiche=../quiche
 make

Todo lo que queda es habilitar el soporte HTTP/3.

events {
    worker_connections  1024;
}

http {
    server {
        # Enable QUIC and HTTP/3.
        listen 443 quic reuseport;

        # Enable HTTP/2 (optional).
        listen 443 ssl http2;

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

        # Enable all TLS versions (TLSv1.3 is required for QUIC).
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        # Request buffering in not currently supported for HTTP/3.
        proxy_request_buffering off;

        # Add Alt-Svc header to negotiate HTTP/3.
        add_header alt-svc 'h3-27=":443"; ma=86400';
    }
}

Todavía no es posible conectarse a través de HTTP/3 en navegadores normales, pero puede utilizar Canarias Chrome y ejecutarlo con la bandera --enable-quic, vaya a su servidor o, por ejemplo, al sitio quic.rocks y observe el tipo de conexión en Herramientas de desarrollo:
HTTP sobre UDP: hacer un buen uso del protocolo QUIC
En lugar de HTTP/3 está escrito http2+quic/99, pero es esencialmente lo mismo.

Otras tecnologías

Conclusión

HTTP sobre UDP: hacer un buen uso del protocolo QUIC

El interés en QUIC es inestable, pero está creciendo y se está trabajando para estandarizarlo. Casi todos los meses aparecen nuevas implementaciones del protocolo y cada año más y más desarrolladores están convencidos de que QUIC es el futuro. Incluso es posible incluir el protocolo en futuras versiones de la pila TCP, lo que significa que tarde o temprano todo Internet pasará a conexiones más estables y rápidas.

Ya puede configurar la interacción QUIC para su infraestructura o incluso dársela a los navegadores; todos planean agregar soporte para el protocolo y las tristes estadísticas de Caniuse se volverán más alegres.

HTTP sobre UDP: hacer un buen uso del protocolo QUIC

Fuente: habr.com

Añadir un comentario