Η σύνδεση ενός κόμβου Pastry στο δίκτυο γίνεται με την βοήθεια ενός Server, ο οποίος αναλαμβάνει την σύνδεση ενός νεοφερμένου κόμβου με το δίκτυο Pastry. Για να διαλέξει το κατάλληλο κόμβο στο οποίο θα στείλει το μήνυμα χρησιμοποιεί την βοήθεια της τάξεις Calendar.
Με την βοήθει της μεθόδου getTimeInMillis() της τάξεις Calendar, βρίσκει πόσα milliseconds έκανε ένα μύνημα να πάει σε μια διεύθυνση, και να σταλεί απάντηση. Αυτό το πετυχαίνει καλώντας την getTimeInMillis() 2 φορές , όταν στείλει το μήνυμα και όταν λάβει απάντηση.
Όλα αυτά γινονται με την βοήθεια της τάξης Connector στην οποία έγιναν περιτέρω αλλαγές για να υποστηρίξει τις νέες λειτουργίες.
Δευτέρα 16 Φεβρουαρίου 2009
Pastry
Αποχώρηση Κόμβου(Node Departure) υλοποιείται από τις εξείς μεθόδους:
private void CheckNodes():
Έλεγχος των κόμβων στο Leaf Set, Routing Table και Neighbor Set αν είναι ακόμα ζωντανά
private void ReplaceDepartedInLeafSet(NodeId[] GivenLeafSet):
Αποκατάσταση ενός κόβου που έπεσε στο Leaf Set.
private void ReplaceDepartedInRoutingTable(int k, int l):
Αποκατάσταση ενός κόβου που έπεσε στο Routing Table.
Ο έλεγχος των κόβων γίνεται από ένα ειδικό νήμα που λειτουργεί σαν δαίμονας.
Κοιμάται για 1 sec και μόλις ξυπνάει ελέγχει γαι το ποιοι κόμβοι είναι ζωντανοί.
private void CheckNodes():
Έλεγχος των κόμβων στο Leaf Set, Routing Table και Neighbor Set αν είναι ακόμα ζωντανά
private void ReplaceDepartedInLeafSet(NodeId[] GivenLeafSet):
Αποκατάσταση ενός κόβου που έπεσε στο Leaf Set.
private void ReplaceDepartedInRoutingTable(int k, int l):
Αποκατάσταση ενός κόβου που έπεσε στο Routing Table.
Ο έλεγχος των κόβων γίνεται από ένα ειδικό νήμα που λειτουργεί σαν δαίμονας.
Κοιμάται για 1 sec και μόλις ξυπνάει ελέγχει γαι το ποιοι κόμβοι είναι ζωντανοί.
Κυριακή 15 Φεβρουαρίου 2009
Pastry
Οι βασικές λειτουργίες του Pastry γίνονται όλλες σε δυο τάξεις το, NodeId.java και το PastryNode.java.
Το NodeId.java αντιπροσωπευει το κλειδί. Αποθηκεύει την διεύθυνση (ip και port) και το κλειδί ενός κόμβου Pastry, περιέχει μεθόδους για την μετατροπή του ζευγαριού ip-address και port-number σε κλειδί 32 byte , το κάθε byte είναι ένας αριθμός από το 0 έως το 15.
Το NodeId.java περιέχει επίσεις μεθόδους πακεταρίσματος του ζευγαριού ip-address και port-number σε ένα πίκακα 8 byte για να μπορέσει να το στείλει μέσω διαδυκτίου στους άλλους κόμβους Pastry.
Η δρομολόγηση των μηνυμάτων , η εισαγωγή καινούριων κόμβων και η απομάκρυνση παλιών κόμβων γίνονται όλλα στο PastryNode.java.
Η Μεταγωγή Πακέτων (Message Routing) γίνεται από τις εξείς μεθόδους :
public void Rout(byte [] message, byte [] key) :
Υλοποιεί την μεταγωγή όπως περιγράφεται στο Paper. Δηλαδή όταν έρεται ένα μήνυμα αποφασίζει με βάση το κλειδί (key) αν θα το δώσει σε ένα από τους κόμβους στο Leaf set ή σε έναν από τους κόμβους στο routing table ή θα το παραδώσει στο τρέχον κόμβο.
private boolean InTheRangeOfLeafNode(byte [] key) :
Αποφασίζει αν το κλειδί είναι στα όρια του πίνακα Leaf set. Αν ναι επιστρέφει true αν όχι false.
private NodeId FindTheClosestInLeafs(byte [] key) :
Επιστρέφει το κοντινότερο κόμβο στο κλειδί από τους κόμβους του Leaf set. Δεν επιστρέφει ποτέ null γιατί εξετάζεται και ο τρέχον κόμβος.
private NodeId FindTheClosestInRoutingTable(byte [] key):
Επιστρέφει το κοντινότερο κόμβο στο κλειδί από τους κόμβους του routing table. Δεν επιστρέφει ποτέ null γιατί εξετάζεται και ο τρέχον κόμβος.
Η εισαγωγή καινούριου κόμβου (Node arrival) γίνεται από τις εξείς μεθόδους:
public boolean Join(InetAddress host, int port):
Στέλνει μια αίτηση για εισαγωγή στο δίκυο Pastry στην διεύθυνση host, port.
private void SendRoutingTable(InetAddress ip, int port) :
Στέλνει τον πίνακα δρομολόγησης στην διευθυνση ip,port.
private void SendLeafSet(InetAddress ip, int port) :
Στέλνει το Leaf set στην διευθυνση ip,port.
private void Assimilate_Information(byte[] mesg, int messageSize) :
Αφομιώνει τις πληροφορίες που βρίσκονται στο πίνακα mesg που έχει μέγεθος messageSize. Αυτή η συνάρτηση καλείται όταν κάποιος άλλος κόμβος Pastry μας στείλει το πίνακα δρομολόγησης του ή το LeafSet του.
private void InsertInLeafSet(NodeId newNode):
Αποθηκευεί το κόμβο newNode στο πίνακα LeafSet, αν βέβαια έχει θέση για αυτό εκεί πέρα.
private void InsertInRoutingTable(NodeId newNode):
Αποθηκευεί το κόμβο newNode στο πίνακα δρομολόγησης, στην κατάλληλη θέση.
private void NotifyNodes():
Στέλνει σε κάθε κόμβο που έχει στο πίνακα δρομολόγησης ή στο LeafSet το πίνακα δρομολόγησης ή το LeafSet του.
private boolean NotInLeafSet(NodeId temp):
Επιστρέφει true αν ο κόμβος temp βρίσκεται στο LeafSet, αν όχι επιστρέφει false. Αυτή η μέθοδος βοηθάει να ξέρουμε αν έναν κόμβο που βρίσκεται στο πίνακα δρομολόγησης τον είδαμε στο LeafSet, έτσι αποφεύγουμε να το ξαναστείλουμε πληροφορίες.
Παρασκευή 23 Ιανουαρίου 2009
Υποδομή επικοινωνίας
Η υλοποιήση της Υποδομής επικοινωνίας έχει πλέον ολοκληρωθεί και δεν προβλέπονται αλλαγές ή περαιτέρω προσθήκες.
Αποτελείται από 3 αρχεία :
a) Connector.java
b) MessageReceiver.java
c) SendedMessage.java
Λίγα λόγια για τις τάξεις.
Η τάξη Connector.java δοθέντος ενός αριθμού για port διημιουργεί μια υποδοχή (ως IP διεύθυνση χρησιμοποιείται η IP διεύθυνση του τρέχοντος μηχανήματος). Ένα αντικείμενο της τάξης MessageReceiver.java θα περιμένει πάνω από την θύρα, που διημιουργήθηκε από την Connector.java, για νέα μηνύματα και κάθε φορά που λαμβάνει ένα μήνυμα το παραδίδει στην κατάλληλη μέθοδο του αντικείμενου Connector, με το έχει συσχετισεί.
Αποστολή μηνυμάτων
Για αποστλή μηνυμάτων καλείται η μέθοδος Send(byte [] data, InetAddress host, int port) της τάξης Connector.java. Η μεθοδος Send διημιουργεί ένα πακέτο που για αρχικό bit έχει τον αριθμό 0 ( για να ξεχωρίζουμε τα μηνύματα από τις επιβεβαιώσεις ), ένα σειριακό αριθμό και τα δεδομένα που πρέπει να στείλει. Πριν στείλει το μήνυμα διημιουργεί ένα αντικείμενο τύπου SendedMessage με κωδικό το σειριακό αριθμό του μηνύματος που είναι να στείλει. Το αντικείμενο αυτο θα καταχωριθεί σε ένα buffer ο οποίος περιέχει όλα τα μηνύματα που στάλθηκαν και περιμένουν επιβεβαίωση.
Μόλις στείλει το μήνυμα μεσω της υποδοχής, διακόπτει την λειτουργία του για ένα χρονικό διάστημα (πέφτει για ύπνο). Μόλις ξυπνίσει ελέγχει αν το μήνυμα που στάλθηκε έχει επιβεβαιωθεί. Αν το μήνυμα έχει επιβεβαιωθεί η μέθοδος Send διαγράφει το αντικείμενο SendedMessage από το buffer ( με τα μηνύματα που στάλθηκαν και περιμένουν επιβεβαίωση ) και επιστρέφει true. Αν το μήνυμα δεν έχει επιβεβαιωθεί επανλαμβάνει την διαδικασία αποστολής άλλες 2 φορές. Αν και οι δύο αποτύγχουν η μέθοδος Send διαγράφει το αντικείμενο SendedMessage από το buffer ( με τα μηνύματα που στάλθηκαν και περιμένουν επιβεβαίωση ) και επιστρέφει false.
Λήψη μηνύματος
Όταν το αντικείμενο τύπου MessageReceiver λαβει ένα μήνυμα, εξετάζει το αρχικό κωδικό του μηνύματος. Αν ο κωδικός είναι 0 , σημαίνει ότι το μήνυμα είναι μήνυμα δεδομένων και παραδίδεται στην μέθοδο Receive(final DatagramPacket pack) του αντικειμένου Connector, αν ο κωδικός είναι 1 σημαίνει ότι είναι επιβεβαίωση κάποιου μηνύματος που στείλαμε προηγούμενα, και παραδίδεται στην μεθοδο ReceiveAck( String ReceivedMesgNum) του αντικειμένου Connector.
Η μεθοδος Receive στέλνει μια επιβεβαίωση στην διεύθυνση από την οποία έλαβε το μήνυμα.
Η επιβεβαίωση είναι ένα μήνυμα με κωδικό 1 και περιέχει το σειριακό αριθμό του μηνύματος που λάβαμε.
Η μεθοδος ReceiveAck μόλις λάβει μια επιβεβαίωσει πηγαίνει στο buffer με τα μηνύματα που στάλθηκαν και περιμένουν επιβεβαίωση και το ενημερώνει για την επιβεβαίωση που λάβαμε.
Αποτελείται από 3 αρχεία :
a) Connector.java
b) MessageReceiver.java
c) SendedMessage.java
Λίγα λόγια για τις τάξεις.
Η τάξη Connector.java δοθέντος ενός αριθμού για port διημιουργεί μια υποδοχή (ως IP διεύθυνση χρησιμοποιείται η IP διεύθυνση του τρέχοντος μηχανήματος). Ένα αντικείμενο της τάξης MessageReceiver.java θα περιμένει πάνω από την θύρα, που διημιουργήθηκε από την Connector.java, για νέα μηνύματα και κάθε φορά που λαμβάνει ένα μήνυμα το παραδίδει στην κατάλληλη μέθοδο του αντικείμενου Connector, με το έχει συσχετισεί.
Αποστολή μηνυμάτων
Για αποστλή μηνυμάτων καλείται η μέθοδος Send(byte [] data, InetAddress host, int port) της τάξης Connector.java. Η μεθοδος Send διημιουργεί ένα πακέτο που για αρχικό bit έχει τον αριθμό 0 ( για να ξεχωρίζουμε τα μηνύματα από τις επιβεβαιώσεις ), ένα σειριακό αριθμό και τα δεδομένα που πρέπει να στείλει. Πριν στείλει το μήνυμα διημιουργεί ένα αντικείμενο τύπου SendedMessage με κωδικό το σειριακό αριθμό του μηνύματος που είναι να στείλει. Το αντικείμενο αυτο θα καταχωριθεί σε ένα buffer ο οποίος περιέχει όλα τα μηνύματα που στάλθηκαν και περιμένουν επιβεβαίωση.
Μόλις στείλει το μήνυμα μεσω της υποδοχής, διακόπτει την λειτουργία του για ένα χρονικό διάστημα (πέφτει για ύπνο). Μόλις ξυπνίσει ελέγχει αν το μήνυμα που στάλθηκε έχει επιβεβαιωθεί. Αν το μήνυμα έχει επιβεβαιωθεί η μέθοδος Send διαγράφει το αντικείμενο SendedMessage από το buffer ( με τα μηνύματα που στάλθηκαν και περιμένουν επιβεβαίωση ) και επιστρέφει true. Αν το μήνυμα δεν έχει επιβεβαιωθεί επανλαμβάνει την διαδικασία αποστολής άλλες 2 φορές. Αν και οι δύο αποτύγχουν η μέθοδος Send διαγράφει το αντικείμενο SendedMessage από το buffer ( με τα μηνύματα που στάλθηκαν και περιμένουν επιβεβαίωση ) και επιστρέφει false.
Λήψη μηνύματος
Όταν το αντικείμενο τύπου MessageReceiver λαβει ένα μήνυμα, εξετάζει το αρχικό κωδικό του μηνύματος. Αν ο κωδικός είναι 0 , σημαίνει ότι το μήνυμα είναι μήνυμα δεδομένων και παραδίδεται στην μέθοδο Receive(final DatagramPacket pack) του αντικειμένου Connector, αν ο κωδικός είναι 1 σημαίνει ότι είναι επιβεβαίωση κάποιου μηνύματος που στείλαμε προηγούμενα, και παραδίδεται στην μεθοδο ReceiveAck( String ReceivedMesgNum) του αντικειμένου Connector.
Η μεθοδος Receive στέλνει μια επιβεβαίωση στην διεύθυνση από την οποία έλαβε το μήνυμα.
Η επιβεβαίωση είναι ένα μήνυμα με κωδικό 1 και περιέχει το σειριακό αριθμό του μηνύματος που λάβαμε.
Η μεθοδος ReceiveAck μόλις λάβει μια επιβεβαίωσει πηγαίνει στο buffer με τα μηνύματα που στάλθηκαν και περιμένουν επιβεβαίωση και το ενημερώνει για την επιβεβαίωση που λάβαμε.
Δομή Εργασίας Pastry
Η εργασία θα αποτελείτα από 3 κομμάτια :
1) Υποδομή Επικοινωίας - Αναλαμβάνει την ανταλλαγή μηνυμάτων μεταξύ των κόμβων
2) Pastry - Αντιπροσωπεύει το Δακτύλιο του Pastry. Σε αυτό το κομμάτι γίνεται η δρομολόγηση των μηνυμάτων, είσοδος και έξοδος κόμβου.
3) Γραφικό κομμάτι - Επικοινωνίας με τον χρήστη και εμφάνιση της κατάστσης του Κόμβου (Πίνακας δρομολήγησης , Φύλλα, Γείτονες).
1) Υποδομή Επικοινωίας - Αναλαμβάνει την ανταλλαγή μηνυμάτων μεταξύ των κόμβων
2) Pastry - Αντιπροσωπεύει το Δακτύλιο του Pastry. Σε αυτό το κομμάτι γίνεται η δρομολόγηση των μηνυμάτων, είσοδος και έξοδος κόμβου.
3) Γραφικό κομμάτι - Επικοινωνίας με τον χρήστη και εμφάνιση της κατάστσης του Κόμβου (Πίνακας δρομολήγησης , Φύλλα, Γείτονες).
Σάββατο 27 Δεκεμβρίου 2008
Υποδομη Εποικοινωνίας
Το Pastry είναι ένα overlay network, που σημαίνει ότι πρέπει να χτιστεί πάνω από κάποια υποδομή επικοινωίας, μεσω της οποίας τα οι διαφοροι κόμβοι θα μπορούν να ανταλάσουν μηνύματα.
Η υποδομή μου αποτελείται από δύο τάξεις, την MessageReceiver και την Connector.
H MessageReceiver κληρονομεί την τάξη Thread και περιμένει πάνω από μια θύρα για νέα μηνυματα. Μόλις λάβει κάποιο μήνυμα ενημερώνει την Connector, η οποία με την σειρά της ενημερωνει τον Pastry κόμβο με το οποίο είναι συνδεμένη. Η Connector είναι η τάξη που αρχικοποιεί την υποδοχή , την τάξη MessageReceiver και αποστέλνει τα μηνύματα. Η υποδοχή εύναι τύπου DatagramSocket.
Η υποδομή μου αποτελείται από δύο τάξεις, την MessageReceiver και την Connector.
H MessageReceiver κληρονομεί την τάξη Thread και περιμένει πάνω από μια θύρα για νέα μηνυματα. Μόλις λάβει κάποιο μήνυμα ενημερώνει την Connector, η οποία με την σειρά της ενημερωνει τον Pastry κόμβο με το οποίο είναι συνδεμένη. Η Connector είναι η τάξη που αρχικοποιεί την υποδοχή , την τάξη MessageReceiver και αποστέλνει τα μηνύματα. Η υποδοχή εύναι τύπου DatagramSocket.
Εγγραφή σε:
Αναρτήσεις (Atom)