A WebSocket connection is initiated by sending a WebSocket handshake request from a browser’s HTTP connection to a server to upgrade the connection. Along with the upgrade request header, the handshake request includes a 64-bit Sec-WebSocket-Key header. The server responds with a hash of the key in a Sec-Websocket-Auth header. This header exchange prevents a caching proxy from resending previous WebSocket exchanges.
From that point, the connection is binary and does not conform to HTTP protocol. A server application is aware of all WebSocket connections and can communicate with each one individually. As WebSocket remains open, either the server or the user can send messages at any time until one of them closes the session. The communication can be initiated at either end, which makes event-driven web programming possible. In contrast, standard HTTP allows only users to request new data.
WebSocket was first seen in HTML5 specifications as TCPConnection, a place holder for a TCP-based socket API. The protocol was developed by Ian Hickson and Michael Carter and standardized by the IETF in RFC 6455 in 2011. WebSocket is supported by almost all major web browsers including Firefox, Chrome, Opera, Edge and Internet Explorer.