
WebSocket là giao thức truyền thông cho phép trao đổi dữ liệu hai chiều giữa trình duyệt và máy chủ thông qua một kết nối TCP duy nhất. Khác với HTTP truyền thống phải gửi yêu cầu liên tục để nhận dữ liệu mới, WebSocket duy trì kết nối mở để cả hai phía gửi tin nhắn bất cứ lúc nào. Đây là nền tảng của các ứng dụng thời gian thực như chat, trading, game nhiều người và dashboard trực tuyến.

WebSocket hoạt động như thế nào?
WebSocket bắt đầu bằng một bắt tay HTTP sử dụng header Upgrade để chuyển đổi giao thức từ HTTP sang WebSocket. Sau khi bắt tay thành công, kết nối TCP được giữ mở và hai phía trao đổi dữ liệu dưới dạng frame — không cần header HTTP cho mỗi tin nhắn. Hai scheme URI được hỗ trợ: ws:// (không mã hóa) và wss:// (TLS mã hóa), chạy trên cổng 80 hoặc 443.
Ưu điểm chính của WebSocket là độ trễ thấp và hiệu quả băng thông. Mỗi frame WebSocket chỉ có 2-14 byte header, so với hàng trăm byte header HTTP cho mỗi yêu cầu. Điều này đặc biệt quan trọng với các ứng dụng cần cập nhật liên tục như sàn giao dịch chứng khoán hay cryptocurrency.
So sánh WebSocket với HTTP Polling và SSE
| Tính năng | HTTP Polling | SSE | WebSocket |
|---|---|---|---|
| Hướng truyền | Client gửi, server phản hồi | Server đẩy một chiều | Hai chiều |
| Độ trễ | Cao (yêu cầu lặp) | Thấp (kết nối mở) | Thấp nhất (frame thô) |
| Server Push | Không | Có (chỉ text) | Có (binary + text) |
| Tự kết nối lại | Không | Có (EventSource) | Tự triển khai |
| Hỗ trợ trình duyệt | Tất cả | Tất cả | Tất cả trình duyệt hiện đại |
SSE (Server-Sent Events) sử dụng API EventSource — server đẩy sự kiện text qua HTTP nhưng chỉ một chiều (server đến client). SSE đơn giản hơn và hoạt động tốt qua proxy firewall. WebSocket phù hợp khi cần client gửi tin nhắn đến server theo thời gian thực như chat room hay hệ thống đặt lệnh.
Ứng dụng thực tế của WebSocket
WebSocket được sử dụng rộng rãi trong nhiều loại ứng dụng yêu cầu cập nhật thời gian thực:
- Ứng dụng chat: WhatsApp Web, Slack, Discord — trao đổi tin nhắn tức thì giữa người dùng với độ trễ cực thấp
- Dashboard trực tuyến: Grafana, Datadog — hiển thị metrics và logs theo thời gian thực không cần reload trang
- Game nhiều người: Đồng bộ trạng thái người chơi tức thì trong game browser-based
- Nền tảng giao dịch: Sàn chứng khoán, crypto — cập nhật giá dưới 1 giây
- Chỉnh sửa tài liệu đồng thời: Google Docs — nhiều người chỉnh sửa cùng lúc
- Tỷ số thể thao trực tiếp: Push cập nhật hàng nghìn client cùng lúc
Ví dụ mã nguồn WebSocket
Client JavaScript (trình duyệt)
const socket = new WebSocket('wss://example.com/socket');
socket.onopen = () => {
socket.send(JSON.stringify({ type: 'join', room: 'general' }));
};
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Nhan duoc:', data);
};
socket.onclose = (event) => {
console.log('Ket noi dong:', event.code, event.reason);
};
Server Node.js (thư viện ws)
const { WebSocketServer } = require('ws');
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', (ws, req) => {
const ip = req.socket.remoteAddress;
console.log('Client ket noi tu', ip);
ws.on('message', (data) => {
const msg = JSON.parse(data);
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify({ from: ip, message: msg }));
}
});
});
ws.on('close', () => console.log('Client ngat ket noi'));
});
Thư viện WebSocket phổ biến
- ws: Thư viện nhẹ, hiệu quả cho Node.js. Zero dependency, là lựa chọn mặc định cho server Node.js
- Socket.IO: Thư viện sự kiện với tự động chuyển đổi (WebSocket sang long-polling sang WebTransport). Hỗ trợ đa ngôn ngữ
- uWebSockets.js: Hiệu suất cao, backend C++. Được sử dụng bởi Discord, Shopify
- Socketioxide: Triển khai Socket.IO bằng Rust cho hiệu suất tối ưu
Bảo mật WebSocket
WebSocket không có cơ chế xác thực tích hợp. Sau khi bắt tay upgrade, cookies và header xác thực không được gửi tự động. Cần truyền token xác thực trong quá trình bắt tay hoặc trong tin nhắn đầu tiên.
Luôn sử dụng wss:// (TLS) trong môi trường production — kết nối ws:// không mã hóa cho phép nghe lén và giả mạo dữ liệu. Kiểm tra header Origin trên mỗi kết nối đến để phòng chống tấn công Cross-Site WebSocket Hijacking.
Các mối đe dọa bảo mật chính theo OWASP bao gồm: thiếu xác thực Origin, tấn công DoS qua kết nối tồn tại lâu, và tải file nén có thể gây lỗ hổng CRIME/BREACH. Triển khai giới hạn kết nối theo IP và timeout để tránh cạn kiệt tài nguyên server.
Khi nào nên dùng WebSocket thay HTTP?
Sử dụng WebSocket khi cần truyền dữ liệu hai chiều thời gian thực với độ trễ thấp — chat, game, trading, làm việc nhóm trực tuyến. HTTP Polling vẫn phù hợp cho các ứng dụng không cần cập nhật tức thì hoặc yêu cầu đơn giản hơn. SSE là giải pháp tốt khi chỉ cần server đẩy dữ liệu đến client.
HTTP/3 (QUIC) cải thiện hiệu năng transport nhưng không thay thế WebSocket cho giao tiếp hai chiều. API WebTransport được kỳ vọng là người kế thừa WebSocket trong tương lai, hỗ trợ multiplexing tốt hơn và độ trễ thấp hơn.
Tham khảo thêm
WebSocket API trên MDN Web Docs.
