«Στείλε τις μεγάλες λήψεις γύρω από το VPN και κράτα τις μικρές αποκρίσεις πάνω του» ακούγεται σαν πολιτική δρομολόγησης, αλλά δεν είναι. Ο δρομολογητής αποφασίζει με πληροφορίες διαθέσιμες εκείνη τη στιγμή: διευθύνσεις, θύρες, πρωτόκολλο, σημάνσεις firewall, αναγνωρισμένη ροή. Το τελικό μέγεθος μιας απόκρισης δεν ανήκει σε αυτό το σύνολο, γιατί δεν έχει φτάσει ακόμη, και όταν ο δρομολογητής θα μπορούσε να μετρήσει τα byte, τα μεταφέρει ήδη. Αν θέλετε καθοδήγηση ανά εργασία, η απόφαση πρέπει να μετακινηθεί σε σημείο που γνωρίζει την εργασία, και η λίστα ελέγχου παρακάτω δείχνει αν ο σχεδιασμός σας έχει τέτοιο σημείο.

Γιατί ένας δρομολογητής δεν μπορεί να μετρήσει μια απόκριση

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

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

Έλεγχος 1: υπάρχει σημείο απόφασης που μπορεί να επιλέξει διαδρομή;

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

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

Έλεγχος 2: τι σας λένε πραγματικά τα μεταδεδομένα;

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

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

Έλεγχος 3: υπάρχει ήδη η ροή;

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

conntrack -L -p tcp --dport 443 | head -5
ip route get 203.0.113.10
ss -tn state established dst 203.0.113.10

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

Έλεγχος 4: είναι η πραγματική απαίτηση η καθυστέρηση, όχι η έξοδος;

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

tc qdisc replace dev eth0 root cake bandwidth 100mbit

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

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

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

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