【12-19】La diferencia entre HTTP 2.0 y HTTP1.1
Uso de compresión de encabezados (diccionario)
La capa de estructura binaria resuelve el bloqueo del encabezado de cola porque los datos enviados por HTTP1.0 están ordenados y el cliente puede manejar devoluciones intercaladas Orden de datos .
La multiplexación permite que una única conexión HTTP/2 inicie múltiples mensajes de solicitud-respuesta simultáneamente. Tomemos un ejemplo:
Todo el proceso de acceso primero solicita la página index.html y luego el navegador solicitará los archivos style.css y scripts.js. La imagen de la izquierda carga dos archivos secuencialmente y la imagen de la derecha carga dos archivos en paralelo.
Sabemos que la capa inferior de HTTP en realidad depende del protocolo TCP, por lo que la pregunta es, ¿cómo pueden responder dos solicitudes simultáneamente en la misma conexión?
En primer lugar debes saber que una conexión TCP equivale a dos pipes (una de servidor a cliente y otra de cliente a servidor). La transmisión de datos en la tubería se transmite mediante código de bytes (TCP está orientado a bytes), la transmisión es ordenada y cada byte se transmite uno por uno.
Por ejemplo, si el cliente quiere enviar Hola y Mundo al servidor, solo puede enviar Hola primero y luego Mundo. Es imposible enviar estas dos palabras al mismo tiempo. De lo contrario, el servidor puede recibir HWeolrllod (tenga en cuenta que se envía alternativamente, pero el orden no se altera). Esto hará que el servidor sea estúpido.
Según la pregunta anterior, ¿puedes enviar las palabras Hola y Mundo al mismo tiempo? Por supuesto que es posible. Puede dividir los datos en paquetes y etiquetar cada paquete. Cuando se envía, se ve así: 1 H2 w1e 2 o 1 l 2r 2 l 02d. Entonces, cuando llegamos al servidor, el servidor diferencia entre las dos palabras según las etiquetas. El efecto de envío real es el siguiente:
Para lograr el efecto anterior, introdujimos un nuevo concepto: marco binario.
La capa de entramado binario se encuentra entre la capa de aplicación (HTTP/2) y la capa de transporte (TCP o UDP). HTTP/2 no modifica el protocolo TCP, pero utiliza las características de TCP tanto como sea posible.
En la capa de marco binario, HTTP/2 divide toda la información transmitida en marcos y los codifica en formato binario. La información del encabezado se encapsulará en el marco del encabezado y el cuerpo de la solicitud correspondiente se encapsulará en el. marco de datos medio.
La clave para la optimización del rendimiento de HTTP no es un gran ancho de banda, sino una baja latencia. Una conexión TCP se "ajusta" con el tiempo, limitando inicialmente la velocidad máxima de la conexión y aumentando la velocidad de transferencia con el tiempo si los datos se transfieren correctamente. Este ajuste se llama inicio lento de TCP. Por este motivo, las conexiones HTTP repentinas y de corta duración se vuelven muy ineficientes.
Al usar la misma conexión para todos los flujos de datos, HTTP/2 puede usar conexiones TCP de manera más eficiente, de modo que un ancho de banda elevado realmente pueda servir a las mejoras de rendimiento de HTTP.
A través de las siguientes dos imágenes, podemos tener una comprensión más profunda de la reutilización:
HTTP/1
HTTP/2
En resumen: tecnología de multiplexación: una sola conexión con múltiples recursos reduce la presión del enlace en el servidor, ocupa menos memoria y aumenta el rendimiento de la conexión debido a la reducción del tiempo de inicio lento de TCP, la velocidad de transmisión aumenta;
¿Por qué compresión? En HTTP/1, las solicitudes y respuestas HTTP constan de tres partes: línea de estado, encabezados de solicitud/respuesta y cuerpo del mensaje. En términos generales, el cuerpo del mensaje está comprimido con gzip o los archivos binarios comprimidos (como imágenes y audio) se transmiten por sí solos, pero la línea de estado y los encabezados se transmiten directamente como texto sin formato sin ninguna compresión.
A medida que las funciones web se vuelven cada vez más complejas, el número de solicitudes generadas por cada página también aumenta, lo que hace que el encabezado consuma cada vez más tráfico, especialmente contenido que no cambia con frecuencia, como UserAgent y Cookie. , esto es un completo desperdicio.
Expliquemos el principio de compresión en un lenguaje sencillo. Se requiere compresión de encabezado entre navegadores y servidores que admitan HTTP/2.
Mantenga la misma tabla estática, incluidos nombres de títulos comunes y combinaciones particularmente comunes de nombres y valores de títulos;
Mantenga la misma tabla dinámica y podrá agregar contenido dinámicamente;
Admite codificación Huffman); basado en la tabla de códigos estáticos de Huffman;
El diccionario estático tiene dos funciones:
1) Para pares de valores clave principales coincidentes, como ": método:GET", se puede representar directamente con un carácter;
2) Para pares clave-valor que pueden coincidir con el nombre del título, como "cookie:xxxxxxx", el nombre se puede representar mediante un personaje.
El diccionario estático en HTTP/2 es el siguiente (a continuación solo se intercepta una parte, la tabla completa está aquí):
Al mismo tiempo, tanto el navegador como el servidor Puede agregar un valor clave al diccionario dinámico. Sí, entonces el par clave-valor se puede representar con un carácter. Cabe señalar que los diccionarios dinámicos son sensibles al contexto y es necesario mantener un diccionario diferente para cada conexión HTTP/2. Durante el proceso de transferencia, el uso de caracteres en lugar de pares clave-valor reduce en gran medida la cantidad de datos transferidos.
El push del lado del servidor es un mecanismo para enviar datos antes de que el cliente los solicite. Las páginas web contemporáneas utilizan muchos recursos: HTML, hojas de estilo, scripts, imágenes y más. Cada uno de estos recursos debe solicitarse explícitamente en http/1.x. Este puede ser un proceso muy lento. El navegador comienza obteniendo HTML y luego obtiene progresivamente más recursos a medida que analiza y evalúa la página. Debido a que el servidor debe esperar cada solicitud del navegador, la red suele estar inactiva y subutilizada.
Para mejorar la latencia, HTTP/2 introdujo el servidor push, que permite al servidor enviar recursos al navegador antes de que el navegador los solicite explícitamente. El servidor generalmente sabe que una página requiere muchos recursos adicionales y puede comenzar a enviar esos recursos cuando responde a la primera solicitud del navegador. Esto permite que el servidor aproveche al máximo la red potencialmente inactiva y mejore los tiempos de carga de la página.