
WebSocket là gì là câu hỏi cơ bản mà bất kỳ lập trình viên web nào cũng cần nắm rõ. WebSocket là giao thức truyền dữ liệu hai chiều theo thời gian thực, cho phép server và client giao tiếp liên tục qua một kết nối TCP duy nhất. Khác với HTTP thông thường chỉ gửi request rồi nhận response một lần, WebSocket giữ kết nối mở để hai bên đẩy dữ liệu cho nhau bất cứ lúc nào.

WebSocket hoạt động như thế nào?
WebSocket bắt đầu bằng một HTTP request thông thường với header Upgrade: websocket để thực hiện bắt tay (handshake). Sau khi server đồng ý với response HTTP 101, kết nối được nâng cấp thành cấu hình full-duplex, cho phép cả hai bên gửi tin nhắn qua lại mà không cần tạo kết nối mới cho mỗi lần trao đổi.
Theo chuẩn WHATWG, giao thức này được thiết kế cho các ứng dụng cần giao tiếp theo thời gian thực, giảm overhead so với việc polling HTTP nhiều lần.
Lợi ích so với HTTP polling
| Tiêu chí | HTTP Polling | WebSocket |
|---|---|---|
| Độ trễ | Cao, phụ thuộc tần suất poll | Thấp, tin nhắn đẩy tức thì |
| Băng thông | Lãng phí qua header HTTP | Tiết kiệm, chỉ dữ liệu |
| Server push | Phải poll thì mới có | Server tự đẩy dữ liệu |
| Kết nối | Mở/đóng liên tục | Giữ kết nối lâu dài |
Đây chính là lý do WebSocket phù hợp với ứng dụng chat, game online, bảng giá chứng khoán và hệ thống thông báo thời gian thực.
Cách dùng WebSocket trong JavaScript
Sử dụng WebSocket API chuẩn của trình duyệt rất đơn giản, được mô tả đầy đủ trong tài liệu MDN:
Đầu tiên tạo một kết nối:
const ws = new WebSocket('wss://example.com/socket');
Lắng nghe sự kiện khi server đẩy dữ liệu đến:
ws.onmessage = (event) => { console.log(event.data); };
Gửi dữ liệu tới server:
ws.send(JSON.stringify({ type: 'message', data: 'Xin chào' }));
Đóng kết nối khi không cần:
ws.close();
WebSocket với Python (websockets)
Ở phía server, Python cung cấp thư viện websockets để triển khai server Echo đơn giản:
import asyncio; from websockets import serve
async def handle(websocket): async for message in websocket: await websocket.send(message)
async def main(): async with serve(handle, "localhost", 8765): await asyncio.Future()
asyncio.run(main())
Chạy script trên và bạn đã có một WebSocket server cơ bản nhận đổi dữ liệu.
Các thư viện và framework phổ biến
- Socket.IO: Thư viện JavaScript phổ biến nhất, kèm fallback sang HTTP khi trình duyệt không hỗ trợ WebSocket
- ws: Thư viện Node.js nhẹ, hiệu suất cao cho WebSocket thuần
- WebSocket API: Tiêu chuẩn trình duyệt tích hợp sẵn
- FastAPI / Flask-SocketIO: Hỗ trợ WebSocket trong backend Python
Khi nào nên dùng WebSocket?
Nên chọn WebSocket khi:
- Ứng dụng cần cập nhật thời gian thực liên tục
- Cần server chủ động đẩy dữ liệu đến client
- Chi phí băng thông là mối quan tâm chính
- Số lượng kết nối đồng thời cao nhưng mỗi kết nối ít tin nhắn
Nên tránh khi chỉ cần thao tác request-response đơn giản, sử dụng REST API sẽ đơn giản và an toàn hơn nhiều.
Server-Sent Events: Giải pháp thay thế
Nếu bạn chỉ cần server gửi dữ liệu đến client (one-way communication) mà không cần client đẩy lại, Server-Sent Events (SSE) đơn giản hơn WebSocket nhiều. SSE dùng HTTP thông thường, dễ cài đặt hơn, và có khả năng tự reconnect khi mất kết nối. Tuy nhiên, SSE không phù hợp với các trường hợp cần hai chiều dữ liệu liên tục như chat hay multiplayer game.
Hiệu năng và scalability
WebSocket tiết kiệm băng thông đáng kể so với HTTP long-polling, nhưng mỗi kết nối WebSocket giữ một TCP socket mở trên server. Với số lượng kết nối đồng thời lớn (hàng nghìn trở lên), bạn cần cân nhắc kiến trúc server phù hợp. Socket.IO hỗ trợ scaling theo chiều ngang với Redis adapter, trong khi giải pháp thuần WebSocket cần load balancer hỗ trợ sticky session.
Một vấn đề phổ biến là WebSocket không thể cache được như HTTP request thông thường. Điều này có nghĩa mọi dữ liệu phải được xử lý real-time hoặc kết hợp caching ở layer application thay vì CDN.
Bảo mật WebSocket
Luôn dùng giao thức mã hóa wss:// thay vì ws:// khi kết nối qua internet để chống nghe lén dữ liệu. Validate dữ liệu trên server và áp dụng rate-limiting để chống tấn công flood. Kiểm tra header Origin để tránh CSRF qua WebSocket, và sử dụng token xác thực (JWT) trong quá trình bắt tay hoặc trong mỗi tin nhắn.
Kết luận
WebSocket là công cụ mạnh mẽ cho ứng dụng thời gian thực. Kết hợp với các framework hiện đại, nó trở thành tiêu chuẩn cho chat, game, dashboard và ứng dụng cần giao tiếp liên tục. Hiểu rõ khi nào nên và không nên WebSocket giúp bạn thiết kế hệ thống hiệu quả hơn nhiều.
