1) ¿Por qué es mejor el protocolo WebSockets?
WebSockets es mejor para situaciones que implican comunicación de baja latencia, especialmente para baja latencia para mensajes de cliente a servidor. Para los datos de servidor a cliente, puede obtener una latencia bastante baja utilizando conexiones de larga duración y transferencia fragmentada. Sin embargo, esto no ayuda con la latencia de cliente a servidor, lo que requiere que se establezca una nueva conexión para cada mensaje de cliente a servidor.
Su protocolo de enlace HTTP de 48 bytes no es realista para las conexiones del navegador HTTP del mundo real, donde a menudo se envían varios kilobytes de datos como parte de la solicitud (en ambas direcciones), incluidos muchos encabezados y datos de cookies. Aquí hay un ejemplo de una solicitud / respuesta para usar Chrome:
Ejemplo de solicitud (2800 bytes incluyendo datos de cookies, 490 bytes sin datos de cookies):
GET / HTTP/1.1
Host: www.cnn.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.68 Safari/537.17
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [[[2428 byte of cookie data]]]
Respuesta de ejemplo (355 bytes):
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 13 Feb 2013 18:56:27 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: CG=US:TX:Arlington; path=/
Last-Modified: Wed, 13 Feb 2013 18:55:22 GMT
Vary: Accept-Encoding
Cache-Control: max-age=60, private
Expires: Wed, 13 Feb 2013 18:56:54 GMT
Content-Encoding: gzip
Tanto HTTP como WebSockets tienen enlaces de conexión inicial de tamaño equivalente, pero con una conexión de WebSocket, el enlace inicial se realiza una vez y luego los mensajes pequeños solo tienen 6 bytes de sobrecarga (2 para el encabezado y 4 para el valor de máscara). La sobrecarga de latencia no se debe tanto al tamaño de los encabezados, sino a la lógica de analizar / manejar / almacenar esos encabezados. Además, la latencia de configuración de la conexión TCP es probablemente un factor mayor que el tamaño o el tiempo de procesamiento de cada solicitud.
2) ¿Por qué se implementó en lugar de actualizar el protocolo HTTP?
Hay esfuerzos para rediseñar el protocolo HTTP para lograr un mejor rendimiento y una menor latencia, como SPDY , HTTP 2.0 y QUIC . Esto mejorará la situación para las solicitudes HTTP normales, pero es probable que WebSockets y / o WebRTC DataChannel sigan teniendo una latencia menor para la transferencia de datos de cliente a servidor que el protocolo HTTP (o se utilizará en un modo que se parece mucho a WebSockets de todos modos).
Actualización :
Aquí hay un marco para pensar en protocolos web:
- TCP : capa de transporte de bajo nivel, bidireccional, dúplex completo y orden garantizada. No es compatible con el navegador (excepto a través de plugin / Flash).
- HTTP 1.0 : protocolo de transporte de solicitud-respuesta en capas en TCP. El cliente realiza una solicitud completa, el servidor da una respuesta completa y luego se cierra la conexión. Los métodos de solicitud (GET, POST, HEAD) tienen un significado transaccional específico para los recursos en el servidor.
- HTTP 1.1 : mantiene la naturaleza de solicitud-respuesta de HTTP 1.0, pero permite que la conexión permanezca abierta para múltiples solicitudes completas / respuestas completas (una respuesta por solicitud). Todavía tiene encabezados completos en la solicitud y la respuesta, pero la conexión se reutiliza y no se cierra. HTTP 1.1 también agregó algunos métodos de solicitud adicionales (OPTIONS, PUT, DELETE, TRACE, CONNECT) que también tienen significados transaccionales específicos. Sin embargo, como se señaló en la introducción al borrador de la propuesta HTTP 2.0, la canalización de HTTP 1.1 no se implementa ampliamente, por lo que esto limita en gran medida la utilidad de HTTP 1.1 para resolver la latencia entre navegadores y servidores.
- Long-poll : una especie de "pirateo" a HTTP (ya sea 1.0 o 1.1) donde el servidor no responde de inmediato (o solo responde parcialmente con encabezados) a la solicitud del cliente. Después de una respuesta del servidor, el cliente envía de inmediato una nueva solicitud (utilizando la misma conexión si es a través de HTTP 1.1).
- Transmisión HTTP : una variedad de técnicas (respuesta multiparte / fragmentada) que permiten al servidor enviar más de una respuesta a una sola solicitud del cliente. El W3C está estandarizando esto como eventos enviados por el servidor utilizando un
text/event-stream
tipo MIME. La API del navegador (que es bastante similar a la API de WebSocket) se denomina API EventSource.
- Empuje de cometa / servidor : este es un término general que incluye la transmisión de sondeo largo y HTTP. Las bibliotecas de cometas generalmente admiten múltiples técnicas para intentar maximizar la compatibilidad entre navegadores y servidores.
- WebSockets : un TCP de capa de transporte integrado que utiliza un protocolo de enlace de actualización compatible con HTTP. A diferencia de TCP, que es un transporte de transmisión, WebSockets es un transporte basado en mensajes: los mensajes se delimitan en el cable y se vuelven a ensamblar por completo antes de entregarlos a la aplicación. Las conexiones WebSocket son bidireccionales, full-duplex y de larga duración. Después de la solicitud / respuesta inicial de protocolo de enlace, no hay semántica transaccional y hay muy poca sobrecarga de mensajes. El cliente y el servidor pueden enviar mensajes en cualquier momento y deben manejar la recepción de mensajes de forma asincrónica.
- SPDY : una propuesta iniciada por Google para extender HTTP utilizando un protocolo de cable más eficiente pero manteniendo toda la semántica HTTP (solicitud / respuesta, cookies, codificación). SPDY presenta un nuevo formato de trama (con marcos con longitud prefijada) y especifica una forma de superponer pares de solicitud / respuesta HTTP en la nueva capa de trama. Los encabezados se pueden comprimir y se pueden enviar nuevos encabezados después de que se haya establecido la conexión. Existen implementaciones reales de SPDY en navegadores y servidores.
- HTTP 2.0 : tiene objetivos similares a SPDY: reduce la latencia y la sobrecarga de HTTP mientras conserva la semántica de HTTP. El borrador actual se deriva de SPDY y define un protocolo de enlace de actualización y un marco de datos que es muy similar al estándar WebSocket para el protocolo de enlace y el marco. Una propuesta de borrador HTTP 2.0 alternativa (httpbis-speed-mobility) en realidad usa WebSockets para la capa de transporte y agrega la multiplexación SPDY y el mapeo HTTP como una extensión de WebSocket (las extensiones de WebSocket se negocian durante el protocolo de enlace).
- WebRTC / CU-WebRTC : propuestas para permitir la conectividad peer-to-peer entre navegadores. Esto puede permitir una comunicación de latencia media y máxima más baja porque el transporte subyacente es SDP / datagrama en lugar de TCP. Esto permite la entrega de paquetes / mensajes fuera de orden, lo que evita el problema de TCP de picos de latencia causados por paquetes descartados que retrasan la entrega de todos los paquetes posteriores (para garantizar la entrega en orden).
- QUIC : es un protocolo experimental destinado a reducir la latencia web sobre la de TCP. En la superficie, QUIC es muy similar a TCP + TLS + SPDY implementado en UDP. QUIC proporciona multiplexación y control de flujo equivalente a HTTP / 2, seguridad equivalente a TLS y semántica de conexión, confiabilidad y control de congestión equivalente a TCP. Debido a que TCP se implementa en los núcleos del sistema operativo y en el firmware de la caja intermedia, es casi imposible realizar cambios significativos en TCP. Sin embargo, dado que QUIC está construido sobre UDP, no tiene tales limitaciones. QUIC está diseñado y optimizado para la semántica HTTP / 2.
referencias :
- HTTP :
- Evento enviado por el servidor :
- WebSockets :
- SPDY :
- HTTP 2.0 :
- WebRTC :
- QUIC :