Διαβάστε οκτώ byte και μετά παραδώστε το τούνελ SOCKS4
Αποφύγετε να καταπιείτε τον χαιρετισμό του προορισμού ή να περιμένετε byte που δεν υπάρχουν, αναλύοντας το σταθερό όριο της απάντησης SOCKS4.
Το αίτημα σύνδεσης SOCKS4 πετυχαίνει, αλλά η εφαρμογή δεν βλέπει ποτέ τον αρχικό χαιρετισμό του διακομιστή. Ένα σημείο για έλεγχο είναι η πρώτη ανάγνωση του connector. Μια ανάγνωση δεκαέξι byte είναι πολύ μεγάλη για μια απάντηση SOCKS4 οκτώ byte.
| Πεδίο απάντησης | Byte |
|---|---|
| Πεδίο έκδοσης απάντησης | 1 |
| Κωδικός αποτελέσματος | 1 |
| Πεδίο θύρας | 2 |
| Πεδίο διεύθυνσης | 4 |
Ο κωδικός αποτελέσματος 0x5a δείχνει ότι το αίτημα εγκρίθηκε. Το SOCKS4a αλλάζει τον τρόπο με τον οποίο το αίτημα μεταφέρει ένα όνομα κεντρικού υπολογιστή· δεν μετατρέπει την απάντηση σε δεκαέξι byte.
Μετά την απάντηση, το ίδιο ρεύμα TCP μεταφέρει το πρωτόκολλο του προορισμού. Ένας διακομιστής αλληλογραφίας μπορεί να στείλει τον χαιρετισμό του αμέσως. Επομένως, μια ανάγνωση που καταναλώνει δεκαέξι διαθέσιμα byte μπορεί να πάρει την πλήρη απάντηση του proxy μαζί με τα πρώτα οκτώ byte αυτού του χαιρετισμού. Αν δεν ακολουθεί ακόμη τίποτα, μια υπερμεγέθης αποκλειστική ανάγνωση μπορεί αντίθετα να προσθέσει μια περιττή αναμονή.
Το ακριβές μήκος είναι ευθύνη του parser
Το να ζητήσετε οκτώ byte μία φορά δεν είναι επαρκής απόδειξη ότι έφτασαν οκτώ byte. Οι αναγνώσεις ρεύματος μπορούν να επιστρέψουν λιγότερα. Συλλέξτε ακριβώς το μήκος της απάντησης εντός προθεσμίας, σταματήστε σε κλειστό ή αποτυχημένο ρεύμα, εξετάστε την απάντηση και αφήστε τα επόμενα byte στην εφαρμογή.
Αν ο connector χρησιμοποιεί μεγαλύτερη buffered ανάγνωση, διατηρήστε ό,τι βρίσκεται μετά το όριο και παραδώστε το στον επόμενο καταναλωτή. Το πέταμα του πλεονάσματος είναι η ίδια απώλεια δεδομένων με διαφορετικό μέγεθος ανάγνωσης.
Το SOCKS5 χρειάζεται τον δικό του parser. Η διεύθυνση της απάντησής του μπορεί να έχει διαφορετικά μήκη ανάλογα με τον τύπο διεύθυνσης. Η αντικατάσταση κάθε ανάγνωσης proxy με σταθερή ανάγνωση οκτώ byte θα διόρθωνε ένα πρωτόκολλο ενώ θα έσπαγε ένα άλλο.