1) Tại sao giao thức WebSockets tốt hơn?
WebSockets tốt hơn cho các tình huống liên quan đến giao tiếp có độ trễ thấp, đặc biệt là độ trễ thấp cho các tin nhắn từ máy khách đến máy chủ. Đối với dữ liệu từ máy chủ đến máy khách, bạn có thể nhận được độ trễ khá thấp bằng cách sử dụng các kết nối dài và chuyển dữ liệu. Tuy nhiên, điều này không giúp ích cho độ trễ của máy khách đến máy chủ yêu cầu kết nối mới được thiết lập cho mỗi máy khách gửi tin nhắn máy chủ.
Cái bắt tay HTTP 48 byte của bạn không thực tế đối với các kết nối trình duyệt HTTP trong thế giới thực, nơi thường có vài kilobyte dữ liệu được gửi như một phần của yêu cầu (theo cả hai hướng) bao gồm nhiều tiêu đề và dữ liệu cookie. Dưới đây là ví dụ về yêu cầu / phản hồi khi sử dụng Chrome:
Yêu cầu ví dụ (2800 byte bao gồm dữ liệu cookie, 490 byte không có dữ liệu cookie):
GET / HTTP/1.1
Host: www.cnn.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.68 Safari/537.17
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [[[2428 byte of cookie data]]]
Ví dụ phản hồi (355 byte):
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 13 Feb 2013 18:56:27 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: CG=US:TX:Arlington; path=/
Last-Modified: Wed, 13 Feb 2013 18:55:22 GMT
Vary: Accept-Encoding
Cache-Control: max-age=60, private
Expires: Wed, 13 Feb 2013 18:56:54 GMT
Content-Encoding: gzip
Cả HTTP và WebSockets đều có các bắt tay kết nối ban đầu có kích thước tương đương, nhưng với kết nối WebSocket, bắt tay ban đầu được thực hiện một lần và sau đó các tin nhắn nhỏ chỉ có 6 byte trên đầu (2 cho tiêu đề và 4 cho giá trị mặt nạ). Chi phí độ trễ không quá nhiều từ kích thước của các tiêu đề, nhưng từ logic để phân tích / xử lý / lưu trữ các tiêu đề đó. Ngoài ra, độ trễ thiết lập kết nối TCP có thể là một yếu tố lớn hơn kích thước hoặc thời gian xử lý cho mỗi yêu cầu.
2) Tại sao nó được triển khai thay vì cập nhật giao thức HTTP?
Có những nỗ lực để thiết kế lại giao thức HTTP để đạt được hiệu suất tốt hơn và độ trễ thấp hơn như SPDY , HTTP 2.0 và QUIC . Điều này sẽ cải thiện tình hình cho các yêu cầu HTTP thông thường, nhưng có khả năng WebSockets và / hoặc WebRTC DataChannel vẫn sẽ có độ trễ thấp hơn để truyền dữ liệu từ máy khách sang máy chủ so với giao thức HTTP (hoặc nó sẽ được sử dụng trong chế độ trông rất giống WebSockets dù sao đi nữa).
Cập nhật :
Đây là một khung để suy nghĩ về các giao thức web:
- TCP : lớp vận chuyển đơn hàng cấp thấp, hai chiều, song công hoàn toàn và được đảm bảo. Không hỗ trợ trình duyệt (ngoại trừ thông qua plugin / Flash).
- HTTP 1.0 : giao thức vận chuyển đáp ứng yêu cầu được xếp lớp trên TCP. Máy khách thực hiện một yêu cầu đầy đủ, máy chủ cung cấp một phản hồi đầy đủ và sau đó kết nối được đóng lại. Các phương thức yêu cầu (GET, POST, HEAD) có ý nghĩa giao dịch cụ thể cho các tài nguyên trên máy chủ.
- HTTP 1.1 : duy trì tính chất đáp ứng yêu cầu của HTTP 1.0, nhưng cho phép kết nối luôn mở cho nhiều yêu cầu đầy đủ / phản hồi đầy đủ (một phản hồi cho mỗi yêu cầu). Vẫn có đầy đủ các tiêu đề trong yêu cầu và phản hồi nhưng kết nối được sử dụng lại và không bị đóng. HTTP 1.1 cũng đã thêm một số phương thức yêu cầu bổ sung (TÙY CHỌN, PUT, XÓA, TRACE, CONNECT) cũng có ý nghĩa giao dịch cụ thể. Tuy nhiên, như đã lưu ý trong phần giới thiệu về đề xuất dự thảo HTTP 2.0, đường ống HTTP 1.1 không được triển khai rộng rãi nên điều này hạn chế rất nhiều tiện ích của HTTP 1.1 để giải quyết độ trễ giữa trình duyệt và máy chủ.
- Thăm dò ý kiến dài : sắp xếp "hack" thành HTTP (1.0 hoặc 1.1) trong đó máy chủ không phản hồi ngay lập tức (hoặc chỉ trả lời một phần với các tiêu đề) cho yêu cầu của máy khách. Sau khi phản hồi của máy chủ, máy khách sẽ gửi ngay một yêu cầu mới (sử dụng cùng một kết nối nếu qua HTTP 1.1).
- Truyền phát HTTP : một loạt các kỹ thuật (phản hồi nhiều phần / phản hồi) cho phép máy chủ gửi nhiều hơn một phản hồi cho một yêu cầu khách hàng. W3C đang chuẩn hóa điều này dưới dạng Sự kiện do Máy chủ gửi bằng
text/event-stream
loại MIME. API trình duyệt (tương đối giống với API WebSocket) được gọi là API EventSource.
- Đẩy sao chổi / máy chủ : đây là một thuật ngữ bao gồm cả phát trực tuyến dài và HTTP. Thư viện Comet thường hỗ trợ nhiều kỹ thuật để thử và tối đa hóa hỗ trợ trình duyệt chéo và máy chủ chéo.
- WebSockets : lớp vận chuyển tích hợp TCP sử dụng bắt tay Nâng cấp thân thiện HTTP. Không giống như TCP là truyền tải trực tuyến, WebSockets là truyền tải dựa trên thông báo: các tin nhắn được phân định trên dây và được lắp ráp lại đầy đủ trước khi gửi đến ứng dụng. Các kết nối WebSocket là hai hướng, song công hoàn toàn và tồn tại lâu dài. Sau yêu cầu / phản hồi bắt tay ban đầu, không có ngữ nghĩa giao dịch và có rất ít chi phí cho mỗi tin nhắn. Máy khách và máy chủ có thể gửi tin nhắn bất cứ lúc nào và phải xử lý nhận tin nhắn không đồng bộ.
- SPDY : một đề xuất do Google khởi xướng để mở rộng HTTP bằng cách sử dụng giao thức dây hiệu quả hơn nhưng vẫn duy trì tất cả các ngữ nghĩa HTTP (yêu cầu / phản hồi, cookie, mã hóa). SPDY giới thiệu một định dạng khung mới (với các khung có tiền tố dài) và chỉ định một cách để xếp các cặp yêu cầu / phản hồi HTTP lên lớp khung mới. Các tiêu đề có thể được nén và các tiêu đề mới có thể được gửi sau khi kết nối được thiết lập. Có các triển khai SPDY trong thế giới thực trong các trình duyệt và máy chủ.
- HTTP 2.0 : có các mục tiêu tương tự như SPDY: giảm độ trễ và chi phí HTTP trong khi vẫn bảo tồn ngữ nghĩa HTTP. Dự thảo hiện tại có nguồn gốc từ SPDY và xác định bắt tay nâng cấp và đóng khung dữ liệu rất giống với tiêu chuẩn WebSocket cho bắt tay và đóng khung. Một đề xuất dự thảo HTTP 2.0 thay thế (httpbis-speed-mobility) thực sự sử dụng WebSockets cho lớp vận chuyển và thêm ghép kênh SPDY và ánh xạ HTTP làm tiện ích mở rộng WebSocket (tiện ích mở rộng WebSocket được đàm phán trong quá trình bắt tay).
- WebRTC / CU-WebRTC : đề xuất cho phép kết nối ngang hàng giữa các trình duyệt. Điều này có thể cho phép giao tiếp độ trễ trung bình và độ trễ tối đa thấp hơn vì vận chuyển cơ bản là SDP / datagram chứ không phải TCP. Điều này cho phép phân phối các gói / tin nhắn không theo thứ tự để tránh sự cố TCP về độ trễ trễ do các gói bị rơi làm trì hoãn việc gửi tất cả các gói tiếp theo (để đảm bảo phân phối theo thứ tự).
- QUIC : là một giao thức thử nghiệm nhằm giảm độ trễ web so với TCP. Nhìn bề ngoài, QUIC rất giống với TCP + TLS + SPDY được triển khai trên UDP. QUIC cung cấp điều khiển ghép kênh và điều khiển luồng tương đương với HTTP / 2, bảo mật tương đương với TLS và ngữ nghĩa kết nối, độ tin cậy và điều khiển tắc nghẽn tương đương với TCP. Vì TCP được triển khai trong các hạt nhân của hệ điều hành và phần sụn giữa, nên việc thay đổi đáng kể đối với TCP là không thể. Tuy nhiên, do QUIC được xây dựng dựa trên UDP, nên nó không bị giới hạn như vậy. QUIC được thiết kế và tối ưu hóa cho ngữ nghĩa HTTP / 2.
Tài liệu tham khảo :
- HTTP :
- Sự kiện gửi máy chủ :
- WebSockets :
- SPDY :
- HTTP 2.0 :
- WebRTC :
- QUIC :