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

C++ là gì? Hướng dẫn toàn diện cho người mới bắt đầu

C++ là gì? Đây là ngôn ngữ lập trình bậc cao ra đời năm 1985 do Bjarne Stroustrup tạo ra, được xem là bản nâng cấp của ngôn ngữ C…

Xem thêm

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

GraphQL là gì và tại sao nó đang trở thành lựa chọn thay thế REST API trong nhiều dự án web lớn? GraphQL là ngôn ngữ truy vấn và runtime…

Xem thêm

Kotlin là gì? Ngôn ngữ lập trình Android hiện đại

Kotlin là ngôn ngữ lập trình được JetBrains phát triển từ năm 2010, và hiện là ngôn ngữ chính thức cho phát triển ứng dụng Android. Với cú pháp gọn…

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