3. Sockets


  • Sockets και επίπεδο εφαρμογών

  • Παράδειγμα εφαρμογής: Πρωτόκολλο SMTP


    | TABLE OF CONTENTS |


    3.Sockets και επίπεδο εφαρμογών


    Μέχρι τώρα έχουμε περιγράψει πως ένα σύνολο δεδομένων διασπάται σε datagrams, στέλνεται σε ένα άλλο υπολογιστή, και επανασυντίθεται. Υπάρχει όμως κάτι ακόμα, το οποίο είναι αναγκαίο για να πετύχουμε κάτι χρήσιμο. Πρέπει δηλ. να υπάρχει ένας τρόπος ώστε να ανοίξουμε σύνδεση με ένα συγκεκριμένο υπολογιστή, να κάνουμε login, να επιλέξουμε το file προς μεταφορά και να ελέγξουμε τη μεταφορά του αρχείου. (Αυτά για το παράδειγμα της μεταφοράς αρχείου. Αν σκέφτεστε κάποια άλλη εφαρμογή, π.χ. computer mail, είναι απαραίτητο κάποιο ανάλογο πρωτόκολλο). Αυτό επιτυγχάνεται με τα πρωτόκολλα εφαρμογών τα οποία τρέχουν πάνω από το TCP/IP. Έτσι, όταν πρέπει να σταλεί ένα μήνυμα, τα πρωτόκολλα αυτά δίνουν το μήνυμα στο TCP. To TCP εξασφαλίζει την άφιξή τους στο άλλο άκρο. Επειδή το TCP και το IP φροντίζουν όλες τις λεπτομέρειες σε σχέση με το δίκτυο, τα πρωτόκολλα εφαρμογών αντιμετωπίζουν τη σύνδεση του δικτύου σαν ένα απλό κανάλι, όπως είναι η γραμμή του τηλεφώνου ή των τερματικών. Πριν μπούμε σε περισσότερες λεπτομέρειες για τα προγράμματα εφαρμογών, πρέπει να περιγράψουμε το πως εντοπίζεται μια εφαρμογή. Ας υποθέσουμε ότι θέλετε να στείλετε ένα αρχείο σε έναν υπολογιστή με Internet διεύθυνση 128.6.4.7. Για να αρχίσει η διαδικασία χρειάζονται πολύ περισσότερα από τη διεύθυνση Internet. Πρέπει αρχικά να συνδεθείτε με τον FTP server του άλλου άκρου. Τελικά, τα προγράμματα δικτύου είναι ειδικευμένα για μια συγκεκριμένη ομάδα εργασιών. Τα περισσότερα συστήματα έχουν ξεχωριστά προγράμματα για το χειρισμό μεταφορών αρχείων, logins σε απομακρυσμένα τερματικά, mail, κ.λ.π. Όταν συνδεθείτε με το 128.6.4.7, πρέπει να καθορίσετε ότι θέλετε να μιλήσετε στον FTP server. Αυτό γίνεται έχοντας καλά- καθορισμένα sockets για κάθε server. Θυμηθείτε ότι το TCP χρησιμοποιεί port numbers για να αναγνωρίσει τις συνδιαλέξεις. Τα προγράμματα χρηστών συνήθως χρησιμοποιούν τυχαία port numbers. Υπάρχουν όμως καθορισμένα port numbers που ανατίθενται σε προγράμματα που τρέχουν, αναμένοντας αιτήσεις π.χ. αν θέλετε να στείλετε ένα αρχείο, θα τρέξετε το πρόγραμμα ftp. Αυτό θα ανοίξει μια σύνδεση, χρησιμοποιώντας ένα τυχαίο αριθμό πόρτας π.χ. 1234. Το άλλο όμως άκρο θα χρησιμοποιήσει καθορισμένο αριθμό πόρτας, τον 21. Αυτός είναι το επίσημο port number για τον FTP server. Σημειώστε ότι υπάρχουν duo διαφορετικά προγράμματα που εμπλέκονται στην όλη διαδικασία. Εσείς τρέχετε το ftp στη δική σας πλευρά. Αυτό είναι ένα πρόγραμμα σχεδιασμένο να δέχεται εντολές από το τερματικό σας και να τις περνάει στο άλλο άκρο. Το πρόγραμμα με το οποίο μιλάτε στη μηχανή είναι ο FTP server. Είναι σχεδιασμένος ώστε να δέχεται εντολές από την αντίστοιχη σύνδεση του δικτύου. Δεν χρειάζεται το πρόγραμμα σας να χρησιμοποιεί ένα καλά-καθορισμένο αριθμό socket. Κανένας δεν προσπαθεί να το εντοπίσει. Οι servers όμως, πρέπει να έχουν καλά-καθορισμένους αριθμούς, ώστε να μπορούν να γίνουν συνδέσεις σ αυτούς και να τους αποστέλλονται εντολές. Μια σύνδεση περιγράφεται στην πραγματικότητα από ένα σύνολο τεσσάρων αριθμών : τη διεύθυνση Internet σε κάθε άκρο και το TCP port number σε κάθε άκρο. Ποτέ δυο διαφορετικές συνδέσεις δεν έχουν το ίδιο σετ αριθμών. Αρκεί ένας οποιοσδήποτε αριθμός να είναι διαφορετικός. Για παράδειγμα, είναι πιθανόν δυο διαφορετικοί χρήστες σε μια μηχανή να στέλνουν αρχεία στην ίδια μηχανή. Κάτι τέτοιο θα είχε σαν αποτέλεσμα συνδέσεις με τις ακόλουθες παραμέτρους: Internet addresses TCP ports connection 1 128.6.4.194, 128.6.4.7 1234, 21 connection 2 128.6.4.194, 128.6.4.7 1235, 21 Εφόσον, και στις δυο συνδέσεις παίρνουν μέρος οι ίδιες μηχανές, και οι διευθύνσεις Internet θα είναι ίδιες. Επίσης, αφού και οι δυο μεταφέρουν αρχεία η μια άκρη της σύνδεσης αφορά το καλά-καθορισμένο port number για το FTP. Το μόνο που διαφέρει είναι το port number για το πρόγραμμα που τρέχουν οι χρήστες. Αυτή η διαφορά είναι αρκετή. Γενικά, σε μια τουλάχιστον από τις άκρες της σύνδεσης απαιτείται από το s/w του δικτύου η ανάθεση του port number να είναι μοναδική. Συνήθως αυτό γίνεται στο άκρο του χρήστη αφού ο server πρέπει να χρησιμοποιήσει καλά-καθορισμένο αριθμό πόρτας. Τώρα που γνωρίζουμε πως ανοίγονται οι συνδέσεις, ας πάμε πίσω στα προγράμματα εφαρμογών. Όπως αναφέρθηκε νωρίτερα, από τη στιγμή που το TCP έχει ανοίξει τη σύνδεση, μπορούμε να αναφερόμαστε στη σύνδεση αυτή σαν να είναι ένα απλό σύρμα. Για όλα τα δύσκολα μέρη φροντίζουν το TCP και το IP. Χρειαζόμαστε όμως ακόμα μερικές συμφωνίες, όπως για παράδειγμα, το τι θα σταλεί κατά τη διάρκεια της σύνδεσης αυτής. Στην ουσία, πρέπει να συμφωνηθεί ποιό θα είναι το σετ εντολών της εφαρμογής και τι format θα χρησιμοποιηθεί κατά τηναποστολή. Γενικά, οτιδήποτε αποστέλλεται είναι ένας συνδυασμός εντολών και δεδομένων. Ο διαχωρισμός γίνεται ανάλογα με τα συμφραζόμενα. Για παράδειγμα το πρωτόκολλο ταχυδρομείου δουλεύει ως εξής: Το δικό σας πρόγραμμα mail ανοίγει μια σύνδεση με τον mail server που βρίσκεται στο άλλο άκρο και του δίνει το όνομα της μηχανής σας, τον αποστολέα του μηνύματος και τους παραλήπτες. Μετά στέλνει μια εντολή που δηλώνει την αρχή του μηνύματος. Στο σημείο αυτό, το άλλο άκρο σταματά να θεωρεί σαν εντολές αυτά που παραλαμβάνει, και αρχίζει να d]wetai το μήνυμα. Το δικό σας άκρο αρχίζει τότε να στέλνει το κείμενο του μηνύματος. Στο τέλος του μηνύματος αποστέλλεται ένα ειδικό σημάδι (μια τελεία στην πρώτη στήλη). Μετά από αυτό και τα δυο άκρα καταλαβαίνουν ότι το πρόγραμμα στέλνει ξανά εντολές. Αυτός είναι ο απλούστερος τρόπος και χρησιμοποιείται από τις περισσότερες εφαρμογές. Η μετάδοση αρχείων είναι κάπως πιο σύνθετη. Το πρωτόκολλο μεταφοράς αρχείων απαιτεί δυο διαφορετικές συνδέσεις. Η διαδικασία ξεκινάει όπως ακριβώς αυτή του mail. Το πρόγραμμα του χρήστη στέλνει εντολές όπως βάλε με στο σύστημα δίνοντας το όνομα χρήστη, πάρε το password μου, στείλε μου το αρχείο με το τάδε όνομα. Όταν σταλεί η εντολή αίτησης αποστολής δεδομένων, μια δεύτερη σύνδεση ανοίγεται μόνο για τα δεδομένα. Θα ήταν βέβαια δυνατό τα δεδομένα να σταλούν μέσω της ίδιας σύνδεσης, όπως γίνεται και στο ταχυδρομείο. Επειδή όμως οι μεταφορές αρχείων διαρκούν πολύ, οι σχεδιαστές του πρωτόκολλου μεταφοράς αρχείων ήθελαν να επιτρέπουν στον χρήστη να μπορεί να δίνει εντολές και κατά τη διάρκεια της μεταφοράς. Για παράδειγμα, ο χρήστης μπορεί να θέλει να κάνει μια επεξεργασία, ή να σταματήσει τη μεταφορά. Έτσι, κρίθηκε σκόπιμο να εγκαθίσταται μια ξεχωριστή σύνδεση για τα δεδομένα και η αρχική σύνδεση να χρησιμοποιείται μόνο για εντολές. Οι απομακρυσμένες συνδέσεις τερματικού χρησιμοποιούν άλλο μηχανισμό. Για τα απομακρυσμένα logins υπάρχει μια μόνο σύνδεση που κανονικά στέλνει δεδομένα. Όταν είναι απαραίτητη η αποστολή μιας εντολής (π.χ. για την αλλαγή του τύπου τερματικού ή κάποιου mode), ένας ειδικός χαρακτήρας χρησιμοποιείται για να δηλώσει ότι ο επόμενος χαρακτήρας ανήκει σε εντολή. Αν ο χρήστης πληκτρολογήσει τον ειδικό αυτό χαρακτήρα σαν δεδομένο, τότε στέλνονται δυο ειδικοί χαρακτήρες. Δεν θα περιγράψουμε εδώ με λεπτομέρεια τα πρωτόκολλα εφαρμογών. Για περισσότερες λεπτομέρειες μπορείτε να αποτανθείτε στα αντίστοιχα RFCs.. Υπάρχουν όμως μερικές κοινές συμβάσεις που χρησιμοποιούνται από τις εφαρμογές και τις οποίες θα περιγράψουμε. Πρωτ απ όλα, το TCP/IP πρέπει να μπορεί να χρησιμοποιηθεί σε κάθε υπολογιστή. Δυστυχώς δεν συμφωνούν όλοι οι υπολογιστές όσον αφορά την αναπαράσταση δεδομένων. Υπάρχουν διαφορές στις κωδικοποιήσεις χαρακτήρων (ASCII-EBCDIC), στις συμβάσεις τέλους γραμμής (CR,LF, κ.λ.π.) και στο αν τα τερματικά περιμένουν οι χαρακτήρες να σταλούν ένας , ή μια γραμμή κάθε φορά. Για να επιτραπεί λοιπόν η επικοινωνία διαφορετικών ειδών υπολογιστών, κάθε πρωτόκολλο εφαρμογών καθορίζει μια standard αναπαράσταση. Σημειώστε, ότι το TCP και το IP δεν ενδιαφέρονται για τις αναπαραστάσεις αυτές. Το TCP απλά στέλνει octets. Παρ όλα αυτά τα προγράμματα και στα δυο άκρα πρέπει να συμφωνήσουν στο πως μεταφράζονται τα octets. Τα RFC για κάθε εφαρμογή καθορίζουν τη standard αναπαράσταση, η οποία είναι συνήθως netASCII. Στην περίπτωση αυτή χρησιμοποιούνται ASCII χαρακτήρες όπου το τέλος γραμμής δηλώνεται με CR, ακολουθούμενο από LF. Για απομακρυσμένο login, υπάαρχει επίσης ο ορισμός standard terminal, που σημαίνει half-duplex τερματικό με echo στην τοπική μηχανή. Οι περισσότερες εφαρμογές δίνουν τη δυνατότητα σε δυο υπολογιστές να συμφωνήσουν σε άλλες αναπαραστάσεις, αν αυτό διευκολύνει. Για παράδειγμα, το PDP-10 έχει 36-bit λέξεις. Υπάρχει τρόπος ώστε δυο PDP-10 να μπορούν να συμφωνήσουν για αποστολή ενός 36-bit δυαδικού αρχείου. Επίσης, δυο συστήματα που προτιμούν full-duplex συνομιλία, μπορούν να συμφωνήσουν. Κάθε εφαρμογή όμως έχει μια standard αναπαράσταση που κάθε μηχανή πρέπει να υποστηρίζει. |TABLE OF TOPICS| |TABLE OF CONTENTS|


    3.1 Παράδειγμα εφαρμογής: Πρωτόκολλο SMTP


    Για να δώσουμε μια πιο ολοκληρωμένη εικόνα του τι συμβαίνει με τα πρωτόκολλα εφαρμογών θα δείξουμε ένα παράδειγμα του SMTP που είναι τοπρωτόκολλο ταχυδρομείου (SMTP: simple mail transfer protocol). Υποθέτουμε ότι ο υπολογιστής με όνομα TOPAZ.RUTGERS.EDU θέλει να στείλει το ακόλουθο μήνυμα στον χρήστη LEVY@RED.RUTGERS.EDU: Date: Sat, 27 Jun 87 13:26:31 EDT From: hedrick@topaz.rutgers.edu To: levy@red.rutgers.edu Subject: meeting Let's get together Monday at 1pm. Αρχικά σημειώστε, ότι το format του μηνύματος περιγράφεται από ένα Internet standard (RFC 822). Το standard αυτό δηλώνει ότι το μήνυμα πρέπει να μεταδοθεί σαν netASCII (πρέπει να είναι ASCII με CR/LF μεταξύ των γραμμών). Επίσης περιγράφει τη γενικότερη δομή κατά την οποία πρέπει να υπάρχει μια ομάδα γραμμών επικεφαλίδων, μετά μια κενή γραμμή και τέλος το σώμα του μηνύματος. Ακόμη περιγράφει το συντακτικό των γραμμών επικεφαλίδων με λεπτομέρεια (Γενικά, οι γραμμές αυτές αποτελούνται από μια λέξη κλειδί και μια τιμή, όπως π.χ. date: Sat, 27 Jun........). Ο τρόπος με τον οποίο το μήνυμα αποστέλλεται στο άλλο σύστημα, περιγράφεται στα RFC 821 και974.Το πρόγραμμα που πραγματοποιεί την αποστολή ρωτάει τον name server αρκετές ερωτήσεις ώστε να καθορίσει τη δρομολόγηση του μηνύματος. Η πρώτη ερώτηση αφορά τον εντοπισμό των μηχανών οι οποίες χειρίζονται το mail του RED.RUTGERS.EDU. Στην περίπτωση αυτή ο server απαντά ότι ο RED.RUTGERS.EDU χειρίζεται μόνος του το mail του. Μετά το πρόγραμμα ρωτάει για τη διεύθυνση του RED.RUTGERS.EDU, που είναι η 128.6.4.2. Στο σημείο αυτό το πρόγραμμα ταχυδρομείου ανοίγει μια TCP σύνδεση στην πόρτα 25 του 128.6.4.2. Η πόρτα 25 είναι το καλά-καθορισμένο socket για την παραλαβή ταχυδρομείου. Αφού εγκατασταθεί η σύνδεση αυτή, το πρόγραμμα ταχυδρομείου αρχίζει να st]kmei εντολές. Αμέσως παρακάτω βλέπουμε μια τυπική συνδιάλεξη. Κάθε γραμμή ονομάζεται RED ή TOPAZ αναλόγως από που προέρχεται η αντίστοιχη διαδικασία. Το TOPAZ αρχικοποιεί τη σύνδεση: RED 220 RED.RUTGERS.EDU SMTP Service at 29 Jun 87 05:17:18 EDT TOPAZ HELO topaz.rutgers.edu RED 250 RED.RUTGERS.EDU - Hello, TOPAZ.RUTGERS.EDU TOPAZ MAIL From: RED 250 MAIL accepted TOPAZ RCPT To: RED 250 Recipient accepted TOPAZ DATA RED 354 Start mail input; end with . TOPAZ Date: Sat, 27 Jun 87 13:26:31 EDT TOPAZ From: hedrick@topaz.rutgers.edu TOPAZ To: levy@red.rutgers.edu TOPAZ Subject: meeting TOPAZ TOPAZ Let's get together Monday at 1pm. TOPAZ . RED 250 OK TOPAZ QUIT RED 221 RED.RUTGERS.EDU Service closing transmission channel Αρχικά, σημειώστε ότι όλες οι εντολές χρησιμοποιούν κανονικό κείμενο. Αυτό είναι τυπικό για τα standards του Internet. Πολλά από τα πρωτόκολλα χρησιμοποιούν standard ASCII εντολές. Έτσι, είναι εύκολη η εποπτεία και η διάγνωση προβλημάτων. Για παράδειγμα, το πρόγραμμα ταχυδρομείου κρατάει ένα log για κάθε συνδιάλεξη. Αν υπάρξει κάποιο πρόβλημα, το log file μπορεί απλά να ταχυδρομηθεί στον υπεύθυνο, ο οποίος αφού διαβάσει το συγκεκριμένο αρχείο μπορεί να καταλάβει τι έχει συμβεί. Σημειώστε επίσης, ότι οι απαντήσεις αρχίζουν όλες με αριθμούς. Αυτό είναι επίσης τυπικό των πρωτοκόλλων του Internet. Οι επιτρεπτές αποκρίσεις καθορίζονται στο πρωτόκολλο. Οι αριθμοί επιτρέπουν στο πρόγραμμα του χρήστη να αποκριθεί με τρόπο ώστε να μην υπάρχουν ασάφειες. Το υπόλοιπο της απάντησης είναι κείμενο, για χρήση από οποιονδήποτε μπορεί να παρακολουθεί τη συνδιάλεξη ή να κοιτάει το log file και δεν έχει επίδραση στη λειτουργία των προγραμμάτων. Όσον αφορά τις εντολές, απλά επιτρέπουν στο πρόγραμμα ταχυδρομείου που τρέχει στο ένα άκρο να πληροφορεί τον server για οτιδήποτε χρειάζεται ώστε να παραδόσει το μήνυμα. Στην περίπτωση αυτή, ο mail server θα μπορούσε να πάρει τις απαιτούμενες πληροφορίες εξετάζοντας μόνος του το μήνυμα. Αλλά για πιο πολύπλοκες περιπτώσεις, αυτό δεν θα ήταν ασφαλές. Κάθε σύνοδος πρέπει να ξεκινάει με πρόταση HELO, η οποία δίνει το όνομα του συστήματος που άνοιξε τη σύνδεση. Μετά, γίνεται ο καθορισμός του αποστολέα και του παραλήπτη. Τέλος, γίνεται η αποστολή των δεδομένων. Σημειώστε, ότι το κείμενο του μηνύματος τελειώνει με μια γραμμή που περιέχει μόνο μια τελεία. Γενικά, υπάρχει ένα μοντέλο για τους αριθμούς αποκρίσεων. Το πρωτόκολλο καθορίζει το συγκεκριμένο σύνολο αποκρίσεων που μπορούν να σταλούν σαν απαντήσεις σε οποιαδήποτε δεδομένη εντολή. Τα προγράμματα που δεν θέλουν να αναλύουν τις αποκρίσεις με λεπτομέρεια μπορούν απλώς να ελέγχουν το πρώτο τους ψηφίο. Γενικά, οι αποκρίσεις που αρχίζουν με 2 δηλώνουν επιτυχία. Όταν αρχίζουν με 3, χρειάζεται κάποια επιπλέον εργασία. Τα 4 και 5 δηλώνουν λάθος. Το 4 είναι προσωρινό λάθος, όπως π.χ. το γέμισμα του δίσκου. Το μήνυμα φυλάσσεται και η διαδικασία μπορεί να συνεχιστεί αργότερα. Το 5 είναι μόνιμο λάθος, όπως π.χ. η μη ύπαρξη του δηλωμένου παραλήπτη. Τότε το μήνυμα επιστρέφεται στον αποστολέα μαζί με ένα μήνυμα λάθους. (Για περισσότερες λεπτομέρειες σχετικά με τα πρωτόκολλα που αναφέρθηκαν στην παράγραφο αυτή βλεπε RFC 821/822 για mail, RFC 959για μεταφορά αρχείων και τα RFC 854/855 για απομακρυσμένα login. Για τα καλά-καθορισμένα port numbers βλέπε την τρέχουσα έκδοση Assigned numbers και πιθανόν το RFC 814). |TABLE OF TOPICS| |TABLE OF CONTENTS|