WebSocket: nó là gì, giao thức truyền thông song công và cách hoạt động

Tác giả: IT Sectr Đã đăng: 2026-03-06 Thời gian đọc: 8 phút

WebSocket là giao thức truyền thông song công thiết lập kết nối liên tục giữa máy khách và máy chủ để trao đổi dữ liệu thời gian thực. Không giống như các yêu cầu HTTP truyền thống, giao thức này thiết lập một kết nối duy nhất và sử dụng nó để truyền hai chiều mà không cần bắt tay lặp lại. Theo Mozilla Developer Network (2025), WebSocket giảm độ trễ tới 50% so với HTTP polling trong các ứng dụng thời gian thực.

Những điểm chính

  • WebSocket là giao thức song công trên TCP để trao đổi dữ liệu thời gian thực
  • Kết nối liên tục loại bỏ chi phí bắt tay HTTP lặp lại với mỗi yêu cầu
  • Độ trễ giảm 30-50% so với HTTP Long Polling nhờ không có tiêu đề
  • Giao thức được hỗ trợ bởi tất cả trình duyệt hiện đại và nền tảng di động qua API gốc
  • Ứng dụng bao gồm chat, trò chơi trực tuyến, thiết bị đầu cuối giao dịch và thiết bị IoT

WebSocket là gì?

WebSocket là giao thức truyền thông hoạt động trên TCP và cung cấp kênh song công giữa máy khách và máy chủ. Nó được IETF chuẩn hóa thành RFC 6455 vào năm 2011 và được hỗ trợ bởi tất cả trình duyệt hiện đại, nền tảng di động và framework máy chủ.

Không giống như HTTP, nơi máy khách khởi tạo yêu cầu và nhận phản hồi, WebSocket cho phép cả hai bên gửi tin nhắn bất kỳ lúc nào sau khi thiết lập kết nối. Điều này làm cho nó trở nên lý tưởng cho các tình huống yêu cầu phân phối tức thời dữ liệu: chat, thông báo, chỉnh sửa tài liệu cộng tác.

Giao thức WebSocket sử dụng cổng HTTP 80 hoặc cổng HTTPS 443 cho bắt tay ban đầu, sau đó chuyển sang giao thức riêng với tiêu đề tối thiểu — chỉ 2 byte thay vì 800+ byte trong HTTP. Tính năng này mang lại lợi thế hiệu suất đáng kể với số lượng lớn tin nhắn.

Các đặc điểm chính của giao thức

Kết nối WebSocket bắt đầu bằng yêu cầu nâng cấp HTTP (Upgrade), sau đó giao thức chuyển sang định dạng khung nhị phân. Kích thước khung dao động từ 2 byte đến 2^63 byte, cho phép truyền cả tin nhắn văn bản ngắn và dữ liệu nhị phân lớn. Giao thức hỗ trợ phân mảnh tin nhắn, che dữ liệu từ máy khách đến máy chủ và ping/pong để duy trì kết nối.

WebSocket hoạt động như thế nào?

Quá trình thiết lập kết nối WebSocket gồm hai giai đoạn: bắt tay và truyền dữ liệu. Trong giai đoạn bắt tay, máy khách gửi yêu cầu HTTP với tiêu đề Upgrade: websocket và máy chủ xác nhận chuyển đổi giao thức với trạng thái 101 Switching Protocols. Sau đó, kết nối chuyển sang chế độ truyền song công.

Mỗi tin nhắn trong WebSocket được chia thành các khung. Một khung chứa opcode (văn bản, dữ liệu nhị phân, đóng, ping/pong), độ dài tải trọng và khóa che dữ liệu từ máy khách. Các khung có thể được phân mảnh — khung điều khiển (ping/pong) có thể được truyền giữa các mảnh tin nhắn, ngăn chặn thời gian chờ kết nối khi truyền dài.

js
const ws = new WebSocket('wss://example.com/chat')

ws.addEventListener('open', () => {
    console.log('Kết nối đã được thiết lập')
    ws.send('Xin chào, máy chủ!')
})

ws.addEventListener('message', (event) => {
    console.log('Đã nhận:', event.data)
})

ws.addEventListener('close', () => {
    console.log('Kết nối đã đóng')
})

Trong ví dụ trên, máy khách tạo đối tượng WebSocket chỉ định URL bảo mật wss://. Sau khi kết nối mở, một tin nhắn chào mừng được gửi và trình xử lý tin nhắn nhận phản hồi từ máy chủ. Khi đóng, trình xử lý đóng được kích hoạt — điều này quan trọng để kết nối lại trong trường hợp gián đoạn mạng.

WebSocket vs HTTP: so sánh

Sự khác biệt chính giữa WebSocket và HTTP nằm ở mô hình tương tác. HTTP hoạt động theo sơ đồ yêu cầu-phản hồi: máy khách khởi tạo yêu cầu, máy chủ trả về phản hồi và kết nối bị đóng. WebSocket, mặt khác, thiết lập một kênh liên tục qua đó cả hai bên có thể bắt đầu truyền bất kỳ lúc nào.

Đối với các ứng dụng yêu cầu độ trễ thấp và luồng dữ liệu liên tục, WebSocket hiệu quả hơn đáng kể. HTTP Long Polling — một giải pháp thay thế nơi máy chủ giữ yêu cầu mở cho đến khi có dữ liệu — tạo ra tải quá mức trên máy chủ và tăng mức tiêu thụ bộ nhớ do nhiều kết nối đồng thời.

Tham sốWebSocketHTTP
Mô hìnhSong côngYêu cầu-phản hồi
Tiêu đề2-14 byte400-800 byte
Kết nối liên tụcCó, một kết nốiKhông, mới mỗi yêu cầu
Độ trễThấp (1-5 ms)Cao (50-200 ms)
Giao thứcws:// hoặc wss://http:// hoặc https://

Theo High Performance Browser Networking (Grigorik, O'Reilly), WebSocket giảm độ trễ mạng trong các tình huống thời gian thực 40-60% so với HTTP Long Polling, trong khi tải máy chủ giảm 3-5 lần nhờ loại bỏ bắt tay lặp lại.

WebSocket được sử dụng ở đâu?

Nhờ độ trễ thấp và truyền thông hai chiều, WebSocket được sử dụng trong nhiều ứng dụng. Các tình huống chính bao gồm nhắn tin tức thời, đồng bộ hóa trạng thái trong trò chơi và truyền dữ liệu thị trường trong hệ thống tài chính.

Chat và trình nhắn tin

WebSocket đã trở thành tiêu chuẩn thực tế cho các ứng dụng chat. Các nền tảng như Slack, Telegram Web và WhatsApp Web sử dụng WebSocket để phân phối tin nhắn tức thời. Giao thức cho phép gửi cả tin nhắn văn bản và tệp qua một kênh duy nhất, trong khi cơ chế ping/pong giữ kết nối hoạt động ngay cả khi không có hoạt động.

Trò chơi trực tuyến

Trò chơi nhiều người chơi trên trình duyệt và di động yêu cầu độ trễ tối thiểu để đồng bộ hóa trạng thái người chơi. WebSocket truyền tọa độ, hành động và sự kiện trong thời gian thực mà không bị chậm trễ của yêu cầu HTTP. Các framework như Socket.IO và Colyseus trừu tượng hóa các thao tác giao thức cấp thấp, thêm kết nối lại tự động và phòng.

Ứng dụng tài chính

Thiết bị đầu cuối giao dịch và nền tảng giao dịch sử dụng WebSocket để nhận giá thị trường thời gian thực. Sự chậm trễ vài mili giây có thể tiêu tốn hàng triệu đô la, vì vậy các API tài chính — như Binance WebSocket Streams, Coinbase Pro — cung cấp giao diện WebSocket cho dữ liệu thị trường.

Ứng dụng di động và IoT

Trong phát triển di động, WebSocket được sử dụng qua API gốc: URLSessionWebSocketTask trên iOS và OkHttp WebSocket trên Android. Cho Flutter, có thư viện web_socket_channel, và cho React Native — react-native-websocket. Thiết bị IoT sử dụng WebSocket để truyền dữ liệu từ xa và nhận lệnh điều khiển, vì giao thức tiêu thụ ít năng lượng hơn so với HTTP polling liên tục.

Ví dụ mã WebSocket

Hãy xem xét ví dụ phía máy chủ sử dụng Node.js với thư viện ws — triển khai WebSocket phổ biến nhất cho JavaScript. Máy chủ chấp nhận kết nối, xử lý tin nhắn và phát sóng chúng đến tất cả máy khách đã kết nối.

js
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })

wss.on('connection', (ws) => {
    console.log('Máy khách mới đã kết nối')

    ws.on('message', (data) => {
        console.log('Đã nhận:', data.toString())
        ws.send('Máy chủ đã nhận tin nhắn của bạn')
    })

    ws.on('close', () => {
        console.log('Máy khách đã ngắt kết nối')
    })
})

console.log('Máy chủ WebSocket đã khởi động trên cổng 8080')

Máy chủ tạo một phiên bản WebSocket.Server trên cổng 8080 và chờ kết nối. Mỗi máy khách mới được gán một đối tượng ws riêng qua đó máy chủ có thể gửi tin nhắn riêng lẻ. Phát sóng tin nhắn đến tất cả máy khách được thực hiện bằng cách lặp qua mảng kết nối. Với số lượng lớn máy khách (hơn 1000), nên sử dụng thư viện hỗ trợ phân cụm như Socket.IO, thêm khả năng mở rộng dựa trên Redis và kết nối lại tự động.

Gửi tin nhắn đến tất cả máy khách

js
wss.clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
        client.send('Tin nhắn cho tất cả người tham gia')
    }
})

Kiểm tra readyState trước khi gửi là bắt buộc: nếu máy khách đã ngắt kết nối, gọi send sẽ gây ra lỗi. Cờ WebSocket.OPEN đảm bảo kết nối đang hoạt động và tin nhắn sẽ được gửi.

Đối với ứng dụng di động iOS, WebSocket được triển khai qua URLSessionWebSocketTask, có sẵn từ iOS 13. Phiên tạo một tác vụ với URL giao thức wss://, sau đó các phương thức send và receive được gọi. Việc nhận tin nhắn có thể được tổ chức qua đệ quy receive liên tục, chờ tin nhắn tiếp theo sau khi xử lý tin nhắn trước đó, đảm bảo nhận dữ liệu liên tục mà không cần kết nối lại. Cho Android, OkHttp WebSocket được sử dụng, cung cấp giao diện tương tự với callback onOpen, onMessage, onClosing và onClosed, cũng như kết nối lại tự động khi mất kết nối.

Khi làm việc với WebSocket trong ứng dụng di động, cần xem xét quản lý vòng đời: khi ứng dụng chuyển vào nền, hệ thống có thể đóng kết nối. Trên iOS, kết nối phải được thiết lập lại khi quay lại tiền cảnh qua delegate sceneDidBecomeActive. Trên Android, nên sử dụng thành phần Lifecycle-aware hoặc Service để duy trì kết nối. Ngoài ra, nên triển khai backoff theo cấp số nhân cho việc kết nối lại — tăng khoảng cách giữa các lần thử từ 1 đến 30 giây — để tránh tạo tải quá mức lên máy chủ khi gặp sự cố mạng tạm thời.

Câu hỏi thường gặp

WebSocket khác HTTP như thế nào?

WebSocket thiết lập kết nối song công liên tục nơi cả hai bên có thể gửi dữ liệu bất kỳ lúc nào. HTTP hoạt động theo sơ đồ yêu cầu-phản hồi nơi mỗi trao đổi yêu cầu kết nối mới và tiêu đề đầy đủ. WebSocket sử dụng một kênh TCP duy nhất và tiêu đề chỉ 2-14 byte, giảm đáng kể độ trễ.

WebSocket sử dụng cổng nào?

WebSocket sử dụng cổng 80 cho kết nối không bảo mật (ws://) và cổng 443 cho kết nối bảo mật (wss://). Điều này cho phép nó vượt qua hầu hết máy chủ proxy và tường lửa doanh nghiệp mà không cần cấu hình thêm. Cổng 443 được khuyến nghị cho môi trường sản xuất do mã hóa TLS.

WebSocket có được hỗ trợ trong ứng dụng di động không?

Có, WebSocket được hỗ trợ trên tất cả nền tảng di động. Trên iOS, lớp URLSessionWebSocketTask gốc có sẵn từ iOS 13. Trên Android — lớp OkHttp WebSocket và java.net.WebSocket tiêu chuẩn. Cho React Native, có thư viện react-native-websocket.

WebSocket Secure (wss://) là gì?

WebSocket Secure là phiên bản bảo mật của giao thức hoạt động trên TLS. Tất cả dữ liệu được mã hóa giống như trong HTTPS. WSS là bắt buộc cho ứng dụng sản xuất, đặc biệt khi truyền mã thông báo xác thực hoặc dữ liệu cá nhân qua WebSocket.

Có những lựa chọn thay thế nào cho WebSocket?

Các lựa chọn thay thế chính: HTTP Long Polling (máy chủ giữ yêu cầu mở), Server-Sent Events (luồng một chiều từ máy chủ) và WebRTC Data Channel (giao tiếp ngang hàng). Server-Sent Events đơn giản hơn để triển khai nhưng không hỗ trợ gửi từ máy khách đến máy chủ.

Tổng kết

  • WebSocket là giao thức thời gian thực song công hoạt động trên TCP, được chuẩn hóa thành RFC 6455
  • Kết nối liên tục loại bỏ chi phí bắt tay HTTP, giảm độ trễ xuống 1-5 ms
  • Tiêu đề khung chỉ 2-14 byte so với 400-800 byte trong HTTP
  • Được sử dụng trong chat, trò chơi trực tuyến, thiết bị đầu cuối giao dịch, IoT và chỉnh sửa cộng tác
  • WSS cung cấp mã hóa TLS và được khuyến nghị cho môi trường sản xuất
  • Giao thức được hỗ trợ bởi tất cả trình duyệt, nền tảng di động và ngôn ngữ máy chủ
  • Sử dụng WebSocket cho chức năng thời gian thực và HTTP cho yêu cầu REST tiêu chuẩn

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm