WebSocket là gì? Cách tạo WebSocket – Knowledge Base Linux

WebSocket là gì?

WebSocket là một giao thức tiếp xúc máy tính, tương hỗ những channel tiếp xúc full-duplex ( song công toàn phần ) qua một liên kết TCP. Giao thức WebSocket được IETF chuẩn hóa RFC 6455 vào năm 2011. Hiện nay, API WebSocket trong Web IDL cũng đang được chuẩn hóa bởi W3C .

Về thực chất, WebSocket khác với HTTP, mặc dầu cả giao thức đều ở trên layer 7 của quy mô OSI, và cùng nhờ vào vào TCP ở layer 4. Tuy nhiên, RFC 6455 cho biết WebSocket “ được phong cách thiết kế để hoạt động giải trí trên những cổng HTTP 443 và 80, cũng như để tương hỗ proxy HTTP và làm trung gian ”. Do đó, WebSocket trọn vẹn có năng lực thích hợp với giao thức HTTP. Để có được sự thích hợp này, WebSocket handshake sẽ sử dụng một header HTTP Upgrade để đổi khác giao thức HTTP thành WebSocket .

Giao thức WebSocket tương hỗ tương tác giữa một trình duyệt web ( hay ứng dụng client ) với một web server, nhưng ngân sách sẽ thấp hơn so với những lựa chọn half-duplex khác như HTTP polling. Do đó, việc truyền tài liệu theo thời hạn thực với server sẽ trở nên hiệu suất cao hơn .

Vậy cách hỗ trợ tương tác trên của WebSocket là gì? WebSocket sẽ cung cấp một cách được tiêu chuẩn để server có thể gửi content đến client mà không cần được request bởi client. Đồng thời cho phép các thông báo được truyền qua lại trong khi vẫn giữ cho kết nối được mở. Từ đó tạo nên một giao tiếp hai chiều giữa client và server.

Các tiếp xúc này thường được giải quyết và xử lý qua port TCP 443 ( hoặc port 80 với những liên kết không được bảo mật thông tin ). Do đó, những môi trường tự nhiên hoàn toàn có thể thuận tiện chặn những liên kết non-web bằng firewall. Bên cạnh đó, những tiếp xúc browser-server không tiêu chuẩn cũng hoàn toàn có thể được thiết lập bằng những công nghệ tiên tiến stopgap như Comet .
Hầu hết những trình duyệt lúc bấy giờ đều tương hỗ giao thức WebSocket. Trong đó có cả Google Chrome, Firefox, Microsoft Edge, Internet Explorer, Safari và Opera .

Thiết lập kết nối WebSocket

Vậy cách để thiết lập kết nối WebSocket là gì? Trước hết, WebSocket Open Handshake không sử dụng lược đồ http:// hay https://, vì chúng không tuân theo giao thức HTTP. Thay vào đó, URI WebSocket sẽ sử dụng giao thức ws: (hay wss: với WebSocket bảo mật). Phần còn lại của URI sẽ tương tự với HTTP URI: gồm host, port, path và bất kỳ tham số truy vấn nào.

"ws:" "//" host [ ":" port ] path [ "?" query ]

BashCopy

"wss:" "//" host [ ":" port ] path [ "?" query ]

BashCopy

Các kết nối WebSocket chỉ có thể được thiết lập cho những URI tuân theo lược đồ này. Do đó, khi thấy một URI với lược đồ ws:// (hoặc wss://), cả client lẫn server đều phải tuân theo giao thức WebSocket.

Kết nối WebSocket được thiết lập bằng cách upgrading một cặp HTTP request / repsonse. Nếu một client có tương hỗ WebSocket muốn thiết lập một liên kết, client nãy sẽ gửi một HTTP request có gồm có những header bắt buộc sau :

  • Connection: Upgrade
    • Header Connection thường kiểm soát việc mở kết nối mạng sau khi transaction kết thúc. Giá trị phổ biến của header này là keep-alive, giúp đảm bảo kết nối được liên tục cho những request sau đến cùng server. Trong WebSocket opening handshake, ta đặt header thành Upgrade, cho biết rằng ta muốn giữ cho kết nối luôn mở, và dùng cho những request non-HTTP.
  • Upgrade: websocket
    • Header Upgrade được client sử dụng để yêu cầu server chuyển sang các giao thức khác trong danh sách, sắp xếp theo thứ tự ưu tiên giảm dần. Trong ví dụ này là websocket, cho biết rằng client muốn thiết lập một kết nối WebSocket.
  • Sec-WebSocket-Key: q4xkcO32u266gldTuKaSOw==
    • Sec-WebSocket-Key là một giá trị ngẫu nhiên, dùng một lần (nonce), được tạo ra bởi client. Giá trị của header là một giá trị 16 byte được mã hóa base64, được tạo ngẫu nhiên
  • Sec-WebSocket-Version: 13
    • Cho biết phiên bản WebSocket duy nhất được chấp nhận là 13. Bất kỳ phiên bản nào khác được liệt kê trong header này đều không hợp lệ.

Các header trên tích hợp với nhau sẽ tạo ra một request HTTP GET từ client đến một URI ws : / / như sau :

GET ws://example.com:8181/ HTTP/1.1
Host: localhost:8181
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: q4xkcO32u266gldTuKaSOw==

BashCopy

Sau khi client gửi request ban đầu để mở một kết nối WebSocket, nó sẽ đợi server reply. Reply từ server phải chứa một response code HTTP 101 Switching Protocols. Response này cho biết server đang chuyển sang giao thức mà client đã yêu cầu ở trong request header Upgrade. Bên cạnh đó, server phải bao gồm cả các header HTTP xác thực các kết nối được upgrade thành công:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fA9dggdnMPU79lJgAE3W4TRnyDM=
  • Connection: Upgrade:
    • Đảm bảo rằng kết nối đã được upgrade.
  • Upgrade: websocket
    • Đảm bảo rằng kết nối đã được upgrade.
  • Sec-WebSocket-Accept: fA9dggdnMPU79lJgAE3W4TRnyDM=`
    • Sec-WebSocket-Accept là một giá trị được mã hóa base64 và SHA-1 hashed. Ta có thể tạo giá trị này bằng cách nối các client Sec-WebSocket-Key nonce và giá trị tĩnh 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 được định nghĩa ở trong RFC 6455. Mặc dù Sec-WebSocket-Key và Sec-WebSocket-Accept có vẻ hơi phức tạp, nhưng chúng phải tồn tại để client và server có thể biết được đối tác có hỗ trợ WebSocket.

Tiếp đến, sau khi client nhận được server response, liên kết WebSocket sẽ được mở để khởi đầu việc truyền tài liệu .

Giao thức Handshake

Để thiết lập một giao thức WebSocket, thứ nhất client sẽ gửi một WebSocket handshake request. Sau đó server sẽ trả về một WebSocket handshake response như ví dụ ở dưới .

  • Client request (giống với HTTP, mỗi dòng sẽ kết thúc bằng \r\n và thêm một khoảng trắng bắt buộc ở cuối:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
  • Server response:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

Giao thức handshake sẽ khởi đầu bằng một HTTP request / response, được cho phép server giải quyết và xử lý những liên kết HTTP cũng như liên kết WebSocket ở trên cùng một cổng. Khi liên kết đã được thiết lập, tiếp xúc sẽ chuyển sang giao thức nhị phân hai chiều, không tương thích với HTTP .
Bên cạnh những header Upgrade, client cũng sẽ gửi một header Sec-WebSocket-Key chứa những byte ngẫu nhiên đã được mã hóa base64, và server sẽ phản hồi bằng một hash của key trong header Sec-WebSocket-Accept. Việc này nhằm mục đích ngăn ngừa caching proxy gửi lại tiếp xúc WebSocket trước đó. Đồng thời không cung ứng bất kể xác nhận, quyền riêng tư hay tính toàn vẹn nào. Hàm hash sẽ append chuỗi cố định và thắt chặt ( một UUID ) 258EAFA5 – E914-47DA-95CA-C5AB0DC85B11 vào giá trị từ header Sec-WebSocket-Key ( không được giải thuật từ base64 ). Cùng với đó là vận dụng hàm băm ( hashing fucntion ) SHA-1 và giải thuật tác dụng bằng base64 .
Sau khi liên kết được thiết lập thành công xuất sắc, client và server hoàn toàn có thể gửi tài liệu WebSocket hoặc text frame qua lại trong chính sách full-duplex. Dữ liệu được frame tối thiểu, với một header nhỏ ở trước payload. Việc truyền WebSocket được diễn đạt như những “ messages ”. Ở đó, mỗi message hoàn toàn có thể được split trên nhiều data frame. Việc này sẽ được cho phép gửi những message khi có sẵn tài liệu bắt đầu, nhưng độ dài của message chưa được xác lập ( nó sẽ gửi từng data frame cho đến khi kết thúc với bit FIN ) .
Ta cũng hoàn toàn có thể sử dụng những phần lan rộng ra của giao thức này để ghép ( multiplex ) nhiều stream đồng thời. Chẳng hạn như để tránh việc sử dụng duy nhất một socket cho payload lớn .

Cân nhắc về bảo mật


Khác với những cross-domain HTTP request, WebSocket request không bị số lượng giới hạn bởi chủ trương Same-Origin. Do đó, những server WebSocket phải xác nhận header “ Origin ” so với origin dự kiến trong quy trình thiết lập liên kết, nhằm mục đích tránh tiến công Cross-Site WebSocket Hijacking ( một loại tiến công tương tự như như Cross-Site Request Forgery – CRF ). Loại tiến công này hoàn toàn có thể xảy ra khi liên kết được xác nhận bằng cookies hay HTTP. Do đó, tốt nhất là hãy sử dụng token hay những chính sách bảo mật thông tin tựa như để xác nhận liên kết WebSocket khi chuyển những tài liệu riêng tư qua WebSocket .

Proxy traversal

Client triển khai giao thức WebSocket muốn kiểm tra xem user agent có được cấu hình để sử dụng proxy khi kết nối đến host đích và host hay không. Nếu có thì sẽ sử dụng phương thức HTTP CONNECT để thiết lập tunnel.

Mặc dù bản thân giao thức WebSocket không hề biết về những proxy server hay firewall, nó có giao thức handshake thích hợp với HTTP. Do đó sẽ được cho phép những HTTP server san sẻ những port HTTP và HTTPS của họ ( 80 và 443 ) bằng một WebSocket gateway hay server. Giao thức WebSocket xác lập một tiền tố ws : / / và wss : / / để xác lập liên kết WebSocket và WebSocket Secure. Cả hai lược đồ đều sử dụng chính sách HTTP uprade để tăng cấp lên giao thức WebSocket .
Một số proxy server hoàn toàn có thể hoạt động giải trí tốt với WebSocket, tuy nhiên 1 số ít khác cũng hoàn toàn có thể ngăn WebSocket hoạt động giải trí thông thường. Từ đó gây ảnh hưởng tác động đến những liên kết. Đôi khi còn hoàn toàn có thể nhu yếu thêm một số ít proxy server bổ trợ, hoặc nhu yếu tăng cấp để hoàn toàn có thể tương hỗ WebSocket .
Nếu lưu lượng không được mã hóa đi qua một transparent proxy không tương hỗ WebSocket, nhiều năng lực liên kết sẽ không hề triển khai .
Mặt khác, với những lưu lượng WebSocket được mã hóa, thì việc sử dụng TLS giúp bảo vệ lệnh HTTP CONNECT được gửi khi trình duyệt được thông số kỹ thuật để sử dụng proxy server. Việc này sẽ thiết lập một tunnel, phân phối tiếp xúc TCP low-level, end-to-end trải qua HTTP proxy, ở giữa WebSocket Secure client và WebSocket server .
Đối với transparent proxy, trình duyệt sẽ không biết về proxy server, nên HTTP CONNECT sẽ không được gửi đi. Tuy nhiên, vì traffic được mã hóa, nên những transparent proxy trung gian hoàn toàn có thể được cho phép lưu lượng được mã hóa đi qua. Do đó, nếu sử dụng WebSocket Secure thì năng lực thiết lập liên kết WebSocket sẽ cao hơn. Việc sử dụng mã hóa dù tốn ngân sách tài nguyên, nhưng sẽ mang lại tỷ suất thành công xuất sắc cao hơn vì nó đi qua tunnel bảo đảm an toàn hơn .
Qua bài viết này, kỳ vọng bạn hoàn toàn có thể hiểu rõ và biết cách tạo WebSocket để hoàn toàn có thể bảo mật thông tin thông tin tốt hơn, chúc những bạn thành công xuất sắc !

Nguồn : https://vietnix.vn/

Rate this post