Mục từ này đã đạt chất lượng ở mức sản phẩm bước đầu của Đề án Biên soạn Bách khoa toàn thư Việt Nam giai đoạn 1
Websocket

Websocket (tiếng Anh WebSocket) là giao thức giao tiếp hai chiều giữa máy khách và máy chủ để tạo một kết nối trao đổi dữ liệu. WebSocket sử dụng giao thức TCP, do vậy sau khi thiết lập kết nối phía máy chủ có thể chủ động gửi thông tin đến phía máy khách, không cần yêu cầu phát sinh từ phía máy khách trước trong giao thức HTTP. Mặc dù được thiết kế phục vụ cho các ứng dụng web, lập trình viên có thể sử dụng WebSocket trong các loại ứng dụng khác nhau, đặc biệt cho những trường hợp yêu cầu dữ liệu được trao đổi theo thời gian thực.

Cơ chế hoạt động[sửa]

Do WebSocket là giao thức TCP nên cơ chế hoạt động của WebSocket sẽ tuân thủ theo mô hình bắt tay 3 bước như sau:

  • Thiết lập kết nối: để thực hiện kết nối, máy khách phải gửi một yêu cầu kết nối (handshake request) đến phía máy chủ như ví dụ sau:

GET /chat HTTP/1.1

Host: server.example.com

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

Origin: http://example.com

Sec-WebSocket-Protocol: chat, superchat

Sec-WebSocket-Version: 13

Máy chủ sẽ gửi trả lại trả lời kết nối (handshake response) có định dạng như sau:

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Sec-WebSocket-Protocol: chat

Trong đoạn mã ví dụ trên, để xác nhận kết nối, máy khách sẽ gửi một giá trị Sec-WebSocket-Key được mã hóa bằng phương thức Base64đến máy chủ. Sau đó, máy chủ sẽ thực hiện các bước sau:

- Nối thêm một chuỗi cố định nào đó, ví dụ là “258EAFA5-E914-47DA-95CA-C5AB0DC85B11″ vào Sec-WebSocket-Key để được chuỗi mới là “x3JJHMbDL1EzLkh9GBhXDw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11″.

- Thực hiện mã hóa SHA-1 với chuỗi trên để được “1d29ab734b0c9585240069a6e4e3e91b61da1969″.

- Mã hóa kết quả vừa nhận được bằng phương thức Base64 để được “HSmrc0sMlYUkAGmm5OPpG2HaGWk=”.

- Gửi trả lời lại máy khách kèm với giá trị Sec-WebSocket-Accept chính là chuỗi kết quả vừa tạo ra. Phía máy khách sẽ kiểm tra mã trạng thái (status code) phải bằng 101 và Sec-WebSocket-Accept xem có đúng với kết quả mong đợi không và thực hiện kết nối.

Khi cả máy khách và máy chủ đã gửi tin nhắn kết nối và nhận tin nhắn phản hồi, đồng thời kết nối thành công, bước truyền dữ liệu sẽ bắt đầu. Đây chính là kênh liên lạc hai chiều giữa máy khách và máy chủ, mỗi bên có thể độc lập gửi dữ liệu theo chức năng được thiết kế.

  • Truyền dữ liệu: Đảm bảo việc truyền dữ liệu theo đúng giao thức TCP về độ toàn vẹn và thứ tự của dữ liệu (xt. giao thức TCP).
  • Kết thúc kết nối: Để kết thúc kết nối, hai bên sử dụng quá trình bắt tay bốn bước và hai bên kết thúc kết nối hoàn toàn độc lập với nhau. Khi một bên muốn kết thúc, bên đó sẽ gửi đi một gói tin FIN và bên kia gửi lại tin báo nhận ACK. Vì vậy, quá trình kết thúc chuẩn tắc sẽ có hai cặp gói tin trao đổi.

Thuộc tính[sửa]

Chuẩn giao thức của WebSocket là ws:// cho chuẩn thông thường và wss:// cho chuẩn an toàn (tương tự như http:// và https://). Kiểu dữ liệu của thông điệp trong quá trình trao đổi là kiểu chuỗi (string). Websocket cũng hỗ trợ mảng đệm (buffered array) và kiểu dữ liệu nhị phân (blob - binary large object). Hiện nay, không phải tất cả các trình duyệt web đều hỗ trợ WebSocket. Do vậy, trong quá trình thiết lập kết nối giữa máy khách và máy chủ cần phải xác định các ngoại lệ nhằm kiểm tra trình duyệt web có hỗ trợ WebSocket hay không. Các thuộc tính của socket được trình bày trong bảng dưới:

Thuộc tính Mô tả
readyState Thuộc tính chỉ đọc (read only) readyState biểu diễn trạng thái kết nối và nhận các giá trị sau:
  • Giá trị 0 chỉ ra rằng kết nối vẫn chưa được thành lập (WebSocket. CONNECTING)
  • Giá trị 1 chỉ ra rằng kết nối đã thành lập và có thể giao tiếp (WebSocket. OPEN)
  • Giá trị 2 chỉ ra rằng kết nối đang qua handshake đóng (WebSocket. CLOSING)
  • - Giá trị 3 chỉ ra rằng kết nối đã được đóng hoặc không thể được mở (WebSocket. CLOSED)
bufferedAmount Thuộc tính chỉ đọc bufferedAmount biểu diễn số byte với dữ liệu chuỗi dạng UTF-8 khi sử dụng phương thức send () của giao thức WebSocket
Các sự kiện của WebSocket với ngôn ngữ lập trình JavaScript:
Sự kiện Quản lý sự kiện Miêu tả
open onopen Sự kiện xảy ra khi kết nối Socket được thành lập
message onmessage Sự kiện xảy ra khi máy khách nhận dữ liệu từ máy chủ
error onerror Sự kiện xảy ra khi có bất kỳ lỗi nào trong giao tiếp
close onclose Sự kiện xảy ra khi kết nối được đóng
Các phương thức của WebSocket
Phương thức Miêu tả
send () Phương thức send (data) gửi dữ liệu tới máy chủ
close () Phương thức close () kết nối đang tồn tại

Ưu điểm và nhược điểm[sửa]

Ưu điểm[sửa]

WebSocket cho phép có thể truyền dữ liệu liên tục theo nhu cầu, giảm thiểu công sức cho các lập trình viên trong quá trình tạo kết nối khi sử dụng HTTP truyền thống. Dữ liệu được truyền đi thông qua WebSocket dưới dạng thông điệp (message), mỗi tin nhắn bao gồm một hoặc nhiều khung (frame) chứa dữ liệu gửi đi (gọi là kiện hàng - payload). Để đảm bảo tin nhắn có thể tái cấu trúc một cách chính xác khi nó đến với máy khách, mỗi khung được gán cứng từ 4-12 byte thông tin về thông điệp. Sử dụng hệ thống thông tin dựa trên khung giúp giảm tải khối lượng dữ liệu dư thừa (non-payload data) phải truyền đi, có thể làm cho độ trễ giảm đi đáng kể. Các ưu điểm của WebSocket trong việc kết nối giữa máy khách và máy chủ, bao gồm:

  • Tăng tốc độ truyền tải thông tin giữa 2 chiều, cho phép gửi nhận dữ liệu theo giời gian thực, dữ liệu theo dòng;
  • Dễ phát hiện và xử lý trong trường hợp có lỗi xảy ra;
  • Dễ dàng sử dụng, không cần cài đặt thêm các phần mềm bổ sung khác trong quá trình xây dựng giao tiếp giữa các thành phần;

Nhược điểm[sửa]

Tuy nhiên, WebSocketcũng có nhược điểm chưa được tất cả các trình duyệt hỗ trợ. Mặt khác, nếu kết nối websocket bị ngắt đột xuất thì sẽ không tự kết nối và truyền tin lại được. Để đảm bảo WebSocket hoạt động trong điều kiện này, các lập trình viên bắt buộc phải viết thêm mã ngoại lệ tại máy khách hoặc máy chủ.

WebSocket được sử dụng phổ biến trong các chức năng chat trên các ứng dụng Internet. Bên cạnh đó, WebSocket được hỗ trợ bởi rất nhiều các ngôn ngữ lập trình như Java, Python, PHP, … Do vậy, sự phổ biến của công nghệ này không giới hạn theo quốc gia.

Tài liệu tham khảo[sửa]

  1. The WebSocket Protocol https: //tools. ietf. org/html/rfc6455
  2. Fette, Ian, and Alexey Melnikov. “The websocket protocol. “ (2011).
  3. Lombardi, Andrew. WebSocket: lightweight client-server communications. “ O'Reilly Media, Inc. “, 2015.