Πρωτόκολλο TCP Διάλεξη Ι
Εισαγωγή Οι υπηρεσίες μεταβίβασης δεδομένων ανάμεσα σε δύο επικοινωνούντες πόρους κατατάσσονται σε δύο κατηγορίες: Connectionless ή datagram Connection-oriented Οι υπηρεσίες της πρώτης κατηγορίας θεωρούνται γενικότερα αναξιόπιστες Δεν υπάρχει μηχανισμός παρακολούθησης της επιτυχούς (ή μη) μεταβίβασης των δεδομένων
Εισαγωγή Επομένως, πακέτα μπορεί να παραδοθούν στον προορισμό τους με λάθος σειρά Πακέτα μπορεί να χαθούν κατά τη μεταβίβαση Το πρωτόκολλο IP παρέχει connectionless υπηρεσίες Οι υπηρεσίες της δεύτερης κατηγορίας παρέχουν τους μηχανισμούς που απαιτούνται για αξιόπιστη (reliable) επικοινωνία
Εισαγωγή Οι μηχανισμοί αυτοί υλοποιούν λογικές συνδέσεις για τη μεταβίβαση δεδομένων ανάμεσα στους επικοινωνούντες πόρους Η επιτυχής αποστολή δεδομένων μέσω των συνδέσεων αυτών ελέγχεται από ειδικούς μηχανισμούς επιβεβαίωσης παραλαβής δεδομένων Οι λογικές αυτές συνδέσεις λειτουργούν και, άρα υλοποιούνται, ανεξάρτητα από τον επιμέρους τύπο της επικοινωνίας που εξυπηρετούν
Εισαγωγή Το πρωτόκολλο TCP είναι ένα πρωτόκολλο επιπέδου Μεταφοράς (Transport layer) σχεδιασμένο να παρέχει connectionoriented υπηρεσίες Εδώ θα μας απασχολήσει η λειτουργία του TCP σε συνδυασμό με το πρωτόκολλο IP Ο συνηθέστερος σήμερα χρησιμοποιούμενος συνδυασμός πρωτοκόλλων για την επίτευξη επικοινωνίας στο Διαδίκτυο
TCP Κύριες λειτουργίες Διευθυνσιοδότηση Πολυπλεξία Υλοποίηση (establishment) και διαχείριση σύνδεσης Χειρισμός πολιτικών μετάδοσης/επαναμετάδοσης Έλεγχος ροής και ενταμίευση (buffering) Απόλυση σύνδεσης (connection release)
TCP Διευθυνσιοδότηση Μία σύνδεση TCP δημιουργείται ανάμεσα σε δύο εφαρμογές των επικοινωνούντων πόρων Ο ένας πόρος παίζει το ρόλο του πελάτη εκκινεί την επικοινωνία Ο άλλος πόρος παίζει το ρόλο του εξυπηρετητή Μίατέτοιασύνδεσηορίζεταιμοναδικάαπό τιςδύοαπολήξειςτης
TCP Διευθυνσιοδότηση Η κάθε απόληξη ορίζεται από το ζεύγος: (IP διεύθυνση πόρου, αναγνωριστικό θύρας) Ένα τέτοιο ζεύγος ονομάζεται socket («πρίζα») Αναγνωριστικό θύρας (port number) - 16 bit αριθμός ο οποίος αναγνωρίζει μοναδικά:
TCP Διευθυνσιοδότηση Tη συγκεκριμένη εφαρμογή στην πλευρά του εξυπηρετητή με την οποία και δημιουργείται η σύνδεση Tη συγκεκριμένη εφαρμογή στην πλευρά του πελάτη η οποία και αιτάται τη σύνδεση Οι αριθμοί θύρας χωρίζονται στις εξής κατηγορίες: Well known ports Registered ports
TCP Διευθυνσιοδότηση Ephemeral ports Στην πρώτη κατηγορία ανήκουν αριθμοί 0 1023 Αναγνωρίζουν τις συχνότερα χρησιμοποιούμενες και γενικά σημαντικότερες TCP/IP εφαρμογές (καθορίζονται από RFCs) στην πλευρά του εξυπηρετητή Π.χ. 21 ftp, 80 http, 23 Telnet, 53 DNS, κτλ.
TCP Διευθυνσιοδότηση Στη δεύτερη κατηγορία ανήκουν οι αριθμοί 1024 49151 Αναγνωρίζουν λιγότερο χρησιμοποιούμενες TCP/IP εφαρμογές (δεν καθορίζονται από RFCs) στην πλευρά του εξυπηρετητή Π.χ. 27010 Half Life, 6890 BitTorrent, κτλ. Υπεύθυνος για την απόδοση και διαχείριση των αριθμών της πρώτης και δεύτερης κατηγορίας είναι ο οργανισμός ΙΑΝΑ
TCP Διευθυνσιοδότηση Στην τρίτη κατηγορία ανήκουν οι αριθμοί 49152 65535 Δεν αντιστοιχούν σταθερά σε κάποια εφαρμογή Χρησιμοποιούνται για να αναγνωρίσουν την εφαρμογή που λαμβάνει μέρος στην επικοινωνία από την πλευρά του πελάτη Αποδίδονται τυχαία από τον πόρο-πελάτη και είναι προσωρινοί διαρκούν μόνο για όσο διαρκεί η σύνδεση
TCP Διευθυνσιοδότηση Σε μια μελλοντική σύνδεση, η ίδια εφαρμογή μπορεί να αντιστοιχιστεί σε διαφορετικό αριθμό θύρας Ο ίδιος αριθμός θύρας δεν μπορεί να αναγνωρίζει ταυτόχρονα παραπάνω από μία εφαρμογή στην πλευρά του πελάτη
TCP Πολυπλεξία Ένας πόρος μπορεί να διατηρεί δύο ή περισσότερες λογικές συνδέσεις ταυτόχρονα Στην περίπτωση αυτή δύο ή περισσότερες εφαρμογές χρησιμοποιούν το πρωτόκολλο TCP ταυτόχρονα Στη ροή δεδομένων που δέχεται το πρωτόκολλο TCP είναι πολυπλεγμένα πακέτα διαφορετικών συνδέσεων
TCP Πολυπλεξία Η κάθε σύνδεση αναγνωρίζεται μοναδικά από το αναγνωριστικό θύρας
Επικεφαλίδα TCP
Επικεφαλίδα TCP Πεδίο source port (16 bits): Αναγνωριστικό θύρας εφαρμογής (αφετηρία σύνδεσης) Πεδίο destination port (16 bits): Αναγνωριστικό θύρας εφαρμογής (προορισμός σύνδεσης) Πεδίο sequence number (32 bits): Aριθμός που χρησιμοποιείται για αξιόπιστη μεταβίβαση δεδομένων
Επικεφαλίδα TCP Προσδιορίζει τη σειρά του πρώτου byte του τρέχοντος πακέτου μέσα στη ροή των bytes που αποστέλλονται Υπακούει στη σχέση: Seq(P n ) = Seq(P n-1 ) + Length (P n-1 ) όπου P n είναι το νιοστό πακέτο δεδομένων και Seq(P n ) είναι ο αριθμός που ενθυλακώνεται στοπακέτοαυτό
Επικεφαλίδα TCP Πεδίο acknowledgment number (32 bits): Περιέχει τον αριθμό επιβεβαίωσης, δηλαδή το sequence number του επόμενου byte δεδομένων που ο αποστολέας του πακέτου περιμένει να λάβει Δίδεται από τη σχέση: Αck(P n ) = Seq(RP n-1 ) + Length (RP n-1 )
Παράδειγμα Ας υποθέσουμε ότι ο Α στέλνει το παραπάνω αρχείο (σε τμήματα) στον Β Το κάθε τμήμα που αποστέλλεται έχει ως sequence number το σύνολο των bytes που έχουν ήδη αποσταλεί
Παράδειγμα Ας υποθέσουμε επίσης ότι παράλληλα ο Α λαμβάνει πακέτα δεδομένων από τον Β Έχει ήδη λάβει ένα πακέτο των 1200 bytes Κάθε φορά που ο Α αποστέλλει ένα τμήμα του αρχείου στον Β ενθυλακώνει και τον επόμενο αριθμό byte που περιμένει να λάβει από τον Β
Παράδειγμα Ο αριθμός αυτός είναι ο αριθμός επιβεβαίωσης και στην περίπτωση αυτή ισούται με 1201 Γενικότερα ο αριθμός επιβεβαίωσης επιβεβαιώνει το σύνολο των συνεχόμενων bytes που έχουν ληφθεί μέχρι τώρα
Επικεφαλίδα TCP (συνέχεια) Πεδίο header field (4 bits): To μήκος της επικεφαλίδας σε 32 bit λέξεις Πεδίο flag field (6 bits): Σημαίες SYN, FIN, RST: Χρησιμοποιούνται για την υλοποίηση και τον τερματισμό μίας σύνδεσης θα εξεταστούν παρακάτω Σημαία ACK = 1: Το περιεχόμενο του πεδίου acknowledgment number είναιέγκυροκαιπρέπειναληφθείυπόψη απότοδέκτη
Επικεφαλίδα TCP Η σημαία αυτή είναι συνεχώς ενεργοποιημένη από τη στιγμή που υλοποιείται μια σύνδεση Σημαία PSH=1: O αποστολέας ενεργοποίησε την άμεση προώθηση δεδομένων και ο παραλήπτης πρέπει να παραδώσει άμεσα το πακέτο στην εφαρμογή Προϋποθέτει το άδειασμα τυχόν ταμιευτών (buffers) που χρησιμοποιούνται για τον έλεγχο ροής δεδομένων (βλ. αργότερα)
Επικεφαλίδα TCP Σημαία URG=1: Υπάρχουν δεδομένα μέσα στο πακέτο που έχουν σηματοδοτηθεί ως επείγοντα Πεδίο window size (16 bits): Ορίζει το μέγεθος του παραθύρου σε bytes που ο παραλήπτης είναι διατεθειμένος να δεχθεί Ο αριθμός αυτός προστίθεται στο acknowledgement number Ο αριθμός αυτός χρησιμοποιείται για τον έλεγχο ροής (βλ. αργότερα)
Επικεφαλίδα TCP Πεδίο checksum (16 bits): Αριθμός που χρησιμοποιείται για έλεγχο σφαλμάτων Καλύπτει ολόκληρο το πακέτο (επικεφαλίδα + δεδομένα) Υπολογίζεται και ενθυλακώνεται από τον αποστολέα Υπολογίζεται εκ νέου στον παραλήπτη ο οποίος και συγκρίνει τις δύο τιμές
Επικεφαλίδα TCP Πεδίο urgent pointer (16 bits): Χρησιμοποιείται όταν η σημαία URG έχει την τιμή 1 Καταδεικνύει το σημείο μέσα στο πακέτο από το οποίο αρχίζουν τα μη επείγοντα δεδομένα Ορίζει ουσιαστικά το μέγεθος σε bytes των επειγόντων δεδομένων Τα επείγοντα δεδομένα, αν υπάρχουν, προηγούνται των μη επειγόντων μέσα στο πακέτο Χρησιμοποιείται συχνά σε συνδυασμό με τη σημαία PSH
TCP Υλοποίηση Σύνδεσης Αρχικά μία εφαρμογή βρίσκεται στην κατάσταση CLOSED Δεν έχει καμία ανοιχτή σύνδεση Από την κατάσταση CLOSED μπορεί να εκδώσει στο τοπικό TCP μία εκ των εντολών: Passive open εντολή παθητικού ανοίγματος Active open εντολή ενεργού ανοίγματος
TCP Υλοποίηση Σύνδεσης Με την passive open περιέρχεται στην κατάσταση LISTEN Παθητικά αναμένει κάποιο αίτημα από μια εφαρμογή απομακρυσμένου πόρου στο οποίο και είναι έτοιμη να απαντήσει Στην κατάσταση αυτή βρίσκονται συνήθως εφαρμογές στην πλευρά του πόρουεξυπηρετητή
TCP Υλοποίηση Σύνδεσης Με την active open περιέρχεται στην κατάσταση SYN SENT Ενεργά προχωράει στη δημιουργία μιας σύνδεσης Η εγκαθίδρυση μιας νέας σύνδεσης (active open) γίνεται μέσω ενός μηχανισμού «τριπλής χειραψίας» (3-way handshake protocol)
TCP Υλοποίηση Σύνδεσης Έστω Α και Π εφαρμογές σε δύο (απομακρυσμένους) πόρους Α: αφετηρία η εφαρμογή η οποία προκαλεί τη σύνδεση Βρίσκεται συνήθως στην πλευρά του πόρου-πελάτη Π: προορισμός της σύνδεσης Βρίσκεται συνήθως στην πλευρά του πόρουεξυπηρετητή Έστω η Α εκδίδει μία εντολή active open
TCP Υλοποίηση Σύνδεσης Το TCP A δημιουργεί ένα πακέτο συγχρονισμού (SYN) Επιλέγει έναν αρχικό 32-bit sequence number i (Initial Sequence Number ISN) και το αποθηκεύει στο πεδίο sequence number Θέτει τη σημαία SYN στην τιμή 1 Στέλνει το πακέτο SYN στο TCP Π Έστω η Π βρίσκεται στην κατάσταση LISTEN
TCP Υλοποίηση Σύνδεσης Το TCP Π δημιουργεί ένα απαντητικό πακέτο ACK SYN Αποθηκεύει στο πεδίο sequence number το δικό του ανεξάρτητο αριθμό ISN j Θέτει τη σημαία SYN στην τιμή 1 Θέτει τη σημαία ACK στην τιμή 1 Αποθηκεύει την τιμή i+1 στο πεδίο acknowledgment number Στέλνει το ACK SYN στο TCP A
TCP Υλοποίηση Σύνδεσης H Π περιέρχεται στην κατάσταση SYN RECVD Το TCP A λαμβάνει το ACK SYN του TCP Π και δημιουργεί ένα νέο «ανταπαντητικό» πακέτο Αποθηκεύει στο πεδίο sequence number τον αριθμό i+1 Αποθηκεύει την τιμή j+1 στο πεδίο acknowledgment number Αποθηκεύει τα πρώτα δεδομένα στο πεδίο data
TCP Υλοποίηση Σύνδεσης Η εφαρμογή Α περιέρχεται στην κατάσταση ESTAB Με τη λήψη αυτού του νέου απαντητικού πακέτου, η εφαρμογή Π περιέρχεται στην κατάσταση ESTAB Έστω η Π βρίσκεται στην κατάσταση CLOSED: Είτε η σύνδεση απορρίπτεται Σε περίπτωση απόρριψης το TCP Π αποστέλλει πακέτο στο TCP Α με την τιμή 1 στη σημαία RST
TCP Υλοποίηση Σύνδεσης Είτε η αίτηση ενταμιεύεται (buffered) μέχρι που η Π εκδώσει εντολή ανοίγματος Σε ορισμένες περιπτώσεις το ΤCP πληροφορεί την Π ότι υπάρχει αίτημα σύνδεσης υπό αναμονή
TCP Υλοποίηση Σύνδεσης
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης Έστω Ε 1 και Ε 2 εφαρμογές σε δύο (απομακρυσμένους) πόρους Έστω ότι οι Ε 1 και Ε 2 επιχειρούν ενεργό άνοιγμα (active open) της μεταξύ τους σύνδεσης στον ίδιο περίπου χρόνο Το TCP 1 δημιουργεί ένα πακέτο συγχρονισμού (SYN): Αποθηκεύει στο πεδίο sequence number τον αριθμό i
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης Θέτει τη σημαία SYN στην τιμή 1 Στέλνει το πακέτο SYN στο TCP 2 Το TCP 2 δημιουργεί ένα πακέτο συγχρονισμού (SYN): Αποθηκεύει στο πεδίο sequence number τον αριθμό j Θέτει τη σημαία SYN στην τιμή 1 Στέλνει το πακέτο SYN στο TCP 1
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης SYN (sn=i) SYN (sn=j)
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης Το TCP 2 λαμβάνει το SYN του TCP 1 και δημιουργεί ένα απαντητικό πακέτο ACK SYN: Αποθηκεύει στο πεδίο sequence number τον αριθμό j+1 Θέτει τη σημαία SYN στην τιμή 1 Θέτει τη σημαία ACK στην τιμή 1 Αποθηκεύει την τιμή i+1 στο πεδίο acknowledgment number Στέλνει το ACK SYN στο TCP 1
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης SYN (sn=i) SYN (sn=j) ACK/SYN (sn=j+1, an=i+1)
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης Το TCP 1 λαμβάνει το SYN του TCP 2 και δημιουργεί ένα απαντητικό πακέτο ACK SYN: Αποθηκεύει στο πεδίο sequence number τον αριθμό i+1 Θέτει τη σημαία SYN στην τιμή 1 Θέτει τη σημαία ACK στην τιμή 1 Αποθηκεύει την τιμή j+1 στο πεδίο acknowledgment number Στέλνει το ACK SYN στο TCP 2
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης ΤCP 1 ΤCP 2 SYN (sn=i) SYN (sn=j) ACK/SYN (sn=i+1, an=j+1) ACK/SYN (sn=j+1, an=i+1) ESTAB ESTAB
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης Οι δύο εφαρμογές περιέρχονται στη κατάσταση ESTAB Παρατηρούμε ότι το TCP 2, απότηστιγμήπου αποστέλλει το πακέτο ACK/SYN περιέρχεται στην κατάσταση SYN RECVD, και περιμένει ένα πακέτο με sequence number i+1 προκειμένου να περιέλθει στην κατάσταση ESTAB Αντίστοιχα για το TCP 1
TCP Υλοποίηση Σύνδεσης Ο κύριος λόγος χρησιμοποίησης της «τριπλής χειραψίας» εξηγείται με το παρακάτω παράδειγμα Έστω ότι το TCP Π δέχεται διαδοχικά από το TCP A δύο πακέτα συγχρονισμού SYN με σειριακούς αριθμούς i και j αντίστοιχα Υποθέτουμε ότι το δεύτερο SYN προέρχεται λανθασμένα από παλαιότερη απόπειρα σύνδεσης
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης ΤCP A SYN (sn=i) SYN (sn=j) ΤCP Π
TCP Υλοποίηση Σύνδεσης Έστω ότι το TCP Π απαντάει (ACK/SYN) στο δεύτερο SYN Στο πεδίο acknowledgment number αποθηκεύεται η τιμή j+1 Έστω ότι ο αριθμός ISN του πακέτου αυτού είναι q Το TCP A λαμβάνει ένα απαντητικό μήνυμα που να επιβεβαιώνει τον αριθμό j
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης ΤCP A SYN (sn=i) SYN (sn=j) ΤCP Π ACK/SYN (sn=q, an=j+1)
TCP Υλοποίηση Σύνδεσης Το TCP A αποστέλλει στο TCP Π πακέτο που ακυρώνει τη σύνδεση που το TCP Π αποπειράθηκε να επιβεβαιώσει Ένα τέτοιο πακέτο έχει Την τιμή 1 στη σημαία RST Την τιμή q+1 στο πεδίο acknowledgement number Το TCP A αποστέλλει ξανά στο TCP Π το αρχικό πακέτο SYN με τον αριθμό i
TCP Ταυτόχρονες Αιτήσεις Σύνδεσης ΤCP A SYN (sn=i) SYN (sn=j) ΤCP Π RST (an=q) SYN (sn=i) ACK/SYN (sn=q, an=j+1) Το ΤCP Π δεν έχει περιέλθει ακόμα στην κατάσταση ESTAB
TCP Υλοποίηση Σύνδεσης Εάν το TCP χρησιμοποιούσε πρωτόκολλο διπλής (και όχι τριπλής) χειραψίας τότε το TCP Π στο παραπάνω παράδειγμα θα περιέρχονταν λανθασμένα στην κατάσταση ESTAB αμέσως μετά την αποστολή του πακέτου ΑCK/SYN
TCP Απόλυση Σύνδεσης Έστω ότι η εφαρμογή Α στην πλευρά του πόρου-πελάτη επιθυμεί να διακόψει τη σύνδεση Το TCP A δημιουργεί ένα πακέτο τερματισμού (FIN) Θέτει τη σημαία FIN στην τιμή 1 Στο πεδίο sequence number αποθηκεύεται ο συνολικός αριθμός των bytes που στάλθηκαν από το TCP Α στο TCP Π μέσω της σύνδεσης
TCP Απόλυση Σύνδεσης Στο πεδίο acknowledgement number αποθηκεύεται o αύξων αριθμός τoυ πρώτου byte δεδομένων που υπό κανονικές συνθήκες θα λάμβανε επόμενα το TCP A από το TCP Π Το TCP Π δημιουργεί ένα πακέτο απάντησης (FIN ΑCK) Θέτει τη σημαία FIN στην τιμή 1
TCP Απόλυση Σύνδεσης Στο πεδίο sequence number αποθηκεύεται ο συνολικός αριθμός των bytes που στάλθηκαν από το TCP Π στο TCP Α μέσω της σύνδεσης Στο πεδίο acknowledgement number αποθηκεύεται o αύξων αριθμός τoυ πρώτου byte δεδομένων που υπό κανονικές συνθήκες θα λάμβανε επόμενα το TCP Π από το TCP Α
TCP Απόλυση Σύνδεσης Η σύνδεση τερματίζεται από την πλευρά του εξυπηρετητή με αντίστοιχο τρόπο