Βασικά Θέματα Επικοινωνίας Κατανεμημένα Συστήματα 1 lalis@inf.uth.gr
Πρωτόκολλο επικοινωνίας Η/Υ Προσδιορίζει τους κανόνες που διέπουν την επικοινωνία ανάμεσα στα εμπλεκόμενα μέρη τα μηνύματα και (εν μέρει) το περιεχόμενο τους τις ενέργειες που οφείλει να πραγματοποιεί κάθε πλευρά για κάθε μήνυμα που λαμβάνει Δεν προσδιορίζει την υλοποίηση ο τρόπος που η κάθε πλευρά θα τηρήσει τους κανόνες Η υλοποίηση ενός πρωτοκόλλου μπορεί να διαφέρει (σημαντικά) κατά περίπτωση διαφορετικά λειτουργικά συστήματα διαφορετικές γλώσσες/περιβάλλοντα προγραμματισμού Κατανεμημένα Συστήματα 2 lalis@inf.uth.gr
Εφαρμογή Α API Εφαρμογή Β API Υλοποίηση πρωτοκόλλου Pa πρωτόκολλο P Υλοποίηση πρωτοκόλλου Pb Δίκτυο 01100101 Δίκτυο Κατανεμημένα Συστήματα 3 lalis@inf.uth.gr
Στοίβες πρωτοκόλλων Για λόγους δομημένης ανάπτυξης, η λειτουργικότητα επικοινωνίας υλοποιείται συνήθως σε στρώματα Κάθε στρώμα εστιάζει στην επίλυση / διαχείριση συγκεκριμένων προβλημάτων επικοινωνίας με βάση την λειτουργικότητα των πιο χαμηλών στρωμάτων Όταν το στρώμα Ν βασίζεται στο στρώμα Ν-1 και παρέχει λειτουργικότητα στο στρώμα Ν+1, μιλάμε για μια στοίβα πρωτοκόλλων ISO-OSI, Internet protocols, κτλ Κατανεμημένα Συστήματα 4 lalis@inf.uth.gr
OSI & Internet Protocol Family Application Presentation Session Transport TCP IP Network Data Link Physical UDP TCP: - port-based local addressing - reliable byte stream - bidirectional data transfer - error checking via checksums - sequencing, flow control, buffering UDP: - port-based local addressing - unreliable messages, up to 64K IP: - machine addressing, routing - unreliable messages, up to 64K - network technology independence - packet fragmentation / re-assembly - protocol (de)multiplexing Κατανεμημένα Συστήματα 5 lalis@inf.uth.gr
Διευθύνσεις δικτύου Κάθε τεχνολογία ορίζει διευθύνσεις μέσω των οποίων καθορίζονται τα άκρα της επικοινωνίας ειδικές διευθύνσεις για broadcast ή multicast Οι διευθύνσεις (παραλήπτη / αποστολέα) βρίσκονται σε συγκεκριμένη θέση μέσα σε κάθε πακέτο Ethernet frame Κατανεμημένα Συστήματα 6 lalis@inf.uth.gr
Πολυπλεξία Συνύπαρξη διαφορετικών «εφαρμογών» πάνω από το ίδιο δίκτυο (υπηρεσία επικοινωνίας) Επιπλέον αναγνωριστικά για τον διαχωρισμό ανάμεσα στα πακέτα της κάθε εφαρμογής Βρίσκονται σε συγκεκριμένη θέση σε κάθε πακέτο Ethernet frame Κατανεμημένα Συστήματα 7 lalis@inf.uth.gr
Ενθυλάκωση δεδομένων εφαρμογής Τα δεδομένα της εφαρμογής δεν «ερμηνεύονται» από το επίπεδο μεταφοράς Μπορεί να περιέχουν δεδομένα ενός πρωτοκόλλου επικοινωνίας που βρίσκεται σε πιο ψηλό επίπεδο Ethernet frame 0x8000=IP 0x11=UDP 21=FTP UDP payload FTP payload Κατανεμημένα Συστήματα 8 lalis@inf.uth.gr
#3 #4 #3 3 ClientIDs: 3 3 #2 #1 3 3 ClientIDs: 3,4 3 3 network interface 1 3 3 ClientIDs: 1,2 MyAddr=3 network 3 1 3 3 Κατανεμημένα Συστήματα 9 lalis@inf.uth.gr
Εντοπισμός της άλλης πλευράς Πως μπορεί ο Α να ανακαλύψει τα στοιχεία επικοινωνίας (διεύθυνση / αναγνωριστικό) του Β; 1. Τα στοιχεία επικοινωνίας του Β είναι ήδη γνωστά (π.χ. προσυμφωνημένα με κάποιο τρόπο) σύμβαση επικοινωνίας (σε τοπικό ή παγκόσμιο επίπεδο) 2. Οι Α και Β υιοθετούν ένα πρωτόκολλο εκπομπής λύνει το πρόβλημα μόνο σε χαμηλό επίπεδο δικτύου 3. Οι Α και Β χρησιμοποιούν μια υπηρεσία καταλόγου (directory / registry service) πρέπει να μπορεί να ανακαλυφθεί η υπηρεσία καταλόγου αναπαράγουμε το πρόβλημα που πάμε να λύσουμε; Κατανεμημένα Συστήματα 10 lalis@inf.uth.gr
Εκπομπή (1) "C"??? C addrc "A" Α B addra "D" D addrd Κατανεμημένα Συστήματα 11 lalis@inf.uth.gr
Εκπομπή (2) "C"??? C addrc Α "A" REQUEST addra B addra "D" D addrd Κατανεμημένα Συστήματα 12 lalis@inf.uth.gr
Εκπομπή (2) "C" C addrc Α "A" REPLY B addra "D" D addrd Κατανεμημένα Συστήματα 13 lalis@inf.uth.gr
Κατάλογος (1) "C" C addrc "A" Α B addra Κατανεμημένα Συστήματα 14 lalis@inf.uth.gr
Κατάλογος (2) "C" C addrc "A" addra Α REGISTER B Κατανεμημένα Συστήματα 15 lalis@inf.uth.gr
Κατάλογος (3) "C"??? C addrc "A" Α B addra Κατανεμημένα Συστήματα 16 lalis@inf.uth.gr
Κατάλογος (4) "C"??? C addrc "A" addra Α REQUEST addra B Κατανεμημένα Συστήματα 17 lalis@inf.uth.gr
Κατάλογος (5) "C" C addrc "A" Α B addra REPLY Κατανεμημένα Συστήματα 18 lalis@inf.uth.gr
Αναπαράσταση δεδομένων Σε ένα κατανεμημένο σύστημα, τα μέρη που επικοινωνούν μπορεί να έχουν διαφορετικές εσωτερικές αναπαραστάσεις/κωδικοποιήσεις δεδομένων διαφορές σε υλικό, λειτουργικά, γλώσσες, μεταφραστές Προσέγγιση χωρίς πρότυπη αναπαράσταση ο αποστολέας/παραλήπτης μετατρέπει τα δεδομένα που στέλνει/λαμβάνει προς/από τη εσωτερική αναπαράσταση της άλλης πλευράς Προσέγγιση με πρότυπη αναπαράσταση ο αποστολέας/παραλήπτης μετατρέπει τα δεδομένα που στέλνει λαμβάνει προς/από ένας κοινό πρότυπο / standard, π.χ., ASCII, XDR, CDR, Java, MIME, XML Κατανεμημένα Συστήματα 19 lalis@inf.uth.gr
Μετατροπή/σειριοποίηση δεδομένων Απαιτείται μετατροπή των δεδομένων από την εσωτερική στην επιθυμητή αναπαράσταση ακέραιοι, πίνακες, strings, structs, pointers Επιπλέον, για διασυνδεδεμένες δομές δεδομένων, απαιτείται η μετατροπή τους σε σειριακή μορφή ώστε να μπορούν να αποθηκευτούν σε ένα μήνυμα Η διαδικασία μετατροπής ονομάζεται σειριοποίηση ή διευθέτηση (data serialization / marshalling) Παρόμοιο πρόβλημα: αποθήκευση σε αρχεία γιατί; Κατανεμημένα Συστήματα 20 lalis@inf.uth.gr
Host & network byte order (integers) Βασικός τύπος δεδομένων: ακέραιοι Host byte order: η σειρά αποθήκευσης των bytes ενός multi-byte ακεραίου στην τοπική μνήμη Network byte order: η σειρά αποθήκευσης των bytes ενός multi-byte ακεραίου μέσα σε ένα πακέτο που στέλνεται πάνω από το δίκτυο Για το διαδίκτυο (Internet Protocols), συνήθως το λειτουργικό δίνει έτοιμες συναρτήσεις μετατροπής htons(), htonl() / ntohs(), ntohl() Κατανεμημένα Συστήματα 21 lalis@inf.uth.gr
Σύνθετοι τύποι δεδομένων Τα περιεχόμενα σύνθετων τύπων δεδομένων μπορεί (και αυτά) να αποθηκεύονται διαφορετικά στη μνήμη Ακόμα και για προγράμματα στην ίδια γλώσσα π.χ., εμβόλιμα (filler) bytes που βάζει ο μεταφραστής ως συνάρτηση της αρχιτεκτονικής του υπολογιστή Για κάθε σύνθετο τύπο δεδομένων Τ που χρησιμοποιείται στην επικοινωνία, προκύπτει εκ νέου το πρόβλημα της αναπαράστασης/σειριοποίησης Πρέπει να συμφωνηθεί κοινή αναπαράσταση για τον Τ Πρέπει να γίνεται μετατροπή των δεδομένων τύπου Τ προς και από την κοινή αναπαράσταση Κατανεμημένα Συστήματα 22 lalis@inf.uth.gr
struct T { char c; int i; char s[7]; }; memory footprint A c i s c i s memory footprint B filler bytes serialization void writet(struct T *t) { writechar(t->c); writeint(t->i); for (i=0;i<7;i++) writechar(t->s[i]); } deserialization void readt(struct T *t) { t->c=readchar(); t->i=readint(); for (i=0;i<7;i++) t->s[i]=readchar(); } Κατανεμημένα Συστήματα 23 lalis@inf.uth.gr
Χειρισμός δεικτών Απαγόρευση δεν επιτρέπεται η μεταφορά δεικτών Ρηχή αντιγραφή (shallow copy) μεταφέρονται τα περιεχόμενα του αντικειμένου, χωρίς να γίνεται χειρισμός τυχόν επιπλέον δεικτών στον παραλήπτη δημιουργείται ένα αντίγραφο με τα ίδια περιεχόμενα (αν το ίδιο το αντικείμενο περιέχει δείκτες, αυτοί αρχικοποιούνται σε NULL) Αντιγραφή σε βάθος (deep copy) όπως παραπάνω, αλλά γίνεται χειρισμός των δεικτών που τυχόν υπάρχουν μέσα στο ίδιο το αντικείμενο ο παραλήπτης λαμβάνει μια πλήρως ανεπτυγμένη δομή Κατανεμημένα Συστήματα 24 lalis@inf.uth.gr
data object typedef struct listobj { int val; struct listobj *nxt; } L; shallow copy p0 5 7 3 9 NULL deep copy p1 5 NULL p2 5 7 3 9 NULL Κατανεμημένα Συστήματα 25 lalis@inf.uth.gr
serialization void writelptr(l *p) { deserialization L *readlptr() { L *p=null; byte flag; } if (p==null) writebyte(0); else { writebyte(1); writelobj(p); } } flag=readbyte(); if (flag==1) p=(l*)malloc(sizeof(l)); readlobj(p); } return(p); void writelobj(l *p) { writeint(p->val); writelptr(p->nxt); } void readlobj(l *p) { p->val=readint(); p->nxt=readlptr(); } Κατανεμημένα Συστήματα 26 lalis@inf.uth.gr
p 5 7 3 9 NULL σειριοποίηση απο-σειριοποίηση root val nxt val nxt val nxt val nxt 1 5 1 7 1 3 1 9 0 write/read direction Κατανεμημένα Συστήματα 27 lalis@inf.uth.gr
Χειρισμός κυκλικών αναφορών Γράψιμο/σειριοποίηση σε κάθε αντικείμενο δίνεται μοναδικό αναγνωριστικό κρατείται πληροφορία για το αν έχει γίνει χειρισμός του αν ένα αντικείμενο έχει ήδη σειριοποιηθεί, δίνεται το αναγνωριστικό του Διάβασμα/αποσειριοποίηση αν διαβαστεί ένα νέο αναγνωριστικό, δημιουργείται ένα νέο αντικείμενο με τα αντίστοιχα περιεχόμενα διαφορετικά, γίνεται αναφορά στο αντικείμενο που έχει ήδη αποσειριοποιηθεί με αυτό το αναγνωριστικό Κατανεμημένα Συστήματα 28 lalis@inf.uth.gr
serialization void writelptr(l *p) { deserialization L *readlptr() { L *p; int id; } if (p==null) writeint(0); else { writeint(getid(p)); if (MARKED(p)) return; else { MARK(p); writelobj(p); } } } id=readint(); if (id==0) return(null); else if ((p=findbyid(id)) return(p); else { p=(l*)malloc(sizeof(l)); REGISTER(p,id); readlobj(p); return(p); } Κατανεμημένα Συστήματα 29 lalis@inf.uth.gr
p 5 7 3 9 σειριοποίηση απο-σειριοποίηση root val nxt val nxt val nxt val nxt 1 5 2 7 3 3 4 9 1 write/read direction Κατανεμημένα Συστήματα 30 lalis@inf.uth.gr
Αυτοματοποίηση σειριοποίησης Το γράψιμο κώδικα σειριοποίησης/αποσειριοποίησης είναι μια βαρετή διαδικασία, όπου όμως είναι και ιδιαίτερα εύκολο να γίνουν «θανατηφόρα» λάθη Ιδανικά ο κώδικας αυτός παράγεται αυτόματα με βάση τις συντακτικές δηλώσεις των τύπων δεδομένων Υπάρχουν διάφορες προσεγγίσεις: προεπεξεργαστές, βιβλιοθήκες, υποστήριξη σε επίπεδο γλώσσας Στην γενικότερη περίπτωση, πρέπει να παρέμβει ο προγραμματιστής καθώς μόνο αυτός γνωρίζει την σημασία των δεδομένων της εφαρμογής Κατανεμημένα Συστήματα 31 lalis@inf.uth.gr