Πλήρως αμφίδρομη ροή και αντίθλιψη σε relay SOCKS
Σχεδιάστε τη ροή του relay γύρω από ανεξάρτητες ροές byte, μερική I/O, φραγμένους buffers και αντίθλιψη αντί για εικασίες μεγέθους απόκρισης.
Η χειραψία SOCKS πέτυχε. Τώρα το relay διαβάζει από τον πελάτη, γράφει στον προορισμό, περιμένει πλήρη απόκριση και μόνο τότε διαβάζει ξανά από τον πελάτη. Αυτή η ακολουθία μπορεί να οδηγήσει σε αδιέξοδο μια απολύτως έγκυρη εφαρμογή.
Μόλις εδραιωθεί η σήραγγα TCP, το SOCKS δεν ορίζει τα μηνύματα μέσα της. Ο προορισμός μπορεί να στείλει πρώτος. Και οι δύο πλευρές μπορούν να στέλνουν ανεξάρτητα. Η μία πλευρά μπορεί να στείλει μια σύντομη εγγραφή και μετά να περιμένει την απάντηση της άλλης.
Προωθήστε byte, όχι εικαζόμενες συναλλαγές
Μια κλήση λήψης επιστρέφει τα διαθέσιμα byte σύμφωνα με τις σημαίες και την κατάσταση του socket. Δεν λέει σε ένα γενικό relay ότι η απόκριση της εφαρμογής είναι πλήρης. Η αναμονή να γεμίσει ένα αυθαίρετα μεγάλο buffer μπορεί να εμποδίσει την προώθηση του μικρού μηνύματος που χρειάζεται ο ομότιμος για να συνεχίσει.
Χρησιμοποιήστε το υπάρχον μοντέλο ταυτοχρονισμού της εφαρμογής για να εξυπηρετήσετε και τις δύο κατευθύνσεις: βρόχο γεγονότων, ασύγχρονη I/O ή άλλο σκόπιμα επιλεγμένο σχεδιασμό. Η σημαντική συμπεριφορά είναι ότι η πρόοδος στη μία κατεύθυνση δεν απαιτεί επινοημένο όριο μηνύματος στην άλλη.
Κρατήστε δύο φραγμένους buffers εκκρεμότητας
Τα δεδομένα που διαβάστηκαν από τον πελάτη μπορεί ακόμη να περιμένουν να φτάσουν στον προορισμό, ενώ τα δεδομένα από τον προορισμό περιμένουν να φτάσουν στον πελάτη. Παρακολουθήστε αυτά τα byte εκκρεμότητας ξεχωριστά.
Μια αποστολή μπορεί να γράψει λιγότερα byte από όσα ζητήθηκαν. Διατηρήστε το άγραφο τμήμα· μην το απορρίψετε και μην επαναλάβετε ολόκληρο το buffer. Ένα προσωρινά μη εγγράψιμο socket είναι λόγος να περιμένετε το σωστό γεγονός ετοιμότητας, όχι να περιστρέφεστε συνεχώς.
Φράξτε τα buffer. Αν ο προορισμός είναι αργός, η συνέχιση ανάγνωσης απεριόριστων δεδομένων πελάτη απλώς μεταφέρει την ουρά στη μνήμη του relay. Η αντίθλιψη σημαίνει παύση των αναγνώσεων όταν το αντίστοιχο buffer είναι γεμάτο και επανάληψη όταν οι εγγραφές απελευθερώνουν χώρο.
Ένα τέλος σε μία κατεύθυνση χρειάζεται πολιτική
Το TCP μπορεί να κλείσει μια κατεύθυνση αποστολής ενώ η άλλη έχει ακόμη χρήσιμα δεδομένα. Αποφασίστε πώς θα μεταδοθεί αυτή η συνθήκη αφού στραγγίσουν τα bufferαρισμένα byte, και διακρίνετε το ομαλό κλείσιμο από σφάλμα ή προθεσμία.
Κανένα από αυτά δεν απαιτεί από το relay να αποκρυπτογραφεί ή να αναλύει το ωφέλιμο φορτίο της εφαρμογής. Χρειάζεται σωστό χειρισμό ροής. Η αύξηση μόνο του μεγέθους του buffer δεν μπορεί να διορθώσει ένα relay που περιμένει τη λάθος πλευρά ή υποθέτει ότι κάθε ανάγνωση αντιστοιχεί σε ένα ολόκληρο αίτημα.