stringtranslate.com

WebSocket

WebSocket es un protocolo de comunicaciones informáticas que proporciona canales de comunicación bidireccionales simultáneos a través de una única conexión de Protocolo de control de transmisión (TCP). El protocolo WebSocket fue estandarizado por el IETF como RFC  6455 en 2011. La especificación actual que permite que las aplicaciones web utilicen este protocolo se conoce como WebSockets . [1] Es un estándar de vida mantenido por WHATWG y sucesor de la API WebSocket del W3C . [2]

WebSocket es distinto de HTTP que se utiliza para servir a la mayoría de las páginas web. Aunque son diferentes, RFC  6455 establece que WebSocket "está diseñado para funcionar a través de los puertos HTTP 443 y 80, así como para admitir servidores proxy e intermediarios HTTP", lo que lo hace compatible con HTTP. Para lograr compatibilidad, el protocolo de enlace WebSocket utiliza el encabezado de actualización HTTP [3] para cambiar del protocolo HTTP al protocolo WebSocket.

El protocolo WebSocket permite la interacción full-duplex entre un navegador web (u otra aplicación cliente ) y un servidor web con una sobrecarga menor que las alternativas half-duplex como el sondeo HTTP , lo que facilita la transferencia de datos en tiempo real desde y hacia el servidor. Esto es posible proporcionando una forma estandarizada para que el servidor envíe contenido al cliente sin que éste lo solicite primero, y permitiendo que los mensajes se transmitan de un lado a otro mientras se mantiene la conexión abierta. De esta manera, puede tener lugar una conversación bidireccional entre el cliente y el servidor. Las comunicaciones suelen realizarse a través del puerto TCP número 443 (u 80 en el caso de conexiones no seguras), lo que resulta beneficioso para entornos que bloquean conexiones a Internet no web mediante un firewall . Además, WebSocket permite flujos de mensajes además de TCP. TCP por sí solo se ocupa de flujos de bytes sin un concepto inherente de mensaje. Se han logrado comunicaciones bidireccionales similares entre navegador y servidor de formas no estandarizadas utilizando tecnologías provisionales como Comet o Adobe Flash Player . [4]

La mayoría de los navegadores admiten el protocolo, incluidos Google Chrome , Firefox , Microsoft Edge , Internet Explorer , Safari y Opera . [5]

La especificación del protocolo WebSocket define ws(WebSocket) y wss(WebSocket Secure) como dos nuevos esquemas de identificador uniforme de recursos (URI) [6] 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 están definidos para utilizar la sintaxis genérica de URI . [7]

Historia

WebSocket fue mencionado por primera vez como TCPConnection en la especificación HTML5 , como marcador de posición para una API de socket basada en TCP. [8] En junio de 2008, Michael Carter dirigió una serie de discusiones que dieron como resultado la primera versión del protocolo conocido como WebSocket. [9] Antes de WebSocket, la comunicación full-duplex del puerto 80 era posible mediante 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 ineficiente para mensajes pequeños. El protocolo WebSocket pretende solucionar estos problemas sin comprometer las suposiciones de seguridad de la web. 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 IRC #whatwg, [10] y posteriormente Ian Hickson lo escribió para su inclusión en la especificación HTML5. En diciembre de 2009, Google Chrome 4 fue el primer navegador que ofreció soporte completo para el estándar, con WebSocket habilitado de forma predeterminada. [11] Posteriormente, el desarrollo del protocolo WebSocket se trasladó del grupo W3C y WHATWG al IETF en febrero de 2010, y se redactó para dos revisiones bajo la dirección de Ian Hickson. [12]

Después de que el protocolo se envió y se habilitó de forma predeterminada en varios navegadores, el RFC  6455 se finalizó bajo Ian Fette en diciembre de 2011.

RFC  7692 introdujo la extensión de compresión a WebSocket utilizando el algoritmo DEFLATE por mensaje.

Implementación del navegador

Se implementa una versión segura del protocolo WebSocket en Firefox 6, [13] Safari 6, Google Chrome 14, [14] Opera 12.10 e Internet Explorer 10. [15] Un informe detallado del conjunto de pruebas de protocolo [16] 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 en la versión móvil de Safari en iOS 4.2 . [17] El navegador BlackBerry en OS7 implementa WebSockets. [18] Debido a vulnerabilidades, se deshabilitó en Firefox 4 y 5, [19] y Opera 11. [20] Utilizando herramientas de desarrollo del navegador, los desarrolladores pueden inspeccionar el protocolo de enlace de WebSocket, así como los marcos de WebSocket. [21]

Ejemplo de cliente JavaScript

// Crea un nuevo objeto WebSocket con un URI de wss como parámetro const socket = new WebSocket ( 'wss://game.example.com/ws/updates' );    // Se activa cuando se abre una conexión con un socket WebSocket . onopen = function () { setInterval ( function () { if ( socket . bufferedAmount == 0 ) socket . send ( getUpdateData ()); }, 50 ); };             // Se activa cuando se reciben datos a través de un socket WebSocket . onmessage = función ( evento ) { handleUpdateData ( evento . datos ); };    // Se activa cuando se cierra una conexión con un socket WebSocket . onclose = función ( evento ) { onSocketClose ( evento ); };    // Se activa cuando se cierra una conexión con un WebSocket debido a un error en el socket . onerror = función ( evento ) { onSocketError ( evento ); };    

Implementación del servidor web

Nginx ha admitido WebSockets desde 2013, implementado en la versión 1.3.13 [30] y actúa como proxy inverso y equilibrador de carga de aplicaciones WebSocket. [31]

Apache HTTP Server admite WebSockets desde julio de 2013, implementado en la versión 2.4.5 [32] [33]

Internet Information Services agregó soporte para WebSockets en la versión 8 que se lanzó con Windows Server 2012 . [34]

lighttpd admite WebSockets desde 2017, implementado en la versión 1.4.46. [35] lighttpd mod_proxy puede actuar como proxy inverso y equilibrador de carga de aplicaciones WebSocket. lighttpd mod_wstunnel puede construir túneles WebSocket para transmitir datos arbitrarios, incluso en formato JSON , a una aplicación backend.

Protocolo

Apretón de manos de protocolo

Para establecer una conexión WebSocket, el cliente envía una solicitud de protocolo de enlace WebSocket, para la cual el servidor devuelve una respuesta de protocolo de enlace WebSocket, como se muestra en el siguiente ejemplo. [36]

Solicitud del cliente (al igual que en HTTP , cada línea termina con \r\ny debe haber una línea en blanco adicional al final):

GET  /chat  HTTP / 1.1 Host :  server.example.com Actualización :  websocket Conexión :  Actualización Sec-WebSocket-Key :  x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol :  chat, superchat Sec-WebSocket-Version :  13 Origen :  http:// ejemplo.com

Respuesta del servidor:

HTTP / 1.1  101  Protocolos de conmutación Actualización :  Conexión websocket : 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 establecida la conexión, la comunicación cambia a un protocolo binario bidireccional que no se ajusta al protocolo HTTP.

Además de Upgradelos encabezados, el cliente envía un Sec-WebSocket-Keyencabezado que contiene bytes aleatorios codificados en base64 y el servidor responde con un hash de la clave en el Sec-WebSocket-Acceptencabezado. Esto tiene como objetivo evitar que un proxy de caché vuelva a enviar una conversación WebSocket anterior [37] y no proporciona 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. [38]258EAFA5-E914-47DA-95CA-C5AB0DC85B11Sec-WebSocket-Key

El RFC6455 requiere que la clave DEBE ser un nonce que consista en un valor de 16 bytes seleccionado aleatoriamente que haya sido codificado en base64, [39] es decir, 24 bytes en base64 (con los dos últimos bytes como ==). Aunque algunos servidores HTTP relajados permiten la presentación de claves más cortas, muchos servidores HTTP modernos rechazarán la solicitud con el error "encabezado Sec-WebSocket-Key no válido".

Protocolo de encuadre base

Una vez establecida la conexión, el cliente y el servidor pueden enviar datos de WebSocket o marcos de texto 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 . [40] Las transmisiones WebSocket se describen como "mensajes", donde un solo mensaje puede dividirse opcionalmente en varias tramas 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 un marco de datos tras otro hasta que se llega al final y se confirma con el bit FIN).

ALETA
Indica el fragmento final de un mensaje. 1b . _
RSV
DEBE ser 0 a menos que esté definido por una extensión. 1b.
Código de operación
Código de operación . 4b.
0
Cuadro de continuación
1
marco de texto
2
marco binario
8
Conexión cerrada
9
Silbido
A
Apestar
etc.
Reservado
Mascarilla
Establezca en 1 si los datos de la carga útil están enmascarados. 1b.
Longitud de carga útil
La longitud de los datos de la carga útil. 7b.
0-125
Esta es la longitud de la carga útil.
126
Los siguientes 2 bytes son la longitud de la carga útil.
127
Los siguientes 8 bytes son la longitud de la carga útil.
Clave de enmascaramiento
Todas las tramas enviadas desde el cliente deben estar enmascaradas por esta clave. Este campo está ausente si el bit de máscara está establecido en 0. 4B.
Datos de carga útil
Los datos de carga útil del fragmento.

Con extensiones del protocolo, esto también se puede utilizar para multiplexar varios flujos simultáneamente (por ejemplo, para evitar monopolizar el uso de un socket para una única carga útil grande). [41]

Enmascaramiento de cliente a servidor

Los datos de carga enviados desde el cliente deben estar enmascarados por la clave de enmascaramiento. La clave de enmascaramiento es un valor aleatorio de 4 bytes elegido por el cliente y debe ser impredecible. La imprevisibilidad de la clave de enmascaramiento es esencial para evitar que aplicaciones maliciosas seleccionen los bytes que ya aparecen. [ se necesita aclaración ] Se aplica el siguiente algoritmo para enmascarar los datos de la carga útil.

j = yo MOD 4Octeto-transformado[i] = octeto-original[i] XOR octeto-clave-de-enmascaramiento[j]

Consideraciones de Seguridad

A diferencia de las solicitudes HTTP normales entre dominios, las solicitudes WebSocket no están restringidas por la política del mismo origen . Por lo tanto, los servidores WebSocket deben validar el encabezado "Origin" con los orígenes esperados durante el establecimiento de la conexión, para evitar ataques de secuestro de WebSocket entre sitios (similar a la falsificación de solicitudes entre sitios ), lo que podría ser posible cuando la conexión se autentica con cookies o HTTP. autenticación. 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. [42] Un ejemplo vivo de vulnerabilidad se vio en 2020 en la forma de Cable Haunt .

recorrido de proxy

Las implementaciones del cliente del protocolo WebSocket intentan detectar si el agente de usuario está configurado para usar un proxy cuando se conecta al host y al puerto 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í desconoce los servidores proxy y los firewalls, presenta un protocolo de enlace compatible con HTTP, lo que permite a los servidores HTTP compartir 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 impedirán que WebSocket funcione correctamente, provocando que falle la conexión. En algunos casos, es posible que se requiera una configuración adicional del servidor proxy y es posible que sea necesario actualizar ciertos servidores proxy para que admitan WebSocket.

Si el tráfico WebSocket no cifrado fluye a través de un servidor proxy explícito o transparente sin soporte WebSockets, es probable que la conexión falle. [43]

Si se utiliza una conexión WebSocket cifrada, el uso de Transport Layer Security (TLS) en la conexión WebSocket Secure garantiza que HTTP CONNECTse emita un comando cuando el navegador esté configurado para usar 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 servidores proxy transparentes, el navegador no reconoce el servidor proxy, por lo que no HTTP CONNECTse envía. 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 sería viajar a través de un túnel seguro.

Un borrador de mediados de 2010 (versión hixie-76) rompió la compatibilidad con servidores proxy inversos y puertas de enlace al incluir ocho bytes de datos clave después de los encabezados, pero no anunciar esos datos en un Content-Length: 8encabezado. [44] Estos datos no fueron enviados por todos los intermediarios, lo que podría provocar una falla en el protocolo. Los borradores más recientes (por ejemplo, hybi-09 [45] ) colocan los datos clave en un Sec-WebSocket-Keyencabezado, resolviendo este problema.

Ver también

Notas

  1. ^ ab Las versiones 6 a 10 de los navegadores basados ​​en Gecko implementan el objeto WebSocket como "MozWebSocket", [24] que requiere código adicional para integrarse con el código existente habilitado para WebSocket.

Referencias

  1. ^ "Estándar WebSockets". websockets.spec.whatwg.org . Consultado el 16 de mayo de 2022 .
  2. ^ "La API WebSocket". www.w3.org . Consultado el 16 de mayo de 2022 .
  3. ^ 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.
  4. ^ "Plataforma Adobe Flash: enchufes". ayuda.adobe.com . Consultado el 28 de julio de 2021 . Las conexiones TCP requieren un "cliente" y un "servidor". Flash Player puede crear sockets de cliente.
  5. ^ "La API WebSocket (WebSockets)". Documentos web de MDN . Red de desarrolladores de Mozilla. 2023-04-06. Archivado desde el original el 28 de julio de 2021 . Consultado el 26 de julio de 2021 .
  6. ^ Graham Klyne, ed. (14 de noviembre de 2011). "Esquemas de identificador uniforme de recursos (URI) de la IANA". Autoridad de asignación de números de Internet . Consultado el 10 de diciembre de 2011 .
  7. ^ Ian Fette; Alexey Melnikov (diciembre de 2011). "URI de WebSocket". RFC 6455 El protocolo WebSocket. IETF . segundo. 3.doi : 10.17487 /RFC6455 . RFC 6455.
  8. ^ "HTML5". www.w3.org . Consultado el 17 de abril de 2016 .
  9. ^ "[whatwg] Comentarios de TCPConnection de Michael Carter el 18 de junio de 2008 (whatwg.org de junio de 2008)". listas.w3.org . Consultado el 17 de abril de 2016 .
  10. ^ "Registros de IRC: freenode / #whatwg / 20080618". krijnhoetmer.nl . Consultado el 18 de abril de 2016 .
  11. ^ "Web Sockets ahora está disponible en Google Chrome". Blog de cromo . Consultado el 17 de abril de 2016 .
  12. ^ <[email protected]>, Ian Hickson (6 de mayo de 2010). "El protocolo WebSocket". Rastreador de datos del IETF . Consultado el 17 de abril de 2016 .
  13. ^ Dirkjan Ochtman (27 de mayo de 2011). "WebSocket habilitado en Firefox 6". Mozilla.org . Archivado desde el original el 26 de mayo de 2012 . Consultado el 30 de junio de 2011 .
  14. ^ "Estado de la plataforma web Chromium" . Consultado el 3 de agosto de 2011 .
  15. ^ "WebSockets (Windows)". Microsoft. 28 de septiembre de 2012 . Consultado el 7 de noviembre de 2012 .
  16. ^ "Informe de prueba del protocolo WebSockets". Tavendo.de. 2011-10-27. Archivado desde el original el 22 de septiembre de 2016 . Consultado el 10 de diciembre de 2011 .
  17. ^ Katie Marsal (23 de noviembre de 2010). "Apple agrega acelerómetro y compatibilidad con WebSockets a Safari en iOS 4.2". AppleInsider.com . Consultado el 9 de mayo de 2011 .
  18. ^ "API de sockets web". Mora . Archivado desde el original el 10 de junio de 2011 . Consultado el 8 de julio de 2011 .
  19. ^ Chris Heilmann (8 de diciembre de 2010). "WebSocket deshabilitado en Firefox 4". Hacks.Mozilla.org . Consultado el 9 de mayo de 2011 .
  20. ^ Aleksander Aas (10 de diciembre de 2010). "Con respecto a WebSocket". Mi blog de ópera . Archivado desde el original el 15 de diciembre de 2010 . Consultado el 9 de mayo de 2011 .
  21. ^ Wang, Vanessa; Salim, Frank; Moskovits, Peter (febrero de 2013). "APÉNDICE A: Inspección del marco WebSocket con herramientas para desarrolladores de Google Chrome". La guía definitiva para HTML5 WebSocket . Presione. ISBN 978-1-4302-4740-1. Archivado desde el original el 31 de diciembre de 2015 . Consultado el 7 de abril de 2013 .
  22. ^ "WebSockets (compatible con Firefox)". desarrollador.mozilla.org . Fundación Mozilla. 30 de septiembre de 2011. Archivado desde el original el 26 de mayo de 2012 . Consultado el 10 de diciembre de 2011 .
  23. ^ "Error 640003 - WebSockets - actualización a ietf-06". Fundación Mozilla. 2011-03-08 . Consultado el 10 de diciembre de 2011 .
  24. ^ "WebSockets-MDN". desarrollador.mozilla.org . Fundación Mozilla. 30 de septiembre de 2011. Archivado desde el original el 26 de mayo de 2012 . Consultado el 10 de diciembre de 2011 .
  25. ^ "Error 640003 - WebSockets - actualización a ietf-07 (comentario 91)". Fundación Mozilla. 22 de julio de 2011.
  26. ^ "Error del cromo 64470". código.google.com . 25 de noviembre de 2010 . Consultado el 10 de diciembre de 2011 .
  27. ^ "WebSockets en Windows Consumer Preview". Equipo de ingeniería de IE . Microsoft. 2012-03-19 . Consultado el 23 de julio de 2012 .
  28. ^ "Conjunto de cambios WebKit 97247: WebSocket: actualice el protocolo WebSocket a hybi-17". trac.webkit.org . Consultado el 10 de diciembre de 2011 .
  29. ^ "Una instantánea del horario de verano de Opera 12.50". Noticias para desarrolladores de Opera. 2012-08-03. Archivado desde el original el 5 de agosto de 2012 . Consultado el 3 de agosto de 2012 .
  30. ^ "¡Bienvenido a nginx!". nginx.org . Archivado desde el original el 17 de julio de 2012 . Consultado el 3 de febrero de 2022 .
  31. ^ "Uso de NGINX como proxy WebSocket". NGINX . 17 de mayo de 2014.
  32. ^ "Descripción general de las nuevas funciones del servidor Apache HTTP 2.4". apache .
  33. ^ "Registro de cambios Apache 2.4". Salón Apache .
  34. ^ "Compatibilidad con el protocolo WebSocket de IIS 8.0". Documentos de Microsoft . 28 de noviembre de 2012 . Consultado el 18 de febrero de 2020 .
  35. ^ "Versión-1 4 46 - Lighttpd - lighty labs".
  36. ^ Ian Fette; Alexey Melnikov (diciembre de 2011). "Resumen del protocolo". RFC 6455 El protocolo WebSocket. IETF . segundo. 1.2. doi : 10.17487/RFC6455 . RFC 6455.
  37. ^ "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 del servidor WS en caché sin una interacción real con el servidor WS.
  38. ^ 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.
  39. ^ Ian Fette; Alexey Melnikov (diciembre de 2011). "Apretón de manos de apertura". RFC 6455 El protocolo WebSocket. IETF . pag. 21. seg. 1.3. doi : 10.17487/RFC6455 . RFC 6455.
  40. ^ Ian Fette; Alexey Melnikov (diciembre de 2011). "Protocolo de marco base". RFC 6455 El protocolo WebSocket. IETF . segundo. 5.2. doi : 10.17487/RFC6455 . RFC 6455.
  41. ^ John A. Tamplin; Takeshi Yoshino (2013). Una extensión de multiplexación para WebSockets. IETF . ID borrador-ietf-hybi-websocket-multiplexación.
  42. ^ Christian Schneider (31 de agosto de 2013). "Secuestro de WebSocket entre sitios (CSWSH)". Blog de seguridad de aplicaciones web .
  43. ^ 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 .
  44. ^ Willy Tarreau (6 de julio de 2010). "WebSocket -76 es incompatible con servidores proxy inversos HTTP". ietf.org (correo electrónico). Grupo de Trabajo de Ingeniería de Internet . Consultado el 10 de diciembre de 2011 .
  45. ^ Ian Fette (13 de junio de 2011). "Clave-Sec-WebSocket". El protocolo WebSocket, borrador hybi-09. segundo. 11.4 . Consultado el 15 de junio de 2011 .

enlaces externos