HTTP sobre UDP — utilizamos el protocolo QUIC de manera efectiva

HTTP sobre UDP — utilizamos el protocolo QUIC de manera efectiva

QUIC (Conexiones Rápidas de Internet sobre UDP) es un protocolo sobre UDP que admite todas las funcionalidades de TCP, TLS y HTTP/2, y resuelve la mayoría de sus problemas. A menudo se le llama un protocolo nuevo o "experimental", pero ya ha pasado mucho tiempo desde su etapa de experimentación: se ha estado desarrollando durante más de 7 años. A lo largo de este tiempo, el protocolo no ha llegado a ser un estándar, pero aún así ha obtenido una amplia distribución. Por ejemplo, QUIC es utilizado para acelerar el tráfico y reducir la latencia en redes móviles por gigantes como Google y Facebook, y la IETF ha declarado su bifurcación como base para el estándar HTTP/3 (mientras que HTTP/2 utiliza solo el 44.8% de los sitios).

Concepto

QUIC fue desarrollado como una alternativa al desfasado TCP, que originalmente estaba diseñado para redes cableadas con un bajo porcentaje de pérdidas. TCP entrega los paquetes en orden, por lo que la pérdida de un paquete provoca que toda la cola se detenga (head-of-line blocking), lo que afecta negativamente la calidad y estabilidad de la conexión. Para evitar pérdidas masivas, las redes móviles recurren al uso de grandes búferes, lo que a su vez conduce a la redundancia y la reacción de falso negativo del protocolo (bufferbloat). Además, TCP gasta mucho tiempo en establecer conexiones: las solicitudes SYN/ACK y TLS van por separado, requiriendo tres viajes de ida y vuelta en lugar de uno, como lo hace QUIC.

HTTP sobre UDP — utilizamos el protocolo QUIC de manera efectiva

Dado que QUIC combina una sustitución de TCP y la 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 estuviera pasando por HTTPS. Además, QUIC se implementa en el nivel de aplicación, ya que una sustitución completa de la pila TCP tomaría una eternidad..

A pesar del soporte de multiplexación en HTTP/2, el problema del head-of-line blocking persiste debido a la necesidad de entregar los paquetes en orden. QUIC se implementa sobre UDP, por lo que no tiene bloqueos en principio, y para evitar que los paquetes se pierdan de forma irreversible, se numeran y pueden contener partes de "vecinos", asegurando redundancia. Además, QUIC divide la cola monolítica en varios flujos para diferentes tipos de solicitudes dentro de una conexión. De esta manera, en caso de pérdida de un paquete, los problemas pueden surgir solo en una cola (por ejemplo, al transmitir un archivo específico):

HTTP sobre UDP — utilizamos el protocolo QUIC de manera efectiva

Uso

Inicialmente, QUIC fue desarrollado dentro de Google y estaba muy orientado a su uso interno. En 2013, fue transferido a la IETF para su estandarización (que aún continúa), y ahora cualquier persona puede participar en el desarrollo del protocolo, sugiriendo lo que le falta. El grupo de trabajo de la IETF organiza reuniones anuales donde se aprueba un nuevo estándar y se discuten innovaciones. Esta implementación de QUIC se considera la principal y es sobre la que se certifica el estándar HTTP/3.

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

HTTP sobre UDP — utilizamos el protocolo QUIC de manera efectiva

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

Comentario de Uber sobre la implementación de QUIC

Para integrar QUIC con éxito y mejorar el rendimiento de la aplicación en condiciones de mala conexión, reemplazamos la antigua pila (HTTP/2 sobre TLS/TCP) por el protocolo QUIC. Utilizamos la biblioteca de red Cronet de Proyectos de Chromium, que contiene la versión original del protocolo – gQUIC. Esta implementación también se mejora constantemente para seguir la última especificación de la IETF.

Primero, integramos Cronet en nuestras aplicaciones Android para agregar soporte para QUIC. La integración se realizó de tal forma que se minimizaron los costos de migración. En lugar de reemplazar completamente la antigua pila de red, que utilizaba la biblioteca OkHttp, integramos Cronet BAJO el marco de la API de OkHttp. Al realizar la integración de esta manera, evitamos cambios en nuestras llamadas de red (que utilizan Retrofit) a nivel de API.

De manera similar al enfoque para dispositivos Android, implementamos Cronet en las aplicaciones de Uber para iOS, interceptando el tráfico HTTP de las API, utilizando NSURLProtocol. Esta abstracción, proporcionada por iOS Foundation, maneja los datos URL específicos del protocolo y garantiza que podemos integrar Cronet en nuestras aplicaciones de iOS sin costos de migración significativos.

tomado de esta traducción del artículo de Uber

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

No es de extrañar que Google Cloud funcione perfectamente con un protocolo desarrollado por Google, pero ¿cuáles son las alternativas?

Nginx

No hace mucho, CloudFlare intentó integrar nginx (que por defecto no soporta HTTP/3) con su herramienta Quiche. La implementación está disponible en un solo archivo .patch, acompañado de 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í se pueden conectar sus 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

Solo queda habilitar el soporte para HTTP/3

events {
    worker_connections  1024;
}

http {
    server {
        # Habilitar QUIC y HTTP/3.
        listen 443 quic reuseport;

        # Habilitar HTTP/2 (opcional).
        listen 443 ssl http2;

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

        # Habilitar todas las versiones de TLS (TLSv1.3 es obligatorio para QUIC).
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        # El almacenamiento en búfer de solicitudes no es compatible actualmente con HTTP/3.
        proxy_request_buffering off;

        # Agregar encabezado Alt-Svc para negociar HTTP/3.
        add_header alt-svc 'h3-27=":443"; ma=86400';
    }
}

Aún no se puede conectar a través de HTTP/3 en navegadores comunes, pero se puede tomar Chrome Canary y ejecutarlo con la bandera --enable-quic, dirigirse a su servidor o, por ejemplo, al sitio quic.rocks y ver el tipo de conexión en las Developer Tools:
HTTP sobre UDP — utilizamos el protocolo QUIC de manera efectiva
En lugar de HTTP/3 se escribe http2+quic/99, pero en esencia, es lo mismo.

Otras tecnologías

Conclusión

HTTP sobre UDP — utilizamos el protocolo QUIC de manera efectiva

El interés en QUIC es inestable, pero está creciendo, se está trabajando en su estandarización. Nuevas implementaciones del protocolo aparecen casi todos los meses, y cada año más desarrolladores se convencen de que el futuro es QUIC. Se admite incluso la inclusión del protocolo en futuras versiones de la pila TCP, lo que significa que más tarde o más temprano toda la internet se trasladará a conexiones más estables y rápidas.

Ya puedes configurar la interacción QUIC para tu infraestructura o incluso proporcionarla a los navegadores, todos planean agregar soporte para el protocolo, y la triste estadística de caniuse se volverá más alegre.

HTTP sobre UDP — utilizamos el protocolo QUIC de manera efectiva

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster