Κεφάλαιο 4 Επίπεδο Μεταφοράς
4.1 Πρωτόκολλα προσανατολισμένα στη σύνδεση – χωρίς σύνδεση
Το επίπεδο μεταφοράς είναι υπεύθυνο για την επικοινωνία των δεδομένων που λαμβάνονται από το επίπεδο εφαρμογής του υπολογιστή αφετηρίας μέχρι το αντίστοιχο του προορισμού ή αλλιώς επικοινωνία από άκρο σε άκρο (end to end), με ή χωρίς εγκατάσταση σύνδεσης.

Οι λειτουργίες που αναλαμβάνει το επίπεδο μεταφοράς είναι:
- η εγκατάσταση και ο τερματισμός των συνδέσεων,
- ο έλεγχος ροής της πληροφορίας ώστε μια γρήγορη μηχανή να μην υπερφορτώνει μια αργή, και
- η επιβεβαίωση ότι η πληροφορία έφτασε πράγματι στον προορισμό της.
Τα δύο βασικά πρωτόκολλα στο επίπεδο μεταφοράς είναι:
- το TCP, Transmission Control Protocol το οποίο είναι προσανατολισμένο σε σύνδεση (connection oriented)
- το UDP, User Datagram Protocol το οποίο είναι χωρίς σύνδεση (connectionless).
Τα πρωτόκολλα που είναι προσανατολισμένα στη σύνδεση πριν ξεκινήσουν τη μετάδοση των δεδομένων εγκαθιστούν μια σύνδεση από άκρο σε άκρο μεταξύ των κόμβων για να εξασφαλίσουν μια διαδρομή (νοητή σύνδεση) για τη μετάδοση των πακέτων. Όλα τα πακέτα μεταδίδονται μέσα από την ίδια νοητή σύνδεση. Αφού ξεκινήσει η μετάδοση, εξασφαλίζουν ότι τα δεδομένα θα φτάσουν στον παραλήπτη χωρίς σφάλματα.
Στα πρωτόκολλα χωρίς σύνδεση η μετάδοση δεδομένων ξεκινά άμεσα χωρίς να έχει προηγηθεί επικοινωνία με τον παραλήπτη. Τα δεδομένα μεταδίδονται σε αυτοδύναμα πακέτα (datagrams) χωρίς την εγκατάσταση νοητής σύνδεσης. Τα πρωτόκολλα αυτά θεωρούνται αναξιόπιστα καθώς δεν εξασφαλίζουν ότι τα δεδομένα θα φτάσουν στο προορισμό τους.
4.1.1 Πρωτόκολλο TCP – Δομή Πακέτου
Για να κατανοηθεί η λειτουργία του πρωτοκόλλου TCP ας δούμε ένα παράδειγμα:
- Έστω ότι θέλουμε να αποστείλουμε ένα μήνυμα μέσω ηλεκτρονικού ταχυδρομείου. Αρχικά η εφαρμογή χρησιμοποιώντας τα πρωτόκολλα του επιπέδου εφαρμογής παράγει μια σειρά πληροφοριών υπό μορφή δεδομένων.
- Η πληροφορία παραλαμβάνεται στο επίπεδο μεταφοράς από το πρωτόκολλο TCP που αναλαμβάνει να μεταφέρει τα δεδομένα — πληροφορίες από το ένα άκρο στο άλλο. Δεδομένα 6000 octets.
- Ελέγχει το δίκτυο και διαπιστώνει ότι δεν μπορεί να διαχειριστεί datagram μεγαλύτερα από 600 octets.
- Για να αντιμετωπιστεί η κατάσταση το αρχικό πακέτο δεδομένων, διασπάται σε 10 μικρότερα των 600 octets και αποστέλλονται ανεξάρτητα από το ένα άκρο στο άλλο.
- Τα μικρότερα αυτά πακέτα συμφωνημένου μεγέθους ονομάζονται Τμήματα (segments). Επομένως στο πρωτόκολλο TCP η μονάδα δεδομένων που διαχειρίζεται (PDU) αναφέρεται ως Τμήμα (Segment).
- Όταν τα τμήματα φτάσουν στο άλλο άκρο θα επανασυνδεθούν για να σχηματίσουν το αρχικό μήνυμα των 6000 οκτάδων.
- Επειδή τα τμήματα μεταφέρονται μέσω ενθυλάκωσης σε αυτοδύναμα πακέτα IP, είναι πιθανόν να φτάσουν με διαφορετική σειρά (κάθε IP πακέτο μπορεί να ακολουθήσει διαφορετική διαδρομή).
- Στην διαδρομή ενδεχομένως κάποια πακέτα IP να καταστραφούν: το πρωτόκολλο IP δεν παρέχει λειτουργίες αξιόπιστης μετάδοσης. Τα τμήματα που μεταφέρονται σε προβληματικά (ή χαμένα) πακέτα IP θα πρέπει να μεταδοθούν ξανά από το επίπεδο μεταφοράς.

Εάν το δίκτυο μεταξύ των δύο άκρων μπορεί να μεταφέρει ολόκληρο το τμήμα (segment) μέσα σε ένα αυτοδύναμο πακέτο, δεν θα χρειαστεί να διασπαστεί.
Ένα ακόμη θέμα που πρέπει να χειριστεί το TCP είναι σε ποια σύνδεση ανήκει ένα συγκεκριμένο τμήμα. Για να γίνει κατανοητό αυτό στο ένα άκρο, σε ένα ηλεκτρονικό υπολογιστή (κόμβο) μπορεί η ίδια ή και διαφορετική εφαρμογή να παράγει πολλά ανεξάρτητα μηνύματα που πρέπει να αποσταλούν στον ίδιο ή και σε διαφορετικό προορισμό.
Επίσης στο άλλο άκρο εξυπηρετητή (κόμβο) μπορεί να παραλαμβάνονται τμήματα από πολλούς διαφορετικούς αποστολείς και να απευθύνονται σε διαφορετικές δικτυακές εφαρμογές.
Πολυπλεξία (Multiplexing) είναι η δυνατότητα πολλές διεργασίες μέσα στον ίδιο τερματικό κόμβο (host) να χρησιμοποιούν τις υπηρεσίες επικοινωνίας του TCP ταυτόχρονα.
Το TCP στην φάση της επανασύνδεσης του αρχικού μηνύματος πρέπει να γνωρίζει ποια είναι
η προέλευση (source) του μηνύματος και ποιος ο προορισμός (destination).
Έτσι το TCP εξασφαλίζει την αξιοπιστία της σύνδεσης με:
- Την Εγκατάσταση Σύνδεσης από την προέλευση στον προορισμό.
- Τεμαχίζει τα δεδομένα αν επιβάλλεται από το δίκτυο.
- Επιβεβαιώνει την παραλαβή δεδομένων.
- Τοποθετεί στη σειρά τα τμήματα κατά την παραλαβή
Όλες αυτές οι πληροφορίες που είναι απαραίτητες για τον έλεγχο και την ανασύνθεση του αρχικού μηνύματος περιέχονται στην επικεφαλίδα που δημιουργείται κατά τον αρχικό σχηματισμό του τμήματος.
Η επικεφαλίδα (header) είναι ένα σύνολο από octets δεδομένων πριν από τα πραγματικά δεδομένα και προστίθεται στην αρχή του τμήματος.

Η επικεφαλίδα έχει ελάχιστο μήκος 20 octets και μέγιστο 60 octets μαζί με το προαιρετικό πεδίο options.

Οι πληροφορίες που περιλαμβάνονται στην επικεφαλίδα του TCP τμήματος είναι:
- Ο Αριθμός Θύρας Προέλευσης (source port number) και Αριθμός Θύρας Προορισμού (destination port number). Οι αριθμοί θύρας χρησιμεύουν στην ταυτοποίηση των διαφορετικών συνομιλιών μεταξύ των δύο άκρων. Για παράδειγμα ένα πρόγραμμα εξυπηρέτησης ηλεκτρονικού ταχυδρομείου χρησιμοποιεί (βάση προτύπου) τη θύρα TCP25, ενώ ένα αντίστοιχο ιστοσελίδων τη θύρα 80. Έστω ότι θέλουμε να στείλουμε 2 μηνύματα ηλεκτρονικού ταχυδρομείου προς ένα εξυπηρετητή. Το TCP αποδίδει τους αριθμούς θύρας προέλευσης για τα δύο τμήματα. Π.χ. τα νούμερα 1024 και 2024. Βέβαια το TCP πρέπει να γνωρίζει ποια είναι η θύρα προορισμού στο άλλο άκρο, και για το λόγο αυτό προσθέτει τον αριθμό 25 στην επικεφαλίδα στο αντίστοιχο πεδίο (του προορισμού). Τώρα, αν από το άλλο άκρο πρέπει να σταλεί πίσω ένα τμήμα τότε τα πεδία θύρα προέλευσης και προορισμού πρέπει να αντιστραφούν στην επικεφαλίδα του αντίστοιχου τμήματος.
- O Αριθμός Σειράς (Sequence Number). O αριθμός αυτός χρησιμεύει ώστε ο παραλήπτης στο άλλο άκρο να τοποθετεί τα τμήματα στη σωστή σειρά καθώς συνθέτει το αρχικό τμήμα, επειδή η σειρά που έχουν παραληφθεί μπορεί να είναι διαφορετική από τη σειρά που έχουν, αποσταλεί. Το TCP αριθμεί τα τμήματα με βάση τα octets, έτσι αν κάθε τμήμα αποτελείται από 600 octets, τότε ο αριθμός σειράς στην επικεφαλίδα του πρώτου τμήματος θα έχει τον αριθμό 0, στου δεύτερου 600, στου τρίτου 1200 κ.ο.κ.
- O Αριθμός Επιβεβαίωσης (Acknowledgment). Ο αριθμός αυτός χρησιμοποιείται για να διασφαλιστεί ότι κάθε τμήμα έχει φτάσει στον προορισμό του. Όταν ο παραλήπτης στο άλλο άκρο παραλάβει το τμήμα στέλνει ένα νέο τμήμα (ACK- επιβεβαίωσης) του οποίου το πεδίο Αριθμός επιβεβαίωσης, είναι συμπληρωμένο. Για παράδειγμα, στέλνοντας ένα τμήμα με επιβεβαίωση τον αριθμό 1201, σημαίνει ότι έχουν φτάσει όλα τα δεδομένα μέχρι και το octet με αριθμό 1200. Αν η επιβεβαίωση δεν παραληφθεί μέσα σε ένα συγκεκριμένο χρονικό διάστημα, αποστέλλονται ξανά τα δεδομένα.
- Το Μέγεθος Παράθυρο (Window). Mε το πεδίο Window κάθε άκρο δηλώνει πόσα νέα δεδομένα μπορεί να απορροφήσει τοποθετώντας σ’ αυτό το πεδίο τον αριθμό από octets που διαθέτει ελεύθερα ο ενταμιευτής εισόδου (buffer). Αν ο χώρος αυτός γεμίσει πρέπει ο αποστολέας να σταματήσει την αποστολή νέων δεδομένων επειδή σ’ αυτή την περίπτωση τα δεδομένα θα απορριφθούν. Όταν ο παραλήπτης απελευθερώσει χώρο δηλώνει με το πεδίο Window ότι είναι έτοιμος να δεχτεί νέα δεδομένα.
- Το Άθροισμα Ελέγχου (Checksum). Ο αριθμός στο πεδίο αυτό της επικεφαλίδας τοποθετείται από τον αποστολέα αφού υπολογίσει το άθροισμα απ’ όλα τα octets σε ένα τμήμα (segment). Το TCP στο άλλο άκρο υπολογίζει ξανά το άθροισμα και το συγκρίνει με αυτό παρέλαβε. Αν τα δύο αποτελέσματα δεν είναι ίδια, τότε κάτι συνέβη κατά τη μεταφορά και το segment απορρίπτεται.
- Τα πεδία Σημαίες Ελέγχου (Flags) χρησιμεύουν για τον χειρισμό των συνδέσεων και αντιστοιχούν σε 9 bit όπου τα σημαντικότερα από αυτά είναι:
- URG (Urgent Pointer). Το πεδίο URG επιτρέπει στο ένα άκρο να πληροφορήσει το άλλο για κάτι σημαντικό, όπως να προχωρήσει επειγόντως στην επεξεργασία της συγκεκριμένης οκτάδας. Αυτό μπορεί να συμβαίνει π.χ. αν ο χρήστης ζητήσει τη διακοπή της επικοινωνίας στέλνοντας ένα χαρακτήρα ελέγχου (π.χ. πιέζοντας CTRL+C (διακοπή) σε μια μεταφορά αρχείου μέσω FTP σε ένα σύστημα.
- ACK (Acknowledgment). Το πεδίο αυτό δηλώνει ότι ο κόμβος που στέλνει το bit με τιμή 1 (On) επιβεβαιώνει τη λήψη δεδομένων.
- PSH (Push). Το πεδίο αυτό ενημερώνει το παραλήπτη ότι πρέπει όσο το δυνατό γρηγορότερα να προωθήσει τα δεδομένα στο επίπεδο εφαρμογής.
- RST (Reset). Το πεδίο αυτό κάνει επισημαίνει επανεκκίνηση /καθαρισμό της σύνδεσης.
- SYN (Synchronize). Το πεδίο αυτό χρησιμεύει για το συγχρονισμό της εγκατάστασης μιας νέας σύνδεσης χρησιμοποιώντας τα πεδία Αριθμός Σειράς έτσι ώστε να ξεκινήσει μία σύνδεση.
- FIN (Finalize). Το πεδίο αυτό ενημερώνει ότι ο αποστολέας έχει τελειώσει την μεταφορά δεδομένων.
Η δομή του πακέτου του πρωτοκόλλου TCP περιέχει όλες πληροφορίες που απαιτούνται σε μια επικοινωνία που παρέχει υπηρεσίες με σύνδεση και αφορούν τα εξής:
- Την Εγκατάσταση σύνδεσης με συμφωνημένες προδιαγραφές επικοινωνίας μεταξύ των δυο άκρων.
- Την Αξιοπιστία στην μετάδοση των δεδομένων. Απώλεια δεδομένων μετά τον έλεγχο σφαλμάτων απαιτεί αναμετάδοση.
- Τον Έλεγχο ροής δεδομένων δηλαδή τον έλεγχο ώστε να μην πλημμυρίσει ο παραλήπτης με δεδομένα από το αποστολέα.
- Τον Έλεγχο Συμφόρησης δεδομένων δηλαδή τον έλεγχο ώστε να μην πλημμυρίσει ‘ένα αργό κανάλι επικοινωνίας με δεδομένα με κίνδυνο κατάρρευσης.
Πρωτόκολλο UDP – Δομή πακέτου
Το πρωτόκολλο UDP (User Datagram Protocol) είναι ένα σχετικά απλούστερο πρωτόκολλο σε σχέση με το TCP.
- Για την μεταφορά των datagrams δεν γίνεται εγκατάσταση σύνδεσης μεταξύ των δύο άκρων.
- Δεν διασπάται το μήνυμα σε μικρότερα τμήματα όταν δεν υποστηρίζεται το μέγεθος του datagram.
- Κάθε αυτοδύναμο πακέτο μεταφέρεται μέσω δικτύων από κόμβο σε κόμβο μέχρι να φτάσει στο προορισμό του χωρίς να εγγυάται κανείς ότι δεν θα χαθεί ή θα καταστραφεί.
- Η απλότητα της δομής του και η έλλειψη ελέγχων προσδίδει στο UDP το πλεονέκτημα της αύξησης στην ταχύτητα μετάδοσης των δεδομένων και της μείωσης χρήσης των πόρων του δικτύου για μη ωφέλιμες εργασίες.
Το UDP έχει μέγεθος επικεφαλίδας μόνο 8 octets και οι πληροφορίες που περιέχει είναι:
- Ο αριθμός Θύρας Προέλευσης και ο αριθμός Θύρας Προορισμού. (Source Port & Destination Port).
- Το μήκος του datagram (UDP Length). Το ελάχιστο μήκος είναι 8 octets δηλαδή μόνο η επικεφαλίδα, και το μέγιστο μέγεθος φτάνει τα 65534 octets (64Kb) μαζί με την επικεφαλίδα.
- Το Άθροισμα Ελέγχου (Checksum). Είναι προαιρετικό πεδίο 16-bit το οποίο χρησιμοποιείται για επαλήθευση της ορθότητας του datagram κατά την παραλαβή του στην πλευρά του παραλήπτη. Υπολογίζει το άθροισμα τη κεφαλίδας και των δεδομένων και η λειτουργία του είναι παρόμοια με του TCP.

Σε αντίθεση με το TCP, το UDP χρησιμοποιείται σε εφαρμογές όπου δεν έχει τόση σημασία η πληρότητα της μεταφοράς των δεδομένων σε σύγκριση με την ταχύτητα που θα παραληφθούν.
Τέτοιες εφαρμογές είναι:
- αυτές οι οποίες μεταδίδουν σε πραγματικό χρόνο ροές video και ήχου (real-time audio/video), όπως IPTV, VolP. Εδώ μας ενδιαφέρει τα δεδομένα να φτάνουν τη σωστή χρονική στιγμή. Οποιαδήποτε απώλειά τους μας επηρεάζει μόνο στην ποιότητα του αναπαραγόμενου σήματος.
- Servers, οι οποίοι απαντούν σε μικρά αιτήματα ενός τεράστιου αριθμού από πελατες (clients) όπως στα δικτυακά online παιχνίδια. Οι Servers, χρησιμοποιώντας UDP, δεν απασχολούνται με το να ελέγχουν την κατάσταση της κάθε σύνδεσης και έτσι μπορούν να εξυπηρετήσουν ένα πολύ μεγαλύτερο αριθμό χρηστών σε αντίθεση με το αν χρησιμοποιούσαν TCP.
Παρόλα αυτά αν απαιτείται να λυθούν και θέματα αξιοπιστίας, ελέγχου ροής, τεμαχισμού των πακέτων κ.λπ., τότε αναλαμβάνει το επίπεδο εφαρμογής να διαχειριστεί αυτά τα ζητήματα. Επίσης πρέπει να σημειωθεί το πρόβλημα δικτυακής συμφόρησης που πρέπει να αναλάβει το επίπεδο εφαρμογής στην περίπτωση κατά την οποία ένας αποστολέας UDP πλημμυρίσει το δίκτυο με πακέτα. Επίσης είναι απαραίτητο οι συσκευές του ενδιάμεσου δικτύου (Δρομολογητές) να χρησιμοποιούν τεχνικές ελέγχου, που αποθηκεύουν προσωρινά ή απορρίπτουν τα πακέτα UDP ώστε να αποφευχθεί πιθανή κατάρρευση.
