HTTP melalui UDP - memanfaatkan protokol QUIC dengan baik

HTTP melalui UDP - memanfaatkan protokol QUIC dengan baik

QUIC (Quick UDP Internet Connections) adalah protokol di atas UDP yang mendukung semua fitur TCP, TLS, dan HTTP/2 serta memecahkan sebagian besar masalahnya. Protokol ini sering disebut protokol baru atau “eksperimental”, namun sudah lama melampaui tahap eksperimental: pengembangan telah berlangsung selama lebih dari 7 tahun. Selama ini, protokol tersebut belum sempat menjadi standar, namun masih tersebar luas. Misalnya, QUIC digunakan oleh raksasa seperti Google dan Facebook untuk mempercepat lalu lintas dan mengurangi penundaan dalam jaringan seluler, dan IETF menyatakan cabang protokolnya sebagai dasar standar HTTP/3 (walaupun HTTP/2 menggunakan hanya 44.8% situs).

Konsep

QUIC dikembangkan sebagai pengganti TCP lama, yang awalnya dirancang untuk jaringan kabel dengan kerugian rendah. TCP mengirimkan paket secara berurutan, jadi jika satu paket hilang, seluruh antrian akan dihentikan (pemblokiran head-of-line), yang berdampak negatif terhadap kualitas dan stabilitas koneksi. Untuk menghindari kerugian besar, jaringan seluler menggunakan buffer besar, yang pada gilirannya menyebabkan redundansi dan respons negatif palsu dari protokol (bufferbloat). Selain itu, TCP menghabiskan banyak waktu untuk membuat koneksi: permintaan SYN/ACK dan TLS diproses secara terpisah, sehingga memerlukan tiga perjalanan pulang pergi, bukan satu, seperti yang dilakukan QUIC.

HTTP melalui UDP - memanfaatkan protokol QUIC dengan baik

Karena QUIC menggabungkan pengganti TCP dan implementasi TLS 1.3, semua koneksi selalu dienkripsi, dan mendekripsi lalu lintas tersebut tidak lebih mudah dibandingkan jika melalui HTTPS. Selain itu, QUIC diimplementasikan pada tingkat aplikasi, karena diperlukan penggantian lengkap tumpukan TCP selamanya.

Meskipun ada dukungan untuk multiplexing di HTTP/2, masalah pemblokiran head-of-line tetap ada karena kebutuhan untuk mengirimkan paket secara berurutan. QUIC diimplementasikan di atas UDP, sehingga pada prinsipnya tidak ada pemblokiran, dan untuk mencegah paket hilang selamanya, paket tersebut diberi nomor dan dapat berisi bagian “tetangga”, sehingga memberikan redundansi. Selain itu, QUIC membagi antrian monolitik menjadi beberapa thread untuk berbagai jenis permintaan dalam satu koneksi. Jadi, jika sebuah paket hilang, masalah mungkin timbul hanya untuk satu antrian (misalnya, untuk mentransfer file tertentu):

HTTP melalui UDP - memanfaatkan protokol QUIC dengan baik

Menggunakan

Awalnya, QUIC dikembangkan di Google dan sebagian besar dirancang untuk digunakan di dalam perusahaan. Pada tahun 2013, protokol tersebut dialihkan ke IETF untuk standardisasi (yang masih berlangsung), dan sekarang setiap orang dapat berpartisipasi dalam pengembangan protokol dengan mengusulkan apa yang kurang. Kelompok kerja IETF menyelenggarakan pertemuan tahunan di mana standar baru disetujui dan inovasi dibahas. Implementasi QUIC ini dianggap yang utama dan atas dasar itulah standar HTTP/3 disertifikasi.

Sejauh ini, belum ada pembicaraan untuk memasukkan HTTP/3 sebagai protokol utama, karena belum selesai dan hampir tidak didukung:

HTTP melalui UDP - memanfaatkan protokol QUIC dengan baik

Namun QUIC dapat diimplementasikan sebagai transportasi antara aplikasi dan server, yang berhasil dilakukan di Uber:

Komentar Uber tentang pengenalan QUIC

Agar berhasil menyematkan QUIC dan meningkatkan kinerja aplikasi di lingkungan konektivitas yang buruk, kami mengganti tumpukan lama (HTTP/2 melalui TLS/TCP) dengan protokol QUIC. Kami menggunakan perpustakaan jaringan Cronet dari Proyek Kromium, yang berisi protokol versi Google asli - gQUIC. Implementasi ini juga terus ditingkatkan untuk mengikuti spesifikasi IETF terbaru.

Kami pertama kali mengintegrasikan Cronet ke dalam aplikasi Android kami untuk menambahkan dukungan untuk QUIC. Integrasi dilakukan sedemikian rupa untuk mengurangi biaya migrasi semaksimal mungkin. Daripada sepenuhnya mengganti tumpukan jaringan lama yang menggunakan perpustakaan OkeHttp, kami telah mengintegrasikan Cronet DI BAWAH kerangka API OkHttp. Dengan melakukan integrasi dengan cara ini, kami menghindari perubahan pada panggilan jaringan kami (yang digunakan oleh Retrofit) di tingkat API.

Mirip dengan pendekatan untuk perangkat Android, kami menerapkan Cronet ke aplikasi Uber di iOS, mencegat lalu lintas HTTP dari jaringan APImenggunakan Protokol NSURL. Abstraksi ini, yang disediakan oleh iOS Foundation, menangani data URL khusus protokol dan memastikan bahwa kami dapat mengintegrasikan Cronet ke dalam aplikasi iOS kami tanpa biaya migrasi yang signifikan.

diambil dari terjemahan ini artikel Uber

Di backend mereka menangkap koneksi QUIC melalui Google Cloud lb, yang mendukung protokol sejak pertengahan tahun 2018.

Tidak mengherankan jika Google Cloud berfungsi baik dengan protokol yang dikembangkan Google, namun apa alternatifnya?

Nginx

Belum lama ini CloudFlare Saya mencoba menyeberang nginx (yang tidak mendukung HTTP/3 secara default) dengan alat Quiche-nya. Implementasinya tersedia sebagai satu file .patch, yang dilengkapi dengan tutorial instalasi:

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

Di sini Anda dapat menghubungkan modul Anda jika perlu

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

Yang tersisa hanyalah mengaktifkan dukungan 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';
    }
}

Koneksi melalui HTTP/3 di browser biasa belum dapat dilakukan, tetapi Anda dapat menggunakannya Chrome Canary dan menjalankannya dengan bendera --enable-quic, buka server Anda atau, misalnya, situs quic.rocks dan lihat jenis koneksi di Alat Pengembang:
HTTP melalui UDP - memanfaatkan protokol QUIC dengan baik
Alih-alih HTTP/3 ada tertulis http2+quic/99, tapi pada dasarnya sama saja.

Teknologi lainnya

  • QUIC juga mendukung LiteSpeed (yang terhubung ke Facebook melalui HTTP/3 dengan meriah) dan progresif Kadi. Apache belum dapat melakukannya, namun pekerjaan sedang dilakukan ayunan penuh.
  • 21 Januari diperbarui rancangan standar untuk WebRTC
  • Beberapa hari yang lalu Microsoft dibuka kode implementasi msquic, yang mana belum semua fungsi dari standar IETF tersedia, namun ini sudah merupakan terobosan besar.

Kesimpulan

HTTP melalui UDP - memanfaatkan protokol QUIC dengan baik

Minat terhadap QUIC tidak stabil, namun terus berkembang, dan upaya sedang dilakukan untuk menstandardisasinya. Implementasi baru dari protokol ini muncul hampir setiap bulan, dan setiap tahun semakin banyak pengembang yang yakin bahwa QUIC adalah masa depan. Bahkan dimungkinkan untuk menyertakan protokol tersebut dalam versi tumpukan TCP yang akan datang, yang berarti cepat atau lambat seluruh Internet akan berpindah ke koneksi yang lebih stabil dan lebih cepat.

Sekarang Anda sudah dapat mengonfigurasi interaksi QUIC untuk infrastruktur Anda atau bahkan memberikannya ke browser - mereka semua berencana menambahkan dukungan untuk protokol, dan statistik menyedihkan dengan caniuse akan menjadi lebih ceria.

HTTP melalui UDP - memanfaatkan protokol QUIC dengan baik

Sumber: www.habr.com

Tambah komentar