PDF of color slides - Communication Systems Group
PDF of color slides - Communication Systems Group
PDF of color slides - Communication Systems Group
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Summary last lecture<br />
P2P introduction<br />
• Classification (client-server, hybrid P2P, pure P2P)<br />
• Napster<br />
• Gnutella<br />
• Analysis<br />
– Network topology follows power law<br />
– Where does power law come from<br />
– Small world networks
2.3 Distributed Hash Tables<br />
Chapter 2.3<br />
Distributed<br />
Hash Tables
2.3 Distributed Hash Tables – DHT<br />
• What are Distributed Hash-Tables<br />
– Applications -- What are DHTs used for<br />
– Complexity – How efficient are DHTs<br />
• Different approaches<br />
– Pastry – Rice, Micros<strong>of</strong>t<br />
– CAN – UC Berkeley, ICSI/ICIR<br />
– Chord – UC Berkeley, MIT<br />
– Tapestry – UC Berkeley<br />
– Symphony<br />
– Viceroy<br />
– Kademlia<br />
• Discussion and summary
Where can I<br />
find<br />
„Matrix.avi“<br />
Information lookup in Peer-to-Peer-<strong>Systems</strong><br />
<br />
I have<br />
„Matrix.avi“<br />
hat is the main problem in peer-to-peer systems<br />
– Data lookup in distributed systems<br />
• Where to store data<br />
– Publish(“content”, …)<br />
• How does query lookup the data location<br />
– Lookup(“content”)<br />
– Minimal overhead in both: communication, storage<br />
– Robustness against failures and frequent network changes
Content lookup – 1 st idea: centralized server<br />
Simplistic strategy: Client-Server<br />
– Server stores information about location <strong>of</strong> content files<br />
X has it!<br />
kup(“content”)<br />
S<br />
<br />
Publish(“content”,<br />
X<br />
Known problems<br />
• scalability (O(N) complexity <strong>of</strong> storage), freshness <strong>of</strong> data,<br />
single-point-<strong>of</strong> failure, implementation cost, etc.<br />
– However:<br />
Get(“content”)<br />
<br />
• Very effective mean for simple applications<br />
Search query<br />
Get content
Content lookup – 2 nd idea: flooding / breadth<br />
search<br />
et(“content”)<br />
kup<br />
ontent”)<br />
available<br />
available<br />
Search query<br />
File download<br />
– Breadth search (flooding, as with Gnutella)<br />
• High number <strong>of</strong> query messages <br />
• Not scalable<br />
– High network load<br />
– High communication overhead
Content lookup<br />
• search overhead vs. storage overhead<br />
O(N)<br />
Search overhead<br />
O(log N)<br />
O(1)<br />
flooding<br />
bottleneck:<br />
• communication<br />
bottleneck:<br />
Centralized<br />
server<br />
• storage, CPU,<br />
network<br />
• availability<br />
O(1)<br />
O(log N)<br />
Storage overhead<br />
O(N)
Content lookup<br />
• search overhead vs. storage overhead<br />
O(N)<br />
Search overhead<br />
O(log N)<br />
O(1)<br />
flooding<br />
bottleneck:<br />
• communication<br />
• complexity: O(log N)<br />
• Resilient against failures<br />
– Node failures<br />
– attacks<br />
– Network dynamics /<br />
temporary users<br />
bottleneck:<br />
Distributed<br />
Hash Tables<br />
Centralized<br />
server<br />
• storage, CPU,<br />
network<br />
• availability<br />
O(1)<br />
O(log N)<br />
Storage overhead<br />
O(N)
Principle <strong>of</strong> Distributed Hash Tables<br />
Idea <strong>of</strong> distributed hash tables<br />
– Distribute data/content on all nodes<br />
• Or rather: information about location <strong>of</strong> content<br />
– On content request, query node that stores information about content<br />
Challenges:<br />
– Even distribution <strong>of</strong> content on all available nodes<br />
• Efficient lookup <strong>of</strong> content<br />
– Constant adaptation on node failure, arrival or leave <strong>of</strong> nodes<br />
• Allocation <strong>of</strong> responsibilities to new nodes<br />
• Transfer and redistribution <strong>of</strong> responsibilities in case <strong>of</strong> node failure or node leave
Principle <strong>of</strong> DHTs – 1 st step: mapping<br />
• 1 st step: Map content to linear address space<br />
– <strong>of</strong>ten: 0, …, 2 m -1 >> N max (N is the maximum number <strong>of</strong> stored<br />
objects)<br />
– Content mapping realized through hash function<br />
• E.g., H(string) modulo 2 m : H(„/movie/Matrix/divx/en“) 2313<br />
• Distribute address space over DHT nodes<br />
0-<br />
1000<br />
1001-<br />
2000<br />
2001-<br />
4000<br />
4001-<br />
7000<br />
7001-<br />
10.000<br />
10.001-<br />
21.000<br />
21.001-<br />
40.000<br />
40.001-<br />
65.535<br />
ften, address<br />
pace illustrated<br />
s ring<br />
2 m -1 0
Distribution <strong>of</strong> address space on DHT nodes<br />
• Each node is responsible for at least a part <strong>of</strong> the address space<br />
– Allows for redundancy<br />
– Permanent adaptation<br />
gical view <strong>of</strong><br />
stributed hash<br />
ble<br />
apping on<br />
al network<br />
pology<br />
40.001-<br />
65.536<br />
4001-<br />
7000<br />
1001-<br />
2000<br />
Managin<br />
2001-400<br />
21.001-<br />
40.000<br />
7001-10.000<br />
0-<br />
1000<br />
10.001-<br />
21.000
Storage <strong>of</strong> content in DHTs – I<br />
How is content stored in the nodes<br />
– assumption: H(“content”) is mapping in address space<br />
Direct mapping:<br />
– Content is stored in node H(“content”)<br />
not flexible for large content<br />
40.001-<br />
65.536<br />
4001-<br />
7000<br />
1001-<br />
2000<br />
21.001-<br />
40.000<br />
7001-10.000<br />
0-<br />
1000<br />
10.001-<br />
21.000<br />
2001-<br />
4000<br />
H(“movie”)=2313
Storage <strong>of</strong> content in DHTs – II<br />
• Indirect mapping:<br />
– Node in DHT store tuple (Key, Value)<br />
• Key = Hash(„/movie/Matrix/divx/en“) 2313<br />
• Value is (very <strong>of</strong>ten) real address, where content is stored:<br />
(IP, Port) = (129.13.15.3, 4711)<br />
– More flexible, but one additional step to get to content<br />
1001-<br />
2000<br />
21.001-<br />
40.000<br />
40.001-<br />
65.536<br />
7001-10.000<br />
0-<br />
1000<br />
4001-<br />
7000<br />
10.001-<br />
21.000<br />
2001-<br />
4000<br />
H(“Film”)=23<br />
link to content:<br />
(2313 X)
DHTs – Content Localization<br />
nd<br />
Step:<br />
Location <strong>of</strong> content (Content based Routing)<br />
Goal: reduced complexity and scalability<br />
– O(1) with centralized hash table<br />
• but:<br />
Administration <strong>of</strong> centralized hash table is complex<br />
– Target complexity with distributed hash table<br />
• O(log N): Hops to find object / content<br />
• O(log N): number <strong>of</strong> keys and routing information per node
Content Localization – II<br />
• Search for keys<br />
– Entry at / query any node<br />
– Routing towards content (Key)<br />
Lookup(H(“Content”))<br />
2313<br />
Node manages keys<br />
2001-4000, also 2313<br />
Key = H(“Conten<br />
(2313, (IP, port<br />
Entry node<br />
(arbitrary)<br />
Value = Reference<br />
location <strong>of</strong> data
DHT-update: Arrival and Departure <strong>of</strong> Nodes<br />
Arrival <strong>of</strong> new nodes<br />
– Allocation <strong>of</strong> appointed hash range<br />
– Transfer Key/Value tuple <strong>of</strong> hash range (mainly redundancy)<br />
– Integration in routing structures<br />
Leave <strong>of</strong> node<br />
– partitioning <strong>of</strong> hash range to neighbor nodes<br />
– Transfer K/V tuple to responsible nodes<br />
– Leave the routing structure<br />
Node failure<br />
– Use <strong>of</strong> redundant K/V tuple (on tuple node failure)<br />
– Use <strong>of</strong> redundant/alternative routes<br />
– Key-Value reachable, if at least one copy is available
Generic interface <strong>of</strong> DHTs<br />
Interface to DHT<br />
– Insert information / content (e.g., location <strong>of</strong> content)<br />
• Publish(Key,Value)<br />
– Information lookup (content search)<br />
• Lookup(Key)<br />
– Answer:<br />
• Value<br />
DHT approaches interchangeable (with regard to interface)<br />
Distributed application<br />
Publish(Key,Value)<br />
Lookup(Key)<br />
distributed hash table<br />
(CAN, Chord, Pastry, Tapestry, …)<br />
Value<br />
node 1<br />
node 2 . . . .<br />
node x
Summary: Distributed Hash Tables<br />
• Summary: properties DHTs<br />
– Distribute keys equally over all DHT nodes (using redundancy)<br />
• No bottlenecks<br />
• Allow for constant growth <strong>of</strong> stored keys<br />
• Tolerant with regard to node failures<br />
• Survive concerted attacks<br />
– Self-organizing systems<br />
– Simple and efficient realization<br />
– Support for a large field <strong>of</strong> applications<br />
• Key has not semantic meaning<br />
• Value depends on application
Implementations <strong>of</strong> Distributed Hash Tables<br />
• DHT implementations<br />
– Pastry<br />
Micros<strong>of</strong>t Research, Rice University<br />
[2.60]<br />
– Chord<br />
UC Berkeley, MIT<br />
[2.70]<br />
– CAN<br />
UC Berkeley, ICSI<br />
[2.80]<br />
– Tapestry (not presented here)<br />
UC Berkeley<br />
– And Symphony, Viceroy, Kademlia<br />
[2.90]
Pastry<br />
• Goal: efficient search <strong>of</strong> K in data structure<br />
– K = ID ∈ [0..2 128 ]<br />
– Basic principle: binary tree – O(log N)<br />
• Node has two sons<br />
• O(log 2 N), but with 128-Bit ID, 128 nodes has to be searched<br />
• Better: 2 b (e.g.,. b=4) sons (like B*-trees in data bases)<br />
• Complexity:<br />
(log 2<br />
N) O b<br />
[2.54]<br />
…<br />
…<br />
… … …<br />
2 b sons<br />
• Pastry-IDs views identifiers as strings <strong>of</strong> digits to the base 2 b<br />
– b=4: Hex system, b=2: “Vierer”-System<br />
– Example: 12345678 10<br />
= BC614E 16<br />
= 233012011032 4
Routing in Pastry<br />
• Insert content:<br />
– Determine FileID<br />
– Insert data in k nodes closest to FileID<br />
• Routing in Pastry:<br />
– In each routing step, query is routed towards<br />
“numerically “ closest node<br />
• That is, query is routed to a node with a<br />
one (= b Bits) bit longer prefix<br />
O(log 2<br />
b N) routing steps<br />
• If that is not possible:<br />
route towards node that is numerically closer to ID<br />
• Required data structure in Pastry node<br />
– Pastry routing table<br />
– Leaf-Set<br />
– Neighborhood-Set<br />
Destination:<br />
(b = 2)<br />
Start<br />
1. Hop<br />
2. Hop<br />
3. Hop<br />
4. Hop<br />
5. Hop<br />
Destination:<br />
0123<br />
3213<br />
0222<br />
0133<br />
0121<br />
0123<br />
0123<br />
0123
Pastry Routing Table - I<br />
• Data structures <strong>of</strong> a Pastry node:<br />
– Leaf Set L<br />
• Set <strong>of</strong> numerically closest (known) nodes <strong>of</strong> node ID<br />
– “leafs <strong>of</strong> routing tree”<br />
– |L| most <strong>of</strong>ten 2 b (|L|/2 larger, respectively smaller than node ID)<br />
• Verification and eventually update if new node is numerically closer<br />
than existing nodes in leaf<br />
– Neighborhood Set M<br />
• Set <strong>of</strong> topological closest (known) nodes <strong>of</strong> local node<br />
• Used metric: in general, delay or number <strong>of</strong> network hops<br />
• Not involved in routing itself
Leaf Set<br />
• If requested key is in range <strong>of</strong> Leaf-Set answer<br />
request with closest nodeID<br />
Node-ID = 32101<br />
Smaller Node-IDs<br />
higher Node-IDs<br />
32100 32023 32110 32121<br />
32012 32022 32123 32120<br />
• Here: range= 32012 to 32123
Pastry Routing Table - II<br />
• ⎡log ⎤ rows with 2 b 2<br />
b N<br />
-1 entries each<br />
– row i: hold the IDs <strong>of</strong> nodes whose ID share an i-digit prefix with<br />
node<br />
– column j: digit(i+1) = j<br />
– Contains topologically closest node that meets these criteria<br />
• Example: b=2, N = 32, Node-ID = 32101<br />
igit at<br />
osition i+1<br />
red prefix<br />
th with<br />
e-ID<br />
i j 0 1 2 3<br />
0 01234 14320 22222 ––<br />
1 30331 31230 –– 33123<br />
2 32012 –– 32212 323--<br />
3 –– 32110 32121 3213-<br />
4 32100 –– 32102 32103<br />
Topologically closest<br />
node with prefix<br />
length i and<br />
digit(i+1)=j<br />
Possible node: 33xyz<br />
33123 is topologically<br />
closest node
Pastry Routing Table - III<br />
• Example for Pastry node routing information<br />
– Neighborhood Table M<br />
2 b entries<br />
32022<br />
00100<br />
12300<br />
11001<br />
01213<br />
21021<br />
32123<br />
11213<br />
– Routing table R<br />
O(log N) entries<br />
i \ j<br />
0<br />
1<br />
0<br />
01234<br />
30331<br />
1<br />
14320<br />
31230<br />
2<br />
22222<br />
––<br />
3<br />
––<br />
33123<br />
2<br />
32012<br />
––<br />
32212<br />
323--<br />
3<br />
––<br />
32110<br />
32121<br />
3213-<br />
4<br />
32100<br />
––<br />
32102<br />
32103<br />
– Leaf Set L<br />
2 b entries<br />
< Node-ID > Node-ID<br />
32100 32023 32110 32121<br />
32012 32022 32123 32120
Pastry Routing Algorithm<br />
Routing <strong>of</strong> packet with destination K at node N:<br />
1. Is K in Leaf Set, route packet directly to that node<br />
2. If not, determine prefix (N, K)<br />
3. Search entry T in routing table with prefix (T, K) > prefix (N, K),<br />
and route packet to T<br />
4. If not possible, search node T with longest prefix (T, K) out <strong>of</strong> merge<br />
set <strong>of</strong> routing table, leaf set, and neighborhood set and route to T<br />
5. As shown in [2.60], that happens not <strong>of</strong>ten<br />
– Access to routing table O(1), since row and column are known<br />
– Entry might be empty if corresponding node is unknown
Key = 32102<br />
Node is in<br />
range <strong>of</strong><br />
Leaf-Set<br />
Node-ID = 32101<br />
Key = 01200<br />
Common prefix:<br />
32101<br />
01200<br />
--------<br />
0----<br />
Example<br />
Key = 32200<br />
Common prefix:<br />
32101<br />
32200<br />
--------<br />
322--<br />
Key = 33122<br />
Common prefix:<br />
32101<br />
33122<br />
--------<br />
33---<br />
i j 0 1 2 3<br />
0 01234 14320 22222 ––<br />
1 30331 31230 –– 33123<br />
2 32012 –– 32212 323--<br />
3 –– 32110 32121 3213-<br />
4 32100 –– 32102 32103<br />
< Node-ID<br />
> Node-ID<br />
32100<br />
32023<br />
32110<br />
32121<br />
32012<br />
32022<br />
32123<br />
32120
Complexity <strong>of</strong> Pastry Routing<br />
• Parameters<br />
– Choice <strong>of</strong> b determines:<br />
size <strong>of</strong> routing table shortest path length<br />
– Example: b = 4<br />
• 1.000.000 nodes:<br />
75 entries in routing table<br />
∅ number <strong>of</strong> hops = 5<br />
• 1.000.000.000 nodes:<br />
105 entries in routing table<br />
∅ number <strong>of</strong> hops = 7
Arrival <strong>of</strong> New Node - III<br />
• Initialization <strong>of</strong> routing table:<br />
– Iteration:<br />
• row i prefix length = i<br />
• Pastry routing: improve prefix with each routing iteration<br />
– Idea: Use information <strong>of</strong> JOIN messages<br />
• row 0 <strong>of</strong> A 0<br />
, since A 0<br />
is close to X<br />
• row 1 <strong>of</strong> A 1<br />
(1 st Hop), since A 1<br />
closest node with prefix (A, *) = 1<br />
• generally:<br />
• then:<br />
– Row i <strong>of</strong> i th hop<br />
– Query Neighbor table <strong>of</strong> all nodes in A’s new routing table<br />
– Check for “closer” nodes with according prefix
Arrival <strong>of</strong> New Node - I<br />
• Node X wants to join Pastry<br />
DHT<br />
– Determine NodeID <strong>of</strong> X<br />
12333 (hash <strong>of</strong> IP address)<br />
– Initialize tables at node X<br />
– Send JOIN message to any<br />
Pastry node<br />
i \ j 0 1 2<br />
0<br />
1<br />
2<br />
3<br />
4<br />
< Node-ID > Node-ID<br />
3<br />
JOIN X<br />
X = 12333<br />
A 2 = 12222<br />
A 4 = Z = 12332<br />
A 0 = 23231<br />
A 3 = 12311<br />
A 1 = 13231
Arrival <strong>of</strong> New Node - II<br />
• Node X wants to join Pastry<br />
DHT<br />
– Node X copies Neighbor-Set<br />
from node A0<br />
32022 12300 01213 3212<br />
00100 11001 21021 1121<br />
i \ j 0 1 2 3<br />
0<br />
1<br />
2<br />
3<br />
4<br />
< Node-ID > Node-ID<br />
py<br />
ighbor-Set<br />
X = 12333<br />
A 2 = 12222<br />
A 4 = Z = 12332<br />
A 0 = 23231<br />
A 3 = 12311<br />
A 1 = 13231
Arrival <strong>of</strong> New Node - III<br />
• Node X wants to join Pastry<br />
DHT<br />
– Node A0 routes message to<br />
node Z<br />
– Each node sends row in<br />
routing table to X<br />
– Here A0<br />
i \ j<br />
0<br />
32022 12300 01213 3212<br />
00100 11001 21021 1121<br />
0 1 2 3<br />
02231 13231 - 3233<br />
1<br />
2<br />
3<br />
4<br />
< Node-ID > Node-ID<br />
JOIN X<br />
X = 12333<br />
A 2 = 12222<br />
A 4 = Z = 12332<br />
A 0 = 23231<br />
A 3 = 12311<br />
A 1 = 13231
Arrival <strong>of</strong> New Node - IV<br />
• Node X wants to join Pastry<br />
DHT<br />
– Node A0 routes message to<br />
node Z<br />
– Each node sends row in<br />
routing table to X<br />
– Here A1<br />
i \ j<br />
0<br />
1<br />
32022 12300 01213 3212<br />
00100 11001 21021 1121<br />
0 1 2 3<br />
02231 13231 - 3233<br />
10122 11312 12222 1312<br />
2<br />
3<br />
4<br />
< Node-ID > Node-ID<br />
X = 12333<br />
A 2 = 12222<br />
A 4 = Z = 12332<br />
A 0 = 23231<br />
JOIN X<br />
A 3 = 12311<br />
A 1 = 13231
Arrival <strong>of</strong> New Node - V<br />
• Node X wants to join Pastry<br />
DHT<br />
– Node A0 routes message to<br />
node Z<br />
– Each node sends row in<br />
routing table to X<br />
– Here A2<br />
i \ j<br />
0<br />
1<br />
2<br />
32022 12300 01213 3212<br />
00100 11001 21021 1121<br />
0 1 2 3<br />
02231 13231 - 3233<br />
10122 11312 12222 1312<br />
12033 12111 - 1231<br />
3<br />
4<br />
< Node-ID > Node-ID<br />
X = 12333<br />
JOIN X<br />
A 2 = 12222<br />
A 4 = Z = 12332<br />
A 0 = 23231<br />
A 3 = 12311<br />
A 1 = 13231
Arrival <strong>of</strong> New Node - VI<br />
• Node X wants to join Pastry<br />
DHT<br />
– Node A0 routes message to<br />
node Z<br />
– Each node sends row in<br />
routing table to X<br />
– Here A3<br />
i \ j<br />
0<br />
1<br />
2<br />
3<br />
32022 12300 01213 3212<br />
00100 11001 21021 1121<br />
0 1 2 3<br />
02231 13231 - 3233<br />
10122 11312 12222 1312<br />
12033 12111 - 1231<br />
12301 - 12320 1233<br />
4<br />
< Node-ID > Node-ID<br />
X = 12333<br />
A 2 = 12222<br />
A 4 = Z = 12332<br />
A 0 = 23231<br />
JOIN X<br />
A 3 = 12311<br />
A 1 = 13231
Arrival <strong>of</strong> New Node - VII<br />
• Node X wants to join Pastry<br />
DHT<br />
– Node A0 routes message to<br />
node Z<br />
– Each node sends row in<br />
routing table to X<br />
– Here A4<br />
i \ j<br />
0<br />
1<br />
2<br />
3<br />
4<br />
32022 12300 01213 3212<br />
00100 11001 21021 1121<br />
0 1 2 3<br />
02231 13231 - 3233<br />
10122 11312 12222 1312<br />
12033 12111 - 1231<br />
12301 - 12320 1233<br />
12330 12331 - 1233<br />
< Node-ID > Node-ID<br />
X = 12333<br />
A 2 = 12222<br />
A 4 = Z = 12332<br />
JOIN X<br />
A 0 = 23231<br />
A 3 = 12311<br />
A 1 = 13231
Arrival <strong>of</strong> New Node - VIII<br />
32022<br />
00100<br />
12300<br />
11001<br />
01213<br />
21021<br />
3212<br />
1121<br />
• Node X wants to join Pastry<br />
DHT<br />
i \ j<br />
0<br />
0<br />
02231<br />
1<br />
13231<br />
2<br />
-<br />
3<br />
3233<br />
– Node Z copies its Leaf-Set to<br />
Node X<br />
1<br />
2<br />
10122<br />
12033<br />
11312<br />
12111<br />
12222<br />
-<br />
1312<br />
1231<br />
3<br />
12301<br />
-<br />
12320<br />
1233<br />
4<br />
12330<br />
12331<br />
-<br />
1233<br />
X = 12333<br />
A 2 = 12222<br />
< Node-ID > Node-ID<br />
12311 12322 12333 13000<br />
12331 12330 13001 13003<br />
A 4 = Z = 12332<br />
A 0 = 23231<br />
Copy Leaf-Set<br />
to X<br />
A 3 = 12311<br />
A 1 = 13231
Arrival <strong>of</strong> New Node - IX<br />
32022<br />
00100<br />
12300<br />
11001<br />
01213<br />
21021<br />
3212<br />
1121<br />
• Node X wants to join Pastry<br />
DHT<br />
i \ j<br />
0<br />
0<br />
02231<br />
1<br />
13231<br />
2<br />
-<br />
3<br />
3233<br />
– Node x sends its routing table<br />
to each neighbor<br />
1<br />
2<br />
10122<br />
12033<br />
11312<br />
12111<br />
12222<br />
-<br />
1312<br />
1231<br />
3<br />
12301<br />
-<br />
12320<br />
1233<br />
4<br />
12330<br />
12331<br />
-<br />
1233<br />
X = 12333<br />
A 2 = 12222<br />
< Node-ID > Node-ID<br />
12311 12322 12333 13000<br />
12331 12330 13001 13003<br />
A 4 = Z = 12332<br />
JOIN X<br />
A 0 = 23231<br />
A 3 = 12311<br />
A 1 = 13231
Arrival <strong>of</strong> New Node - IV<br />
• Efficiency <strong>of</strong> procedure <strong>of</strong> initialization<br />
– Quality <strong>of</strong> routing table (b=4, |L| = 16, |M| = 32, 5k nodes)<br />
[2.60]<br />
SL: transfer only the i th routing table row <strong>of</strong> A i<br />
WT: transfer <strong>of</strong> i th routing table row <strong>of</strong> A i<br />
as well as analysis <strong>of</strong> leaf and neighbor set<br />
WTF: same as WT, but also query the newly discovered nodes from WT and analysis data
Failure <strong>of</strong> Pastry Nodes<br />
• Detection <strong>of</strong> failure<br />
– Periodic verification <strong>of</strong> nodes in Neighborhood Set<br />
• “Are you alive” also checks capability <strong>of</strong> neighbor<br />
– Route query fails<br />
• Routing in spite <strong>of</strong> failure possible<br />
– Route slightly worse – problems only with |L| consecutive nodes<br />
• Replacement <strong>of</strong> corrupted entries<br />
– Neighborhood-Set:<br />
• Choose alternative node from Leaf (L) ∪ Leaf (±|L|/2)<br />
– entry R x y<br />
in routing table failed:<br />
• Ask node R x i (i≠y) <strong>of</strong> same row for route to R x y<br />
• If not successful, test entry R x++ i in next row
Using Pastry<br />
• We have seen how Pastry networks are built, but how to<br />
use the routing structure<br />
– Create objectID, using file name and object owner<br />
– Replicas are stored on the k Pastry nodes with nodeIDs<br />
numerically closest to the objectID<br />
• By definition, the lookup it is guaranteed to reach a node<br />
that stores the object as long as one <strong>of</strong> the k nodes is<br />
alive.
Performance Evaluation<br />
[2.60<br />
Routing Performance<br />
– Number <strong>of</strong> Pastry hops (b=4,<br />
|L| = 16, |M| = 32, 2·10 5 queries<br />
– O(log N) for number <strong>of</strong> hops<br />
in the overlay<br />
– Overhead <strong>of</strong> overlay<br />
(in comparison to route<br />
between two node in the IP network)<br />
– But:<br />
Routing table has only O(log N)<br />
entries instead <strong>of</strong> O(N)
Summary Pastry<br />
• Complexity:<br />
– O(log N) hops to destination<br />
• Often even better through Leaf- and Neighbor-Set:<br />
– O(log N) storage overhead per node<br />
(log 2<br />
N ) O b<br />
• Good support <strong>of</strong> locality<br />
– Explicit search <strong>of</strong> close by nodes (following some metric)<br />
• Use in many applications<br />
– PAST (file system), Squirrel (Web-Cache), …<br />
– Simulator many publications available (FreePastry)
Distributed Hash Table<br />
– Routing complexity: O(log N)<br />
– Node complexity: O(log N)<br />
Principle:<br />
Chord<br />
– Keys <strong>of</strong> the DHT are unique l-bit identifiers<br />
– Form a uni-dimensional identifier<br />
circle space: 0 ≤ k < 2 M<br />
– Node and Key-Value tuple are in the same<br />
value range<br />
• node: N x<br />
= Hash(IP Address)<br />
• Key-Value-Tuple: K y<br />
= Hash(String)<br />
– E.g. Hash(„Matrix.avi“) = 107<br />
– K107 points to IP-Address <strong>of</strong> storage location (K107, (51.12.3.2, 4711))<br />
• Based on consistent hashing<br />
• Recommended hash function: SHA-1 (m = 164)<br />
[2.59]<br />
N32<br />
K41<br />
N21<br />
N60<br />
[2.70]<br />
Beispiel: k=7<br />
N71<br />
K80<br />
N99<br />
K107<br />
0 2 7 -1
Each node is responsible for<br />
segments <strong>of</strong> the range 0...2 M -1<br />
– Key-Value pair <strong>of</strong> a segment are<br />
managed in the successor node<br />
– E.g., K22...K32 are managed in<br />
node N32<br />
Routing in Chord<br />
1. Start search for K at any node N<br />
2. If N manages key K, reply with tuple (K, V)<br />
3. If not, send query clockwise to ring neighbor<br />
until N > K<br />
<br />
<br />
Chord-Routing - I<br />
(K23 → IP 23 )<br />
(K27 → IP 27 )<br />
(K32 → IP 32 )<br />
(K33 → IP 33 )<br />
(K51 → IP 51 )<br />
N32<br />
Answer is guaranteed: if K exist, it will be found<br />
Question: efficient forwarding<br />
K33<br />
K32<br />
K27<br />
K23<br />
N21<br />
N60<br />
K51<br />
Example: M=7<br />
0 2 7 -1<br />
N71<br />
K87<br />
K99<br />
N99<br />
(K99 → IP 9<br />
(K87 → IP 8
Simple Lookup<br />
• Each node maintains<br />
successor<br />
• Route packet(ID, data) to<br />
the node responsible for<br />
ID using successor<br />
pointers<br />
N58<br />
Lookup 37<br />
N4<br />
N8<br />
Node 44<br />
N15<br />
N44<br />
N20<br />
N35<br />
N32
Joining Operation I<br />
• Each node A periodically sends stabilize() messages to<br />
its successor B<br />
• B replies with a notify() message containing the<br />
predecessor <strong>of</strong> B (node X)<br />
• If X is between A and B, A updates its successor to X
Joining Operation II<br />
• Node 50 joins ring<br />
• Node 50 knows at least one<br />
other node in ring<br />
Succ=4<br />
• E.g., N15<br />
Pred=44<br />
N58<br />
N4<br />
N8<br />
Succ=nil<br />
Pred=nil<br />
N50<br />
N15<br />
Succ=58<br />
Pred=35<br />
N44<br />
N35<br />
N20<br />
N32
Joining Operation III<br />
• N50 sends join to N15<br />
• N44 returns N58<br />
• N50 updates succ. N4<br />
Succ=4<br />
Pred=44<br />
N58<br />
N8<br />
Succ=58<br />
Pred=nil<br />
N50<br />
Join<br />
N15<br />
Succ=58<br />
Pred=35<br />
N44<br />
N35<br />
Route to key 50<br />
N20<br />
N32
Joining Operation IV<br />
• N50 sends stabilize() to N58<br />
• N58 updates pred.<br />
• N58 sends notify(). N4<br />
Stabilize()<br />
Succ=4<br />
Pred=50<br />
N58<br />
N8<br />
Succ=58<br />
Pred=nil<br />
N50<br />
Notify(50)<br />
N15<br />
Succ=58<br />
Pred=35<br />
N44<br />
N35<br />
N20<br />
N32
Joining Operation V<br />
• Node 44 sends stabilize to<br />
successor N58<br />
• Node 58 replies with<br />
notify(N50)<br />
• Node 44<br />
updates<br />
Succ=58<br />
Pred=nil<br />
its successor<br />
to N50<br />
N50<br />
Succ=50<br />
Pred=35<br />
Succ=4<br />
Pred=50<br />
Stabilize()<br />
N44<br />
N58<br />
Notify(50)<br />
N4<br />
N8<br />
N15<br />
N35<br />
N20<br />
N32
Joining Operation VI<br />
• Node 44 sends stabilize to new<br />
successor N50<br />
• Node 50 sets its<br />
predecessor<br />
to N40<br />
Succ=58<br />
Pred=40<br />
N50<br />
Succ=4<br />
Pred=50<br />
N58<br />
N4<br />
N8<br />
Stabilize()<br />
N15<br />
Succ=50<br />
Pred=35<br />
N44<br />
N20<br />
N35<br />
N32
Improve Efficiency<br />
• Simple Routing:<br />
– Node must know clockwise successor<br />
– Consecutive forwarding to next node: O(N)<br />
N46<br />
N38<br />
• Improvement:<br />
– Node R knows all next nodes (Neighbor Set)<br />
– Complexity O(N/R)<br />
Neighbor-Set<br />
N21<br />
N33<br />
• R := N<br />
– Search complexity: O(1) ☺<br />
#R<br />
N33 -> IP 33<br />
N38 -> IP 38<br />
N46 -> IP 46<br />
– But:<br />
Storage complexity is O(N) and problems with table updates
Exponential Search – Finger Tables<br />
• Exponential strategy for pointers in hash range<br />
– Node points with M = log N pointers in value range<br />
– Pointer i in node K points to the node that stores key K + 2 i , i.e.,<br />
Successor (K + 2 i )<br />
– Routing: search for node in Finger Table<br />
that is closest to K<br />
– Complexity:<br />
• O(log N) Hops<br />
• O(log N) pointers<br />
• Complexity during arrival<br />
and node departure
Exponential Search – Finger Tables<br />
• Exponential strategy for pointers in hash range<br />
– Node points with M = log N pointers in value range<br />
– Pointer i in node K points to the node that stores key K + 2 i , i.e.,<br />
Successor (K + 2 i )<br />
– Example K=N32<br />
• Finger 0=32+2 0 = 33(32,33]<br />
• Finger 1=32+2 1 = 34(33,34]<br />
• Finger 2=32+2 2 = 36(34,36]<br />
• Finger 2=32+2 3 = 40(36,40]<br />
• …<br />
i<br />
Finger-Table<br />
Key. Pointer<br />
N60<br />
48<br />
40<br />
33 3436<br />
64<br />
N71<br />
96<br />
0 K33 N60<br />
1 K34 N60<br />
2 K36 N60<br />
3 K40 N60<br />
4 K48 N60<br />
5 K64 N71<br />
N32<br />
N21
Routing in Chord<br />
• search for K18 (M=7)<br />
N120<br />
N5<br />
109<br />
N12<br />
N15<br />
Finger-Table N32<br />
79<br />
Successor(N32+2 6) =<br />
Successor(K96) = N98<br />
N20<br />
N32<br />
i Key. Pointer<br />
0 K33 N59<br />
1 K34 N59<br />
2 K36 N59<br />
3 K40 N59<br />
4 K48 N59<br />
5 K64 N79<br />
6 K96 N98<br />
N59<br />
Search (K18)<br />
[2.7
Routing in Chord<br />
• search for K18 (M=7)<br />
N120<br />
N5<br />
109<br />
79<br />
N98+2 5<br />
→ K2<br />
Successor(N32+2 6) =<br />
Successor(K96) = N98<br />
N12<br />
N15<br />
N20<br />
N32<br />
Finger-Table N98<br />
i Key. Pointer<br />
0 K99 N109<br />
1 K100 N109<br />
2 K102 N109<br />
3 K106 N109<br />
4 K114 N120<br />
5 K2 N5<br />
6 K34 N59<br />
N59<br />
Search (K18)<br />
[2.7
Routing in Chord<br />
• search for K18 (M=7)<br />
N120<br />
N5<br />
109<br />
79<br />
N98+2 32<br />
→ K3 N5+2 3<br />
→ K13<br />
Successor(N32+2 6) =<br />
Successor(K96) = N98<br />
N12<br />
N15<br />
N20<br />
N32<br />
Finger-Table N5<br />
i Key. Pointer<br />
0 K6 N12<br />
1 K7 N12<br />
2 K9 N12<br />
3 K13 N15<br />
4 K21 N32<br />
5 K37 N59<br />
6 K71 N79<br />
N59<br />
Search (K18)<br />
[2.7
Routing in Chord<br />
• search for K18 (M=7)<br />
109<br />
79<br />
N120<br />
N98+2 32<br />
→ K3<br />
N5<br />
N5+2 3<br />
→ K13<br />
N15+2 1<br />
→ K17<br />
Successor(N32+2 6) =<br />
Successor(K96) = N98<br />
N12<br />
N15<br />
N20<br />
N32<br />
Finger-Table N15<br />
i Key. Pointer<br />
0 K16 N20<br />
1 K17 N20<br />
2 K19 N20<br />
3 K23 N32<br />
4 K31 N32<br />
5 K47 N59<br />
6 K79 N79<br />
N59<br />
Search (K18)<br />
[2.7
Routing in Chord<br />
• search for K18 (M=7)<br />
109<br />
N120<br />
N5<br />
N98+2 32<br />
→ K3 N5+2 3<br />
→ K13<br />
(K18 → IP 18 )<br />
. . .<br />
N12<br />
N15<br />
N20<br />
N20 in<br />
Neighbor Set<br />
Successor(N32+2 6) =<br />
Successor(K96) = N98<br />
N32<br />
79<br />
N59<br />
Search (K18)<br />
[2.7
Example: Routing in Chord<br />
• search for K18 (M=7) • Evolution <strong>of</strong> path length<br />
109<br />
79<br />
N120<br />
N5<br />
N12<br />
N98+2 32<br />
N15<br />
→ K3 N5+2 3<br />
→ K13 N20<br />
N20 in<br />
Neighb.Set<br />
Successor(N32+2 6) =<br />
Successor(K96) = N98<br />
(K18 → IP 18 )<br />
. . .<br />
N32<br />
and network size<br />
(Simulation)<br />
– O(log N)<br />
Path length (Chord-Hops)<br />
N59<br />
Search (K18)<br />
# nodes N<br />
[2.7
Arrival <strong>of</strong> new node in Chord<br />
• Objectives for insert/leave <strong>of</strong> nodes<br />
– Maintenance <strong>of</strong> correct search queries<br />
• Each node mode know its successor<br />
– Secondary objective for efficiency <strong>of</strong> queries<br />
• Finger table should be correct<br />
• Insert <strong>of</strong> node N<br />
– Start node N 1 searches successor N S and predecessor N P <strong>of</strong> N<br />
– Building <strong>of</strong> Finger- and Neighbor Table <strong>of</strong> N: O(log² N)<br />
– Update <strong>of</strong> Finger Tables, that point to N or N S respectively O(log²<br />
N)<br />
– Transfer <strong>of</strong> Key-Value pairs N P < K ≤ N: O(log N)<br />
– If nodes are double linked, search for predecessor
Example: Insert <strong>of</strong> new Node<br />
N38<br />
N32<br />
Insert <strong>of</strong> N38:<br />
• Building <strong>of</strong> finger table<br />
at node N38<br />
• Update <strong>of</strong> finger tables<br />
with link to N38, N32<br />
• Transfer <strong>of</strong> keys in<br />
segment <strong>of</strong> N38<br />
(K38 – K59)<br />
48<br />
36<br />
33 34<br />
N21<br />
N60<br />
64<br />
Finger-Table N32<br />
i dest pointer<br />
0 K33 N60<br />
1 K34 N60<br />
2 K36 N60<br />
3 K40 N60<br />
4 K48 N60<br />
5 K64 N71<br />
6 K96 N99<br />
N71<br />
96<br />
N99<br />
Finger-Table N38<br />
i dest pointe<br />
0 K39 N60<br />
1 K40 N60<br />
2 K42 N60<br />
3 K46 N60<br />
4 K54 N60<br />
5 K70 N71<br />
6 K102 N21<br />
Finger-Table N32<br />
i dest pointe<br />
0 K33 N38<br />
1 K34 N38<br />
2 K36 N38<br />
3 K40 N60<br />
4 K48 N60<br />
5 K64 N71<br />
6 K96 N99
Problems <strong>of</strong> Node Insert<br />
• Problems <strong>of</strong> node insert<br />
– Case 1: Tables <strong>of</strong> all participating nodes are correct<br />
• No problem – Search complexity O(log N)<br />
– Case 2: Successor table correct, but Finger table inconsistent<br />
• Query still correct – but increased complexity<br />
– Fall3: Successor-Table not correct<br />
• Possibility <strong>of</strong> wrong query result, i.e., existing key will not be found<br />
• Periodic stabilization prevents inconsistencies<br />
– Periodic verification <strong>of</strong> successor's predecessor<br />
– Periodic update <strong>of</strong> finger tables
Chord - Summary<br />
• Complexity<br />
– Search complexity: O(log N)<br />
– Storage complexity : O(log N)<br />
– Maintenance complexity O(log² N)<br />
• Advantages<br />
– Theoretical validation <strong>of</strong> complexity<br />
– In case <strong>of</strong> failure, still logarithmic<br />
complexity<br />
• Disadvantages<br />
– No explicit search for close by nodes (no proximity)<br />
– No build in security<br />
– Unsolved problem <strong>of</strong> network partitioning
CAN – Content Addressable Network<br />
O(<br />
D<br />
• DHT with complexity <strong>of</strong><br />
4<br />
• Hash value corresponds to point in 3 dimensional space<br />
– E.g., H(„Matrix.avi“) → (0.7, 0.2)<br />
– DHT handles (key, value)<br />
• Each overlay node manages<br />
partition <strong>of</strong> space<br />
1<br />
N D<br />
– Node 4 manages all hash values<br />
in the range: x ∈ [0.5, 1], y ∈ [0, 0,25]<br />
– Adjoining areas called neighbors<br />
• 6, 2, 4, 3 neighbor <strong>of</strong> 5 (not 1!)<br />
• „wrap around“ at DHT borders<br />
• Expected number <strong>of</strong> neighbors: O(2·D)<br />
)<br />
1<br />
7<br />
3<br />
8<br />
9<br />
2<br />
6<br />
4<br />
5
CAN – Content Addressable networks
CAN – Content Addressable Network<br />
O(<br />
D<br />
• DHT with complexity <strong>of</strong><br />
4<br />
• Hash value corresponds to point in 3 dimensional space<br />
– E.g., H(„Matrix.avi“) → (0.7, 0.2)<br />
– DHT handles (key, value)<br />
• Each overlay node manages<br />
partition <strong>of</strong> space<br />
1<br />
N D<br />
– Node 4 manages all hash values<br />
in the range: x ∈ [0.5, 1], y ∈ [0, 0,25]<br />
– Adjoining areas called neighbors<br />
• 6, 2, 4 neighbor <strong>of</strong> 5 (not 1!)<br />
• „wrap around“ at DHT borders<br />
• Expected number <strong>of</strong> neighbors: O(2·D)<br />
)<br />
1<br />
7<br />
3<br />
8<br />
9<br />
2<br />
6<br />
4<br />
5
Routing in CAN<br />
How to get from P8 to Z<br />
– Route along the shortest path in D-dimensional<br />
space<br />
– specifically:<br />
neighbor with closest distance to destination is next hop.<br />
Example:<br />
• Distance is constantly decreasing<br />
• Complexity: Hops 7 in DHT<br />
– P8: Lookup(Z)<br />
8<br />
1<br />
– Which neighbor is closest to 9Z<br />
starting at P8<br />
• Route to P1<br />
– Then go to P3<br />
– Then go to Z<br />
O(<br />
D<br />
4<br />
1<br />
N D<br />
)<br />
3<br />
2<br />
6<br />
4<br />
Z<br />
5<br />
1<br />
7<br />
3<br />
Start: Lookup(Z)<br />
6<br />
8<br />
9<br />
2 5<br />
Z<br />
4<br />
Distance to neighbors (from P8) to dest.<br />
Route choice using CAN-Routing
Building a CAN - I<br />
sert node X<br />
Select an arbitrary CAN node as entry to DHT<br />
Choose an arbitrary point in the D-dimensional space<br />
Route JOIN message towards this point or to node K that handles this point<br />
Divide the region <strong>of</strong> this node in two parts<br />
• Dimension <strong>of</strong> division is chosen according to dimension<br />
• E.g., x, y, z, x, y, z, ... with D=3<br />
• (key, value) pairs <strong>of</strong> nodes in the newly created region will be transferred from node K<br />
to node X<br />
• New node inherit neighbors from former node<br />
• Neighbors update neighborhood information<br />
complexity: O(D) – independent <strong>of</strong> N (!)
Building a CAN - II<br />
• Example: Insert P2, ..., P7<br />
1<br />
1<br />
1<br />
2<br />
2<br />
3 2<br />
3<br />
4<br />
1<br />
1<br />
6<br />
7<br />
6<br />
1<br />
2 5<br />
2 5<br />
2 5<br />
3<br />
4<br />
3<br />
4<br />
3<br />
4
Remove node from CAN<br />
• Leave <strong>of</strong> node K from CAN<br />
– Managed region and Key/Value pairs are transferred to<br />
neighbor:<br />
• ideally: regions merge according to border<br />
• If not possible: smallest neighbor (neighbor with smallest number <strong>of</strong><br />
managed keys) manages both regions (no fusion!)<br />
– In case <strong>of</strong> controlled leave: controlled transfer<br />
– In case <strong>of</strong> node failure: TAKEOVER procedure<br />
• Triggered if no update messages from neighbors arrive at neighbors<br />
• According to region size, neighbors start timers (as with. ARP)<br />
• (smallest) neighbor indicates TAKEOVER to other neighbors and<br />
absorbs region<br />
– Network restructuring in the background
Performance Improvements with CAN<br />
• CAN complexity:<br />
– State information per node: O(D) (independent <strong>of</strong> N)!<br />
1<br />
– Routing: O(<br />
DN ) Hops (in Overlay!) (linear increase)!<br />
D<br />
• Problem: Overlay-Hop != Hop in IP network topology<br />
• Goal: similar delays between two hops as in IP network<br />
• Improvements:<br />
– Adding more dimensions:<br />
• Increase number <strong>of</strong> neighbors D<br />
– Multiple (realities)<br />
• Multiple DHTs at the same time<br />
• Point (x,y,z) is store at many nodes
Multi Dimensions ↔ Parallel Coordinate <strong>Systems</strong><br />
• Multiple dimensions<br />
– More neighbors<br />
– More routing choices<br />
– More status information O(2D)<br />
• multiple coordinate systems (r)<br />
– r possibilities for routing<br />
– Status information O(r·D)<br />
• r-time redundancy!<br />
Increasing dimensions Increasing realities comparison<br />
conclusion: the more dimensions, the shorter the routing path in the<br />
verlay, but multiple coordinate systems increase redundancy<br />
[2.8
Additional CAN Enhancements<br />
• Better routing metrics<br />
– Measure network quality to neighbors<br />
– Choose neighbor with best increase<br />
• Overlapping regions<br />
– Adding redundancy<br />
– Faster routing due to smaller number <strong>of</strong> regions<br />
• Multiple hash functions<br />
– Redundancy<br />
• Equitable division in regions<br />
– Target region verifies before insert if another neighbor is larger<br />
or better suitable for handling<br />
• Consider topology during growth <strong>of</strong> CAN
Summary: Distributed Hash Tables<br />
• Low storage and search complexity<br />
– O(log N) with Pastry and Chord<br />
• CAN tends to linear complexity for search<br />
• Only O(D) storage complexity<br />
– Pastry and Chord similar<br />
• Pastry eventually better for locality<br />
• Open issues:<br />
– Security<br />
• DoS attacks against single nodes are absorbed<br />
• Problem: targeted attack <strong>of</strong> an node with faked/bogus information<br />
• Some DHT have problems with partitioning
Complexity <strong>of</strong> Hash Tables<br />
• Comparison: Complexity DHTs<br />
State per<br />
node<br />
Path length<br />
(Routing)<br />
Node insert<br />
Node<br />
removal<br />
CAN Chord Pastry Tapestry<br />
O(D) O(log N) O(log N) O(log N)<br />
1<br />
O(<br />
D 4<br />
N D )<br />
1<br />
O(<br />
DN D )<br />
O(log N) O(log N) O(log N)<br />
O(log² N) O(log N) O(log N)<br />
O(log² N)
Applications using DHTs<br />
• File Sharing: CFS, OceanStore, PAST<br />
• Web Cache: Squirrel<br />
• Censor-resistant stores: Eternity, FreeNet<br />
• Instant messaging (IM): Scribe<br />
• Name spaces: ChordDNS, INS<br />
• Indexing and search: Kademlia<br />
• <strong>Communication</strong> platform: i³<br />
• distributed Backup: HiveNet<br />
• Web Archiving: Herodotus
References<br />
• DHTs allgemein:<br />
[2.50] R. Albert, A. Barabasi: „Statistical mechanics <strong>of</strong> complex networks“, Reviews <strong>of</strong> Modern Physics, Vol. 74,<br />
2002<br />
[2.51] L.A. Adamic, R.M. Lukose, A.R. Puniyani, B.A. Huberman: „Search in Power-Law Networks“, Physical<br />
Review E, Volume 64<br />
[2.52] A. Rao, K. Lakshminarayanan, S. Surana, R. Karp, I. Stoica: “Load Balancing in Structured P2P <strong>Systems</strong>”,<br />
2nd International Workshop on Peer-to-Peer <strong>Systems</strong> (IPTPS '03), Berkeley, Feb. 2003.<br />
[2.53] H. Balakrishnan, S. Shenker, M. Walfish: “Semantic-Free Referencing in Linked Distributed <strong>Systems</strong>”, 2nd<br />
International Workshop on Peer-to-Peer <strong>Systems</strong> (IPTPS '03), Berkeley, CA, February 2003.<br />
[2.54] T. Ottmann, P. Widmayer: „Algorithmen und Datenstrukturen“, Spektrum Akademischer Verlag,<br />
2. Auflage, 2002<br />
[2.55] H. Balakrishnan, M.F. Kaashoek, D. Karger, R. Morris, I. Stoica: „Looking up Data in P2P <strong>Systems</strong>“,<br />
<strong>Communication</strong>s <strong>of</strong> ACM, Vol. 43, No.2, Feb. 2003<br />
[2.56] K. Hildrun, J. Kubiatowicz, S. Rao, B. Zhao: „Distributed Object Location in a Dynamic Network“, Proc. <strong>of</strong><br />
14th ACM Symp. On Parallel Algorithms and Architectures (SPAA), August 2002<br />
[2.57] C. Plaxton, R. Rajaraman, A. Richa: „Accessing nearby copies <strong>of</strong> replicated objects in a distributed<br />
environment“, Proc. <strong>of</strong> ACM Symp. On Parallel Algorithms and Architectures, June 1997<br />
[2.58] S. Ratnasamy, S. Shenker, I. Stoica: „Routing Algorithms for DHTs: Some Open Questions“, 1st<br />
International Workshop on Peer-to-Peer <strong>Systems</strong> (IPTPS '02), Cambridge, February 2002<br />
[2.59] D. Karger, E. Lehmann, F. Leighton, et.al.: „Consistent hashing and random trees“, Proc. Of 29th Annual<br />
ACM Symposium on Theory <strong>of</strong> Computing, El Paso, Mai 1997
Mehr Literatur zu Pastry unter http://research.micros<strong>of</strong>t.com/~antr/Pastry/pubs.htm<br />
References<br />
• Pastry:<br />
[2.60] A. Rowstron and P. Druschel, "Pastry: Scalable, distributed object location<br />
and routing for large-scale peer-to-peer systems". IFIP/ACM International<br />
Conference on Distributed <strong>Systems</strong> Platforms, Heidelberg, November, 2001<br />
[2.61] R. Mahajan, M. Castro and A. Rowstron, "Controlling the Cost <strong>of</strong> Reliability in<br />
Peer-to-peer Overlays", IPTPS'03, Berkeley, CA, February 2003.<br />
[2.62] M. Castro, P. Druschel, A-M. Kermarrec and A. Rowstron, "One ring to rule<br />
them all: Service discovery and binding in structured peer-to-peer overlay<br />
networks", SIGOPS European Workshop, France, September, 2002.<br />
[2.63] M. Castro, P. Druschel, Y. C. Hu and A. Rowstron, "Exploiting network<br />
proximity in peer-to-peer overlay networks", Proc. Of Intern. Workshop on Future<br />
Directions in Distributed Computing, Bertinoro, Italy, June, 2002.<br />
[2.64] M. Castro, P. Druschel, A. Ganesh, A. Rowstron, and D. S. Wallach: "Security<br />
for structured peer-to-peer overlay networks". Proc. <strong>of</strong> the 5th Symposium on<br />
Operating <strong>Systems</strong> Design and Implementation (OSDI'02), Boston, Dezember<br />
2002
References<br />
• Chord:<br />
[2.70] I. Stoica, R. Morris, D. Karger, M.F. Kaashoek, H. Balakrishnan: "Chord: A Scalable Peerto-peer<br />
Lookup Service for Internet Applications", Proc. <strong>of</strong> ACM SIGCOMM'01, San Diego,<br />
September 2001.<br />
[2.71] F. Dabek, E. Brunskill, M.F. Kaashoek, D. Karger, R. Morris, I. Stoica, H. Balakrishnan:<br />
„Building Peer-to-Peer <strong>Systems</strong> With Chord, a Distributed Lookup Service“, Proc. <strong>of</strong> the 8th<br />
Workshop on Hot Topics in Operating <strong>Systems</strong> (HotOS-VIII), Mai 2001<br />
[2.72] D. Liben-Nowell, H. Balakrishnan, D. Karger: “Observations on the Dynamic Evolution <strong>of</strong><br />
Peer-to-Peer Networks”, Proc. <strong>of</strong> the 1st Intern. Workshop on Peer-to-Peer <strong>Systems</strong> (IPTPS<br />
'02), Cambridge, März, 2002<br />
[2.73] E. Sit, R.T. Morris: “Security Considerations for Peer-to-Peer Distributed Hash Tables”,<br />
Proc. <strong>of</strong> the 1st Intern. Workshop on Peer-to-Peer <strong>Systems</strong> (IPTPS '02), Cambridge, März,<br />
2002<br />
[2.74] D. Liben-Nowell, H. Balakrishnan, D. Karger: “Analysis <strong>of</strong> the Evolution <strong>of</strong> Peer-to-Peer<br />
<strong>Systems</strong>“, Proc. <strong>of</strong> ACM Conf. on Principles <strong>of</strong> Distributed Computing (PODC), Monterey,<br />
Juli 2002<br />
[2.75] D.R. Karger, M. Ruhl: „Finding Nearest Neighbors in Growth-restricted Metrics“, ACM<br />
Symposium on Theory <strong>of</strong> Computing (STOC '02), Montréal, Mai 2002<br />
Mehr Literatur zum Chord-Projekt unter http://www.pdos.lcs.mit.edu/chord/
References<br />
• CAN:<br />
[2.80] S. Ratnasami, P. Francis, M. Handley, R. Karp, S. Shenker: „A Scalable<br />
Content-Addressable Network“, Proc. ACM SIGCOMM 2002, San Diego<br />
[2.81] S. Ratnasami: „A Scalable Content-Addressable Network”, Ph.D. Thesis, UC<br />
Berkeley, Oktober 2002<br />
[2.82] S. Ratnasami, M. Handley, R. Karp, S. Shenker: “Application-level Multicast<br />
using Content-Addressable Networks”, Proc. <strong>of</strong> NGC 2001.<br />
• Weitere DHT-Modelle:<br />
[2.90] B.Y. Zhao, J. Kubiatowicz, A. Joseph: „Tapestry: An Infrastructure for Faulttolerant<br />
Wide-Area Location and Routing“, Technical Report, UC Berkeley<br />
[2.91] B. Silaghi, B. Bhattacharjee, P. Keleher: „Query Routing in the TerraDir<br />
Distributed Directory“, Proc. <strong>of</strong> SPIE ITCOM’02<br />
[2.92] I. Clarke, O. Sandberg, B. Wiley, T. Hong: „Freenet: A distributed anonymous<br />
information storage and retrieval system“, Proc. <strong>of</strong> ICSI Workshop on Design<br />
Issues in Anonymity and Unobservability, Berkeley, Juni, 2000