¿Qué es un WebSocket?

Al usar HTTP, el cliente debe hacer una petición antes de que el servidor pueda mandar cualquier información. Esto complica la implementación de algunas funcionalidades que requieren comunicación bidireccional. Por ejemplo, supón que estás implementando una aplicación web que necesita mandar notificaciones en tiempo real al usuario. Como el servidor no puede pushear información al usuario a su voluntad, el cliente tendría que preguntar al servidor constantemente por notificaciones, requiriendo muchas peticiones gastadas.

El protocolo WebSocket permite la creación de canales de comunicación bidireccionales entre el navegador y el servidor estableciendo una conexión duradera que puede ser usada para comunicaciones full-duplex.


Elevando Comunicaciones HTTP a WebSockets

El protocolo WebSocket fue diseñado para ser totalmente compatible con HTTP. Establecer una conexión WebSocket sigue un proceso similar al de h2c. El cliente manda una petición HTTP inicial con el header Upgrade: websocket y otros headers adicionales. Si el servidor soporta WebSockets, responde con un 101 Switching Protocols y mejora la conexión acorde a ello. Desde ese punto en adelante, la conexión usa el protocolo WebSocket en lugar de HTTP.

WebSockets

Si ahora añadimos un proxy en medio, algo interesante ocurre: En lugar de dirigir las conexiones ellos mismos, la mayoría de proxies delegarán el upgrade al backend. Una vez que la conexión sea mejorada, el proxy establecerá un túnel entre el cliente y el servidor, por lo que cualquier tráfico WebSocket será redirigido sin interrupciones.

WebSockets

El problema que enfrentamos ahora es que el túnel ahora usa el protocolo WebSocket en lugar de HTTP. Si intentamos contrabandear una petición HTTP usando este túnel, el backend la rechazará ya que ahora espera una petición WebSocket.