HTTP is stateless. WebSockets are stateful. How does the handshake work?
The Upgrade
It starts as a normal HTTP GET request.
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
If the server agrees, it responds:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Now, the TCP connection stays open. You don't send headers anymore. You send frames of binary data.
Heartbeats
Since the connection stays open, how do you know if the user is still there?
Ping/Pong frames. The server sends a Ping. The client MUST send a Pong. If not, the connection is dead.
Conclusion
Real-time is not magic. It's just a raw TCP pipe that started life as an HTTP request.