HTTP là request–response: client hỏi, server mới được trả lời. WebSocket là full-duplex, một kết nối giữ mở: hai bên gửi bất cứ lúc nào.
Bắt tay khởi đầu vẫn đi bằng HTTP rồi nâng cấp giao thức:
http
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
HTTP/1.1 101 Switching Protocolsjs
const ws = new WebSocket('wss://example.com/chat')
ws.onopen = () => ws.send(JSON.stringify({ type: 'join', room: 42 }))
ws.onmessage = (e) => render(JSON.parse(e.data))
ws.onclose = () => setTimeout(reconnect, 1000) // backoff, đừng reconnect ngay| HTTP polling | SSE | WebSocket | |
|---|---|---|---|
| Chiều | client hỏi | server → client | hai chiều |
| Overhead header mỗi tin | có | không | không |
| Tự reconnect | — | có sẵn | tự làm |
Khi nào chọn: chat, cộng tác thời gian thực, game, giá cổ phiếu → WebSocket. Chỉ cần server đẩy một chiều (thông báo, log stream) → SSE đơn giản hơn nhiều, đi qua HTTP/2 và tự reconnect.
Lưu ý: WebSocket không tự lấy lại kết nối khi mạng rớt, và không đi qua được một số proxy doanh nghiệp. Luôn viết logic reconnect kèm backoff.