Freenet: A Distributed Anonymous Information Storage and Retrieval System Κοκκίνης Νίκος Κώνστα Λαμπρινή Μπουντουρόπουλος Νίκος Νικολαϊδου Παναγιώτα Παπαγεωργίου Χαρά
Freenet Tι είναι το Freenet? Freenet είναι μία P2P εφαρμογή η οποία παρέχει μια υπηρεσία για την αποθήκευση και ανάκτηση αρχείων ανώνυμα μέσω του Internet Τα κλειδιά και τα δεδομένα αποθηκεύονται κρυπτογραφημένα Χαρακτηριστικά Τα αρχεία καταλήγουν να τοποθετούνται σε περιοχές του δικτύου στις οποίες γίνονται requested πιο συχνά Τα δημοφιλή αρχεία αντιγράφονται σε περισσότερα μέρη από τα λιγότερο δημοφιλή Motivation Privacy Availability
Design Goals Ανωνυμία για τους requesters και providers πληροφοριών Προστασία της πληροφορίας από κακόβουλους χρήστες Αποτελεσματική δυναμική αποθήκευση και δρομολόγηση της πληροφορίας Αποκεντρικοποίηση των λειτουργιών του δικτύου Δεν παρέχει Permanent file storage Ανωνυμία γενικά, μόνο για Freenet file transactions
Αρχιτεκτονική Peer-to-peer δίκτυο, όπου όλοι οι peers είναι ισοδύναμοι Κάθε κόμβος αποτελείται από ένα τοπικό data store ένα δυναμικό routing table : σύνολο ζευγών, όπου κάθε pointer δείχνει σε έναν κόμβο ο οποίος έχει ένα αντίγραφο του αρχείου που αντιστοιχεί στο κλειδί key Κάθε κόμβος παρέχει στο δίκτυο το τοπικό του data- store συμβάλλοντας στην αύξηση του συνολικού αποθηκευτικού χώρου του δικτύου
Basic Model Τα µηνύµατα δηµιουργούν µια αλυσίδα (proxy chain) καθώς ένα request προωθείται από κόµβο σε κόµβο Στην proxy chain κάθε κόμβος γνωρίζει μόνο τον αμέσως προηγούμενο και αμέσως επόμενο γείτονα Σε κάθε request ανατίθεται Key του αρχείου που αναζητείται Τυχαίο ID για την αποφυγή loops Hops-to-live όριο για την αποφυγή τεράστιων αλυσίδων Ένα request συνεχίζει να προωθείται μέχρι να ανακτηθεί το ζητούμενο αρχείο ή να ξεπεραστεί το hops-to-live όριο Το αποτέλεσμα αποτυχίας ή επιτυχίας ενός requests προωθείται στον αρχικό requestor προς τα πίσω περνώντας κάθε κόμβο της αλυσίδας
Key Based Searching Σε κάθε αρχείο αντιστοιχεί ένα binary key Τα κλειδιά δημιουργούνται με την SHA-1 hash function Χρησιμοποιούνται τρεις τύποι files keys Keyword-signed key (ΚSΚ) Signed-subspace key (SSK) Content-hash key (CHK) Για να βρει κάποιος ένα αρχείο πρέπει να γνωρίζει το κλειδί του
Keyword-signed key (ΚSΚ) Κατά την αποθήκευση ενός αρχείου δίνεται από τον χρήστη ένα περιγραφικό string, το οποίο χρησιμοποιείται για Key generation String Public key + Private key Kρυπτογράφηση Για την ανάκτηση του αρχείου απο άλλους απαιτείται να γίνει publish μόνο το περιγραφικό user-defined string Hash KSK signature
Signed-subspace key (SSK) Παραγωγή τυχαίου ζεύγους public/private key που καθορίζει το namespace ID του χρήστη Κατά την αποθήκευση ενός αρχείου δίνεται από τον χρήστη ένα περιγραφικό string Για την δημιουργία Key Encryption Για την ανάκτηση του αρχείου απο άλλους απαιτούνται το string και το public key τα οποία γίνονται publish από τον χρήστη Hash Public Key Hash String XOR Hash SSK Key Private Key Signature
Content-hash key (CHK) Δημιουργία μοναδικού κλειδιού κάνοντας hash τα περιεχόμενα του αρχείου Το αρχείο κρυπτογραφείται από ένα randomly generated encryption key Για την ανάκτηση του αρχείου από άλλους απαιτούνται το content hash key και ένα decryption key που γίνονται από τον χρήστη Το CHK μπορεί να χρησιμοποιηθεί σε συνδυασμό με το SSK Το αρχείο εισάγεται στο Freenet χρησιμοποιώντας ένα CHK Το ίδιο CHK εισάγεται ως αρχείο (indirect file) χρησιμοποιώντας ένα SSK Η ανάκτηση αρχείου επιτυγχάνεται σε δύο βήματα δοθέντος του SSK SSK CHK File
Content-hash key (CHK) (cont.) Updating files Ο χρήστης κάνει publish την νέα version χρησιμοποιώντας ένα νέο διαφορετικό CHK Εισαγωγή του νέου CHK σε ένα indirect αρχείο χρησιμοποιώντας το ίδιο SSK Αντικατάσταση της παλιάς version του indirect αρχείου με την νέα, που περιέχει την τοποθεσία της νέας version του αρχείου Οι παλιές versions του αρχείου συνεχίζουν να είναι διαθέσιμες μέσω των παλιών CHKs, που τους αντιστοιχούν για κάποιο διάστημα SSK CHK old CHK new File’s old version File’s new version
Content-hash key (CHK) (cont.) Splitting του αρχείου σε τμήματα Εισαγωγή κάθε τμήματος με διαφορετικό content hash key Δημιουργία ενός indirect αρχείου με τις τοποθεσίες κάθε τμήματος του αρχείου SSK CHK 1 …. CΗΚ n Τμήμα 1 Τμήμα n …
Retrieving data Ο χρήστης στέλνει ένα request μήνυμα,που περιέχει το key του αρχείου που ψάχνει και μια τιμή hops-to-live, στον τοπικό κόμβο Κάθε κόμβος που λαμβάνει ένα request ελέγχει αν τo αρχείο είναι στο data store του και αν είναι το επιστρέφει μαζί με ένα μήνυμα ότι αυτός είναι ο data source αν το hops-to-live έχει γίνει μηδέν ή ο κόμβος έχει ξαναδεί αυτό το request επιστρέφεται ένα failure message διαφορετικά, το hops-to-live μειώνεται και ο κόμβος ψάχνει το κοντινότερο κλειδί στο routing table του και προωθεί το μήνυμα στον αντίστοιχο κόμβο, ο οποίος πραγματοποιεί την ίδια διαδικασία Αν βρεθεί ένας κόμβος που έχει το αρχείο αυτός θα το επιστρέψει μέσω του request μονοπατιού και κάθε κόμβος στο μονοπάτι θα κάνει cache αντίγραφο του αρχείου και θα προσθέσει μια νέα εγγραφή στο routing table για το key του request και το data source του
Retrieving data (Cont.) Ένας κόμβος μπορεί να αποφασίσει να αλλάξει το reply message παριστάνοντας τον ίδιο ως το data source προστατεύοντας το πραγματικό data source Διαδοχικά requests για παρόμοια κλειδιά θα προωθηθούν στους ίδιους κόμβους Failures Αν ένας κόμβος δεν μπορεί να προωθήσει ένα request στον downstream node πρώτης επιλογής του, δοκιμάζει την δεύτερη επιλογή του κοκ. Αν κανένας κόμβος δεν έχει το αρχείο στέλνει ένα failure message στον upstream κόμβο (backtracking), ο οποίος ακολουθεί την ίδια διαδικασία Αν ξεπεραστεί το hops-to-live όριο, ένα failure message επιστρέφεται στον αρχικό requestor
Retrieving data (Cont.)
Storing data Ο χρήστης υπολογίζει το binary file key και καθορίζει το hops-to-live και στέλνει ένα insert message στον τοπικό κόμβο Το hops-to-live καθορίζει τον αριθμό των κόμβων στον οποίο θα αποθηκευτεί αρχικά το αρχείο Κάθε κόμβος που λαμβάνει ένα insert request ελέγχει αν προκύπτει collision και αν υπάρχει ο χρήστης ενημερώνεται και προσπαθεί να κάνει insert το αρχείο χρησιμοποιώντας ένα διαφορετικό key αν δεν υπάρχει collision,το hops-to-live μειώνεται και ο κόμβος ψάχνει το κοντινότερο κλειδί στο routing table του σε σχέση με αυτό που προτάθηκε, και προωθεί το insert message στον κόμβο που αντιστοιχεί σε αυτό το κλειδί Όταν λήξει το όριο hops-to-live, ένα ‘all clear message’ αποστέλλεται στον αρχικό requestor και ο χρήστης στέλνει τα data για να αποθηκευθούν Τα data γίνονται cache σε κάθε κόμβο που έλαβε το insert request και εισάγεται μια καταχωρηση στο routing table κάθε κόμβου σχετίζοντας το file key με τον inserter
Data management Πεπερασμένο disk space Ωστόσο δεν υπάρχει περιορισμός στην ποσότητα των δεδομένων που μπορούν να εισάγουν οι publishers Όταν πρέπει να εισαχθεί ένα νέο αρχείο στο data store και δεν υπάρχει χώρος αποθήκευσης τα Least Recently Used (LRU) αρχεία αποβάλλονται Οι καταχωρήσεις των routing tables αντικαθίστανται χρησιμοποιώντας επίσης LRU πολιτική Όλα τα αρχεία στο data store κάθε κόμβου κρυπτογραφούνται Κανένας χρήστης ενός κόμβου δεν γνωρίζει τα περιεχόμενα των αρχείων που είναι αποθηκευμένα σε αυτόν τον κόμβο, ώστε ο κάτοχος ενός κόμβου να μην ευθύνεται για τα περιεχόμενα του data store του
Adding nodes Ένας νέος κόμβος μπορεί να συνδεθεί στο δίκτυο ανακαλύπτοντας την διεύθυνση ενός η περισσότερων υπάρχοντων κόμβων Οι νέοι κόμβοι πρέπει να ανακοινώσουν την παρουσία τους Οι υπάρχοντες κόμβοι θέλουν να γνωρίζουν ποια κλειδιά να αναθέσουν στους καινούριους κόμβους
Adding nodes (Cont.) Διαδικασία εισαγωγής σε ένα Freenet System Ο υποψήφιος κόμβος υπολογίζει ένα τυχαίο seed Στέλνει ένα μήνυμα σε έναν υπάρχοντα κόμβο, που περιέχει την διεύθυνση του και ένα hash του seed O κόμβος που δέχεται το μήνυμα παράγει ένα τυχαίο seed, το οποίο κάνει XOR με το hash που έλαβε και το αποτέλεσμα το κάνει ξανά hash, δημιουργώντας ένα commitment το οποίο προωθείται σε τυχαίο κόμβο του routing table του Όταν το hops-to-live γίνει 0, όλοι οι κόμβοι αποκαλύπτουν τα seeds τους και όλα τα seeds γίνονται XOR για να παράγουν το key του νέου κόμβου και κάθε κόμβος προσθέτει μια entry για τον νέο κόμβο στο routing table του με αυτό το κλειδί
Small-world model Κάθε κόμβος γνωρίζει τους φυσικούς γείτονές του κι ένα μικρό αριθμό από τυχαία επιλεγμένους μακρινούς κόμβους. Αποτέλεσμα:Μικρή διάμετρος και μικρό routing distance. Το μέσο μήκος μονοπατιού μειώνεται λογαριθμικά ως προς το μέγεθος του δικτύου. Ο συντελεστής ομαδοποίησης είναι υψηλός.
Simulation Results Όταν διακινείται μεγάλο φορτίο στο δίκτυο οι συχνές local caching λειτουργίες που προκαλούνται χαλάνε την ομαδοποίηση των keys μειώνοντας το hit-ratio και την αποτελεσματικότητα του Freenet routing
Εφαρμογή στο Freenet Enhanced clustering Κάθε κόμβος x διαλέγει τυχαία ένα seed s(x). Όταν ένα datastore είναι γεμάτο κι έρχεται ένα νέο αρχείο με κλειδί u (είτε από εισαγωγή, είτε από αναζήτηση) βρίσκεται το αρχείο με κλειδί v που είναι πιο μακριά από το seed. Ισχύει Αν Distance(u,seed)<=Distance(v,seed) κάνουμε cache το u αποβάλλουμε το v και δημιουργούμε μία νέα εγγραφή για τον u στο routing table. Αποτέλεσμα: Στο routing table δημιουργούνται κλειδιά για τους γείτονες που υπάρχουν γύρω από το seed του κόμβου.
Εφαρμογή στο Freenet (Cont.) Enhanced clustering with random shortcuts Αν Distance(u,seed)>Distance(v,seed) κάνουμε και πάλι cache το u αποβάλλουμε το v και δημιουργούμε μία νέα εγγραφή στο routing table για το u με πιθανότητα p (συνήθως 0.03). Αποτέλεσμα: Δημιουργία μερικών τυχαίων shortcuts.
LRU – Enhanced Clustering – Enhanced Clustering with shortcuts
LRU – Enhanced Clustering – Enhanced Clustering with shortcuts (Cont.)