b"\n_START_ARTICLE_\nWebSocket\n_START_PARAGRAPH_\nWebSocket es una tecnolog\xc3\xada que proporciona un canal de comunicaci\xc3\xb3n bidireccional y full-duplex sobre un \xc3\xbanico socket TCP. Est\xc3\xa1 dise\xc3\xb1ada para ser implementada en navegadores y servidores web, pero puede utilizarse por cualquier aplicaci\xc3\xb3n cliente/servidor. La API de WebSocket est\xc3\xa1 siendo normalizada por el W3C, mientras que el protocolo WebSocket ya fue normalizado por la IETF como el RFC 6455. Debido a que las conexiones TCP comunes sobre puertos diferentes al 80 son habitualmente bloqueadas por los administradores de redes, el uso de esta tecnolog\xc3\xada proporcionar\xc3\xada una soluci\xc3\xb3n a este tipo de limitaciones proveyendo una funcionalidad similar a la apertura de varias conexiones en distintos puertos, pero multiplexando diferentes servicios WebSocket sobre un \xc3\xbanico puerto TCP (a costa de una peque\xc3\xb1a sobrecarga del protocolo)._NEWLINE_En el lado del cliente, WebSocket est\xc3\xa1 ya implementado en Mozilla Firefox 8, Google Chrome 4 y Safari 5, as\xc3\xad como la versi\xc3\xb3n m\xc3\xb3vil de Safari en el iOS 4.2,\xe2\x80\x8b y en Internet Explorer 10.\xe2\x80\x8b\n_START_SECTION_\nNegociaci\xc3\xb3n del protocolo WebSocket\n_START_PARAGRAPH_\nPara establecer una conexi\xc3\xb3n WebSocket, el cliente env\xc3\xada una petici\xc3\xb3n de negociaci\xc3\xb3n WebSocket, y el servidor env\xc3\xada una respuesta de negociaci\xc3\xb3n WebSocket, como se puede ver en el siguiente ejemplo:_NEWLINE_Petici\xc3\xb3n del navegador al servidor:_NEWLINE_GET /demo HTTP/1.1_NEWLINE_Host: example.com_NEWLINE_Connection: Upgrade_NEWLINE_Sec-WebSocket-Key2: 12998 5 Y3 1 .P00_NEWLINE_Sec-WebSocket-Protocol: sample_NEWLINE_Upgrade: WebSocket_NEWLINE_Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5_NEWLINE_Origin: http://example.com_NEWLINE__NEWLINE_^n:ds[4U_NEWLINE_Respuesta del servidor:_NEWLINE_HTTP/1.1 101 WebSocket Protocol Handshake_NEWLINE_Upgrade: WebSocket_NEWLINE_Connection: Upgrade_NEWLINE_Sec-WebSocket-Origin: http://example.com_NEWLINE_Sec-WebSocket-Location: ws://example.com/demo_NEWLINE_Sec-WebSocket-Protocol: sample_NEWLINE__NEWLINE_8jKS'y:G*Co,Wxa-_NEWLINE_Los 8 bytes con valores num\xc3\xa9ricos que acompa\xc3\xb1an a los campos Sec-WebSocket-Key1 y Sec-WebSocket-Key2 son tokens aleatorios que el servidor utilizar\xc3\xa1 para construir un token de 16 bytes al final de la negociaci\xc3\xb3n para confirmar que ha le\xc3\xaddo correctamente la petici\xc3\xb3n de negociaci\xc3\xb3n del cliente._NEWLINE_La negociaci\xc3\xb3n o handshake se construye concatenando los n\xc3\xbameros que acompa\xc3\xb1an al primer campo, y dividi\xc3\xa9ndolo por el n\xc3\xbamero de espacios en blanco en el propio campo. Esto mismo se repite para el segundo campo. Los dos n\xc3\xbameros resultantes se concatenan entre s\xc3\xad y con los 8 bytes que van despu\xc3\xa9s de los campos. El resultado final es una suma MD5 de la cadena concatenada.\xe2\x80\x8b_NEWLINE_Esta negociaci\xc3\xb3n puede parecerse a la negociaci\xc3\xb3n HTTP, pero no es as\xc3\xad. Permite al servidor interpretar parte de la petici\xc3\xb3n de negociaci\xc3\xb3n como HTTP y entonces cambiar a WebSocket._NEWLINE_Una vez establecida, las tramas WebSocket de datos pueden empezar a enviarse en ambos sentidos entre el cliente y el servidor en modo full-duplex. Las tramas de texto pueden ser enviadas en modo full-duplex tambi\xc3\xa9n, en ambas direcciones al mismo tiempo. La informaci\xc3\xb3n se segmenta en tramas de \xc3\xbanicamente 2 bytes. Cada trama empieza con un byte 0x00, termina con un byte 0xFF, y contiene datos UTF-8 entre ellos. Tramas de datos binarios no est\xc3\xa1n soportadas todav\xc3\xada en el API. Las tramas WebSocket de texto utilizan un terminador, mientras que las tramas binarias utilizan un prefijo de longitud.\n_START_SECTION_\nPaso a trav\xc3\xa9s de servidores proxy\n_START_PARAGRAPH_\nLa implementaci\xc3\xb3n de cliente del protocolo WebSocket intenta detectar si el agente de usuario est\xc3\xa1 configurado para utilizar un proxy a la hora de conectar a un host y puerto remoto, y si es as\xc3\xad, utiliza el m\xc3\xa9todo HTTP CONNECT para establecer un t\xc3\xbanel persistente._NEWLINE_Aunque el protocolo WebSocket es indiferente a la conexi\xc3\xb3n sobre servidores proxy o cortafuegos, implementa una negociaci\xc3\xb3n compatible con HTTP para que los servidores HTTP puedan compartir sus puertos HTTP y HTTPS por defecto (80 y 443) con una pasarela o servidor WebSocket. El protocolo WebSocket define un prefijo ws:// y wss:// para indicar una conexi\xc3\xb3n WebSocket y Websocket Secure, respectivamente. Ambos esquemas utilizan un mecanismo HTTP upgrade para actualizar al protocolo WebSocket. Algunos servidores proxy no interfieren en la conexi\xc3\xb3n y funcionan perfectamente con WebSocket; otros afectan al correcto funcionamiento de WebSocket, provocando que la conexi\xc3\xb3n falle. En algunos casos puede que se requiera configuraci\xc3\xb3n adicional en el servidor proxy, y algunos servidores proxy puede que necesiten actualizarse para soportar WebSocket._NEWLINE_Si el tr\xc3\xa1fico sin cifrar de WebSocket pasa por un proxy expl\xc3\xadcito o transparente en su camino al servidor WebSocket, entonces, independientemente de que el proxy se comporte como debiera, esta conexi\xc3\xb3n, a d\xc3\xada de hoy, muy probablemente fallar\xc3\xa1 (a medida que WebSocket se extienda, los servidores proxy lo tendr\xc3\xa1n en cuenta). De ah\xc3\xad que las conexiones sin cifrar de WebSocket se deber\xc3\xadan utilizar s\xc3\xb3lo en las topolog\xc3\xadas m\xc3\xa1s sencillas. _NEWLINE_\xe2\x80\x8b_NEWLINE_Si se utiliza una conexi\xc3\xb3n WebSocket cifrada, se necesitar\xc3\xa1 utilizar una capa TLS en la conexi\xc3\xb3n Websocket Secure para asegurar que un comando HTTP CONNECT se manda cuando el navegador est\xc3\xa1 configurado para utilizar un servidor proxy expl\xc3\xadcitamente. Esto establece un t\xc3\xbanel, que proporciona una comunicaci\xc3\xb3n TCP de bajo nivel y punto a punto a trav\xc3\xa9s del proxy HTTP, entre el cliente WebSocket Secure y el servidor Websocket. En el caso de servidores proxy trasparentes, el navegador no ser\xc3\xa1 consciente del uso de un servidor proxy, as\xc3\xad que no mandar\xc3\xa1 una petici\xc3\xb3n HTTP CONNECT. En cualquier caso, como el tr\xc3\xa1fico est\xc3\xa1 cifrado, los servidores proxy trasparentes intermedios podr\xc3\xadan simplemente permitir el tr\xc3\xa1fico cifrado a trav\xc3\xa9s de ellos, de manera que la conexi\xc3\xb3n WebSocket funcionar\xc3\xa1 sin problemas si se utiliza WebSocket Secure. Utilizar cifrado no es gratis en lo que a consumo de recursos se refiere, pero nos asegura la tasa de \xc3\xa9xito m\xc3\xa1s alta._NEWLINE_Desafortunadamente, una actualizaci\xc3\xb3n reciente al borrador (versi\xc3\xb3n 76) rompi\xc3\xb3 completamente la compatibilidad con proxies inversos y pasarelas, ya que los 8 bytes de datos que el cliente debe enviar despu\xc3\xa9s de las cabeceras no se anuncian en una cabecera Content-Length, por lo que los intermediarios no reenv\xc3\xadan los datos hasta que se completa la negociaci\xc3\xb3n. Y como la negociaci\xc3\xb3n necesita de esos 8 bytes para completarse, \xc3\xa9sta nunca se completa y entra en un punto muerto. En el estado actual de las cosas, no es recomendable modificar estos componentes intermediarios para que soporten este comportamiento HTTP no est\xc3\xa1ndar, porque hacerlo llever\xc3\xada a estos componentes a ser vulnerables a ataques HTTP smuggling, ya que un atacante simplemente tendr\xc3\xada que hacer un intento de actualizaci\xc3\xb3n al protocolo WebSocket en una petici\xc3\xb3n para ser capaz de mandar m\xc3\xa1s datos de los que el servidor HTTP de destino pudiera parsear, salt\xc3\xa1ndose as\xc3\xad algunos filtros de seguridad obligatorios. No se sabe si esta problem\xc3\xa1tica se solucionar\xc3\xa1 en un nuevo borrador o no.\xe2\x80\x8b\n_START_SECTION_\nEsquema de URL\n_START_PARAGRAPH_\nLa especificaci\xc3\xb3n del protocolo WebSocket define dos nuevos esquemas de URI, ws: y wss:,\xe2\x80\x8b para conexiones no cifradas y cifradas respectivamente. Adem\xc3\xa1s del nombre del esquema, el resto de componentes del URI se definen con la sintaxis gen\xc3\xa9rica de URI.\xe2\x80\x8b"