HTTP qua UDP - tận dụng tốt giao thức QUIC

HTTP qua UDP - tận dụng tốt giao thức QUIC

QUIC (Kết nối Internet UDP nhanh) là một giao thức trên UDP hỗ trợ tất cả các tính năng của TCP, TLS và HTTP/2 và giải quyết hầu hết các vấn đề của chúng. Nó thường được gọi là một giao thức mới hoặc “thử nghiệm”, nhưng nó đã tồn tại lâu hơn giai đoạn thử nghiệm từ lâu: quá trình phát triển đã diễn ra trong hơn 7 năm. Trong thời gian này, giao thức không thể trở thành một tiêu chuẩn nhưng vẫn trở nên phổ biến. Ví dụ: QUIC được những gã khổng lồ như Google và Facebook sử dụng để tăng tốc lưu lượng truy cập và giảm độ trễ trong mạng di động, và IETF đã tuyên bố rằng nhánh giao thức của họ là cơ sở cho tiêu chuẩn HTTP/3 (mặc dù HTTP/2 sử dụng chỉ 44.8% các trang web).

Khái niệm

QUIC được phát triển để thay thế cho TCP truyền thống, ban đầu được thiết kế cho các mạng có dây có tổn thất thấp. TCP phân phối các gói theo thứ tự, vì vậy nếu một gói bị mất, toàn bộ hàng đợi sẽ bị dừng (chặn đầu dòng), điều này ảnh hưởng tiêu cực đến chất lượng và độ ổn định của kết nối. Để tránh tổn thất lớn, mạng di động sử dụng bộ đệm lớn, điều này dẫn đến dư thừa và phản hồi âm tính giả của giao thức (đệm). Ngoài ra, TCP dành nhiều thời gian để thiết lập kết nối: các yêu cầu SYN/ACK và TLS được xử lý riêng biệt, yêu cầu ba lượt khứ hồi thay vì một như QUIC.

HTTP qua UDP - tận dụng tốt giao thức QUIC

Vì QUIC kết hợp thay thế TCP và triển khai TLS 1.3 nên tất cả các kết nối luôn được mã hóa và việc giải mã lưu lượng truy cập đó không dễ dàng hơn so với khi nó đi qua HTTPS. Ngoài ra, QUIC được triển khai ở cấp ứng dụng, vì việc thay thế hoàn toàn ngăn xếp TCP sẽ mất nhiều thời gian hơn. vĩnh cửu.

Mặc dù hỗ trợ ghép kênh trong HTTP/2, vấn đề chặn đầu dòng vẫn tồn tại do nhu cầu phân phối các gói theo thứ tự. QUIC được triển khai trên UDP, do đó về nguyên tắc nó không có tính năng chặn và để tránh các gói bị mất vĩnh viễn, chúng được đánh số và có thể chứa các phần của “hàng xóm”, cung cấp khả năng dự phòng. Ngoài ra, QUIC chia hàng đợi nguyên khối thành nhiều luồng cho các loại yêu cầu khác nhau trong một kết nối. Do đó, nếu một gói bị mất, các vấn đề có thể chỉ phát sinh đối với một hàng đợi (ví dụ: để truyền một tệp cụ thể):

HTTP qua UDP - tận dụng tốt giao thức QUIC

Sử dụng

Ban đầu, QUIC được phát triển trong Google và phần lớn được điều chỉnh để sử dụng trong công ty. Vào năm 2013, nó đã được chuyển đến IETF để tiêu chuẩn hóa (vẫn đang tiếp tục) và giờ đây mọi người đều có thể tham gia vào việc phát triển giao thức bằng cách đề xuất những gì họ còn thiếu. Nhóm làm việc của IETF tổ chức các cuộc họp thường niên trong đó tiêu chuẩn mới được phê duyệt và các cải tiến được thảo luận. Việc triển khai QUIC này được coi là triển khai chính và trên cơ sở đó tiêu chuẩn HTTP/3 đã được chứng nhận.

Cho đến nay vẫn chưa có thảo luận nào về việc đưa HTTP/3 làm giao thức chính, vì nó vẫn chưa hoàn thiện và gần như chưa được hỗ trợ:

HTTP qua UDP - tận dụng tốt giao thức QUIC

Nhưng QUIC có thể được triển khai như một phương tiện vận chuyển giữa ứng dụng và máy chủ, điều này đã được thực hiện thành công tại Uber:

Bình luận của Uber về việc giới thiệu QUIC

Để nhúng QUIC thành công và cải thiện hiệu suất ứng dụng trong môi trường kết nối kém, chúng tôi đã thay thế ngăn xếp cũ (HTTP/2 thay vì TLS/TCP) bằng giao thức QUIC. Chúng tôi đã sử dụng thư viện mạng Cronet của Dự án crom, chứa phiên bản gốc của giao thức Google - gQUIC. Việc triển khai này cũng liên tục được cải tiến để tuân theo đặc tả IETF mới nhất.

Lần đầu tiên chúng tôi tích hợp Cronet vào các ứng dụng Android của mình để hỗ trợ thêm cho QUIC. Việc tích hợp được thực hiện theo cách giảm chi phí di chuyển nhiều nhất có thể. Thay vì thay thế hoàn toàn ngăn xếp mạng cũ đã sử dụng thư viện OkHttp, chúng tôi đã tích hợp Cronet THEO khung API OkHttp. Bằng cách thực hiện tích hợp theo cách này, chúng tôi đã tránh được những thay đổi đối với cuộc gọi mạng của mình (được sử dụng bởi Trang bị thêm) ở cấp độ API.

Tương tự như phương pháp dành cho thiết bị Android, chúng tôi đã triển khai Cronet vào ứng dụng Uber trên iOS, chặn lưu lượng HTTP từ mạng APIsử dụng NSURLGiao thức. Bản tóm tắt này do iOS Foundation cung cấp, xử lý dữ liệu URL theo giao thức cụ thể và đảm bảo rằng chúng tôi có thể tích hợp Cronet vào các ứng dụng iOS của mình mà không phải trả chi phí di chuyển đáng kể.

được lấy từ bản dịch này Bài viết về Uber

Ở phần phụ trợ, họ đã tìm thấy các kết nối QUIC thông qua Google Cloud lb, kết nối này hỗ trợ giao thức kể từ giữa năm 2018.

Không có gì ngạc nhiên khi Google Cloud hoạt động tốt với giao thức do Google phát triển, nhưng các lựa chọn thay thế là gì?

Nginx

Cách đây không lâu CloudFlare Tôi đã cố gắng vượt qua nginx (mặc định không hỗ trợ HTTP/3) bằng công cụ Quiche của nó. Việc triển khai có sẵn dưới dạng một tệp .patch, đi kèm với hướng dẫn cài đặt:

curl -O https://nginx.org/download/nginx-1.16.1.tar.gz
tar xvzf nginx-1.16.1.tar.gz
git clone --recursive https://github.com/cloudflare/quiche
cd nginx-1.16.1
patch -p01 < ../quiche/extras/nginx/nginx-1.16.patch

Tại đây bạn có thể kết nối các mô-đun của mình nếu cần thiết

./configure                          	
   	--prefix=$PWD                       	
   	--with-http_ssl_module              	
   	--with-http_v2_module               	
   	--with-http_v3_module               	
   	--with-openssl=../quiche/deps/boringssl 
   	--with-quiche=../quiche
 make

Tất cả những gì còn lại là kích hoạt hỗ trợ HTTP/3

events {
    worker_connections  1024;
}

http {
    server {
        # Enable QUIC and HTTP/3.
        listen 443 quic reuseport;

        # Enable HTTP/2 (optional).
        listen 443 ssl http2;

        ssl_certificate      cert.crt;
        ssl_certificate_key  cert.key;

        # Enable all TLS versions (TLSv1.3 is required for QUIC).
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

        # Request buffering in not currently supported for HTTP/3.
        proxy_request_buffering off;

        # Add Alt-Svc header to negotiate HTTP/3.
        add_header alt-svc 'h3-27=":443"; ma=86400';
    }
}

Hiện chưa thể kết nối qua HTTP/3 trong các trình duyệt thông thường, nhưng bạn có thể sử dụng Chrome Canary và chạy nó với cờ --enable-quic, hãy truy cập máy chủ của bạn hoặc, ví dụ: trang quic.rocks và xem loại kết nối trong Công cụ dành cho nhà phát triển:
HTTP qua UDP - tận dụng tốt giao thức QUIC
Thay vì HTTP/3 nó được viết http2+quic/99, nhưng về cơ bản thì nó giống nhau.

Các công nghệ khác

  • QUIC cũng hỗ trợ Tốc độ nhanh (được kết nối với Facebook qua HTTP/3 với sự phô trương lớn) và tiến bộ Hộp trà. Apache chưa thể làm điều đó, nhưng công việc đang được tiến hành đu đủ.
  • Cập nhật ngày 21 tháng XNUMX dự thảo tiêu chuẩn cho WebRTC
  • Mới hôm nọ Microsoft đã khai trương mã triển khai msquic, trong đó không phải tất cả các chức năng từ tiêu chuẩn IETF đều có sẵn, nhưng đây đã là một bước đột phá lớn.

Kết luận

HTTP qua UDP - tận dụng tốt giao thức QUIC

Sự quan tâm đến QUIC không ổn định nhưng đang tăng lên và công việc đang được tiến hành để tiêu chuẩn hóa nó. Các triển khai mới của giao thức xuất hiện hầu như hàng tháng và mỗi năm, ngày càng có nhiều nhà phát triển tin rằng QUIC là tương lai. Thậm chí có thể đưa giao thức này vào các phiên bản tương lai của ngăn xếp TCP, điều đó có nghĩa là sớm hay muộn toàn bộ Internet sẽ chuyển sang các kết nối ổn định hơn và nhanh hơn.

Bây giờ bạn có thể định cấu hình tương tác QUIC cho cơ sở hạ tầng của mình hoặc thậm chí cung cấp nó cho các trình duyệt - tất cả họ đều đang có kế hoạch thêm hỗ trợ cho giao thức và số liệu thống kê đáng buồn với caniuse sẽ trở nên vui vẻ hơn.

HTTP qua UDP - tận dụng tốt giao thức QUIC

Nguồn: www.habr.com

Thêm một lời nhận xét