Skip to content

limebell/Kademlia

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DHT based on Kademlia

1. 카뎀리아


1.1 카뎀리아?

img

  • 노드의 id값을 기반으로 거리를 계산해서, 먼 거리의 노드는 간략하게, 가까운 노드는 자세하게 라우팅 테이블에 저장하는 기법.
  • 공통된 prefix의 길이를 xor로 계산하여 각각의 bucket에 저장.
  • 일반적으로 bucket의 크기는 16.

1.2 Rationale

  • 한 노드가 모든 노드의 정보를 갖고 있으면 블럭이나 트랜젝션을 브로드캐스팅 할 때 전체 노드의 갯수만큼의 업로드를 한번에 진행해야 함. 😢
  • 카뎀리아 방식을 적용한다면 블럭이나 트랜젝션을 브로드캐스팅 하는 노드는 logn만큼의 업로드만 하면 됨. 😄

1.2 Bootstrapping Procedure

  1. 부트스트랩 노드의 정보는 하드코딩 되어(혹은 사용자가 직접 입력하여) 알고 있다.
  2. 부트스트랩 노드에 자신과 거리가 가까운 몇 개의 노드를 요청한다.
  3. 응답받은 노드에 대해 재귀적으로 보다 더 가까운 노드가 있는지 찾아본다.
  4. 결과적으로 얻어낸 노드들을 자신의 라우팅 테이블에 집어넣는다.

1.3 Broadcasting Messages

  1. 전송하는 노드는 자신의 라우팅 테이블의 각 bucket에서 하나씩 랜덤하게 뽑아 메세지 전달.
  2. 메세지를 전달받은 노드들은 다시 자신의 라우팅 테이블에서 노드들을 골라 전달.
  3. 메세지가 끝까지 도달할 때까지 반복.

2. 구현


Kademlia.cs
  • 분산 노드 트리의 생성, 제어를 관리하는 클래스.
  • 몇 가지 테스트가 존재.
Node.cs
  • 일반 노드와 카뎀리아 노드의 부모 클래스.
  • 일반 노드와 카뎀리아 노드에서 공통적으로 사용하는 메소드가 정의됨.
KademliaNode.cs
  • 카뎀리아 노드의 구현.
  • 신규 노드는 Bootstrap을 통해 1.2의 과정을 거쳐 부트스트랩 노드에 연결.
  • 블럭이나 트랜젝션 등의 메세지를 브로드캐스트 할 때에는 각 bucket 내에서 임의의 노드를 하나만 선택하여 메세지를 전달.
  • 메세지를 전달받은 노드는 해당 메세지를 전송한 노드의 정보를 자신의 라우팅 테이블에 추가.
  • 주기적으로 자신의 라우팅 테이블의 모든 노드에 Ping을 수행.
Node.cs
  • 모든 피어의 정보를 가지고 있는 일반적인 노드의 구현체.
Bucket.cs
  • 카뎀리아 구현에서의 라우팅 테이블에서 사용되는 구성 요소.
  • 갖고 있는 노드의 수가 최대가 아닐 때에는 노드를 바로 추가하지만, 그렇지 않을 때에는 가장 오래 전에 사용한 노드가 살아있는지 검사한 후 살아있다면 추가하지 않고 죽어있다면 제거하고 추가.

3. 문제점


  1. 동시에 엄청난 수의 노드가 죽어버리면 네트워크가 분리됨.
    • 매우 극단적 상황으로 거의 일어나지 않음
  2. 최초의 부트스트랩 단계에서 가까운 노드들을 가져오는 과정이 즉시 일어나지 않기 때문에 블럭을 생성했어도 네트워크와 연결되어 있지 않은 상태일 가능성이 있음.
  3. 최초의 부트스트랩 단계를 성공적으로 완료했더라도 모든 노드들의 정보를 갖고 있지 않기 때문에 메세지 전송이 모든 노드에게 이뤄지지 않음.
  4. 핑을 브로드캐스팅 할 때 업로드는 logn번만 하지만, 퐁을 다운로드 할 때는 n개의 노드 전체로부터 받음.
    • 단방향 핑?

About

Kademlia DHT

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages