Μετάβαση στο περιεχόμενο

Πρωτόκολλο Ελέγχου Μεταφοράς

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
(Ανακατεύθυνση από TCP)

Το Πρωτόκολλο Ελέγχου Μεταφοράς (Αγγλ. Transmission Control Protocol(TCP)) είναι ένα από τα σημαντικότερα πρωτόκολλα της Συλλογής Πρωτοκόλλων Διαδικτύου. Βρίσκεται πάνω από το πρωτόκολλο IP. Οι κύριοι στόχοι του συγκεκριμένου πρωτοκόλλου είναι να η επιβεβαίωση της αξιόπιστης αποστολής και λήψης δεδομένων, της μεταφοράς τους χωρίς λάθη μεταξύ του στρώματος δικτύου (network layer) και του στρώματος εφαρμογής (application layer) και, φτάνοντας στο πρόγραμμα του στρώματος εφαρμογής, η επίτευφη της σωστής σειράς. Οι περισσότερες σύγχρονες υπηρεσίες στο Διαδίκτυο βασίζονται στο TCP με χαρακτηριστικά παραδείγματα το SMTP (port 25), το παλαιότερο (και μη-ασφαλές) Telnet (pοrt 23), το FTP και το HTTP (port 80).

Τα πακέτα του πρωτοκόλλου TCP καλούνται segments (τμήματα)[1]. Ένα από τα κυριότερα μέρη ενός segment είναι η TCP επικεφαλίδα (TCP header), η οποία παρέχει συγκεκριμένες πληροφορίες για το πρωτόκολλο TCP. Το ελάχιστο μέγεθος της επικεφαλίδας είναι 5 words και το μέγιστο 15 words (απουσία ή παρουσία όλων των options αντίστοιχα).

TCP επικεφαλίδα
+ Bits 0 - 3 4 - 9 10 - 15 16 - 31
0 Source Port 
Θύρα Προέλευσης 
Destination Port 
Θύρα Προορισμού 
32 Sequence Number 
Αριθμός ακολουθίας 
64 Acknowledgment Number 
Αριθμός επιβεβαίωσης 
96 Data Offset 
 
Reserved 
 
Flags 
Σημαίες 
Window 
Παράθυρο 
128 Checksum 
Άθροισμα ελέγχου 
Urgent Pointer 
Επείγοντα δεδομένα 
160 Options 
Επιλογές (προαιρετικές) 
160/192+ Data 
Δεδομένα
 
Source Port
Αυτό το πεδίο προσδιορίζει τη θύρα αποστολής
Destination Port
Αυτό το πεδίο προσδιορίζει την port (θύρα) του παραλήπτη
Sequence Number
Ο sequence number (αριθμός ακολουθίας) έχει διπλό ρόλο:
  • Εαν υπάρχει η SYN flag (SYN σημαία) τότε είναι ο αρχικός αριθμός ακολουθίας (ISN - initial sequence number) και η πρώτη octet δεδομένων του πακέτου είναι ο ISN+1.
  • Αλλιώς, εαν δεν υπάρχει η SYN flag, τότε η πρώτη octet δεδομένων είναι ο αριθμός ακολουθίας.
Acknowledgment number
Όταν υπάρχει η ACK flag η τιμή αυτού του πεδίου δείχνει τον επόμενο sequence number (αριθμό ακολουθίας) που αναμένει ο αποστολέας.
Data offset
Είναι ο αριθμός από words μεγέθους 32 bit στην επικεφαλίδα TCP (TCP header). Καθορίζει το μέγεθος της επικεφαλίδας (πολλαπλάσιο του 32) και επομένως δείχνει και την αρχή των δεδομένων[2].
Reserved
Πεδίο 6 bit "κρατημένων" (αγγλ. reserved) για μελλοντική χρήση. Η τιμή των bit πρέπει να είναι 0.
Flags (επίσης γνωστό ως bits ελέγχου - Control bits)
Περιέχει 6 bit - σημαίες:
Σημαία Σημασία Προέλευση ονομασίας
URG Το πεδίο urgent pointer είναι σημαντικό URGent
ACK Το πεδίο επιβεβαίωσης είναι σημαντικό ACKnowledgment
PSH Λειτουργία ώθησης PuSH
RST Επαναρύθμιση σύνδεσης ReSeT
SYN Συγχρονισμός αριθμών ακολουθίας SYNchronize
FIN Ο αποστολέας δεν στέλνει άλλα δεδομένα FINish
Window
Ο αριθμός από octets δεδομένων (bytes) που επιθυμεί να δεχτεί ο αποστολέας του πακέτου, αρχίζοντας από εκείνη που δείχνει το πεδίο επιβεβαίωσης (acknowledgment field).
Checksum
Το πεδίο checksum μεγέθους 16 bit χρησιμοποιείται για έλεγχο λαθών στην επικεφαλίδα και στα δεδομένα. To checksum υπολογίζεται πάνω σε ψευδο-κεφαλίδα.
Options
Μεταβλητή, η οποία καθορίζει ειδικές επιλεγόμενες ρυθμίσεις και μπορεί να καταλάβει χώρο στο τέλος της επικεφαλίδας TCP (TCP header). Το μήκος τους είναι πολλαπλάσιο των 8 bit και σε το περιεχόμενο της επικεφαλίδας μετά την τελευταία επιλογή πρέπει να γεμίζει (π.χ. με μηδενικά - 0). Με αυτόν τον τρόπο το data offset θα δείχνει σωστά την αρχή των δεδομένων.
Urgent pointer
Εάν είναι ενεργοποιημένο το URG bit ελέγχου, τότε αυτό το πεδίο δείχνει τον αριθμό ακολουθίας (sequence number)της octet που βρίσκεται αμέσως μετά το τελευταίο byte από τα επείγοντα δεδομένα. Έτσι παρουσιάζει τη θέση του τελευταίου byte με επείγοντα δεδομένα.

Τρόπος λειτουργίας

[Επεξεργασία | επεξεργασία κώδικα]

Το πρωτόκολλο ελέγχου μεταφορών (TCP) είναι connection oriented, δηλαδή η μεταφορά δεδομένων γίνεται μέσω σύνδεσης, η οποία οριοθετείται από ένα σήμα έναρξης και ένα σήμα τέλους ή διακοπής.

Έναρξη - Τριμερής χειραψία / 3-way handshake

[Επεξεργασία | επεξεργασία κώδικα]

Πριν να προσπαθήσει ένα πρόγραμμα-πελάτης (client) να συνδεθεί με έναν server, ο server πρέπει πρώτα να δεσμεύσει μια θύρα και να την ανοίξει ώστε να δέχεται συνδέσεις· αυτό καλείται passive open. Κατόπιν, ο client μπορεί να αρχίσει τη σύνδεση (active open). Για να γίνει μια σύνδεση, γίνεται μια "χειραψία" ανάμεσα στα συμμετέχοντα μέρη, το λεγόμενο three-way handshake:

Έναρξη της σύνδεσης με three-way handshake

1.Αρχικά αποστέλεται ένα πακέτο[1] με το SYN bit ενεργοποιημένο. Ο client θέτει το πεδίο αριθμού ακολουθίας στην TCP επικεφαλίδα (TCP header) στον αρχικό αριθμό ακολουθίας του (ISN - initial sequence number).

2.Ο server στο άλλο άκρο απαντάει:

  • είτε με SYN (για να στείλει και το δικό του ISN) και ACK (που έχει το ISN+1 του client) του πρώτου πακέτου του client για να αποδεχτεί τη σύνδεση,
  • ή SYN/RST για να ενημερώσει τον client ότι αρνείται τη σύνδεση και η διαδικασία σταματά.

3.Όταν ο client πάρει ένα πακέτο SYN/ACK απαντάει, αυτή τη φορά, με ένα πακέτο ACK. Σε αυτό το σημείο, τα δύο μέρη συνδέονται και μπορούν πλέον να σταλούν τα δεδομένα.

Κατά τη διάρκεια του three-way handshake, τα δύο μέρη διαπραγματεύονται επίσης όλες τις ειδικές επιλογές που θα χρησιμοποιηθούν κατά τη διάρκεια της σύνδεσης TCP, όπως ECN κ.α.

Μεταφορά δεδομένων

[Επεξεργασία | επεξεργασία κώδικα]

Μόλις ανταλλαχθούν οι ISNs, οι εφαρμογές μπορούν να διαβιβάσουν δεδομένα η μια στην άλλη. Η ανάλυση του τρόπου με τον οποίο γίνεται η μεταφορά δεδομένων, απαιτεί εξέταση για

  • έλεγχο ροής (flow control) και
  • τεχνικές ελέγχου συμφόρησης (congestion avoidance).

Σε μια απλή υλοποίηση του TCP, χωρίς τους προαναφερθέντες ελέγχους,η εφαρμογή θα στείλει πακέτα στο δίκτυο προς τον παραλήπτη, εφ'όσον υπάρχουν δεδομένα να σταλούν και εφ' όσον ο αποστολέας δεν υπερβαίνει το window που του έχει υποδείξει ο παραλήπτης. Όταν ο παραλήπτης δέχεται πακέτα TCP, στέλνει επιβεβαιώσεις (acknowledgement), δείχνοντας σε ποιο σημείο του ρεύματος από byte (byte stream) βρίσκεται. Αυτές οι επιβεβαιώσεις περιέχουν επίσης το επόμενο window (παράθυρο) που καθορίζει πόσα byte επιθυμεί να δεχτεί στη συνέχεια ο παραλήπτης.

Εάν ορισμένα δεδομένα αναπαράγονται ή χάνονται, μπορεί να δημιουργηθεί ένα κενό στο ρεύμα από byte (byte stream). Ο παραλήπτης θα συνεχίσει να επιβεβαιώνει την νεότερη θέση που βρίσκεται, στο ρεύμα από byte που έχει δεχτεί.

Εάν δεν υπάρχουν δεδομένα για να σταλούν, ο αποστολέας θα βρίσκεται σε αδράνεια αναμένοντας την εφαρμογή να βάλει δεδομένα στο byte stream ή να παραλάβει δεδομένα από το άλλο άκρο της σύνδεσης.

Ο έλεγχος ροής απαιτεί την επιβεβαίωση λήψης (acknowledgment) κάθε πακέτου από τον απόμακρο host πριν να σταλεί το επόμενο. Οι αλγόριθμοι για το sliding window [3], που χρησιμοποιούνται από το TCP, επιτρέπουν σε πολλαπλά πακέτα δεδομένων να μεταφέρονται ταυτόχρονα για να χρησιμοποιείται αποδοτικότερα το εύρος ζώνης (bandwidth) ενός δικτύου.

Για παράδειγμα, εαν ένας υπολογιστής A στείλει 4 byte με αριθμό ακολουθίας (sequence number) 100 - συνεπώς, τα 4 bytes έχουν αριθμό ακολουθίας 100, 101, 102 και 103 - τότε ο παραλήπτης πρέπει να απαντήσει με επιβεβαίωση (acknowledgement) που φέρει sequence number 104. Αυτό πρόκειται να είναι το επόμενο byte που περιμένει στο επόμενο πακέτο. Εαν για κάποιο λόγο, τα τελευταία δύο bytes περιέχουν σφάλματα τότε η τιμή της επιβεβαίωσης θα είναι 102, εφόσον τα bytes με αριθμό 100 και 101 έχουν φτάσει με επιτυχία.

Έλεγχος συμφόρησης

[Επεξεργασία | επεξεργασία κώδικα]

Αν και το TCP συνήθως δεν ενδιαφέρεται για όσα συμβαίνουν στο διαδίκτυο (αυτό είναι εργασία που εκτελείται από IP protocol στο 3ο επίπεδο του μοντέλου OSI) πρέπει να είναι αρκετά "έξυπνο", ώστε να αντιληφθεί και να χειριστεί κατάλληλα μια συμφόρηση στο δίκτυο. Το TCP δεν μπορεί να αγνοήσει τι συμβαίνει στο διαδίκτυο μεταξύ των δύο συνδεδεμένων άκρων.

Για αυτόν τον λόγο, το TCP περιλαμβάνει διάφορους συγκεκριμένους αλγορίθμους που έχουν ως σκοπό είτε να αποφύγουν εξ αρχής τη συμφόρηση, είτε να ανταποκριθούν σε αυτή. Χρησιμοποιούνται διάφοροι μηχανισμοί για να επιτευχθεί υψηλή απόδοση και να μην υπερφορτωθεί το δίκτυο. Αυτοί οι μηχανισμοί περιλαμβάνουν:

  • τον αλγόριθμο slow-start,
  • τον αλγόριθμο congestion avoidance,
  • τον αλγόριθμο fast retransmit και
  • τον αλγόριθμο fast recovery

όπως αναφέρεται στο RFC 2001.

Η σύνδεση τερματίζεται με ένα four-way handshake, με την κάθε πλευρά να τερματίζει ανεξάρτητα:

1.Όταν κάποιο άκρο επιθυμεί να κλεισει τη σύνδεση από πλευράς του, στέλνει ένα πακέτο με το FIN ενεργοποιημένο,
2.Το πακέτο αυτό επιβεβαιώνει η άλλη πλευρά με ένα ACK και
3.στη συνέχεια, στέλνει το ένα πακέτο FIN
4.Η πλευρά που ξεκίνησε τον τερματισμό, μπορεί να το επιβεβαιώσει στέλνοντας ένα πακέτο ACK.

Με αυτόν τον τρόπο, για έναν τυπικό τερματισμό χρειάζεται ένα ζεύγος πακέτων FIN και ACK για κάθε άκρο στη σύνδεση TCP. Μια σύνδεση μπορεί να είναι "half-open", δηλαδή η μία πλευρά να έχει τερματίσει, όχι όμως και η άλλη. Η πλευρά που έχει τερματίσει δεν μπορεί να στείλει πλέον δεδομένα, ενώ η άλλη μπορεί.

Τέλος, είναι δυνατό, αν και λιγότερο πιθανό, οι δύο host να στείλουν ταυτόχρονα ένα πακέτο FIN ο ένας στον άλλο. Στη συνέχεια ο καθένας επιβεβαιώνει το FIN που δέχτηκε με ένα πακέτο ACK. Στο σημείο αυτό και οι δύο διακόπτουν τη σύνδεση.

  1. 1,0 1,1 Στα αντίστοιχα RFCs η έννοια πακέτο δεν χρησιμοποιείται τόσο γενικευμένα, συγκεκριμένα:
    τα πακέτα IP
    καλούνται διαγράμματα δεδομένων (IP datagrams), ενώ
    τα πακέτα TCP
    καλούνται τμήματα, τομείς ή τεμάχια (TCP segments).
    Για λόγους απλότητας στο παρόν άρθρο αναφέρονται όλα ως πακέτα.
  2. Offset
    1. (ρήμα) αντισταθμίζω
    2. (ουσιαστικό - τυπογραφία) οφσετ
  3. Sliding window
    ολίσθαίνον/συρόμενο παράθυρο

Oskar Andreasson, Iptables Tutorial 1.2.1, online έκδοση

Εξωτερικοί σύνδεσμοι

[Επεξεργασία | επεξεργασία κώδικα]
RFCs
Άλλα κείμενα

The Law of Leaky Abstractions (Joel Spolsky) (Αγγλικά)[1], (Ελληνικά) [2]

Demo

Sliding Window Demo Αρχειοθετήθηκε 2011-03-11 στο Wayback Machine. — Επίδειξη του τρόπου με τον οποίο λειτουργεί το sliding window