Ένα διαδραστικό κέλυφος πάνω από τη σήραγγα παγώνει για αρκετά δευτερόλεπτα όσο τρέχει μια αντιγραφή αρχείου και μετά συνεχίζει σαν να μη συνέβη τίποτα. Μόνο η λήψη έχει πρόβλημα, όμως και το κέλυφος περιμένει, και τα δύο ανακάμπτουν την ίδια στιγμή. Αυτό το μοτίβο είναι η υπογραφή μιας μοναδικής αξιόπιστης ροής που μεταφέρει πολλές συνομιλίες, και επιβιώνει σχεδόν σε κάθε ρύθμιση που δοκιμάζουν πρώτα οι άνθρωποι.

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

Το σύμπτωμα: όλα παγώνουν ταυτόχρονα

Δύο εσωτερικές συνδέσεις που κολλάνε μαζί είναι το στοιχείο. Μια αργή λήψη και ένα αργό κέλυφος είναι ξεχωριστές συνομιλίες TCP με ξεχωριστούς αριθμούς ακολουθίας και ξεχωριστή κατάσταση συμφόρησης, οπότε μια βλάβη στη μία δεν θα έπρεπε να αγγίζει την άλλη. Όταν παγώνουν με τον ίδιο ρυθμό, κάτι πάνω από αυτές ταξινομεί τα byte τους.

Αυτό το κάτι είναι το μεταφορικό επίπεδο της σήραγγας. Σε λειτουργία TCP, το OpenVPN γράφει τα ενθυλακωμένα πακέτα σε μία σύνδεση TCP προς τον ομότιμο, και το συμβόλαιο του TCP είναι η παράδοση με σειρά μιας μοναδικής ροής byte. Τα επόμενα byte δεν παραδίδονται στην εφαρμογή πριν από τα χαμένα, ανεξάρτητα από το σε ποια εσωτερική συνομιλία ανήκουν.

Προσέξτε τι δεν λέει το σύμπτωμα. Δεν λέει ότι η διαδρομή είναι χαλασμένη, ότι ο διακομιστής είναι υπερφορτωμένος ή ότι η κρυπτογράφηση είναι αργή. Αυτά δίνουν άλλα σχήματα: ομοιόμορφα χαμηλή απόδοση, χρονικά όρια ή βλάβες που επηρεάζουν μία κατεύθυνση. Μια κοινή παύση που τελειώνει όταν ένα χαμένο τμήμα αναμεταδίδεται είναι ειδικά φαινόμενο σειράς.

Μία εξωτερική ροή byte, πολλές εσωτερικές συνομιλίες

Φανταστείτε τη σήραγγα να μεταφέρει ταυτόχρονα μια λήψη και ένα κέλυφος. Ένα τμήμα της εξωτερικής σύνδεσης χάνεται. Τα επόμενα τμήματα μπορεί να φτάσουν στον υποδοχέα και η στοίβα TCP υποδοχής θα τα επιβεβαιώσει, αλλά δεν μπορεί να τα παραδώσει προς τα πάνω μέχρι να γεμίσει το κενό. Επομένως το OpenVPN δεν έχει τίποτα να διαβάσει για το κέλυφος, αν και τα byte του ίδιου του κελύφους έφτασαν εδώ και πολύ καιρό.

Αυτός είναι αποκλεισμός στην κεφαλή της ουράς μέσα σε μία σύνδεση, και δεν απαιτεί να μοιράζονται οι δύο εφαρμογές μια εσωτερική σύνδεση. Μοιράζονται την εξωτερική, και αυτό αρκεί.

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

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

Γιατί ένα μεγαλύτερο εσωτερικό χρονόμετρο δεν μπορεί να βοηθήσει

Η αύξηση του ελάχιστου χρόνου επαναμετάδοσης σε μια διαδρομή, με το rto_min, αναβάλλει την επαναμετάδοση με χρονόμετρο για τοπικά παραγόμενη κίνηση TCP που χρησιμοποιεί αυτή τη διαδρομή. Είναι πραγματικό κουμπί με πραγματικό αποτέλεσμα, και αντιμετωπίζει το πρόβλημα δεύτερης τάξης αντί για το πρώτο.

ip route show
ip route show cache 2>/dev/null | head
ss -tin dst 10.70.0.1

Αυτό που δεν μπορεί είναι να ελευθερώσει εξωτερικά byte εκτός σειράς, να ανακτήσει το χαμένο τμήμα γρηγορότερα ή να κάνει τον απομακρυσμένο διακομιστή εφαρμογής να υιοθετήσει το ίδιο χρονόμετρο. Η στοίβα υποδοχής εξακολουθεί να παραδίδει με σειρά, και ο αποστολέας στο άλλο άκρο εξακολουθεί να χρησιμοποιεί τις δικές του μετρήσεις χρόνου μετάβασης.

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

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

Τι κάνει και τι δεν κάνει το tcp-nodelay

Η επιλογή σήραγγας που απενεργοποιεί την προσωρινή αποθήκευση τύπου Nagle στην υποδοχή μεταφοράς έχει στενό σκοπό: εμποδίζει τις μικρές εγγραφές να περιμένουν περισσότερα δεδομένα πριν από τη μετάδοση. Αυτό βοηθά τη διαδραστική κίνηση να αποφύγει μια πρόσθετη καθυστέρηση σε μια κατά τα άλλα υγιή διαδρομή.

Δεν κάνει τη μεταφορά άτακτη και δεν συντομεύει την αποκατάσταση μετά από χαμένο τμήμα. Ένα κέλυφος που παγώνει για ένα χρονικό όριο επαναμετάδοσης θα παγώσει ακόμη και με την επιλογή ενεργή, γιατί η επιλογή δεν άγγιξε ποτέ τον κανόνα σειράς.

Το να μπερδέψει κανείς τα δύο είναι εύκολο γιατί και τα δύο περιγράφονται ως διορθώσεις καθυστέρησης. Το ένα αφαιρεί μια τεχνητή αναμονή που εισάγει η προσωρινή αποθήκευση, το άλλο θα απαιτούσε να αλλάξει αυτό που εγγυάται η μεταφορά, και καμία επιλογή υποδοχής δεν το κάνει.

Πώς συγκρίνουμε δίκαια τα μεταφορικά επίπεδα

Αν ο διαχειριστής το επιτρέπει και υπάρχουν και οι δύο υπηρεσίες, συγκρίνετε μια υπηρεσία UDP και μια υπηρεσία TCP που μεταφέρουν το ίδιο φορτίο στην ίδια διαδρομή πρόσβασης προς τον ίδιο διακομιστή. Η αλλαγή χώρας, παρόχου ή γενιάς διακομιστή ανάμεσα στις δύο δοκιμές εισάγει μια μεταβλητή που θα κυριαρχήσει στο αποτέλεσμα.

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

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

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

Σχετικά άρθρα