WebSocket es un protocolo de comunicaciones informáticas que proporciona canales de comunicación full-duplex a través de una única conexión TCP . El protocolo WebSocket fue estandarizado por el IETF como RFC 6455 en 2011, y la API de WebSocket en Web IDL está siendo estandarizada por el W3C .
Estándar internacional | RFC 6455 |
---|---|
Desarrollado por | IETF |
Industria | Ciencias de la Computación |
Tipo de conector | TCP |
WebSocket es distinto de HTTP . Ambos protocolos están ubicados en la capa 7 en el modelo OSI y dependen de TCP en la capa 4. Aunque son diferentes, RFC 6455 establece que WebSocket "está diseñado para funcionar en los puertos HTTP 443 y 80, así como para admitir intermediarios y proxies HTTP. "haciéndolo compatible con HTTP. Para lograr la compatibilidad, el protocolo de enlace de WebSocket utiliza el encabezado de actualización HTTP [1] para cambiar del protocolo HTTP al protocolo WebSocket.
El protocolo WebSocket permite la interacción entre un navegador web (u otra aplicación cliente) y un servidor web con menos gastos generales que las alternativas semidúplex como el sondeo HTTP, lo que facilita la transferencia de datos en tiempo real desde y hacia el servidor. Esto es posible al proporcionar una forma estandarizada para que el servidor envíe contenido al cliente sin que el cliente lo solicite primero, y al permitir que los mensajes se pasen de un lado a otro mientras se mantiene la conexión abierta. De esta manera, puede tener lugar una conversación continua bidireccional entre el cliente y el servidor. Las comunicaciones generalmente se realizan a través del puerto TCP número 443 (u 80 en el caso de conexiones no seguras), lo cual es beneficioso para entornos que bloquean las conexiones a Internet que no son de la web mediante un firewall . Se han logrado comunicaciones similares de dos vías navegador-servidor de formas no estandarizadas utilizando tecnologías provisionales como Comet .
La mayoría de los navegadores admiten el protocolo, incluidos Google Chrome , Firefox , Microsoft Edge , Internet Explorer , Safari y Opera .
A diferencia de HTTP, WebSocket proporciona comunicación full-duplex. [2] [3] Además, WebSocket habilita flujos de mensajes sobre TCP. TCP solo se ocupa de flujos de bytes sin un concepto inherente de mensaje. Antes de WebSocket, la comunicación de dúplex completo del puerto 80 se podía lograr mediante los canales Comet ; sin embargo, la implementación de Comet no es trivial y, debido al protocolo de enlace TCP y la sobrecarga del encabezado HTTP, es ineficaz para mensajes pequeños. El protocolo WebSocket tiene como objetivo resolver estos problemas sin comprometer los supuestos de seguridad de la web.
La especificación del protocolo WebSocket define ws
(WebSocket) y wss
(WebSocket Secure) como dos nuevos esquemas de identificador uniforme de recursos (URI) [4] que se utilizan para conexiones cifradas y no cifradas, respectivamente. Aparte del nombre del esquema y el fragmento ( #
es decir, no se admite), el resto de los componentes de URI se definen para utilizar la sintaxis genérica de URI . [5]
Con las herramientas de desarrollo del navegador, los desarrolladores pueden inspeccionar el protocolo de enlace de WebSocket, así como los marcos de WebSocket. [6]
Historia
Primero se hizo referencia a WebSocket como TCPConnection en la especificación HTML5 , como un marcador de posición para una API de socket basada en TCP. [7] En junio de 2008, Michael Carter dirigió una serie de debates que dieron como resultado la primera versión del protocolo conocido como WebSocket. [8]
El nombre "WebSocket" fue acuñado por Ian Hickson y Michael Carter poco después a través de la colaboración en la sala de chat #whatwg IRC, [9] y posteriormente fue escrito por Ian Hickson para su inclusión en la especificación HTML5. En diciembre de 2009, Google Chrome 4 fue el primer navegador en ofrecer soporte completo para el estándar, con WebSocket habilitado de forma predeterminada. [10] El desarrollo del protocolo WebSocket se trasladó posteriormente del grupo W3C y WHATWG al IETF en febrero de 2010, y fue escrito para dos revisiones bajo Ian Hickson. [11]
Una vez que el protocolo se envió y habilitó de forma predeterminada en varios navegadores, el RFC 6455 se finalizó bajo Ian Fette en diciembre de 2011.
Implementación del navegador
Se implementa una versión segura del protocolo WebSocket en Firefox 6, [12] Safari 6, Google Chrome 14, [13] Opera 12.10 e Internet Explorer 10. [14] Un informe detallado del conjunto de pruebas de protocolo [15] enumera la conformidad de esos navegadores a aspectos específicos del protocolo.
Se implementó una versión más antigua y menos segura del protocolo en Opera 11 y Safari 5, así como la versión móvil de Safari en iOS 4.2 . [16] El navegador BlackBerry en OS7 implementa WebSockets. [17] Debido a vulnerabilidades, se deshabilitó en Firefox 4 y 5, [18] y Opera 11. [19]
Protocolo, versión | Fecha borrador | explorador de Internet | Firefox [20] (PC) | Firefox (Android) | Chrome (PC, móvil) | Safari (Mac, iOS) | Opera (PC, móvil) | Navegador de Android |
---|---|---|---|---|---|---|---|---|
hixie-75 | 4 de febrero de 2010 | 4 | 5.0.0 | |||||
hixie-76 hybi-00 | 6 de mayo de 2010 23 de mayo de 2010 | 4.0 (discapacitado) | 6 | 5.0.1 | 11.00 (discapacitado) | |||
hybi-07 , v7 | 22 de abril de 2011 | 6 [21] [a] | ||||||
hybi-10 , v8 | 11 de julio de 2011 | 7 [23] [a] | 7 | 14 [24] | ||||
RFC 6455 , v13 | Diciembre de 2011 | 10 [25] | 11 | 11 | 16 [26] | 6 | 12.10 [27] | 4.4 |
Ejemplo de cliente JavaScript
const socket = new WebSocket ( 'ws: //game.example.com: 12010 / updates' ); zócalo . onopen = function () { setInterval ( function () { if ( socket . bufferAmount == 0 ) socket . enviar ( getUpdateData ()); }, 50 ); };
Implementación del servidor web
Nginx ha admitido WebSockets desde 2013, implementado en la versión 1.3.13 [28], incluida la actuación como proxy inverso y equilibrador de carga de las aplicaciones WebSocket. [29]
Apache HTTP Server ha admitido WebSockets desde julio de 2013, implementado en la versión 2.4.5 [30] [31]
Internet Information Services agregó soporte para WebSockets en la versión 8 que se lanzó con Windows Server 2012 . [32]
lighttpd admite WebSockets desde 2017, implementado en la versión 1.4.46. [33] lighttpd mod_proxy puede actuar como un proxy inverso y equilibrador de carga de aplicaciones WebSocket. lighttpd mod_wstunnel puede facilitar un túnel de WebSocket, lo que permite que un cliente emplee WebSockets para hacer un túnel de un protocolo más simple, como JSON , a una aplicación de back-end.
Protocolo de apretón de manos
Para establecer una conexión WebSocket, el cliente envía una solicitud de protocolo de enlace de WebSocket, para lo cual el servidor devuelve una respuesta de protocolo de enlace de WebSocket, como se muestra en el ejemplo siguiente. [34]
Solicitud del cliente (al igual que en HTTP , cada línea termina con \r\n
y debe haber una línea en blanco adicional al final):
GET / chat HTTP / 1.1 Host : server.example.com Actualización : websocket Conexión : Actualizar Sec-WebSocket-Key : x3JJHMbDL1EzLkh9GBhXDw == Sec-WebSocket-Protocol : chat, superchat Sec-WebSocket-Versión : 13 Origen : http: // example.com
Respuesta del servidor:
HTTP / 1.1 101 Protocolos de conmutación Actualización : websocket Conexión : Actualización Sec-WebSocket-Accept : HSmrc0sMlYUkAGmm5OPpG2HaGWk = Sec-WebSocket-Protocol : chat
El protocolo de enlace comienza con una solicitud / respuesta HTTP, lo que permite a los servidores manejar conexiones HTTP y conexiones WebSocket en el mismo puerto. Una vez que se establece la conexión, la comunicación cambia a un protocolo binario bidireccional que no se ajusta al protocolo HTTP.
Además de los Upgrade
encabezados, el cliente envía un Sec-WebSocket-Key
encabezado que contiene bytes aleatorios codificados en base64 y el servidor responde con un hash de la clave en el Sec-WebSocket-Accept
encabezado. Esto está destinado a evitar que un proxy de almacenamiento en caché vuelva a enviar una conversación anterior de WebSocket, [35] y no proporciona ninguna autenticación, privacidad o integridad. La función hash agrega la cadena fija (un UUID ) al valor del encabezado (que no está decodificado desde base64), aplica la función hash SHA-1 y codifica el resultado usando base64. [36]258EAFA5-E914-47DA-95CA-C5AB0DC85B11
Sec-WebSocket-Key
Una vez que se establece la conexión, el cliente y el servidor pueden enviar marcos de texto o datos de WebSocket de un lado a otro en modo full-duplex . Los datos están mínimamente enmarcados, con un pequeño encabezado seguido de una carga útil . [37] Las transmisiones de WebSocket se describen como "mensajes", donde un solo mensaje se puede dividir opcionalmente en varios marcos de datos. Esto puede permitir el envío de mensajes donde los datos iniciales están disponibles pero se desconoce la longitud completa del mensaje (envía una trama de datos tras otra hasta que se alcanza el final y se agrega el bit FIN). Con extensiones al protocolo, esto también se puede usar para multiplexar varios flujos simultáneamente (por ejemplo, para evitar monopolizar el uso de un conector para una sola carga útil grande). [38]
Consideraciones de Seguridad
A diferencia de las solicitudes HTTP habituales entre dominios, las solicitudes de WebSocket no están restringidas por la política del mismo origen . Por lo tanto, los servidores de WebSocket deben validar el encabezado "Origin" contra los orígenes esperados durante el establecimiento de la conexión, para evitar ataques de secuestro de WebSocket entre sitios (similares a la falsificación de solicitudes entre sitios ), que podrían ser posibles cuando la conexión se autentica con cookies o autenticación HTTP . Es mejor utilizar tokens o mecanismos de protección similares para autenticar la conexión WebSocket cuando se transfieren datos confidenciales (privados) a través de WebSocket. [39] Un ejemplo vivo de vulnerabilidad se vio en 2020 en la forma de Cable Haunt .
Cruce de proxy
Las implementaciones de cliente del protocolo WebSocket intentan detectar si el agente de usuario está configurado para usar un proxy cuando se conecta al puerto y host de destino y, si lo está, usa el método HTTP CONNECT para configurar un túnel persistente.
Si bien el protocolo WebSocket en sí mismo desconoce los servidores proxy y los firewalls, presenta un protocolo de enlace compatible con HTTP, lo que permite que los servidores HTTP compartan sus puertos HTTP y HTTPS predeterminados (80 y 443, respectivamente) con una puerta de enlace o servidor WebSocket. El protocolo WebSocket define un prefijo ws: // y wss: // para indicar una conexión WebSocket y WebSocket Secure, respectivamente. Ambos esquemas utilizan un mecanismo de actualización HTTP para actualizar al protocolo WebSocket. Algunos servidores proxy son transparentes y funcionan bien con WebSocket; otros evitarán que WebSocket funcione correctamente, provocando que la conexión falle. En algunos casos, es posible que se requiera una configuración adicional del servidor proxy y es posible que algunos servidores proxy deban actualizarse para admitir WebSocket.
Si el tráfico de WebSocket no cifrado fluye a través de un servidor proxy explícito o transparente sin compatibilidad con WebSockets, es probable que la conexión falle. [40]
Si se utiliza una conexión WebSocket cifrada, el uso de Seguridad de la capa de transporte (TLS) en la conexión WebSocket Secure garantiza que se emite un comando HTTP CONNECT cuando el navegador está configurado para utilizar un servidor proxy explícito. Esto configura un túnel, que proporciona comunicación TCP de extremo a extremo de bajo nivel a través del proxy HTTP, entre el cliente WebSocket Secure y el servidor WebSocket. En el caso de los servidores proxy transparentes, el navegador no conoce el servidor proxy, por lo que no se envía HTTP CONNECT. Sin embargo, dado que el tráfico por cable está cifrado, los servidores proxy transparentes intermedios pueden simplemente permitir el paso del tráfico cifrado, por lo que hay muchas más posibilidades de que la conexión WebSocket tenga éxito si se utiliza WebSocket Secure. El uso de cifrado no está exento de costos de recursos, pero a menudo proporciona la tasa de éxito más alta, ya que viajaría por un túnel seguro.
Un borrador de mediados de 2010 (versión hixie-76) rompió la compatibilidad con proxies inversos y puertas de enlace al incluir ocho bytes de datos clave después de los encabezados, pero sin anunciar esos datos en un Content-Length: 8
encabezado. [41] Estos datos no fueron enviados por todos los intermediarios, lo que podría conducir a fallas en el protocolo. Los borradores más recientes (por ejemplo, hybi-09 [42] ) colocan los datos clave en un Sec-WebSocket-Key
encabezado, resolviendo este problema.
Ver también
- TONTERÍAS
- Comparación de implementaciones de WebSocket
- Toma de red
- Tecnología de empuje
- Eventos enviados por el servidor
- XMLHttpRequest
- HTTP / 2
- Conjunto de protocolos de internet
- WebRTC
Notas
- ^ a b Las versiones 6–10 de los navegadores basados en Gecko implementan el objeto WebSocket como "MozWebSocket", [22] que requieren código adicional para integrarse con el código existente habilitado para WebSocket.
Referencias
- ^ Ian Fette; Alexey Melnikov (diciembre de 2011). "Relación con TCP y HTTP" . RFC 6455 El protocolo WebSocket . IETF . segundo. 1.7. doi : 10.17487 / RFC6455 . RFC 6455 .
- ^ "Glosario: WebSockets" . Red de desarrolladores de Mozilla. 2015.
- ^ "HTML5 WebSocket - Un salto cuántico en escalabilidad para la Web" . www.websocket.org .
- ^ Graham Klyne, ed. (14 de noviembre de 2011). "Esquemas de identificador uniforme de recursos (URI) de la IANA" . Autoridad de Números Asignados de Internet . Consultado el 10 de diciembre de 2011 .
- ^ Ian Fette; Alexey Melnikov (diciembre de 2011). "URI de WebSocket" . RFC 6455 El protocolo WebSocket . IETF . segundo. 3. doi : 10.17487 / RFC6455 . RFC 6455 .
- ^ Wang, Vanessa; Salim, Frank; Moskovits, Peter (febrero de 2013). "APÉNDICE A: Inspección de tramas de WebSocket con herramientas de desarrollo de Google Chrome" . La guía definitiva para HTML5 WebSocket . Presione. ISBN 978-1-4302-4740-1. Consultado el 7 de abril de 2013 .
- ^ "HTML 5" . www.w3.org . Consultado el 17 de abril de 2016 .
- ^ "[whatwg] Comentarios de TCPConnection de Michael Carter el 18-06-2008 (whatwg.org desde junio de 2008)" . listas.w3.org . Consultado el 17 de abril de 2016 .
- ^ "Registros de IRC: freenode / #whatwg / 20080618" . krijnhoetmer.nl . Consultado el 18 de abril de 2016 .
- ^ "Web Sockets ahora disponibles en Google Chrome" . Blog de Chromium . Consultado el 17 de abril de 2016 .
- ^
, Ian Hickson. @hixie.ch>"El protocolo WebSocket" . tools.ietf.org . Consultado el 17 de abril de 2016 . - ^ Dirkjan Ochtman (27 de mayo de 2011). "WebSocket habilitado en Firefox 6" . Mozilla.org . Consultado el 30 de junio de 2011 .
- ^ "Estado de la plataforma web Chromium" . Consultado el 3 de agosto de 2011 .
- ^ "WebSockets (Windows)" . Microsoft. 2012-09-28 . Consultado el 7 de noviembre de 2012 .
- ^ "Informe de prueba del protocolo WebSockets" . Tavendo.de. 2011-10-27 . Consultado el 10 de diciembre de 2011 .
- ^ Katie Marsal (23 de noviembre de 2010). "Apple agrega acelerómetro, soporte WebSockets para Safari en iOS 4.2" . AppleInsider.com . Consultado el 9 de mayo de 2011 .
- ^ "API de Web Sockets" . BlackBerry . Archivado desde el original el 10 de junio de 2011 . Consultado el 8 de julio de 2011 .
- ^ Chris Heilmann (8 de diciembre de 2010). "WebSocket deshabilitado en Firefox 4" . Hacks.Mozilla.org . Consultado el 9 de mayo de 2011 .
- ^ Aleksander Aas (10 de diciembre de 2010). "Respecto a WebSocket" . Mi blog de Opera . Archivado desde el original el 15 de diciembre de 2010 . Consultado el 9 de mayo de 2011 .
- ^ "WebSockets (soporte en Firefox)" . developer.mozilla.org . Fundación Mozilla. 2011-09-30 . Consultado el 10 de diciembre de 2011 .
- ^ "Error 640003 - WebSockets - actualizar a ietf-06" . Fundación Mozilla. 2011-03-08 . Consultado el 10 de diciembre de 2011 .
- ^ "WebSockets - MDN" . developer.mozilla.org . Fundación Mozilla. 2011-09-30 . Consultado el 10 de diciembre de 2011 .
- ^ "Error 640003 - WebSockets - actualizar a ietf-07 (comentario 91)" . Fundación Mozilla. 2011-07-22.
- ^ "Error de cromo 64470" . code.google.com . 2010-11-25 . Consultado el 10 de diciembre de 2011 .
- ^ "WebSockets en Windows Consumer Preview" . Equipo de Ingeniería de IE . Microsoft. 2012-03-19 . Consultado el 23 de julio de 2012 .
- ^ "WebKit Changeset 97247: WebSocket: Actualizar el protocolo WebSocket a hybi-17" . trac.webkit.org . Consultado el 10 de diciembre de 2011 .
- ^ "Una instantánea de verano de Opera 12.50 caliente" . Novedades para desarrolladores de Opera. 2012-08-03. Archivado desde el original el 5 de agosto de 2012 . Consultado el 3 de agosto de 2012 .
- ^ [1]
- ^ "Utilizando NGINX como WebSocket Proxy" . NGINX . 17 de mayo de 2014.
- ^ "Descripción general de las nuevas características de Apache HTTP Server 2.4" . Apache .
- ^ "Registro de cambios Apache 2.4" . Apache Lounge .
- ^ "Soporte del protocolo IIS 8.0 WebSocket" . Microsoft Docs . 28 de noviembre de 2012 . Consultado el 18 de febrero de 2020 .
- ^ [2]
- ^ Ian Fette; Alexey Melnikov (diciembre de 2011). "Descripción general del protocolo" . RFC 6455 El protocolo WebSocket . IETF . segundo. 1.2. doi : 10.17487 / RFC6455 . RFC 6455 .
- ^ "Objetivo principal del protocolo WebSocket" . IETF . Consultado el 25 de julio de 2015 .
El cálculo está destinado a evitar [...] que un intermediario de almacenamiento en caché proporcione a un cliente WS una respuesta de servidor WS en caché sin interacción real con el servidor WS.
- ^ Ian Fette; Alexey Melnikov (diciembre de 2011). "Apretón de manos de apertura" . RFC 6455 El protocolo WebSocket . IETF . pag. 8. seg. 1.3. doi : 10.17487 / RFC6455 . RFC 6455 .
- ^ Ian Fette; Alexey Melnikov (diciembre de 2011). "Protocolo de encuadre de base" . RFC 6455 El protocolo WebSocket . IETF . segundo. 5.2. doi : 10.17487 / RFC6455 . RFC 6455 .
- ^ John A. Tamplin; Takeshi Yoshino (2013). Una extensión de multiplexación para WebSockets . IETF . ID draft-ietf-hybi-websocket-multiplexing.
- ^ Christian Schneider (31 de agosto de 2013). "Secuestro de WebSocket entre sitios (CSWSH)" . Blog de seguridad de aplicaciones web .
- ^ Peter Lubbers (16 de marzo de 2010). "Cómo interactúan los sockets web HTML5 con los servidores proxy" . Infoq.com . C4Media Inc . Consultado el 10 de diciembre de 2011 .
- ^ Willy Tarreau (6 de julio de 2010). "WebSocket -76 es incompatible con los proxies inversos HTTP" . ietf.org (correo electrónico). Grupo de trabajo de ingeniería de Internet . Consultado el 10 de diciembre de 2011 .
- ^ Ian Fette (13 de junio de 2011). "Sec-WebSocket-Key" . El protocolo WebSocket, borrador hybi-09 . segundo. 11.4 . Consultado el 15 de junio de 2011 .
enlaces externos
- Grupo de trabajo de hipertexto bidireccional (HyBi) del IETF
- RFC 6455 El protocolo WebSocket - Estándar propuesto publicado por el Grupo de trabajo IETF HyBi
- El protocolo WebSocket - Borrador de Internet publicado por el Grupo de Trabajo IETF HyBi
- El protocolo WebSocket : propuesta de protocolo original de Ian Hickson
- La API de WebSocket - Especificación del borrador de trabajo del W3C de la API
- La API de WebSocket : especificación de la API de recomendación candidata de W3C
- Demostraciones de WebSocket.org WebSocket, pruebas de loopback, información general y comunidad