간선 DHT

Mainline DHT

메인라인 DHTBitTorrent 클라이언트가 BitTorrent 프로토콜을 통해 피어를 찾기 위해 사용하는 Kademlia 기반 DHT(Distributed Hash Table)에 부여된 이름이다.비트토렌트(BitTorrent)에서 분산 추적을 위해 DHT를 사용하자는 아이디어는 2005년 5월 아즈레우스 2.3.0.0(현재의 부제)에서 처음 구현되어[1][2] 큰 인기를 얻었다.관련이 없지만 거의 비슷한 시기에 비트토렌트는 그들의 고객인 메인라인 DHT에 유사한 DHT를 출시했고, 따라서 비트토렌트 프로토콜에서 분산 추적의 사용을 대중화했다.측정 결과 2013년까지 메인라인 DHT 이용자는 1000만~2500만명으로 하루 이용자는 1000만명 이상이다.[3]

설명

메인라인 DHT는 인기 있는 Kademlia DHT 디자인을 기반으로 한다.[4]피어 배포를 위해 DHT를 사용하기 전에는 추적기가 피어를 찾는 유일한 방법이었다.DHT over Tracker를 사용하는 주요 특징은 분산형 접근법이 BitTorrent 프로토콜의 특성을 선호한다는 것이다.DHT는 토렌트의 SHA-1 해시에 의해 식별된 피어의 목록을 배포하여 작동한다.

작전

토렌트의 SHA-1 해시인 인포하시는 오버레이 네트워크에서 피어(값)를 찾는 데 사용되는 카뎀리아 키와 동의어다.군집 내 피어를 찾기 위해 노드는 infohash(Kademlia FIND_VALUE와 동일)를 키로 하는 get_peer 쿼리를 알려진 가장 가까운 노드(키 거리 관련)로 전송한다.카뎀리아와 마찬가지로 노드가 값(피어)을 반환하지 않으면 반복 작업에서 더 지속된다.그러나 검색이 소진된 후에는 클라이언트가 자신을 위한 피어 연락처 정보를 토렌트의 인포하시에 가장 가까운 ID로 응답 노드에 삽입한다.

토큰

노드는 토큰으로 알려진 추가 조치를 사용하여 다른 호스트가 급류에 대해 다른 호스트에 등록하지 않도록 한다.피어에 대한 쿼리의 반환 값에는 이 불투명 값이 포함된다.제어 피어가 토렌트를 다운로드하고 있음을 알리는 노드는 피어에 대한 최근 쿼리에 동일한 쿼리 노드에서 수신한 토큰을 표시해야 한다.노드가 토렌트를 "공고"하려고 하면 쿼리된 노드는 쿼리 노드의 IP 주소에 대해 토큰을 확인한다.

메인라인 DHT는 토큰 값에 대해 5분마다 바뀌는 비밀에 연결된 IP 주소의 SHA1 해시를 사용한다.유통기한이 10분 이내인 토큰은 허용된다.

KRPC

메인라인 DHT의 노드는 IP와 포트 조합으로 구성된다.노드는 KRPC라는 RPC 프로토콜을 통해 통신한다. KRPC는 UDP를 통해 BEncoded 사전이 포함된 메시지(쿼리, 응답, 오류)를 보내는 노드로 구성되는 간단한 프로토콜이다.

KRPC 메시지는 메시지 유형에 따라 모든 메시지에 공통되는 두 개의 키와 추가 키가 있는 단일 사전이다.모든 메시지에는 트랜잭션 ID를 나타내는 문자열 값이 있는 키 "t"가 있다.이 트랜잭션 ID는 쿼리 노드에 의해 생성되며 응답에 메아리되므로, 응답은 동일한 노드에 대한 다중 쿼리와 상호 연관될 수 있다.트랜잭션 ID는 이진수의 짧은 문자열로 인코딩되어야 하며, 일반적으로 2^16 미결 쿼리를 포함하기 때문에 두 개의 옥텟이면 충분하다.모든 KRPC 메시지에 포함된 다른 키는 메시지 유형을 설명하는 단일 문자 값을 가진 "y"이다."y" 키의 값은 쿼리의 경우 "q", 응답의 경우 "r" 또는 오류의 경우 "e" 중 하나이다.

쿼리

쿼리 또는 "y" 값이 "q"인 KRPC 메시지 사전에는 "q"와 "a"의 두 개의 추가 키가 포함되어 있다.키 "q"에는 쿼리의 메서드 이름이 포함된 문자열 값이 있다.키 "a"는 쿼리에 대한 명명된 인수를 포함하는 사전 값을 가지고 있다.

응답

응답 또는 "y" 값이 "r"인 KRPC 메시지 사전에는 하나의 추가 키 "r"가 포함되어 있다.r의 값은 명명된 반환 값을 포함하는 사전이다.쿼리가 성공적으로 완료되면 응답 메시지가 전송된다.

오류

오류 또는 "y" 값이 "e"인 KRPC 메시지 사전에는 하나의 추가 키 "e"가 포함되어 있다."e"의 값은 목록이다.첫 번째 요소는 오류 코드를 나타내는 정수다.두 번째 요소는 오류 메시지를 포함하는 문자열이다.쿼리를 수행할 수 없을 때 오류가 전송된다.

라우팅 테이블

버킷은 카뎀리아와 다르게 구조되어 있다.160개의 버킷 리스트 대신 비트토렌트는 한 버킷으로 시작한다.양동이 가득 차면 두 가지 중 하나가 발생할 수 있다.

  • 물통이 갈라져 있다.
  • (카뎀리아와 마찬가지로) 오래된 노드들이 ping된다.

분할은 우리 자신의 노드 ID가 버킷 범위 안에 들어갈 경우에만 발생하는 작업이다.분할되고 있는 버킷은 각각 기존 버킷의 절반 범위를 가진 2개의 새 버킷으로 대체되며, 기존 버킷의 노드는 2개의 새 버킷에 분산된다.

이 버킷 구현에는 두 가지 이점이 있다.

  • 160개 미만의 버킷의 라우팅 테이블에는 더 적은 메모리가 사용된다.
  • 버킷을 검색할 때 현재 버킷에 충분한 노드가 보장되므로 인접 버킷에서 추가 노드를 검색할 필요가 없다.

구현

메인라인 DHT는 비트토렌트 소프트웨어 버전 4.2.0(2005년 11월)에 처음 포함되었다.그 이후로, 그것은 많은 다른 고객들에 의해 구현되었다.

참조

  1. ^ Jones, Ben (7 June 2015). "BitTorrent's DHT Turns 10 Years Old". TorrentFreak. Retrieved 2015-07-05.
  2. ^ "Vuze Changelog". Azureus.sourceforge.net.
  3. ^ Wang, Liang; Kangasharju, Jussi (2013). "Measuring Large-Scale Distributed Systems: Case of BitTorrent Mainline DHT" (PDF). IEEE Peer-to-Peer. Retrieved 26 October 2013.
  4. ^ Loewenstern, Andrew; Norberg, Arvid (2013-03-22). "DHT Protocol". BitTorrent.org. Retrieved 2021-11-26.
  5. ^ "About – Deluge".

외부 링크