HTTP μέσω UDP - αξιοποίηση του πρωτοκόλλου QUIC

HTTP μέσω UDP - αξιοποίηση του πρωτοκόλλου QUIC

Το QUIC (Quick UDP Internet Connections) είναι ένα πρωτόκολλο πάνω από το UDP που υποστηρίζει όλες τις δυνατότητες των TCP, TLS και HTTP/2 και επιλύει τα περισσότερα από τα προβλήματά τους. Συχνά αποκαλείται νέο ή «πειραματικό» πρωτόκολλο, αλλά έχει ξεπεράσει από καιρό το πειραματικό στάδιο: η ανάπτυξη συνεχίζεται για περισσότερα από 7 χρόνια. Κατά τη διάρκεια αυτής της περιόδου, το πρωτόκολλο δεν κατάφερε να γίνει πρότυπο, αλλά παρόλα αυτά έγινε ευρέως διαδεδομένο. Για παράδειγμα, το QUIC χρησιμοποιείται από γίγαντες όπως η Google και το Facebook για την επιτάχυνση της κυκλοφορίας και τη μείωση των καθυστερήσεων στα δίκτυα κινητής τηλεφωνίας, και το IETF δήλωσε ότι το πρωτόκολλό του είναι η βάση για το πρότυπο HTTP/3 (παρόλο που το HTTP/2 χρησιμοποιεί μόνο 44.8% τοποθεσίες).

Έννοια

Το QUIC αναπτύχθηκε ως αντικατάσταση του παλαιού τύπου TCP, το οποίο σχεδιάστηκε αρχικά για ενσύρματα δίκτυα χαμηλών απωλειών. Το TCP παραδίδει τα πακέτα με τη σειρά, οπότε αν χαθεί ένα πακέτο, ολόκληρη η ουρά σταματά (μπλοκάρισμα κεφαλής), γεγονός που επηρεάζει αρνητικά την ποιότητα και τη σταθερότητα της σύνδεσης. Για να αποφύγουν τεράστιες απώλειες, τα κυψελωτά δίκτυα καταφεύγουν στη χρήση μεγάλων buffer, τα οποία με τη σειρά τους οδηγούν σε πλεονασμό και ψευδώς αρνητική απόκριση του πρωτοκόλλου (bufferbloat). Επιπλέον, το TCP ξοδεύει πολύ χρόνο για τη δημιουργία μιας σύνδεσης: Τα αιτήματα SYN/ACK και TLS επεξεργάζονται χωριστά, απαιτώντας τρία ταξίδια μετ' επιστροφής αντί για ένα, όπως κάνει το QUIC.

HTTP μέσω UDP - αξιοποίηση του πρωτοκόλλου QUIC

Δεδομένου ότι το QUIC συνδυάζει μια αντικατάσταση TCP και μια υλοποίηση του TLS 1.3, όλες οι συνδέσεις είναι πάντα κρυπτογραφημένες και η αποκρυπτογράφηση αυτής της κίνησης δεν είναι ευκολότερη από ό,τι αν περνούσε μέσω HTTPS. Επιπλέον, το QUIC υλοποιείται σε επίπεδο εφαρμογής, καθώς θα χρειαζόταν μια πλήρης αντικατάσταση της στοίβας TCP αιωνιότητα.

Παρά την υποστήριξη για πολυπλεξία σε HTTP/2, το πρόβλημα του αποκλεισμού της γραμμής κεφαλής παρέμεινε εκεί λόγω της ανάγκης να παραδοθούν τα πακέτα με τη σειρά. Το QUIC υλοποιείται πάνω από το UDP, επομένως δεν έχει καταρχήν αποκλεισμό, και για να αποτραπεί η οριστική απώλεια πακέτων, είναι αριθμημένα και μπορούν να περιέχουν τμήματα "γειτόνων", παρέχοντας πλεονασμό. Επιπλέον, το QUIC διαχωρίζει τη μονολιθική ουρά σε πολλαπλά νήματα για διαφορετικούς τύπους αιτημάτων σε μία μόνο σύνδεση. Έτσι, εάν χαθεί ένα πακέτο, ενδέχεται να προκύψουν προβλήματα μόνο για μία ουρά (για παράδειγμα, για τη μεταφορά ενός συγκεκριμένου αρχείου):

HTTP μέσω UDP - αξιοποίηση του πρωτοκόλλου QUIC

Χρήση

Αρχικά, το QUIC αναπτύχθηκε εντός της Google και ήταν σε μεγάλο βαθμό προσαρμοσμένο για χρήση εντός της εταιρείας. Το 2013 μεταφέρθηκε στο IETF για τυποποίηση (η οποία είναι ακόμη σε εξέλιξη), και πλέον ο καθένας μπορεί να συμμετέχει στην ανάπτυξη του πρωτοκόλλου προτείνοντας αυτό που του λείπει. Η ομάδα εργασίας του IETF διοργανώνει ετήσιες συναντήσεις κατά τις οποίες εγκρίνεται ένα νέο πρότυπο και συζητούνται οι καινοτομίες. Αυτή η υλοποίηση του QUIC θεωρείται η κύρια και στη βάση της είναι πιστοποιημένο το πρότυπο HTTP/3.

Μέχρι στιγμής, δεν υπάρχει λόγος να συμπεριληφθεί το HTTP/3 ως το κύριο πρωτόκολλο, επειδή δεν έχει ολοκληρωθεί ακόμα και σχεδόν δεν υποστηρίζεται:

HTTP μέσω UDP - αξιοποίηση του πρωτοκόλλου QUIC

Αλλά το QUIC μπορεί να εφαρμοστεί ως μεταφορά μεταξύ της εφαρμογής και του διακομιστή, κάτι που έγινε με επιτυχία στην Uber:

Το σχόλιο της Uber για την εισαγωγή του QUIC

Για την επιτυχή ενσωμάτωση του QUIC και τη βελτίωση της απόδοσης της εφαρμογής σε περιβάλλοντα κακής συνδεσιμότητας, αντικαταστήσαμε την παλιά στοίβα (HTTP/2 μέσω TLS/TCP) με το πρωτόκολλο QUIC. Χρησιμοποιήσαμε τη βιβλιοθήκη δικτύου Cronet του Έργα Chromium, το οποίο περιέχει την αρχική, έκδοση Google του πρωτοκόλλου - gQUIC. Αυτή η υλοποίηση επίσης βελτιώνεται συνεχώς για να ακολουθεί τις πιο πρόσφατες προδιαγραφές IETF.

Πρώτα ενσωματώσαμε το Cronet στις εφαρμογές μας Android για να προσθέσουμε υποστήριξη για το QUIC. Η ενσωμάτωση πραγματοποιήθηκε με τέτοιο τρόπο ώστε να μειωθεί όσο το δυνατόν περισσότερο το κόστος μετανάστευσης. Αντί να αντικαταστήσετε πλήρως την παλιά στοίβα δικτύωσης που χρησιμοποιούσε τη βιβλιοθήκη OkHttp, έχουμε ενσωματώσει το Cronet ΣΤΟ πλαίσιο API OkHttp. Κάνοντας την ενσωμάτωση με αυτόν τον τρόπο, αποφύγαμε αλλαγές στις κλήσεις δικτύου μας (οι οποίες χρησιμοποιούνται από Αναβάθμιση) σε επίπεδο API.

Παρόμοια με την προσέγγιση για συσκευές Android, εφαρμόσαμε το Cronet σε εφαρμογές Uber στο iOS, παρεμποδίζοντας την κυκλοφορία HTTP από το δίκτυο APIχρησιμοποιώντας Πρωτόκολλο NSURL. Αυτή η αφαίρεση, που παρέχεται από το Ίδρυμα iOS, χειρίζεται δεδομένα URL για συγκεκριμένα πρωτόκολλα και διασφαλίζει ότι μπορούμε να ενσωματώσουμε το Cronet στις εφαρμογές μας για iOS χωρίς σημαντικό κόστος μετεγκατάστασης.

παρμένο από αυτή η μετάφραση Άρθρα Uber

Στο backend έπιασαν συνδέσεις QUIC μέσω του Google Cloud lb, το οποίο υποστηρίζει πρωτόκολλο από τα μέσα του 2018.

Δεν αποτελεί έκπληξη το γεγονός ότι το Google Cloud λειτουργεί εξαιρετικά με το πρωτόκολλο που έχει αναπτύξει η Google, αλλά ποιες είναι οι εναλλακτικές λύσεις;

nginx

Πριν από λίγο καιρό το CloudFlare Προσπάθησα να περάσω nginx (το οποίο δεν υποστηρίζει HTTP/3 από προεπιλογή) με το εργαλείο Quiche. Η υλοποίηση είναι διαθέσιμη ως ένα ενιαίο αρχείο .patch, το οποίο συνοδεύεται από ένα σεμινάριο εγκατάστασης:

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

Εδώ μπορείτε να συνδέσετε τις μονάδες σας εάν είναι απαραίτητο

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

Το μόνο που μένει είναι να ενεργοποιήσετε την υποστήριξη 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';
    }
}

Δεν είναι ακόμη δυνατή η σύνδεση μέσω HTTP/3 σε κανονικά προγράμματα περιήγησης, αλλά μπορείτε να χρησιμοποιήσετε Chrome Canary και τρέξτε το με τη σημαία --enable-quic, μεταβείτε στον διακομιστή σας ή, για παράδειγμα, στον ιστότοπο quic.rocks και δείτε τον τύπο σύνδεσης στα Εργαλεία προγραμματιστή:
HTTP μέσω UDP - αξιοποίηση του πρωτοκόλλου QUIC
Αντί για HTTP/3 είναι γραμμένο http2+quic/99, αλλά ουσιαστικά είναι το ίδιο πράγμα.

Άλλες τεχνολογίες

  • Υποστήριξη και QUIC LiteSpeed (που συνδέθηκε στο Facebook μέσω HTTP/3 με μεγάλη φανφάρα) και προοδευτική Κουτί. Ο Apache δεν μπορεί να το κάνει ακόμα, αλλά η δουλειά βρίσκεται σε εξέλιξη σε πλήρη εξέλιξη.
  • 21 Ιανουαρίου ενημερώθηκε προσχέδιο προτύπου για WebRTC
  • Μόλις τις προάλλες άνοιξε η Microsoft κώδικας υλοποίησης msquic, στο οποίο δεν είναι ακόμη διαθέσιμες όλες οι λειτουργίες από το πρότυπο IETF, αλλά αυτό είναι ήδη μια μεγάλη ανακάλυψη.

Συμπέρασμα

HTTP μέσω UDP - αξιοποίηση του πρωτοκόλλου QUIC

Το ενδιαφέρον για το QUIC είναι ασταθές, αλλά αυξάνεται, και γίνονται εργασίες για την τυποποίησή του. Νέες υλοποιήσεις του πρωτοκόλλου εμφανίζονται σχεδόν κάθε μήνα και κάθε χρόνο όλο και περισσότεροι προγραμματιστές είναι πεπεισμένοι ότι το QUIC είναι το μέλλον. Είναι ακόμη δυνατό να συμπεριληφθεί το πρωτόκολλο σε μελλοντικές εκδόσεις της στοίβας TCP, πράγμα που σημαίνει ότι αργά ή γρήγορα ολόκληρο το Διαδίκτυο θα μετακινηθεί σε πιο σταθερές και ταχύτερες συνδέσεις.

Ήδη τώρα μπορείτε να διαμορφώσετε την αλληλεπίδραση QUIC για την υποδομή σας ή ακόμα και να τη δώσετε σε προγράμματα περιήγησης - όλα σχεδιάζουν να προσθέσουν υποστήριξη για το πρωτόκολλο και τα θλιβερά στατιστικά στοιχεία με το caniuse θα γίνουν πιο χαρούμενα.

HTTP μέσω UDP - αξιοποίηση του πρωτοκόλλου QUIC

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο