간단히 말해서, BitTorrent 클라이언트는 처음에 DHT를 사용하여 피어를 어떻게 발견합니까?


45

이미 읽은 이 슈퍼 유저 응답이 위키 백과 문서를 하지만 모두 내가 정말 주위에 내 머리를 정리하기에 너무 기술이다.

추적기의 아이디어를 이해합니다. 클라이언트는 집단 목록에 피어 목록을 유지 관리하는 중앙 서버에 연결합니다.

또한 동료 교환의 아이디어를 이해합니다. 이미 떼에있는 클라이언트는 동료의 전체 목록을 서로에게 보냅니다. 새로운 동료가 발견되면 목록에 추가됩니다.

제 질문은 DHT가 어떻게 작동합니까? 즉, 새로운 고객이 어떻게 추적 자나 적어도 하나의 웜 구성원에 대한 지식없이 동료와 교환 할 수없는 방법으로 웜에 가입 할 수 있습니까?

(참고 : 간단한 설명이 가장 좋습니다.)

답변:


48

요약

동료와 교환하기 위해 추적 자나 웜 구성원 중 적어도 한 명에 대한 지식없이 새로운 클라이언트가 어떻게 웜에 가입 할 수 있습니까?

당신은 할 수 없습니다. 불가능하다.*

* ( 근거리 통신망 의 노드가 이미 DHT의 노드 인 경우가 아니라면 이 경우 Avahi와 같은 브로드 캐스트 메커니즘을 사용하여이 피어를 "발견"하고 부트 스트랩에서 부트 스트랩 할 수 있습니다. 그들은 당신이 공용 인터넷에 연결하기 위해 필요로하는 곳에 당신이 상황을 칠 것이다, 결국? 자신을 부트 스트랩. 그리고 공용 인터넷은 유니 캐스트 아니라,하지 멀티 캐스트, 왜 이렇게있는 거 동료의 미리 정해진 목록을 사용하여 갇혔.)


참고 문헌

Bittorrent DHTKademlia 라는 프로토콜을 통해 구현 되는데, 이는 이론적으로 분산 해시 테이블 개념의 경우입니다 .


박람회

Kademlia 프로토콜을 사용하면 네트워크에 가입 할 때 부트 스트랩 절차를 거치게 되는데,이를 위해서는 DHT 네트워크에 이미 참여하고있는 하나 이상의 노드의 IP 주소와 포트를 미리 알아야 합니다. 예를 들어, 연결 한 추적기는 그 자체가 DHT 노드 일 수 있습니다. 하나의 DHT 노드에 연결되면 DHT에서 정보를 계속 다운로드하여 더 많은 노드에 대한 연결 정보를 제공 한 다음 "그래프"구조를 탐색하여 더 많은 노드에 대한 연결을 얻을 수 있습니다. 다른 노드와의 연결 및 페이로드 데이터 (다운로드 청크)

나는 굵은 글씨로 실제 질문을 생각한다 - 모른 채 Kademlia DHT 네트워크에 연결하는 방법의 어떤 다른 회원 - 잘못된 가정에 근거한다.

굵게 표시된 질문에 대한 간단한 대답은 그렇지 않습니다 . DHT 메타 데이터를 포함 할 수있는 하나의 호스트에 대한 모든 정보를 전혀 모른다면 멈출 수 없으며 시작할 수도 없습니다. 내 말은, 공개 포트에서 공개 포트에서 DHT 정보를 브로드 캐스트하는 IP를 발견하려고하는 무차별적인 시도 일 수 있습니다. 그러나 BT 클라이언트는 특정 고정 IP 또는 DNS로 하드 코딩되어 DHT 메타 데이터 만 제공하는 안정적인 DHT 노드로 해석됩니다.

기본적으로 DHT는 가입 메커니즘만큼 분산되어 있으며 가입 메커니즘이 상당히 취약하기 때문에 (전체 인터넷을 "브로드 캐스트"할 수있는 방법이 없습니다!) DHT를 받으려면 미리 지정된 개별 호스트로 유니 캐스트 해야합니다. Kademlia DHT는 실제로 분산 되어 있지 않습니다 . 단어의 엄밀한 의미가 아닙니다.

이 시나리오를 상상해보십시오. P2P를 중지하려는 사람이 나가서 부트 스트랩에 사용되는 일반적으로 사용되는 모든 안정적인 DHT 노드 에 대한 공격을 준비합니다 . 일단 공격을 시작하면 모든 노드에서 한 번 에 공격이 시작 됩니다. ; 모든 단일 부트 스트랩 DHT 노드가 한 번에 작동하지 않습니다. 이제 뭐? 중앙 추적 장치 에 연결하여 기존 피어 목록을 다운로드 할 수 있습니다. 그들이 트래커도 공격하면 정말 정말개울. 다시 말해, Kademlia와 전체 BT 네트워크는 인터넷 자체의 한계로 인해 제약을받습니다. 즉, 90 % 이상을 방지하기 위해 성공적으로 공격하거나 오프라인 상태로 만들어야하는 유한 한 (그리고 상대적으로 적은) 수의 컴퓨터가 있다는 것입니다 네트워크에 연결하는 사용자 수

"의사 중심의"부트 스트랩 노드가 모두 사라지면 DHT 외부의 내부 노드에 대해 아무도 모르기 때문에 부트 스트랩되지 않는 DHT의 내부 노드 는 쓸모가 없습니다. 그들은 새로운 노드를 DHT로 가져올 수 없습니다. 따라서 사람들이 컴퓨터를 종료하거나 업데이트를 위해 다시 부팅하는 등의 이유로 인해 각 내부 노드가 DHT와 연결이 끊어지면 네트워크가 무너집니다.

물론,이 문제를 해결하기 위해 누군가 미리 결정된 안정적인 DHT 노드 또는 DNS 주소 목록으로 패치 된 BitTorrent 클라이언트를 배포하고이 새로운 목록을 대신 사용하도록 P2P 커뮤니티에 큰 소리로 광고 할 수 있습니다. 그러나 이것은 공격자 (노드 이터)가 점진적으로이 목록을 다운로드하고 용감한 새 부트 스트랩 노드를 대상으로 한 다음 오프라인 상태로 만드는 "몰리 락"상황이 될 것입니다.


DHT를 설명하는 방식은 피어 교환과 동일합니다.
Celeritas

DHT에 대해 배포 되는 것은 실제 데이터 페이로드, 즉 파일을 다운로드 할 수있는 IP 및 포트 목록을 의미합니다. 피어 교환에서 전체 목록은 한 컴퓨터, 일반적으로 추적기에 저장되며 파일 다운로드와 다르지 않게 다운로드됩니다. 내 답변에서 언급 할 수는 있지만이 전체 질문 (및 답변)은 DHT 네트워크의 초기 발견 또는 가입 에만 관한 것이지 가입 후의 결과는 아닙니다.
allquixotic

1
모든 부트 스트랩 노드를 종료하면 새 사용자가 부트 스트랩하는 것을 막을 수 있지만 반드시 오프라인으로 전환 한 다음 다시 오는 기존 사용자는 아닙니다. 여러 클라이언트가 활성 노드 세트를 기억하고 매번 부트 스트랩하지 않고 다시 연결하는 데 사용한다는 인상을 받았습니다.
clacke

masscan ( github.com/robertdavidgraham/masscan ) 과 같은 프로젝트를 사용하면 중앙 디렉토리없이 DHT 노드를 발견 할 수 있습니다.
newlog

19

짧은 대답 : .torrent 파일에서 가져옵니다.

BitTorrent 클라이언트가 트래커리스 .torrent 파일을 생성 하면 (즉, 누군가가 BitTorrent를 통해 새로운 것을 공유 할 준비가되었을 때) "노드"키 ( "키 / 값 쌍"과 같은 키)를 섹션 헤더와 같이 추가합니다. 해당 클라이언트에 알려진 K 가장 가까운 DHT 노드가 포함 된 .torrent 파일에 대한 암호화 키가 아님).

http://www.bittorrent.org/beps/bep%5F0005.html#torrent-file-extensions

트래커리스 토렌트 사전에는 "announce"키가 없습니다. 대신 추적기가없는 토렌트에는 "노드"키가 있습니다. 이 키는 토렌트 생성 클라이언트의 라우팅 테이블에서 K 가장 가까운 노드로 설정해야합니다. 대안 적으로, 키는 토런트를 생성하는 사람에 의해 조작되는 것과 같은 알려진 양호한 노드로 설정 될 수있다. 토렌트 파일에 "router.bittorrent.com"을 자동으로 추가하거나 클라이언트 라우팅 테이블에이 노드를 자동으로 추가하지 마십시오.

따라서 다운로드하려는 트래커리스 토렌트의 .torrent 파일을 BitTorrent 클라이언트에 공급하면 .torrent 파일의 해당 "노드"키 값을 사용하여 처음 몇 개의 DHT 노드를 찾습니다.


3
이것은 좋은 설명 정보입니다. 귀하의 답변은 현재 BitTorrent 고객이 내 답변에서 식별 된 이론적 한계와 문제 를 처리하기 위해 수행 하는 작업 을 설명한다고 생각합니다 . 바라건대 두 답변이 답변의 다른 측면을 설명 할 때 상향 조정되기를 바랍니다.
allquixotic

3
많은 클라이언트에서 "토렌트 다운로드와 함께 새 토렌트 파일 병합"이 죽은 토렌트를 생생하게 만드는 이유입니까?
Jesvin Jose

2
@ aitchnyu 예, 토런트 파일에는 추가 / 다른 추적 프로그램이있을 수 있습니다.
longneck

2
실제로 BitTorrent 클라이언트가 노드 정보를 포함하지 않는 것으로 보입니다. Transmission, Vuze, Deluge, Mainline 등을 테스트했습니다.
Aeyoun

1

당신은 할 수 없습니다! 웜 중 하나의 IP 하나 이상을 알아야합니다. 이것은 p2p 네트워크의 약점입니다. 맹목적으로 브로드 캐스트하여 첫 번째 IP를 찾을 수 있지만, 대규모 네트워크에서는 모든 사람이 그렇게하면 혼잡 문제가 발생합니다. 캐시를 사용할 수 있지만 큰 무리 (대규모 피어 주소 캐시)에만 가능합니다. 첫 IP 만 요청하려면 항상 트래커를 연결해야합니다.

DHT로 분산 됨은 클라이언트가 공유 파일 이름의 md5 합계를 포함하는 모든 목록을 해당 피어와 함께 보유 할 필요가 없음을 의미합니다. 해시 목록은 모양이 같고 떼를 통해 중복으로 배포됩니다. 피어 연결이 끊어지면 해시 목록과 동일한 부분을 가진 다른 곳이 있습니다. 피어는 해시리스트 부분의 좋은 소유자에게 주소를 서로 공유합니다.

토런트 괴물이 주제에 대한 게시물을 썼습니다


0

동료와 교환하기 위해 추적 자나 웜 구성원 중 적어도 한 명에 대한 지식없이 새로운 클라이언트가 어떻게 웜에 가입 할 수 있습니까?

요청합니다.

DHT 를 지원하는 Bittorrent 클라이언트는 두 가지 별도의 피어 투 피어 응용 프로그램을 실행합니다.

첫 번째는 파일 공유를 수행합니다. 비트 토렌트 링고 의 떼는 비트 토렌트 객체 (예 : 파일 또는 디렉토리 구조)를 공유하는 피어 그룹입니다. 각 bittorent 객체에는 .torrent 파일에 저장된 일부 메타 데이터가 있습니다. (객체 크기, 폴더 이름, 추적기 정보 또는 노드 등이 포함될 수 있습니다.)이 비트 토렌트 객체를 다운로드하는 데 필요한 메타 데이터의 해시를 infohash라고합니다.

DHT는 기본적으로 추적기를 대체하는 두 번째 P2P 응용 프로그램입니다. (infohash, swarm) 쌍을 저장하고 알림 메시지를 수신하면 swarm을 업데이트합니다. 새로운 클라이언트는 DHT의 정보를 부트 스트랩하려면 일부 "노드"(DHT 피어의 비트 토렌트 링고)에 대한 지식이 있어야합니다. 여기에 @allquixotic에 의해 주어진 인수가 적용됩니다. MDHT가 현재 7 백만 명이 넘는 동료로 구성되어 있기 때문에 지속적인 서비스 거부 공격은 없을 것 같습니다.

그런 다음 infohash와 관련하여 DHT를 쿼리 할 수 ​​있으며 추적 프로그램을 사용하거나 이전에 웜의 일부인 피어를 알 필요가 없습니다. 그가 접촉 한 피어 중 하나가 메타 데이터 공유를 지원 하는 경우 infohash 만 swarm에서 .torrent 파일을 검색 할 수 있습니다.


0

대부분의 p2p 네트워크 클라이언트는 처음에 연결하는 시드 피어 목록에서 부트 스트랩됩니다. 일단 부트 스트랩 된 피어에 연결되면 나머지는 분산 방식으로 다운로드됩니다. 부트 스트랩 피어에 연결하고 피어의 DHT 목록을 다운로드 한 다음 각 피어로 이동하여 같은 작업을 수행합니다.

예를 들면 다음과 같습니다.

부트 스트랩 노드 목록은 다음과 같습니다.

https://github.com/dontcontactme/p2pspider/blob/master/lib/dhtspider.js#L10

클라이언트가 피어 목록을 수화하기 위해 연결하는 위치는 다음과 같습니다.

https://github.com/dontcontactme/p2pspider/blob/master/lib/dhtspider.js#L60

이것은 거의 모든 사람이 부트 스트랩 노드가 될 수 있다는 점을 제외하고는 추적기가 작동하는 방식과 유사합니다.

비트 코인 코어 지갑은 같은 방식으로 작동합니다. 어떤 이유로 든 기본 종 료자가 종료되는 경우 부트 스트랩 시드 피어를 변경할 수 있습니다.


링크는 죽었다
zella
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.