Εισαγωγή

Το γεγονός ότι το πρότυπο επικοινωνίας TCP/IP φέρει το όνομα του πρωτοκόλλου διαδικτύου (Internet Protocol - IP) και πρωτόκολλου ελέγχου μετάδοσης (Transmission Control Protocol - TCP) υποδεικνύει ότι αυτά δύο πρωτόκολλα αναλαμβάνουν την βασική λειτουργεία του μοντέλου αυτού. Όπως έχουμε αναφέρει και σε προηγούμενα tutorials το πρωτόκολλο IP ανήκει στο επίπεδο δικτύου ενώ το TCP στο επίπεδο μεταφοράς. Το TCP όμως δεν χρησιμοποιείται παντού για παράδειγμα θα ήταν πρακτικά άχρηστο να έχουμε όλους τους μηχανισμούς αξιοπιστίας και επιβεβαίωσης αποστολής μηνυμάτων για να δούμε ένα video στο διαδίκτυο καθότι εδώ μας ενδιαφέρει να λάβουμε άμεσα την πληροφορία κι όχι να λάβουμε την πληροφορία χωρίς σφάλματα ή απώλειες. Σε αυτήν την περίπτωση χρησιμοποιείται το πρωτόκολλο UDP το οποίο δεν παρέχει μηχανισμούς επιβεβαίωσης, ελέγχου ροής δεδομένων κλπ για τα πακέτα που στέλνονται μεταξύ δύο οντοτήτων, απλά προωθεί τα πακέτα στην άλλη μεριά χωρίς να ελέγχει αν αυτά έφτασαν ή όχι.


Πρωτόκολλο UDP ανασκόπηση, Ιστορική αναφορά και πρότυπα

Όταν το πρότυπο επικοινωνίας TCP/IP ήταν στα αρχικά του στάδια το μόνο πρωτόκολλο που υπήρχε για μεταφορά δεδομένων ήταν το TCP το οποίο τότε αναλάμβανε τις σημερινές λειτουργίες του TCP και του IP. Τότε το TCP παρείχε υπηρεσίες διαδικτυακής σύνδεσης μεταξύ υπολογιστών και παρείχε εξίσου υπηρεσίες επαναμετάδοσης και επιβεβαίωσης πακέτων καθώς και έλεγχο ροής δεδομένων. Δεν πήρε αρκετό καιρό στους σχεδιαστές του TCP για να καταλάβουν ότι ο συνδυασμός δύο λειτουργιών που ανήκουν σε δύο διαφορετικά επίπεδα θα παραβιάζει πρώτον την ιεραρχική αρχιτεκτονική κι ότι θα το καθιστούσε πρακτικά άχρηστο. Πέραν του ότι οι περισσότερες συμβατικές εφαρμογές χρειαζόντουσαν τους μηχανισμούς αξιοπιστίας του επιπέδου μεταφοράς αυτό όμως σε κάποιες άλλες εφαρμογές αυτό δεν ισχύει. Αυτοί μηχανισμοί αξιοπιστίας παρουσιάζουν υψηλό φόρτο εργασίας κάτι που δεν αποτελεί την βέλτιστη λύση για εφαρμογές που απαιτούν ταχύτητα ή που οι μηχανισμοί αξιοπιστίας είναι άχρηστοι. Ακόμη χειρότερα υπήρχαν εφαρμογές όπου οι υπηρεσίες αυτές όχι μόνο ήταν άχρηστες αλλά και επιβλαβής, καθότι ακόμη και η πιο μικρή απώλεια επίδοσης λόγω του φόρτου εργασίας αποτελούσε πρόβλημα.

Η λύση γι' αυτό το πρόβλημα ήταν να διαχωρίσουν τις λειτουργίες του TCP. Από εδώ και πέρα οι υπηρεσίες διαδικτυακής σύνδεσης είναι ευθύνη του πρωτοκόλλου IP ενώ οι υπηρεσίες αξιόπιστης μεταφοράς δεδομένων είναι στην αποκλειστική ευθύνη του πρωτοκόλλου TCP. Αυτή η διαφορά όρισε έναν νέο τρόπο για εφαρμογές που δεν χρειάζονταν τις υπηρεσίες που παρείχε το TCP. Αυτό φυσικά είναι το UDP. Υπάρχουν δύο κύρια χαρακτηριστικά όταν περιγράφουμε το UDP το πρώτο είναι η απλότητα που προσφέρει και ότι είναι αρκετά γρήγορο σε σχέση με το TCP. Η απλότητα του οφείλετε στον λόγο του ότι προωθεί τα πακέτα χωρίς την όλη πολυπλοκότητα που έχουν οι μηχανισμοί του TCP. Ο μοναδικός στόχος του πρωτοκόλλου είναι να αναλαμβάνει τον ρόλο της διεπαφής ανάμεσα στις δικτυακές εφαρμογές του υψηλότερου επιπέδου και των δυνατοτήτων διαδικτύωσης του πρωτοκόλλου IP.

Το UDP (όπως και το TCP) ανήκει στο επίπεδο μεταφοράς οπότε χρησιμοποιεί μια σειρά από αριθμούς θυρών επικοινωνίας που ονομάζονται UDP θύρες. Μπορούμε αν θέλουμε επιλεκτικά να προσθέσουμε δυνατότητες checksum για εντοπισμό σφαλμάτων αλλά δεν προσθέτει ουσιαστικά καμία άλλη λειτουργικότητα. Στην ουσία ο καλύτερος λόγος για τον οποίον μπορούμε να παρατηρήσουμε την απλότητα του UDP είναι τα πρότυπο που το ορίζει. Το UDP έχει οριστεί ως RFC 768, User Datagram Protocol το 1980. Αυτό το RFC ουσιαστικά αποτελεί τρείς σελίδες και δεν χρειάστηκε ποτέ να αναθεωρηθεί. Το UDP είναι ένα αρκετά γρήγορο πρωτόκολλο καθότι όπως αναφέραμε και προηγουμένως δεν διαθέτει κανέναν μηχανισμό από αυτούς του TCP. Αυτό το καθιστά ακατάλληλο για κλασσικές δικτυακές εφαρμογές. Υπάρχουν όμως εφαρμογές που όπως αναφέραμε προηγουμένως δεν απαιτούν κανέναν από τους μηχανισμούς του TCP και όπου απαιτούν τα δεδομένα τους να προωθηθούν όσο πιο γρήγορα γίνεται προς το πρωτόκολλο IP χωρίς πολύπλοκα σχήματα μηχανισμών.



Σημαντική παρατήρηση


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


Πως λειτουργεί το UDP

Το μοναδικό ουσιαστικό καθήκον του UDP είναι να παίρνει τα δεδομένα από το υψηλότερο επίπεδο και να τα τοποθετεί σε UDP μηνύματα τα οποία μετά προωθούνται προς το πρωτόκολλο IP για μετάδοση. Τα βασικά βήματα για την μετάδοση πακέτων σε μια UDP επικοινωνία είναι τα εξής:


  • Μεταφορά δεδομένων από το υψηλότερο επίπεδο (Higher-Layer Data Transfer): Μια εφαρμογή στέλνει ένα μήνυμα στο πρωτόκολλο UDP.

  • Ενθυλάκωση UDP μηνύματος (UDP Message Encapsulation): Το μήνυμα του υψηλοτέρου επιπέδου ενθυλακώνετε στο πεδίο δεδομένων ενός UDP μηνύματος. Οι επικεφαλίδες ενός UDP μηνύματος συμπληρώνονται (UDP θύρα πηγής της εφαρμογής που στέλνει τα δεδομένα και UDP θύρα προορισμού του παραλήπτη). Η τιμή checksum μπορεί επίσης να συνυπολογιστεί.

  • Μεταφορά του μηνύματος στο πρωτόκολλο IP (Transfer Message To IP): Το UDP μήνυμα προωθείτε στο πρωτόκολλο IP για να μεταδοθεί μετέπειτα προς την άλλη μεριά.

Σε αυτό το σημείο θα πρέπει να αναρωτηθούμε τι δεν κάνει το UDP ;;;


Το πρωτόκολλο UDP είναι τόσο απλό που η λειτουργεία του πολύ συχνά περιγράφεται στο τι δεν κάνει αντί στο τι ουσιαστικά κάνει. Μερικά από τα πιο σημαντικά πράγματα που δεν κάνει το UDP είναι τα παρακάτω:

  • Το UDP δεν εγκαθιδρύει συνδέσεις πριν στείλει τα δεδομένα. Απλά δημιουργεί UDP πακέτα και τα προωθεί στο IP πρωτόκολλο.

  • Το UDP δεν παρέχει επιβεβαιώσεις γι' αυτά τα πακέτα οπότε προφανώς δεν μπορεί να είναι σε θέση να γνωρίζει αν όντως έφτασαν στην άλλη μεριά

  • Το UDP δεν εγγυάται για το αν το πακέτο φτάσει όντως στην άλλη μεριά

  • Το UDP δεν εντοπίζει τα μηνύματα που χάθηκαν και προφανώς ούτε τα ξαναστέλνει.

  • Το UDP δεν εξασφαλίζει ότι τα δεδομένα θα φτάσουν στον παραλήπτη με την σωστή σειρά.

  • Το UDP δεν παρέχει κανέναν μηχανισμό για έλεγχο ροής δεδομένων μεταξύ δύο συσκευών ή διαχείριση συμφόρησης.

Δομή UDP επικεφαλίδας


Η UDP επικεφαλίδα αποτελείται από 4 πεδία καθένα μήκους 2 bytes (16 bits). Η χρήση του πεδίου Checksum και Θύρας πηγής (μπλε κουτάκια) είναι επιλεκτική στο IPv4 ενώ στο IPv6 μόνο η θύρα πηγής είναι.

  • Θύρα πηγής: Αυτό το πεδίο υποδεικνύει την θύρα του αποστολέα. Αν ο παραλήπτης επιθυμεί να στείλει κάποια απάντηση, θα πρέπει να χρησιμοποιήσει αυτήν την θύρα. Το συγκεκριμένο πεδίο δεν είναι υποχρεωτικό αλλά σε περίπτωση που δεν χρησιμοποιηθεί θα πρέπει να έχει την τιμή μηδέν.

  • Θύρα Προορισμού: Αυτό το πεδίο υποδεικνύει την θύρα του παραλήπτη.

  • Μήκος: Αυτό το πεδίο περιγράφει το μήκος σε bytes της UDP επικεφαλίδας και των UDP δεδομένων. Το ελάχιστο μήκος είναι 8 bytes καθότι το συνολικό μήκος της επικεφαλίδας είναι τόσο. Το μήκος του πεδίου θέτει ένα θεωρητικό όριο στα 65,535 bytes (8 bytes επικεφαλίδας συν 65,527 bytes δεδομένων) για ένα UDP datagram.

  • Checksum: Το πεδίο checksum μπορεί να χρησιμοποιηθεί για έλεγχο σφαλμάτων στην UDP επικεφαλίδα και στα δεδομένα. Στο IPv4 αυτό το πεδίο είναι προαιρετικό ενώ στο IPv6 είναι υποχρεωτικό. Αν δεν χρησιμοποιηθεί τότε αυτό το πεδίο συμπληρώνεται με μηδενικά.

IPv4 ψευδό-επικεφαλίδα


Δομή UDP επικεφαλίδας
  • Στο IPv4 το checksum υπολογίζεται χρησιμοποιώντας μια ψευδό-επικεφαλίδα η οποία περιέχει μερικές πληροφορίες που είναι ίδιες με την IPv4 επικεφαλίδα.


  • Η ψευδό-επικεφαλίδα δεν είναι ίδια με μια IPv4 επικεφαλίδα που χρησιμοποιείται στα IP πακέτα αλλά χρησιμοποιείται μόνο για τον υπολογισμό του checksum.


  • Η διεύθυνση IPv4 πηγής και IPv4 προορισμού είναι ίδιες με αυτές στην IPv4 επικεφαλίδα. Το πεδίο UDP μήκος είναι το συνολικό μέγεθος των δεδομένων και της UDP επικεφαλίδας.


  • Το πεδίο δεδομένα υποδηλώνει τα δεδομένα που είναι προς μετάδοση.


  • Να υπογραμμίσουμε ότι ο υπολογισμός του checksum στο IPv4 είναι προαιρετικός. Αν δεν χρησιμοποιηθεί αυτό το πεδίο θα πάρει την τιμή 0.




Δομή IPv6 ψευδό-επικεφαλίδας

IPv6 ψευδό-επικεφαλίδα


  • Στο IPv6 το πεδίο checksum είναι υποχρεωτικό και υπολογίζεται χρησιμοποιώντας μια ψευδό-επικεφαλίδα η οποία περιέχει μερικές πληροφορίες που είναι ίδιες με την IPv6 επικεφαλίδα.


  • Η διεύθυνση IPv6 πηγής και προορισμού είναι ίδιες με αυτές της IPV6 επικεφαλίδας


  • Μήκος UDP (UDP Length): Το συνολικό μέγεθος του πακέτου UDP, όπως και προηγουμένως.


  • Zeros: Μία ακολουθία μηδενικών, η οποία δεν παίζει κανέναν ρόλο κατά την μετάδοση του πακέτου.


  • Επόμενη κεφαλίδα (Next Header): Το πεδίο αυτό παίρνει μία τιμή που είναι χαρακτηριστική για το πρωτόκολλο που χρησιμοποιείται. Στην περίπτωση του UDP, η τιμή αυτή είναι 17.




Εφαρμογές

Όπως έχουμε παρατηρήσει μέχρι τώρα το UDP έχει ελάχιστη λειτουργικότητα. Με κάποιες εξαιρέσεις όπως δηλαδή η δυνατότητα χρήσης UDP θυρών σε μια εφαρμογή για να μπορέσει να επικοινωνήσει με μια άλλη εφαρμογή. Στην ουσία είναι σαν να χρησιμοποιούμε απευθείας το πρωτόκολλο IP. Αυτό σημαίνει ότι το UDP έχει περίπου τα ίδια μειονέκτηματα με αυτά του πρωτοκόλλου IP. Δηλαδή δεν πραγματοποιείται εγκαθίδρυση διαρκής συνδέσεως μεταξύ δύο συσκευών, δεν πραγματοποιεί επιβεβαίωση για τα δεδομένα που έχουν σταλθεί ή επαναμετάδοσης σε περίπτωση που κάποιο μήνυμα χαθεί, και σίγουρα δεν ασχολείται με θέματα όπως ο έλεγχος ροής ή ο έλεγχος συμφόρησης. Η έλλειψη αυτών των δυνατοτήτων καθιστά το UDP αρκετά ακατάλληλο για της περισσότερες κλασσικές εφαρμογές δικτύωσης.

Αυτές οι εφαρμογές συνήθως χρειάζονται να εγκαθιδρύσουν μια σύνδεση έτσι ώστε οι δύο μεριές να μπορούν να είναι σε θέση να ανταλλάξουν δεδομένα κοκ. Πολλές άλλες εφαρμογές μπορεί να χρειάζονται ενίοτε ή τακτικά να στέλνουν αρκετά μεγάλες ποσότητες δεδομένων για τα οποία χρειάζεται να σταλούν άθικτα και χωρίς να έχουν υποστεί αλλοιώσεις. Για παράδειγμα ας πάρουμε ένα πρωτόκολλο μεταφοράς μηνυμάτων όπως το HTTP. Εάν ένα κομμάτι μιας ιστοσελίδας φτάσει από τον διακομιστή πίσω στον web browser είναι άχρηστο. Το HTTP και άλλα πρωτόκολλα μεταφοράς μηνύματος χρειάζονται δυνατότητες αξιόπιστης μεταφοράς.

Ουσιαστικά οι προγραμματιστές που θα αναλαμβάνουν να φτιάξουν μια web εφαρμογή θα πρέπει να συνειδητοποιήσουν τις ελάχιστες δυνατότητες που διαθέτει το πρωτόκολλο UDP και ότι ουσιαστικά καθιστά την εφαρμογή υπεύθυνη για τον διαχειρισμό όλων των πιθανών προβλημάτων που μπορούν να προκύψουν σε μια σύνδεση. Οπότε κάποιος που επιθυμεί να φτιάξει μια UDP-based εφαρμογή πρέπει πάντα να έχει στο μυαλό του ότι δεν λαμβάνονται από το αυτό το πρωτόκολλο προϋποθέσεις σχετικά με το πως ή εάν κάποιο μήνυμα θα φτάσει στον τελικό του προορισμό.


Εδώ τίθεται το ερώτημα με ποιες προϋποθέσεις κρίνουμε ότι μια εφαρμογή είναι UDP-based ;;;


Αν θέλουμε να φτιάξουμε μια εφαρμογή που δεν χρειάζεται αξιόπιστους μηχανισμούς ή αν δεν μας ενδιαφέρει για το αν τα μηνύματα φτάσουν στον τελικό προορισμό τους τότε το UDP είναι το πιο κατάλληλο πρωτόκολλο για μεταφορά δεδομένων. Οπότε οι εφαρμογές που έχουν ως πρωτόκολλο μεταφοράς το UDP είναι συνήθως αυτές που δεν απαιτούν όλες ή τις περισσότερες υπηρεσίες που υπάρχουν στο TCP και που μπορούν να επωφεληθούν από την αυξημένη αποδοτικότητα που το UDP παρέχει (χαμηλό overhead κλπ).



Σημαντική παρατήρηση


Το UDP χρησιμοποιείται πιο συχνά σε σχέση με το TCP για τους εξής δύο λόγους. Η πρώτη περίπτωση είναι όταν μια εφαρμογή θέλει παράδοση εντός κάποιου συγκεκριμένου χρονικού διαστήματος αντί για αξιόπιστη παράδοση δεδομένων, ή όταν η απώλεια δεδομένων κατά την μετάδοση τους δεν αποτελεί μείζον ζήτημα. Η δεύτερη περίπτωση είναι όταν ένα πρωτόκολλο είναι σε θέση να διαχειριστεί μια ενδεχόμενη απώλεια ενός IP datagram χρησιμοποιώντας timers ή τεχνικές επαναμετάδοσης δεδομένων. Το UDP χρησιμοποιείται επίσης σε εφαρμογές που απαιτούν multicast ή broadcast μεταδόσεις καθότι αυτές δεν υποστηρίζονται από το πρωτόκολλο TCP.


Όπως είδαμε προηγουμένως, οι εφαρμογές που χρησιμοποιούν το πρωτόκολλο UDP παρουσιάζουν απώλεια πακέτων ή διάφορα σφάλματα στα πακέτα τα οποία στέλνουν. Μερικές εφαρμογές, όπως για παράδειγμα το Trivial File Transfer Protocol - TFTP υλοποιούν δικούς τους μηχανισμούς για διασφάλιση αξιόπιστης επικοινωνίας. Οι εφαρμογές που χρησιμοποιούν το UDP δεν επιβάλλουν επιπρόσθετους μηχανισμούς αξιοπιστίας (όπως αυτό γίνεται στο TCP) διότι με αυτόν τον τρόπο παρεμποδίζεται ή χειροτερεύει η απόδοσή. Κλασικό παράδειγμα τέτοιων προγραμμάτων είναι οι εφαρμογές πραγματικού χρόνου (πχ. media streaming, παιχνίδια στο διαδίκτυο, VoIP κτλ). Στην περίπτωση πάντως που μία εφαρμογή χρειάζεται αξιόπιστη μετάδοση δεδομένων, θα προτιμήσει να χρησιμοποιήσει το πρωτόκολλο TCP αντί του UDP.


  • Domain Name Server - DNS (Θύρα 53): Χρησιμοποιεί απλά μηνύματα τύπου αίτησης / απάντησης για τις περισσότερες συναλλαγές (αλλά χρησιμοποιεί επίσης και το TCP για μακρόχρονες συνδέσεις)

  • Bootstrap Protocol - BOOTP και Dynamic Host Configuration Protocol - DHCP (θύρες 67 και 68): Τα πρωτόκολλα Host config χρησιμοποιούν μηχανισμούς αποστολής μικρών μηνυμάτων αίτησης / απάντησης οπότε το UDP αποτελεί μια καλή λύση σε αυτό

  • TFTP (Θύρα 69): To TFTP σε σχέση με το FTP χρησιμοποιεί κι αυτό το πρωτόκολλο μεταφοράς UDP. Σε αντίθεση με το FTP, το TFTP είναι σχεδιασμένο για γρήγορη και απλή μεταφορά δεδομένων μικρών αρχείων. To TFTP χρησιμοποιεί την UDP θύρα 69.

Τελευταία ενημέρωση: 31/10/2016






Follow us

 ☰