Page 1
Κεφάλαιο 1 Το Πρωτόκολλο TCP (Transmission Control Protocol)
Η υλοποίηση του πρωτοκόλλου µεταφοράς TCP είναι προσανατολισµένη για
ενσύρµατα δίκτυα δεδοµένων παρέχοντας µια ασφαλή µεταφορά δεδοµένων µεταξύ
σταθερών σταθµών επικοινωνίας. Η εφαρµογή του TCP έχει επεκταθεί σε κινητούς
σταθµούς παρέχοντας την αντίστοιχη υπηρεσία µε κάποιους όµως περιορισµούς στην
απόδοση. Αυτό το κεφάλαιο περιγράφει την λειτουργία του TCP τους µηχανισµούς
µετάδοσης, ελέγχου ροής και τους αλγορίθµους συµφόρησης που αυτό εφαρµόζει καθώς
και τις διάφορες εκδόσεις του πρωτοκόλλου.
1.1 Επίπεδο Μεταφοράς (Transport Layer)
Σύµφωνα µε το µοντέλο αναφοράς TCP/IP [1], το επίπεδο µεταφοράς (transport layer)
είναι σχεδιασµένο ώστε να επιτρέπει οµότιµες οντότητες (peer entities) σε κοµιστές
πηγής (source host) και κοµιστές προορισµού (destination host) να εγκαταστήσουν µία
συνοµιλία. Σε αυτό το επίπεδο έχουν οριστεί δύο απ’ άκρο σ΄ άκρο (end-to-end)
πρωτόκολλα. Το πρώτο από τα δύο, το TCP (Transmission Control Protocol) είναι ένα
αξιόπιστο συνδεσµοστραφές (connection-oriented) πρωτόκολλο όπου επιτρέπει σε µία
ακολουθία byte προερχόµενη από ένα µηχάνηµα να παραδοθεί σε οποιοδήποτε άλλο στο
Internet, χωρίς λάθη. Τεµαχίζει την εισερχόµενη ακολουθία από byte σε διακριτά
µηνύµατα και τα περνάει στο κατώτερο επίπεδο δικτύου (network layer). Στον
προορισµό τους τα µηνύµατα συναθροίζονται από την αντίστοιχη TCP διεργασία
(process) στην αρχική ακολουθία byte. To TCP ελέγχει επίσης την ροή των µηνυµάτων,
ώστε ένας γρήγορος αποστολέας να µην καταπνίξει έναν αργό δέκτη µε περισσότερα
µηνύµατα απ΄ ότι αυτός µπορεί να χειριστεί. Το δεύτερο πρωτόκολλο του επιπέδου
µεταφοράς είναι το UDP (User Datagram Protocol). Πρόκειται για ένα αναξιόπιστο,
χωρίς σύνδεση (connectionless) πρωτόκολλο για εφαρµογές όπου δεν χρειάζονται την
ακολουθιακή πιστότητα των µηνυµάτων και τον έλεγχο ροής του TCP. Οι εφαρµογές
αυτές παρέχουν δικούς τους µηχανισµούς µεταφοράς όπου η άµεση παράδοση κρίνεται
πιο σηµαντική από την ορθή (χωρίς λάθη) παράδοση του TCP. Τέτοιες εφαρµογές έχουν
να κάνουν µε τη µετάδοση φωνής ή video. Το TCP όµως, παρέχει σηµαντικά
περισσότερες δυνατότητες σε εφαρµογές, απ΄ ότι το UDP. Αξιοσηµείωτα είναι, ο έλεγχος
ροής, η ανάκαµψη λαθών και η αξιοπιστία. Τα περισσότερα πρωτόκολλα εφαρµογής
χρήστη όπως το Telnet, και το FTP χρησιµοποιούν ως πρωτόκολλο µεταφοράς το TCP.
13
Page 2
∆ύο διεργασίες όπου επικοινωνούν µεταξύ τους πάνω από µία σύνδεση του TCP
φαίνεται στο Σχήµα 1.
∆ιεργασία 1
TCP
port m . . .. . .
IP
∆ιεργασία 2
TCP
port n . . .. . .
IP
TCP σύνδεση
IP πακέτα
Σχήµα 1:TCP σύνδεση µεταξύ διεργασιών
1.2 Το Μοντέλο TCP
To TCP είναι ειδικά σχεδιασµένο, ώστε να παρέχει µία αξιόπιστη απ’ άκρο σ’ άκρο
ροή δεδοµένων, πάνω σε ένα αναξιόπιστο διαδίκτυο. Ένα διαδίκτυο διαφέρει από ένα
δίκτυο συγκεκριµένης µορφής [6], διότι απαρτίζεται από τµήµατα που έχουν
διαφορετικές παραµέτρους όπως τοπολογία, εύρος καναλιού (bandwidth),
καθυστερήσεις, µέγεθος πακέτων κ.α. Το TCP προσαρµόζεται δυναµικά στις
ιδιαιτερότητες του διαδικτύου και εµφανίζεται ανθεκτικό στην αντιµετώπιση διαφόρων
τέτοιων προβληµάτων. Το TCP καθορίζεται επίσηµα από το [7] ενώ κάποιες
διευκρινήσεις και διορθώσεις που προέκυψαν στη συνέχεια εµφανίζονται στο [44].
Προεκτάσεις του πρωτοκόλλου δίνονται στο [54].
Κάθε µηχάνηµα που υποστηρίζει το TCP έχει και µία TCP οντότητα επιπέδου
µεταφοράς είτε ως πρόγραµµα είτε ως µέρος του kernel η οποία διαχειρίζεται τις TCP
ροές και ρυθµίζει την διεπαφή µε το κατώτερο επίπεδο IP. Μία TCP οντότητα δέχεται
µία ροή δεδοµένων χρήστη από τοπικές διεργασίες, τη σπάει σε τµήµατα µέχρι 64Κ
(στην πράξη, συνήθως µέχρι 1500 byte) και στέλνει κάθε τµήµα σαν ξεχωριστό πακέτο
14
Page 3
Κεφάλαιο 1 - Το Πρωτόκολλο TCP
IP. Όταν πακέτα IP που περιέχουν δεδοµένα TCP καταφθάνουν σε ένα µηχάνηµα τότε
αυτά παραδίδονται στην οντότητα του TCP όπου επανασχηµατίζει την αρχική ροή
δεδοµένων. Το επίπεδο δικτύου δεν παρέχει καµία εγγύηση, ότι τα πακέτα IP θα
παραδοθούν σωστά και στην σειρά µε την οποία µεταδόθηκαν. Έτσι το TCP θα πρέπει
να φροντίσει για επαναµεταδόσεις λανθασµένων ή χαµένων πακέτων όπως και για την
αναδιάταξη των µηνυµάτων στη σωστή σειρά.
Κάθε byte σε µία TCP σύνδεση έχει ένα µοναδικό 32άµπιτο αριθµό ακολουθίας
(sequence number). Αυτοί οι αριθµοί ακολουθίας χρησιµοποιούνται για τις επιβεβαιώσεις
(acknowledgement) και για τον µηχανισµό του παραθύρου.
Οι TCP οντότητες του αποστολέα και του δέκτη ανταλλάσσουν δεδοµένα µε τη
µορφή πακέτων (segment). Ένα πακέτο αποτελείται από µία επικεφαλίδα σταθερού
µεγέθους 20-byte ακολουθούµενο από µηδενικά ή περισσότερα byte δεδοµένων. Το TCP
αποφασίζει πόσο θα είναι το µέγεθος κάθε πακέτου. Μπορεί είτε να καταχωρήσει
δεδοµένα από πολλά γραψίµατα σε ένα πακέτο είτε να σπάσει τα δεδοµένα από ένα
γράψιµο σε πολλά πακέτα. ∆ύο περιορισµοί καθορίζουν το µέγεθος κάθε πακέτου. Ο
πρώτος περιορισµός είναι ο διαθέσιµος χώρος του IP πακέτου ο οποίος δεν πρέπει να
ξεπερνά τα 65.535 byte. Ο δεύτερος αφορά την µέγιστη µονάδα µεταφοράς (Maximum
Transfer Unit – MTU) ενός δικτύου όπου µέσα σε αυτή θα πρέπει να χωράει κάθε πακέτο
του TCP. Αν ένα TCP πακέτο καλύπτει τον περιορισµό του MTU ενός δικτύου τότε
ενθυλακώνεται στο IP πακέτο χωρίς να τεµαχιστεί ενώ όταν υπερβαίνει τον περιορισµό
MTU τότε τεµαχίζεται σε περισσότερα από ένα πακέτα.
Ο βασικός µηχανισµός που εφαρµόζουν οι οντότητες του TCP είναι το κυλιόµενο
παράθυρο. Όταν ο αποστολέας µεταδίδει ένα πακέτο αρχίζει ένας χρονοµετρητής. Όταν
το πακέτο φθάσει στον προορισµό, η οντότητα TCP του δέκτη στέλνει ένα πακέτο στον
αποστολέα, συµπεριλαµβάνοντας σε αυτό έναν αριθµό επιβεβαίωσης ίσο µε τον επόµενο
αριθµό της ακολουθίας δεδοµένων που περιµένει να δεχτεί. Εάν ο χρονοµετρητής του
αποστολέα εκπνεύσει προτού έρθει η επιβεβαίωση τότε το πακέτο επαναµεταδίδεται.
Στην περίπτωση όπου κάποιο πακέτο τεµαχιστεί από έναν δροµολογητή δικτύου που
υποστηρίζει µικρότερα MTU από αυτά των διασυνδεµένων δικτύων, τότε είναι πιθανόν
κάποια πακέτα να καθυστερήσουν να παραδοθούν στον δέκτη ή ακόµα και να χαθούν.
Έτσι λοιπόν κάποια πακέτα που φθάνουν στον δέκτη µε λάθος σειρά δεν µπορούν να
15
Page 4
επιβεβαιωθούν επειδή εκείνα που προηγούνται δεν έχουν ακόµα παραδοθεί. Τα πακέτα
µπορεί ακόµα να καθυστερήσουν τόσο, ώστε ο χρονοµετρητής να προκαλέσει την
επαναµετάδοση αυτού του πακέτου. Εάν ένα πακέτο που επαναµεταδίδεται
δροµολογηθεί από ένα άλλο µονοπάτι από αυτό του αρχικού πακέτου και τεµαχιστεί
διαφορετικά, τότε τµήµατα αυτού πακέτου και του αρχικού παραδίδονται σποραδικά
στον δέκτη, απαιτώντας έτσι µία προσεκτική διαχείριση ώστε να ανακτηθεί το αρχικό
πακέτο. Τέλος, λόγω του ότι το Internet δοµείται από την διασύνδεση ποικίλων δικτύων,
ενδέχεται κάποιο πακέτο να διαπερνάει, περιστασιακά κατά τη διαδροµή του µέσα από
δίκτυα που παρουσιάζουν συµφόρηση.
1.3 Κανόνας του Παραθύρου
Ένα απλό πρωτόκολλο µεταφοράς µπορεί να εφαρµόσει τον ακόλουθο κανόνα. Για
κάθε πακέτο που στέλνει να περιµένει µία επιβεβαίωση από τον δέκτη προτού
προχωρήσει στην µετάδοση του επόµενου. Εάν η επιβεβαίωση δεν έρθει µέσα σε κάποιο
χρονικό πλαίσιο, το πακέτο επαναµεταδίδεται. Ο µηχανισµός αυτός εγγυάται την
αξιοπιστία του πρωτοκόλλου, αλλά χρησιµοποιεί µόνο ένα τµήµα του διαθέσιµου εύρους
του δικτύου.
∆ιαφορετικά, ένα πρωτόκολλο µεταφοράς µπορεί να διευρύνει τον αριθµό των
πακέτων που µεταδίδονται κάθε φορά από τον αποστολέα. Έτσι ο αποστολέας µπορεί να
στείλει οµαδικά όλα τα πακέτα που είναι στο παράθυρο χωρίς να λάβει επιβεβαίωση για
κάθε ένα από αυτά. Για κάθε πακέτο που αποστέλλεται ενεργοποιείται ένας
χρονοµετρητής. Ο δέκτης πρέπει να επιβεβαιώσει τα πακέτα που λαµβάνει
επιδεικνύοντας τον αριθµό ακολουθίας του τελευταίου σωστού πακέτου. Κάθε φορά που
ο δέκτης παίρνει µία επιβεβαίωση για ένα πακέτο, ολισθαίνει το παράθυρο κατά ένα
πακέτο προς τα δεξιά. Στο Σχήµα 2 φαίνεται ο µηχανισµός του παραθύρου. Στην αρχή ο
αποστολέας µπορεί να στείλει µέχρι τα 5 πρώτα πακέτα. Μόλις λάβει επιβεβαίωση για το
πακέτο µε αριθµό ακολουθίας 1 τότε το παράθυρο ολισθαίνει κατά µία θέση δεξιά και
µεταδίδει το πακέτο µε αριθµό 6. Στην περίπτωση που ο αποστολέας δεν λάβει
επιβεβαίωση για το δεύτερο πακέτο (ACK2), το παράθυρο θα παραµείνει στην θέση
1(Σχήµα 2β). Στην πραγµατικότητα αφού ο δέκτης δεν έλαβε το πακέτο 2 θα
επιβεβαιώσει τα πακέτα 3, 4 και 5 µε ACK 1 καθώς το πακέτο 1 ήταν το τελευταίο της
ακολουθίας που έλαβε. Στην πλευρά του αποστολέα θα εκπνεύσει ο χρονοµετρητής και
θα δώσει το έναυσµα για επαναµετάδοση του πακέτου 2. Όταν αυτό το πακέτο 2 ληφθεί
16
Page 5
Κεφάλαιο 1 - Το Πρωτόκολλο TCP
τώρα από τον δέκτη θα προκαλέσει την επιβεβαίωση µε αριθµό 5 (ACK 5), καθώς όλα
τα πακέτα από το 1 µέχρι το 5 έχουν παραδοθεί σωστά. Κατά την λήψη του ACK 5 ο
αποστολέας ολισθαίνει το παράθυρο τέσσερις θέσεις δεξιά. Στην άλλη περίπτωση που το
πακέτο 2 ληφθεί από τον δέκτη και η επιβεβαίωση του (ACK2) χαθεί, ο αποστολέας θα
δεχθεί την επιβεβαίωση για το επόµενο πακέτο 3 που έχει ήδη παραδοθεί. Η επιβεβαίωση
ACK 3 συµπεριλαµβάνει όλα τα πακέτα µέχρι και το 3 και ο αποστολέας ολισθαίνει το
παράθυρο δεξιά µέχρι το πακέτο 4 όπου εκκρεµεί ακόµα η επιβεβαίωση του. Ο
µηχανισµός του παραθύρου εξασφαλίζει αξιόπιστη µετάδοση, καλύτερη χρήση του
εύρους καναλιού του δικτύου και έλεγχο ροής. Όσον αφορά τον έλεγχο ροής, ο δέκτης
δεν θα επιβεβαιώσει αµέσως κάθε πακέτο που λαµβάνει, µέχρι ότου εξασφαλίσει ότι
διαθέτει ελεύθερο χώρο στην µνήµη προσωρινής αποθήκευσης (buffer) και στο
παράθυρο της επικοινωνίας µε τον αποστολέα.
1 2 3 4 5 6 7 8 9 . . . 1 2 3 4 5 6 7 8 9 . . .
πακέτα
παράθυρο Ολισθαίνον παράθυρο
πακέτα
(β)(α)
Σχήµα 2:Μηχανισµός παραθύρου
Αυτοί οι κανόνες του παραθύρου εφαρµόζονται και στο TCP πρωτόκολλο µε µικρές
διαφορές. Η πρώτη αφορά την λειτουργία του παραθύρου σε επίπεδο byte. Από την
στιγµή που το TCP εγκαθιστά συνδέσεις για την µεταφορά µίας ροής δεδοµένων οι
αριθµοί ακολουθίας αντιστοιχούν στα byte αυτής της ροής. Έτσι τα πακέτα που
στέλνονται και οι επιβεβαιώσεις τους µεταφέρουν αριθµούς ακολουθίας byte και το
µέγεθος του παραθύρου εκφράζεται σε πλήθος byte αντί πακέτων. Η ροή δεδοµένων
στον αποστολέα έχει την µορφή που φαίνεται στο Σχήµα 3. Όπου Α είναι τα byte
δεδοµένων που έχουν επιβεβαιωθεί µέχρι τώρα. Β είναι αυτά που έχουν σταλεί και δεν
έχουν ακόµα επιβεβαιωθεί. C είναι τα byte που µπορούν να σταλούν χωρίς
προηγουµένως να υπάρχει κάποια επιβεβαίωση και D είναι τα byte δεδοµένων που δεν
17
Page 6
µπορούν ακόµα να σταλούν.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 . . .
Παράθυρο σε µέγεθος δεδοµένων byte
A B C D
Σχήµα 3:O µηχανισµός του παραθύρου στο TCP
1.4 Επιβεβαιώσεις και Επαναµεταδόσεις
Το TCP στέλνει δεδοµένα µε µεταβλητό µήκος πακέτων. Οι αριθµοί ακολουθίας
βασίζονται στην µέτρηση των byte. Οι επιβεβαιώσεις καθορίζουν τον αριθµό ακολουθίας
του byte όπου ο δέκτης περιµένει να δεχτεί ώστε να συνεχίσει στην επεξεργασία των
δεδοµένων που του αποστέλλονται. Ας θεωρήσουµε ένα πακέτο το οποίο χάνεται ή
παραδίδεται µε λάθη. Σε αυτή την περίπτωση ο δέκτης θα αποστείλει µία επιβεβαίωση
που θα αναφέρεται στο πρώτο byte του χαµένου πακέτου, πιστοποιώντας συγχρόνως και
όλα τα προηγούµενα πακέτα που έχουν παραδοθεί σύµφωνα µε την ακολουθία
δεδοµένων. Ο αποστολέας θα σταµατήσει την µετάδοση των πακέτων µόλις αποστείλει
όλα τα byte που του καθορίζει το παράθυρο. Τελικά ο χρονοµετρητής θα εκπνεύσει και
το χαµένο πακέτο θα επαναµεταδοθεί. Το Σχήµα 4 παρουσιάζει ένα παράδειγµα όπου το
µέγεθος του παραθύρου είναι 1500 byte και κάθε πακέτο περιλαµβάνει 500 byte
δεδοµένων.
Το πρόβληµα που ανακύπτει είναι πως ο αποστολέας δεν γνωρίζει ότι το πακέτο 2 δεν
έχει ληφθεί από τον δέκτη όπως και για τα άλλα πακέτα 3 και 4. Ο αποστολέας θα
µπορούσε τουλάχιστον να στείλει το πακέτο 2 όπως επίσης και τα 3,4 καθότι βρίσκονται
µαζί στο τρέχον παράθυρο. Σε αυτό το σηµείο έχουµε δύο περιπτώσεις. Στην πρώτη,
υποθέτουµε ότι το πακέτο 3 έχει παραδοθεί και δεν γνωρίζουµε τίποτα για το πακέτο 4.
Θα µπορούσε να έχει παραδοθεί αλλά από την στιγµή που δεν έχουµε επιβεβαίωση
18
Page 7
Κεφάλαιο 1 - Το Πρωτόκολλο TCP
ακόµα, µπορεί να θεωρηθεί χαµένο. Στην δεύτερη περίπτωση, υποθέτουµε ότι το πακέτο
3 έχει χαθεί µόλις ο αποστολέας δεχθεί ACK 1500 ύστερα από την παράδοση του
πακέτου 4 στο δέκτη. Κάθε υλοποίηση του TCP είναι ελεύθερη να αντιδράσει µε τον
δικό της τρόπο στο ενδεχόµενο ενός timeout που θα υποδείξει ο χρονοµετρητής. Στο
παράδειγµα µας θα µπορούσε να επαναµεταδώσει µόνο το πακέτο 2, αλλά στην δεύτερη
περίπτωση θα περίµενε πάλι ώσπου να εκπνεύσει ο χρονοµετρητής για το πακέτο 3. Σε
αυτό το ενδεχόµενο χάνουµε όλα τα πλεονεκτήµατα της ρυθµοαπόδοσης (throughput)
του µηχανισµού παραθύρου. ∆ιαφορετικά, το TCP θα µπορούσε να επανεκπέµψει όλα τα
πακέτα που είναι στο τρέχον παράθυρο. Σε οποιαδήποτε περίπτωση ανάκαµψης της
απώλειας πακέτων χάνεται η µέγιστη ρυθµοαπόδοση του πρωτοκόλλου.
∆έκτηςΑποστολέας
Λαµβάνει το ACK 1500το οποίο όµως δεν ολισθαίνει το παράθυρο
. . . . . . .εκδηλώνεται timeout για το πακέτο 2και γίνεται επαναµετάδοση
∆έχεται ένα από τα πακέτα και απαντάει µε ACK 1500 (περιµένει ακόµα το byte 1500)
Πακέτο 4 (ακολ.2500)
Αναµένοντας για ACK, το παράθυρο έφθασε στο όριο του.
Πακέτο 3 (ακολ.2000)
///Χάνεται
Πακέτο 2 (ακολ.1500)
Λαµβάνει ACK 1500,Ολισθαίνει το παράθυρο
∆έχεται 1000, στέλνει ACK 1500Πακέτο 1 (ακολ.1000)
Σχήµα 4:TCP ∆ιαδικασία επιβεβαίωσης και επαναµετάδοσης
1.5 TCP Χρονοµετρητές
Για να λειτουργήσει το TCP, χρησιµοποιεί πολλούς χρονοµετρητές (τουλάχιστον
εννοιολογικά). Ο σηµαντικότερος από αυτούς είναι ο χρονοµετρητής επαναµετάδοσης
(retransmission timer). Όταν ένα πακέτο αποστέλλεται, ενεργοποιείται ένας
χρονοµετρητής. Εάν το πακέτο επιβεβαιωθεί (µε την λήψη ενός ACK) προτού εκπνεύσει
ο χρονοµετρητής, τότε σταµατάει η χρονοµέτρηση. Αντίθετα, όταν εκπνεύσει ο
χρονοµετρητής προτού ληφθεί η επιβεβαίωση, τότε το πακέτο επαναµεταδίδεται και ο
19
Page 8
χρονοµετρητής ενεργοποιείται ξανά. Το ερώτηµα που ανακύπτει αφορά το χρονικό
διάστηµα στο οποίο θα εκπνεύσει ο χρονοµετρητής και θα σηµάνει ένα timeout. Εάν το
διάστηµα του timeout είναι πολύ µικρό τότε ενδέχεται τα πακέτα να επαναµεταδοθούν
άσκοπα κατακλύζοντας το δίκτυο µε άχρηστα πακέτα. Από την άλλη εάν το διάστηµα
του timeout είναι πολύ µεγάλο, τότε η απόδοση του πρωτοκόλλου θα υστερεί λόγω
καθυστέρησης στην επαναµετάδοση των χαµένων πακέτων. Η απάντηση δίνεται από
έναν δυναµικό αλγόριθµο ο οποίος σταθερά προσαρµόζει το διάστηµα του timeout
βασιζόµενος σε συνεχείς µετρήσεις της απόδοσης του δικτύου. Ο αλγόριθµος αυτός που
γενικά χρησιµοποιείται από το TCP είναι του Jacobson [8] και λειτουργεί ως ακολούθως.
Για κάθε σύνδεση, το TCP διατηρεί την τρέχουσα καλύτερη εκτίµηση της µεταβλητής
RTT (round trip time). Η µεταβλητή αντιστοιχεί στο συνολικό χρονικό διάστηµα που
διαρκεί για ένα πακέτο να παραδοθεί στον δέκτη και να επιστραφεί µία επιβεβαίωση
πίσω στον αποστολέα. Είναι δηλαδή, ο χρόνος της κυκλικής διαδροµής από τον
αποστολέα στον δέκτη και πίσω πάλι στον αποστολέα σε ένα πρωτόκολλο µε
επιβεβαιώσεις. Μόλις ένα πακέτο αποστέλλεται, αµέσως ενεργοποιείται ο
χρονοµετρητής. Αυτός µετράει τον χρόνο απόκρισης της επιβεβαίωσης ενώ παράλληλα,
µετά την πάροδο του διαστήµατος timeout, δίνει το έναυσµα για επαναµετάδοση. Εάν η
επιβεβαίωση επιστραφεί προτού εκπνεύσει ο χρονοµετρητής, το TCP κρατάει αυτό το
χρονικό διάστηµα σε µία µεταβλητή Μ. Βάση αυτής τις τιµής, γίνεται η τρέχουσα
εκτίµηση της µεταβλητής RTT σύµφωνα µε την φόρµουλα
RTT=α⋅RTT+(1-α)⋅Μ
όπου α είναι ένας συντελεστής εξοµάλυνσης, ο οποίος καθορίζει πόσο βάρος δίνεται στις
παλαιότερες τιµές. Τυπικά το α ισούται µε 7/8.
Ακόµα και µε το υπολογισµό της τιµής του RTT, η επιλογή του κατάλληλου timeout
είναι µία µη τετριµµένη διαδικασία. Συνήθως το TCP χρησιµοποιεί ένα συντελεστή β για
να αντιστοιχήσει το timeout σε χρόνο β⋅RTT. H κατάλληλη επιλογή του β έχει µία
ιδιοτυπία. Στις αρχικές υλοποιήσεις του TCP, το β ήταν µία σταθερά ίση µε 2 αλλά στην
πορεία αποδείχτηκε ότι η σταθερή τιµή δεν ανταποκρίνεται καλά σε µεγάλες
διακυµάνσεις του εκτιµώµενου χρόνου. Ο Jacobson πρότεινε το β να γίνει κατά
προσέγγιση ανάλογο της σταθερής απόκλισης της συνάρτησης πυκνότητας πιθανότητας
του χρόνου επιστροφής της επιβεβαίωσης. Έτσι µεγάλη διακύµανση σηµαίνει µεγάλο β
και αντίστροφα. Ειδικότερα, πρότεινε την µέση απόκλιση (mean deviation) ως ένα
20
Page 9
Κεφάλαιο 1 - Το Πρωτόκολλο TCP
πρόχειρο εκτιµητή (cheap estimator) της σταθερής απόκλισης (standard deviation). Ο
αλγόριθµος απαιτεί την παρακολούθηση εξοµάλυνσης µιας άλλης µεταβλητής D, της
απόκλισης. Όποτε µία επιβεβαίωση επιστρέφεται υπολογίζεται η απόλυτη διαφορά του
χρόνου µεταξύ της αναµενόµενης και της τρέχουσας τιµής, |RTT-M|. Η µεταβλητή D
ενηµερώνεται αφού πρώτα εξοµαλυνθεί µε ένα συντελεστή α όπως φαίνεται στην
φόρµουλα
D=α⋅D+(1-α)⋅|RTT-M|
O συντελεστής α µπορεί να είναι ο ίδιος ή διαφορετικός από την αντίστοιχη φόρµουλα
εξοµάλυνσης του RTT. Καθότι το D δεν είναι ταυτόσηµο µε την ίδια την σταθερή
απόκλιση, είναι χρήσιµο όπως υπέδειξε ο Jacobson, το D να υπολογίζεται µόνο µε
πράξεις (πρόσθεση, αφαίρεση και ολίσθηση) ακεραίων. Οι περισσότερες υλοποιήσεις
τώρα χρησιµοποιούν αυτό τον αλγόριθµο και θέτουν το διάστηµα timeout σύµφωνα µε
τον υπολογισµό
Timeout=RTT+4⋅D
Η επιλογή του παράγοντα 4 στην εξίσωση είναι κάπως αυθαίρετο αλλά έχει δύο
πλεονεκτήµατα. Πρώτον, ο υπολογισµός µπορεί να γίνει µε µία απλή ολίσθηση.
∆εύτερον µειώνει στο ελάχιστο τα timeout και τις άσκοπες επαναµεταδόσεις, καθώς
µόλις το 1% των πακέτων επιστρέφουν επιβεβαιώσεις αργότερα κατά 4 φορές τον χρόνο
της σταθερής απόκλισης.
Ένας άλλος χρονοµετρητής που χρησιµοποιείται από το TCP είναι ο χρονοµετρητής
διατήρησης (persistence timer) ο οποίος εφαρµόζεται στον αλγόριθµο του Karn . Αυτός ο
αλγόριθµος καλύπτει περιπτώσεις όπου ένα πακέτο επαναµεταδίδεται συνέχεια και οι
επιβεβαιώσεις του λαµβάνονται καθυστερηµένα. Αυτό δεν διαλευκαίνει αν η
επιβεβαίωση αντιστοιχεί στην πρώτη ή σε µία µετέπειτα επαναµετάδοση, οδηγώντας έτσι
λάθος υπολογισµούς του χρόνου RTT. Σύµφωνα µε τον αλγόριθµο, ο υπολογισµός του
RTT δεν επιχειρείται σε κάθε επαναµετάδοση πακέτου αλλά αντί αυτού, διπλασιάζεται ο
χρόνος του timeout σε κάθε αποτυχία µέχρι τα πακέτα να επιβεβαιωθούν για πρώτη
φορά. Ο χρονοµετρητής διατήρησης ενεργοποιείται στην περίπτωση όπου ο δέκτης
στέλνει ένα µήνυµα στον αποστολέα για να αναστείλει την µετάδοση διότι δεν διαθέτει
χώρο προσωρινής αποθήκευσης. Αν στην συνέχεια ο δέκτης στείλει νέο µήνυµα για να
συνεχιστεί η µετάδοση και αυτό χαθεί τότε και οι δύο περιµένουν ανενεργοί ο ένας τον
21
Page 10
άλλον χωρίς να ανταλλάσσουν κανένα µήνυµα. Τότε εκπνέει ο χρονοµετρητής και ο
αποστολέας στέλνει ένα µήνυµα για να εξετάσει εάν ο δέκτης έχει διαθέσιµο χώρο. Ο
δέκτης απαντάει µε σχετικό µήνυµα (µέγεθος παραθύρου) και αν ο χώρος έχει
ελευθερωθεί τότε αρχίζει η µετάδοση διαφορετικά (µηδενικό παράθυρο) ενεργοποιείται ο
χρονοµετρητής.
Κάποιες υλοποιήσεις παρέχουν έναν άλλο χρονοµετρητή (keepalive timer) όπου
διατηρούν συνδέσεις ανοικτές για σχετικά µεγάλα χρονικά διαστήµατα. Όταν δεν
υπάρχει ανταλλαγή µηνυµάτων µετά την πάροδο του χρόνου που ορίζει ο χρονοµετρητής
τότε η µία πλευρά ερευνά εάν η άλλη είναι ακόµα συνδεδεµένη. Εάν δεν υπάρξει
απάντηση από την άλλη πλευρά η σύνδεση τερµατίζεται.
1.6 TCP Αλγόριθµοι Ελέγχου Συµφόρησης
Ο αλγόριθµος ελέγχου συµφόρησης [39] του TCP εµποδίζει έναν αποστολέα να
ξεπεράσει την χωρητικότητα του δικτύου. Το TCP προσαρµόζει το ρυθµό του αποστολέα
στην χωρητικότητα του δικτύου και προσπαθεί να αποφύγει πιθανές καταστάσεις
συµφόρησης. ∆ιάφοροι αλγόριθµοι έχουν προταθεί και έχουν προστεθεί στις υλοποιήσεις
του TCP αλλά οι πιο βασικοί που θεωρούνται ως δεδοµένοι για το Internet και είναι
άµεσα συνυφασµένοι µεταξύ τους είναι οι εξής. Αργής εκκίνησης (slow start), αποφυγής
συµφόρησης (congestion avoidance), γρήγορη επαναµετάδοση (fast retransmit), γρήγορη
ανάκαµψη (fast recovery).
1.6.1 Αργή εκκίνηση
Οι παλαιότερες υλοποιήσεις του TCP θα ενεργοποιούσαν µία σύνδεση µε τον
αποστολέα να εισάγει τόσα πακέτα στο δίκτυο όσα του επιτρέπει το µέγεθος παραθύρου
του δέκτη. Αυτό δεν δηµιουργεί πρόβληµα όταν οι δύο σταθµοί βρίσκονται σε ένα
τοπικό δίκτυο, αν όµως µεσολαβούν δροµολογητές και πιο αργές συνδέσεις µεταξύ
αποστολέα και δέκτη τότε προκύπτουν προβλήµατα. Ενδέχεται λοιπόν οι ενδιάµεσοι
δροµολογητές να µην µπορέσουν να διεκπεραιώσουν τον ρυθµό του αποστολέα και να
χάσουν ορισµένα πακέτα προκαλώντας επαναµεταδόσεις πακέτων υποβαθµίζοντας έτσι
την απόδοση του πρωτοκόλλου.
Ο αλγόριθµος αργής εκκίνησης προσπαθεί να αποφύγει τέτοιες περιπτώσεις. Η
λειτουργία του βασίζεται στην παρατήρηση ότι ο ρυθµός µε τον οποίον τα πακέτα
µεταδίδονται από τον αποστολέα στο δίκτυο είναι ίσος µε τον ρυθµό των επιβεβαιώσεων
22
Page 11
Κεφάλαιο 1 - Το Πρωτόκολλο TCP
που επιστρέφονται από το άλλο άκρο της σύνδεσης. Ο αλγόριθµος προσθέτει ένα
επιπλέον παράθυρο στον αποστολέα, το παράθυρο συµφόρησης (congestion window -
cwnd). Όταν µία καινούργια σύνδεση εγκαθίσταται µε έναν κοµιστή (host) σε άλλο
δίκτυο το παράθυρο συµφόρησης αρχικά οριοθετείται στο µέγεθος ενός πακέτου. Κάθε
φορά που ο αποστολέας δέχεται µία επιβεβαίωση (ACK) το παράθυρο συµφόρησης
αυξάνεται κατά ένα πακέτο. Ο αποστολέας µπορεί να µεταδώσει τόσα πακέτα όσο η
ελάχιστη τιµή των δύο παραθύρων (συµφόρησης και δέκτη). Το παράθυρο συµφόρησης
είναι έλεγχος ροής που επιβάλλεται από τον αποστολέα ενώ το παράθυρο επικοινωνίας
των δύο κοµιστών είναι έλεγχος ροής που επιβάλλεται από το δέκτη. Το παράθυρο
συµφόρησης ακολουθεί την εκτίµηση του αποστολέα για την διαβλεπόµενη συµφόρηση
του δικτύου ενώ το άλλο παράθυρο επικοινωνίας σχετίζεται µε το ποσό του διαθέσιµου
χώρου στη µνήµη προσωρινής αποθήκευσης (buffer) του δέκτη.
O αποστολέας ξεκινάει µε την µετάδοση ενός πακέτου και στη συνέχεια αναµένει την
επιβεβαίωση του. Όταν η επιβεβαίωση ληφθεί, το παράθυρο συµφόρησης αυξάνεται σε
µέγεθος δύο πακέτων. Στην συνέχεια ο αποστολέας µπορεί να στείλει δύο πακέτα και
όταν λάβει επιβεβαίωση για αυτά τα πακέτα, τότε το παράθυρο αυξάνεται σε τέσσερα
πακέτα. Αυτό ο µηχανισµός όπως παρουσιάζεται και στο Σχήµα 5 εµφανίζει µία εκθετική
αύξηση του παραθύρου.
αποστολέας δέκτης
Σχήµα 5:Αργή εκκίνηση του TCP
23
Page 12
1.6.2 Αποφυγή συµφόρησης Ο αλγόριθµος υποθέτει ότι η απώλεια των πακέτων λόγω λάθους στο κανάλι είναι
πολύ µικρή, της τάξης του 1%, έτσι η απώλεια ενός πακέτου είναι δείγµα συµφόρησης
κάπου στο δίκτυο. Υπάρχουν δύο ενδείξεις για την απώλεια ενός πακέτου. Η πρώτη είναι
η εκδήλωση ενός timeout και η δεύτερη είναι τα διπλά ACK που λαµβάνει ο δέκτης. Οι
δύο αλγόριθµοι αργής εκκίνησης και αποφυγής συµφόρησης είναι ανεξάρτητοι µεταξύ
τους και µε διαφορετικές λειτουργίες. Στην πράξη όµως, υλοποιούνται και οι δύο µαζί.
Όταν κάπου στο δίκτυο έχουµε ένδειξη συµφόρησης, το TCP ρίχνει τους ρυθµούς
µετάδοσης πακέτων και στη συνέχεια ενεργοποιείται ο µηχανισµός αργής εκκίνησης
ώστε να επανακάµψει το ρυθµό. Οι αλγόριθµοι διατηρούν δύο µεταβλητές για κάθε
σύνδεση. Αυτές είναι, το παράθυρο συµφόρησης (cwnd) και το κατώφλι αργής
εκκίνησης (ssthresh – slow start threshold). O συνδυασµός των αλγορίθµων αργής
εκκίνησης και αποφυγής συµφόρησης λειτουργεί ως ακολούθως.
1. στην αρχικοποίηση µιας σύνδεσης η µεταβλητή cwnd τίθεται σε ένα πακέτο και
το ssthresh σε 65535 byte.
2. το TCP ποτέ δεν στέλνει περισσότερα δεδοµένα από την µέγιστη ελάχιστη τιµή
των δύο παραθύρων του cwnd και του δέκτη.
3. όταν προκληθεί συµφόρηση, η τιµή του ssthresh λαµβάνει το µισό του τρέχοντος
παραθύρου. Ειδικά, αν η συµφόρηση υποδηλώνεται από την εκδήλωση ενός
timeout τότε η τιµή του cwnd γίνεται ίση µε το µέγεθος ενός πακέτου.
4. κάθε φορά που επιβεβαιώνονται πακέτα από το άλλο άκρο της σύνδεσης
αυξάνεται η τιµή του cwnd. Ο ρυθµός αύξησης εξαρτάται από την συγκεκριµένη
χρονική στιγµή όπου το TCP εφαρµόζει αργή εκκίνηση ή αποφυγή συµφόρησης.
Αυτό καθορίζεται από τις τιµές των µεταβλητών. Έτσι όταν η τιµή του cwnd
είναι µικρότερη ή ίση από το κατώφλι που ορίζει η µεταβλητή ssthresh τότε το
TCP εφαρµόζει αργή εκκίνηση διαφορετικά εφαρµόζει τον µηχανισµό αποφυγής
συµφόρησης.
Ο µηχανισµός αργής εκκίνησης εξακολουθεί µέχρι το παράθυρο να πάρει την µισή
τιµή που είχε όταν την συγκεκριµένη χρονική στιγµή προκλήθηκε timeout ή διπλό ACK.
Μετά από αυτό το σηµείο εφαρµόζεται ο µηχανισµός αποφυγής συµφόρησης. Ο
µηχανισµός αργής εκκίνησης θέτει αρχικά το cwnd σε ένα πακέτο και το αυξάνει κατά
24
Page 13
Κεφάλαιο 1 - Το Πρωτόκολλο TCP
ένα πακέτο, κάθε φορά που δέχεται µία επιβεβαίωση (ACK). Αυτή η αύξηση αντιστοιχεί
σε εκθετική µεταβολή, πρώτα ένα πακέτο, µετά δύο, τέσσερα και ούτω καθεξής.
Ο µηχανισµός αποφυγής συµφόρησης υποδεικνύει την αύξηση του cwnd κατά
segsize*segsize/cwnd κάθε φορά που ένα ACK επιστρέφεται στον αποστολέα. Όπου
segsize είναι το µέγεθος του πακέτου εκφρασµένο σε byte και όπως και το cwnd.
Συγκρινόµενη µε την µεταβολή της αργής εκκίνησης, αυτή η αύξηση του cwnd
αντιστοιχεί σε γραµµική µεταβολή. Η αύξηση θα πρέπει να είναι το πολύ ένα πακέτο
κάθε φορά (σε αντίστοιχο χρόνο RTT, άσχετα µε το πόσα πακέτα επιβεβαιώνονται στο
χρόνο αυτό), ενώ στην αργή εκκίνηση η αύξηση γίνεται σύµφωνα µε το πλήθος των
πακέτων που επιβεβαιώνονται. Στο Σχήµα 6 παρουσιάζεται το διάγραµµα αύξησης του
cwnd όπου τον µηχανισµό αργής εκκίνησης διαδέχεται ο µηχανισµός αποφυγής
συµφόρησης.
Σχήµα 6:Αργή εκκίνηση και αποφυγή συµφόρησης του TCP
1.6.3 Γρήγορη επαναµετάδοση
Σύµφωνα µε το µηχανισµό αυτό, το TCP προσπαθεί να αποφύγει την εκδήλωση ενός
timeout προτού επαναµεταδώσει ένα χαµένο πακέτο. Ας αντιληφθούµε ότι το TCP
µπορεί δηµιουργήσει µία γρήγορη επιβεβαίωση (διπλό ACK) µόλις ο δέκτης λάβει ένα
25
Page 14
πακέτο µε λάθος σειρά ακολουθίας. Η ύπαρξη του διπλού ACK ενηµερώνει το άλλο
άκρο ότι ένα πακέτο έχει ληφθεί σε λάθος σειρά ενώ ταυτόχρονα υπενθυµίζει το σωστό
αριθµό ακολουθίας πακέτου που αναµένει ο δέκτης. Θα πρέπει λοιπόν, το διπλό ACK να
είναι άµεσο στην επικοινωνία των δύο άκρων.
Από την στιγµή που το TCP δεν γνωρίζει εάν το διπλό ACK είναι αποτέλεσµα της
απώλειας πακέτου ή µίας αναδιάταξης των πακέτων στο δέκτη, προτού επαναµεταδώσει
το πακέτο που του υποδεικνύει το ACK, περιµένει ώσπου να λάβει ένα µικρό αριθµό
διπλών ACK. Αν πρόκειται για αναδιάταξη πακέτων, θα υπάρξουν ένα ή δύο διπλά ACK
προτού τα πακέτα συνταχθούν από το δέκτη στη σωστή σειρά. Τότε ο δέκτης θα στείλει
ένα νέο συνολικό ACK που θα επιβεβαιώνει όλη την ακολουθία των πακέτων. Εάν
υπάρχουν τρία ή περισσότερα διπλά ACK τότε γίνεται σαφής ένδειξη ότι ένα πακέτο από
την ακολουθία έχει χαθεί. Προτού τότε, εκπνεύσει ο χρονοµετρητής επαναµετάδοσης το
TCP εκτελεί µία επαναµετάδοση του χαµένου πακέτου. Μία σύνοψη του µηχανισµού
αυτού φαίνεται στο Σχήµα 7.
Σχήµα 7:Μηχανισµός γρήγορης επαναµετάδοσης
1.6.4 Γρήγορη ανάκαµψη
Σύµφωνα µε τον αλγόριθµο της γρήγορης ανάκαµψης, µετά από την γρήγορη
επαναµετάδοση του χαµένου πακέτου, αντί της αργής εκκίνησης εφαρµόζεται ο
26
Page 15
Κεφάλαιο 1 - Το Πρωτόκολλο TCP
µηχανισµός αποφυγής συµφόρησης. Αυτό είναι µία βελτίωση που επιτρέπει έναν υψηλό
βαθµό στην ρυθµαπόδοση του TCP, κάτω από µέτρια συµφόρηση και ειδικά για µεγάλα
παράθυρα.
Ο λόγος που σε αυτή την περίπτωση δεν εφαρµόζεται αργή εκκίνηση είναι ότι η
λήψη των διπλών ACK ενηµερώνει το TCP επιπλέον από την απώλεια του πακέτου.
Έτσι, την στιγµή που ο δέκτης δηµιουργεί διπλά ACK όταν λαµβάνει ένα άλλο πακέτο,
αυτό το πακέτο έχει αφήσει το δίκτυο και βρίσκεται στη µονάδα προσωρινής
αποθήκευσης του δέκτη. Αυτό σηµαίνει ότι υπάρχουν ακόµα δεδοµένα που ρέουν µεταξύ
των δύο άκρων και το TCP δεν επιθυµεί να µειώσει απότοµα την ροή εφαρµόζοντας
αργή εκκίνηση. Οι αλγόριθµοι της γρήγορης επαναµετάδοσης και ανάκαµψης
υλοποιούνται µαζί ως ακολούθως:
1. όταν λαµβάνεται το τρίτο διπλό ACK, επαναµεταδίδεται το χαµένο πακέτο και
το ssthresh τίθεται στο µισό του τρέχοντος παραθύρου συµφόρησης, cwnd,
αλλά όχι λιγότερο από δύο πακέτα. Το cwnd γίνεται όσο το ssthresh συν τρεις
φορές το µέγεθος του πακέτου. Αυτό µεγαλώνει το παράθυρο συµφόρησης µε
το πλήθος των πακέτων που έχουν εγκαταλείψει το δίκτυο και των άλλων τριών
(όσο το πλήθος των διπλών ACK) που έχουν αποθηκευτεί προσωρινά στο
buffer του δέκτη.
2. κάθε φορά που φθάνει ένα διπλό ACK, γίνεται αύξηση του cwnd κατά ένα
πακέτο αφού αυτό έχει εγκαταλείψει το δίκτυο. Επίσης ελέγχεται αν µε την νέα
τιµή του cwnd µπορεί να µεταδοθεί πακέτο.
3. όταν λαµβάνεται το επόµενο ACK που επιβεβαιώνει τα νέα δεδοµένα η τιµή
του cwnd γίνεται όσο το ssthresh στο πρώτο βήµα. Αυτό το ACK θα πρέπει να
είναι η επιβεβαίωση της επαναµετάδοσης του πρώτου βήµατος µετά από χρόνο
RTT. Επιπλέον, αυτό το ACK θα πρέπει να επιβεβαιώνει όλα τα ενδιάµεσα
πακέτα που στάλθηκαν µετά το χαµένο πακέτο και µέχρι το πρώτο διπλό ACK.
Αυτό το βήµα είναι αποφυγή συµφόρησης, καθώς το TCP ρίχνει τον ρυθµό του
στο µισό που είχε όταν συνέβη η απώλεια του πακέτου.
1.7 Εκδόσεις του Πρωτοκόλλου TCP
Στην συνέχεια παρουσιάζονται οι διάφορες εκδόσεις του πρωτοκόλλου TCP και οι
27
Page 16
κύριες διαφορές τους. Μία από τις κύριες λειτουργίες του TCP είναι η αποστολή από τον
δέκτη µιας επιβεβαίωσης για κάθε πακέτο που έλαβε σωστά από τον αποστολέα. Οι
επιβεβαιώσεις αυτές περιλαµβάνουν πληροφορία σχετικά µε το επόµενο πακέτο
που αναµένει ο δέκτης. Σε περίπτωσή που το πακέτο µε ακολουθιακό αριθµό m
χαθεί και τα πακέτα που το ακολουθούν φτάσουν επιτυχώς στο δέκτη, ο δέκτης στέλνει
διπλές επιβεβαιώσεις µέσω των οποίων ζητά από τον αποστολέα να στείλει το
πακέτο m. Το πλήθος των διπλών επιβεβαιώσεων εξαρτάται από τον αριθµό των
πακέτων που θα φτάσουν στον δέκτη µετά το πακέτο m. Μια επιβεβαίωση
είναι αθροιστική υπό την έννοια ότι όταν περιέχει τον αριθµό k επιβεβαιώνει όλα τα
πακέτα µέχρι αυτόν τον αριθµό. Επίσης, o δέκτης παρουσιάζει όλα τα πακέτα στο χρήστη
µε την σειρά που έφτασαν, οπότε είναι απαραίτητη η προσωρινή αποθήκευσή όσων
πακέτων φτάνουν στον δέκτή εκτός σειράς. Το µέγεθος αυτού του προσωρινού
αποθηκευτικού χώρου είναι Wrec πακέτα. Οι επιβεβαιώσεις περιέχουν πληροφορία
για το µέγεθος της προσωρινής µονάδας αποθήκευσης στο δέκτη µε αποτέλεσµα ο
µηχανισµός µετάδοσης πακέτων να εγγυάται ότι δεν θα υπάρχουν υπό µετάδοση
περισσότερα από Wrec πακέτα.
O δέκτης µεταδίδει πακέτα µε βάση τον µηχανισµό του παραθύρου. Σε
κάθε χρονική στιγµή t ο αποστολέας γνωρίζει ποια πακέτα έχουν µεταδοθεί
σωστά. Έστω ότι το A(t) αντιστοιχεί σε µια άκρη παραθύρου µετάδοσης πακέτων
όπου όλα τα πακέτα αριστερά του A(t) έχουν επιβεβαιωθεί ενώ δεν έχει ληφθεί η
επιβεβαίωση για το πακέτο δεξιά του A(t). Ακόµα, ο αποστολέας σχετίζεται µε ένα
παράθυρο W(t) έτσι ώστε την χρονική στιγµή t µόνο A(t)+W(t) πακέτα µπορούν να
υπάρχουν χωρίς να έχουν επιβεβαιωθεί. Καθώς λαµβάνονται επιβεβαιώσεις, το A(t)
αυξάνει ενώ το W(t) µεταβάλλεται µε βάση τον µηχανισµό προσαρµογής παραθύρου
που εφαρµόζει η συγκεκριµένη έκδοση του TCP. H απώλεια κάποιου πακέτου
γίνεται αντιληπτή από τον αποστολέα είτε µε την εκπνοή κάποιου χρονοµετρητή,
είτε µε τη λήψη διπλών επιβεβαιώσεων. Σε ένα ενσύρµατο δίκτυο ή απώλεια ενός
πακέτου σηµαίνει την ύπαρξη κατάστασης συµφόρησης στο δίκτυο. Αυτό έχει σαν
αποτέλεσµα την αλλαγή στο µέγεθος του παραθύρου και την επαναµετάδοση του
πακέτου που έχει χαθεί. Σε αυτή την περίπτωση, το A(t) δεν µεταβάλλεται. Επίσης, το
W(t) δεν µπορεί να αυξηθεί πέρα από το ελάχιστο των Wrec και Wm, όπου Wm είναι το
µέγιστο µέγεθος παραθύρου συµφόρησης. Στη συνέχεια υποθέτουµε ότι το W(t)
περιορίζεται µόνο από το Wm , δηλαδή Wm < Wrec .
28
Page 17
Κεφάλαιο 1 - Το Πρωτόκολλο TCP
Οι εκδόσεις του TCP που υπάρχουν διαφέρουν κυρίως στο τρόπο µε τον οποίο
γίνεται η διαχείριση του παραθύρου µετάδοσης πακέτων. Οι διαφορές σχετίζονται
µε τον τρόπο που µειώνεται το παράθυρο µετάδοσης πακέτου σε κάποια απώλεια
πακέτου και στον τρόπο που το παράθυρο αυτό αυξάνει όταν δεν υπάρχουν απώλειες.
Υπάρχουν πέντε διαφορετικές εκδόσεις του TCP και είναι οι εξής: TCP OldTahoe, TCP
Tahoe, TCP Reno, TCP NewReno και TCP Sack. Η διαδικασία προσαρµογής του
παραθύρου στην οποία στηρίζονται οι παραπάνω αλγόριθµοι προτάθηκε και
υλοποιήθηκε από τον Van Jacobson.
Αρχικά δίνεται µια περιγραφή του βασικού µηχανισµού προσαρµογής
παραθύρου και στην συνέχεια δίνονται τα σηµεία στα οποία διαφέρουν οι εκδόσεις του
TCP. Σε κάθε χρονική στιγµή t το παράθυρο µετάδοσης δεδοµένων του αποστολέα
δηλώνεται µε W(t) και το κατώφλι αργής εκκίνησης (slow start threshold) µε ω(t).
∆ιακρίνονται οι ακόλουθες περιπτώσεις:
• Αν W(t) < ω(t), κάθε νέα επιβεβαίωση από τον δέκτη έχει σαν αποτέλεσµα την
αύξηση του W(t) κατά ένα πακέτο. Αυτή είναι η φάση της αργής εκκίνησης
(slow start phase). Έτσι, το µέγεθος του παραθύρου διπλασιάζεται σε κάθε
RTT (round-trip time).
• Αν W(t) > ω(t), κάθε επιβεβαίωση αυξάνει το W(t) κατά 1/ W(t) όσο το W(t)
είναι µικρότερο από το παράθυρο του δέκτη. Αν το W(t) είναι ίσο µε το
παράθυρο του δέκτη, τότε παραµένει αµετάβλητο. Αυτή είναι η φάση της
αποφυγής συµφόρησης (congestion avoidance). Το αποτέλεσµα αυτής της
φάσης είναι η αύξηση του µεγέθους του παραθύρου κατά ένα πακέτο σε κάθε
RTT δοθέντος ότι το παράθυρο του αποστολέα (παράθυρο συµφόρησης)
είναι µικρότερο από το παράθυρο του δέκτη.
• Αν εκπνεύσει ο χρονοµετρητής στον δέκτη, τότε W ( t +) =1 και ω( t +)
=W ( t )/2 και η επαναµετάδοση ξεκινά από το πρώτο πακέτο που έχει
χαθεί.
Αν ένα πακέτο που µεταδίδεται από τον αποστολέα στον δέκτη χαθεί ή φτάσει στον
προορισµό του µε λάθη, τότε δεν παράγεται επιβεβαίωση. Για να είναι γνωστό πότε ένα
πακέτο πρέπει να επαναµεταδοθεί χρησιµοποιείται ένας χρονοµετρητής o οποίος
29
Page 18
συσχετίζεται µε το πακέτο όταν αυτό πρόκειται να µεταδοθεί. Αν o χρονοµετρητής αυτός
εκπνεύσει πριν ληφθεί επιβεβαίωση για το πακέτο, τότε το πακέτο πρέπει να
επαναµεταδοθεί. Στην συνέχεια δίνονται συγκεκριµένες λεπτοµέρειες για τις διάφορες
εκδόσεις του πρωτοκόλλου TCP.
1.7.1 TCP OldTahoe O αλγόριθµος προσαρµογής του παραθύρου [8] είναι αυτός που περιγράφηκε
προηγουµένως. Η απώλεια ενός πακέτου γίνεται αντιληπτή µε την εκπνοή ενός
χρονοµετρητή. Εποµένως, όταν συµβεί απώλεια ενός πακέτου o αποστολέας πρέπει να
περιµένει µέχρι να λήξει o χρονοµετρητής, κάτι που µειώνει τις επιδόσεις του
πρωτοκόλλου.
1.7.2 TCP Tahoe Ενώ στο TCP OldTahoe η απώλεια ενός πακέτου γίνεται αντιληπτή µε την λήξη ενός
χρονοµετρητή, στο TCP Tahoe [9] η απώλεια ενός πακέτου µπορεί επίσης να γίνει
αντιληπτή µε την λήψη Ω συνεχόµενων διπλών επιβεβαιώσεων. Σε µια τέτοια
περίπτωση, o δέκτης αντιδρά σαν να έληξε κάποιος χρονοµετρητής και προχωρά στην
επαναµετάδοση του πακέτου που έχει χαθεί. Μια διπλή επιβεβαίωση σηµατοδοτεί είτε
την απώλεια ενός πακέτου είτε ότι ένα πακέτο καθυστέρησε µε αποτέλεσµα η λήψη του
να γίνει εκτός σειράς. Για να γίνει διαχωρισµός των δύο περιπτώσεων, ο αποστολέας να
περιµένει µέχρι να λάβει τρεις διπλές επιβεβαιώσεις για το ίδιο πακέτο. Έτσι στις
περισσότερες υλοποιήσεις το Ω είναι 3.
Το παράθυρο του αποστολέα και το κατώφλι αργής εκκίνησης µεταβάλλονται µε τον
τρόπο που περιγράφηκε παραπάνω. Η µέθοδος ανίχνευσης απώλειας πακέτου µε την
χρήση διπλών επιβεβαιώσεων ονοµάζεται γρήγορη επαναµετάδοση (fast retransmit).
Όπως είναι φανερό, αυτή η µέθοδος µπορεί να οδηγήσει σε καλύτερη χρήση του
καναλιού και καλύτερη ρυθµαπόδοση. Ενδέχεται όµως σε ορισµένες περιπτώσεις να
επαναµεταδοθούν πακέτα τα οποία έχουν ληφθεί σωστά από τον δέκτη.
1.7.3 TCP Reno
Αυτή η έκδοση [10] επεκτείνει την διαδικασία γρήγορης επαναµετάδοσης
χρησιµοποιώντας την γρήγορη ανάκαµψη (fast recovery). Μόλις γίνει ανίχνευση της
απώλειας κάποιου πακέτου από την διαδικασία γρήγορης επαναµετάδοσης, o
αποστολέας στέλνει το πακέτο που χάθηκε και µειώνει το παράθυρο συµφόρησης στο
µισό. Στην διαδικασία γρήγορης ανάκαµψης, αντί ο αποστολέας να µπαίνει στην φάση
30
Page 19
Κεφάλαιο 1 - Το Πρωτόκολλο TCP
αργής εκκίνησης χρησιµοποιεί επιπλέον εισερχόµενες επιβεβαιώσεις για την αποστολή
νέων πακέτων. Έτσι, αν η απώλεια του πακέτου έγινε σε ένα παράθυρο µε κατώφλι σ,
τότε ω(t+) =σ/2 και W(t+)=ω(t+)+Ω όπου η πρόσθεση του Ω γίνεται γιατί Ω πακέτα
µεταδόθηκαν επιτυχώς και οδήγησαν στις Ω διπλές επιβεβαιώσεις.
Όταν ο αποστολέας µεταδώσει και πάλι το πακέτο που χάθηκε περιµένει την
επιβεβαίωση για το πακέτο αυτό. Αν ο αποστολέας λάβει επιπλέον διπλές επιβεβαιώσεις
όσο περιµένει για την συγκεκριµένη επιβεβαίωση, αυξάνει το W(t) κατά 1 για κάθε διπλή
επιβεβαίωση. Με αυτόν τον τρόπο ο αποστολέας αυξάνει το παράθυρό του µε το πλήθος
των διπλών επιβεβαιώσεων που έλαβε. Όταν ληφθεί πλήθος διπλών επιβεβαιώσεων ίσο
µε το µισό του παραθύρου, o αποστολέας στέλνει ένα νέο πακέτο για κάθε διπλή
επιβεβαίωση που λαµβάνει. ∆ηλαδή, µέχρι το σ/2 + πλήθος διπλών επιβεβαιώσεων
ξεπεράσει το σ, o αποστολέας δεν µπορεί να στείλει νέα πακέτα. Μόλις ληφθεί µια
επιβεβαίωση για καινούργια δεδοµένα (recovery ACK) o αποστολέας τερµατίζει την
διαδικασία γρήγορης ανάκαµψης και ξεκινά την µετάδοση µε W(t+) = ω(t+) = σ/2 .
Όταν ένα πακέτο από το παράθυρο του αποστολέα χαθεί, τότε η επιβεβαίωση για την
πρώτη επαναµετάδοση θα ολοκληρώσει την ανάκαµψη. Αλλά αν υπάρξουν πολλές
απώλειες από ένα παράθυρο τότε η επιβεβαίωση από την πρώτη επαναµετάδοση οδηγεί
σε µερική επιβεβαίωση. Μια µερική επιβεβαίωση βγάζει τον αποστολέα από την
διαδικασία γρήγορης ανάκαµψης και µειώνει το µέγεθος του παραθύρου σε αυτό του
παραθύρου συµφόρησης. Αν το παράθυρο επιτρέπει στον αποστολέα την µετάδοση
επιπλέον πακέτων που µπορούν να προκαλέσουν νέες διπλές επιβεβαιώσεις, o
αποστολέας µπορεί να µπει και πάλι στην διαδικασία γρήγορης ανάκαµψης και να
επαναλάβει τα ίδια βήµατα για το επόµενο πακέτο που έχει χαθεί. Αλλά αν το πλήθος
των διπλών επιβεβαιώσεων δεν είναι αρκετό, η ανάκαµψη σταµατά και o αποστολέας
πρέπει να περιµένει για την εκπνοή κάποιου χρονοµετρητή. Μόλις εκπνεύσει o
χρονοµετρητής ακολουθείται ο βασικός αλγόριθµος.
H στρατηγική που ακολουθείται από τον αποστολέα στην Reno έκδοση είναι να
επαναµεταδώσει το πολύ ένα πακέτο που έχει χαθεί σε κάθε RTT (round-trip time). Για
απώλεια ενός πακέτου από το παράθυρο µετάδοσης, το TCP Reno βελτιώνει κατά πολύ
την απόδοση του Tahoe, αλλά για πολλαπλές απώλειες πακέτων από το παράθυρο
µετάδοσης το Reno έχει σηµαντικά προβλήµατα [9], [11].
31
Page 20
1.7.4 TCP New-Reno Αυτή η έκδοση [12] αντιµετωπίζει τα προβλήµατα που εµφανίζονται στο TCP Reno
όταν χαθούν πολλά πακέτα από το παράθυρο µετάδοσης. Στο Reno η λήψη µιας µερικής
επιβεβαίωσης βγάζει τον αποστολέα από την διαδικασία της γρήγορης ανάκαµψης. Στο
New-Reno, η λήψη µιας τέτοιας µερικής επιβεβαίωσης δεν βγάζει τον αποστολέα από
την γρήγορη ανάκαµψη, αλλά θεωρείται σαν ένδειξη ότι το πακέτο που ακολουθεί
αµέσως µετά το πακέτο που επιβεβαιώθηκε έχει χαθεί και πρέπει να επαναµεταδοθεί.
Έτσι, όταν χαθούν πολλά πακέτα από ένα παράθυρο το New-Reno µπορεί να ανακάµψει
χωρίς πρώτα να εκπνεύσει κάποιος χρονοµετρητής, επαναµεταδίδοντας ένα χαµένο
πακέτο σε κάθε round-trip time µέχρι όλα τα χαµένα πακέτα του παραθύρου να έχουν
επαναµεταδοθεί. Σε περίπτωση που το πλήθος των χαµένων πακέτων είναι τέτοιο που o
αποστολέας δεν µπορεί να µπει στην διαδικασία γρήγορης επαναµετάδοσης, είναι
αναγκαία η αναµονή για την εκπνοή κάποιου χρονοµετρητή. O αποστολέας παραµένει σε
φάση γρήγορης ανάκαµψης µέχρι όλα τα δεδοµένα που είχαν µεταδοθεί όταν ξεκίνησε η
φάση, επιβεβαιωθούν. Εφόσον, το NewReno αντιµετωπίζει τα προβλήµατα του Reno
είναι φανερό ότι θα έχει και καλύτερη απόδοση από αυτό.
1.7.5 TCP Sack H έκδοση Sack [30] (selective ack) του TCP είναι µια συντηρητική επέκταση του TCP
Reno υπό την έννοια ότι και οι δύο εκδόσεις χρησιµοποιούν τους ίδιους αλγορίθµους για
την προσαρµογή του παραθύρου µετάδοσης. Κάθε επιβεβαίωση που φτάνει στον
αποστολέα περιέχει πληροφορία για οποιοδήποτε συνεχόµενο πλήθος δεδοµένων τα
οποία έχουν ληφθεί και µπει στην ουρά του δέκτη. Με αυτό το τρόπο ο αποστολέας είναι
σε θέση να καταλάβει ποια πακέτα έχουν χαθεί. O αποστολέας, στο Sack TCP, µπαίνει
στην διαδικασία γρήγορης ανάκαµψης µόλις λάβει Ω διπλές επιβεβαιώσεις. H λήψη
µερικών επιβεβαιώσεων δεν βγάζει τον αποστολέα από την διαδικασία γρήγορης
ανάκαµψης, όπως γίνεται και στο NewReno. H διαφορά από το NewReno έγκειται στο
ότι εφόσον ο αποστολέας έχει περισσότερη πληροφορία για τα πακέτα που έχουν χαθεί,
δεν περιορίζεται στο να στείλει το πολύ ένα χαµένο πακέτο σε κάθε RTT όπως γίνεται
στο NewReno. O αποστολέας βγαίνει από την διαδικασία γρήγορης ανάκαµψης όταν
λάβει µια επιβεβαίωση ανάκαµψης. Και σε αυτή τη περίπτωση, αν o αποστολέας δεν
µπορεί να µπει στην διαδικασία γρήγορης επαναµετάδοσης λόγω έλλειψης διπλών
επιβεβαιώσεων πρέπει να περιµένει την εκπνοή κάποιου χρονοµετρητή.
32