28.01.2015 Views

PDF of color slides - Communication Systems Group

PDF of color slides - Communication Systems Group

PDF of color slides - Communication Systems Group

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!