WebSocket là gì? Hướng dẫn toàn diện cho lập trình viên

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

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.

WebSocket Security Cheat Sheet từ OWASP.

Socket.IO Documentation — Thư viện WebSocket phổ biến.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Sơ đồ workflow migrate và sqlc trong CI/CD pipeline

Database migration an toàn với Golang golang-migrate sqlc Atlas so sánh

Tại sao cần database migration tool trong Golang Khi xây dựng ứng dụng production với Golang, việc quản lý thay đổi schema database là bài toán bắt buộc. Ba công…

Xem thêm

TypeScript 5.5: type inference cải tiến, decorators chuẩn hóa, isolated declarations

Giới thiệu TypeScript 5.5 mang đến những cải tiến đáng kể cho hệ thống kiểu dữ liệu, khiến mã nguồn an toàn hơn và dễ bảo trì hơn. Bài viết…

Xem thêm

So sánh các web framework Python phổ biến

Giới thiệu So sánh các web framework Python phổ biến là một trong những chủ đề nóng nhất trong thời gian qua. Bài viết này sẽ cung cấp một cái…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất