목차
기본 개념
p2p 아키텍처
DHT
구현 방법
DHT 네트워크는 KRPC 프로토콜을 사용하여 메시지를 전달합니다.
Java java지도 시간 Java를 사용하여 P2P 시드 검색 기능을 구현하는 방법

Java를 사용하여 P2P 시드 검색 기능을 구현하는 방법

Apr 15, 2019 am 10:20 AM
java

이 기사의 내용은 Java를 사용하여 P2P 시드 검색 기능을 구현하는 방법에 대한 것입니다. 이는 특정 참고 가치가 있으므로 도움이 될 수 있습니다.

수년 전부터 P2P에 많은 관심을 갖고 있었지만 그것은 모두 이론적인 것에 불과했고 실제로 실천해 볼 기회가 없었습니다. 최근에 이 일을 구현했는데, 처음부터 지금까지 공유할 수 있는 부분이 있다고 생각합니다. 본론으로 들어가죠

기본 개념

p2p에 대해 이야기하기 전에 파일 다운로드 방법에 대해 이야기하고 싶습니다. 파일을 다운로드하는 여러 가지 방법을 나열해 보겠습니다.

1. 다운로드하려면 http 프로토콜을 사용하세요. 가장 일반적으로 사용되는 방법은 브라우저를 통해 파일을 다운로드하는 것입니다.

2. FTP에는 두 가지 모드가 있습니다. 하나는 포트(활성) 모드입니다. 이 모드에서는 클라이언트가 로컬로 포트 N(>1023)을 열어 FTP 연결을 설정합니다. to ftp server N. +1 리스닝 포트는 데이터 전송에 사용됩니다. 방화벽이 있거나 클라이언트가 NAT인 경우 다운로드할 수 없습니다. 또 다른 방법은 수동 모드입니다. 이 모드에서는 FTP 서버가 포트 21 외에도 1023보다 큰 다른 포트를 엽니다. 즉, FTP 서버가 있는 한 클라이언트는 FTP 연결과 데이터 전송 연결을 적극적으로 시작합니다. 이 포트에는 문제가 없습니다.

위의 두 가지 방법을 합쳐서 cs 아키텍처라고 할 수 있습니다. 이 아키텍처에서는 리소스가 특정 수준에 도달하면 문제가 발생합니다. 이 문제를 해결하기 위해 분산형 분산화를 생각할 수 있는데, p2p는 P2P(Peer to Peer) 아키텍처입니다.

p2p 아키텍처

리소스가 각 노드에 저장되면 리소스를 다운로드할 때 이 파일을 다운로드할 수 있는 컴퓨터를 어떻게 알 수 있을까?

초기 p2p 아키텍처에는 파일의 메타데이터 정보를 저장하는 역할을 담당하는 트래커 역할이 있었습니다. 이제 파일은 각 피어에 저장되고 파일 정보는 추적기를 통해 획득됩니다.

이 아키텍처에서는 모든 파일이 배포되지만 트래커는 모든 파일의 메타데이터 정보를 저장하는 역할을 담당하므로 트래커는 소량의 데이터만 저장하면 되며 이는 기존 파일보다 상대적으로 쉽습니다. .

그러나 트래커 서버가 정지되거나 서비스를 사용할 수 없게 되면 완전히 분산되지 않기 때문에 모든 파일이 다운로드되지 않습니다. 완전한 분산화를 위해 나중에 트래커 없는 아키텍처가 개발될 예정입니다.

이런 것은 없습니다. 더 이상 추적기로 사용되며 메타데이터 정보를 포함한 모든 파일은 분산 방식으로 저장됩니다.

DHT

DHT(분산 해시 테이블) 추적기를 대체하는 데 사용되는 분산 해시 테이블입니다. Kademlia 알고리즘 등 dht를 구현하는 많은 알고리즘이 있습니다.
몇 가지 개념:

1.nodeid dht 네트워크의 각 노드 ID는 160비트입니다

2.XOR 두 노드 사이의 거리는 XOR을 사용하여 계산됩니다

3.라우팅 테이블 라우팅 테이블

여기서 단어는 구현에 집중하겠습니다. 부분이므로 인터넷에 많은 정보가 있습니다.

구현 방법

시드 검색을 구현하는 데는 두 단계가 있습니다. 첫 번째 단계는 크롤러이며, 이는 크롤러에서 시드 정보를 크롤링하는 데 사용됩니다. 인터넷. 두 번째 단계는 검색에 참여하는 것입니다.

다음 지식이 필요합니다: 씨앗, 비트토렌트 dht 프로토콜, 벤코드

p2p에 관해서는 .torrent의 결과인 파일 종류인 씨앗을 언급해야 합니다. bt를 사용했을 수도 있습니다. 파일을 다운로드하려면 비트토렌트 프로토콜을 사용하세요. 그렇다면 인터넷에서 씨앗을 수집하는 방법은 무엇입니까?

BT 시드에 포함된 주요 필드: https://segmentfault.com/a/1190000000681331

dht에서 얻은 시드는 추적기 없는 토렌트라고 합니다. 알림 속성은 없지만 대신 노드 속성이 있습니다. router.bittorrent.com을 시드에 추가하거나 라우팅 테이블에 추가하지 않는 것이 공식적으로 권장됩니다.

1.dht에서 시드를 얻는 방법

시드 정보를 얻으려면 DHT 프로토콜에 대한 깊은 이해가 있어야 합니다. bep_0005는 DHT 프로토콜을 설명합니다.

자세한 내용은 여기를 클릭하세요. /www.bittorrent.org/beps/bep_0005.html

라우팅 테이블 구현 방법:

라우팅 테이블은 0부터 2까지 160승까지의 모든 노드 ID를 포함합니다. 라우팅 테이블은 버킷으로 구성될 수 있으며 각 버킷은 모든 노드의 일부를 포함합니다.

처음에는 라우팅 테이블에 모든 노드 ID를 포함하는 버킷이 하나만 있습니다. 각 버킷은 최대 K개의 노드만 보유할 수 있습니다. 현재 K 값은 8입니다. 버킷이 가득 차고 그 안의 모든 노드가 양호하며 자체 nodeid가 이 버킷에 없으면 원래 버킷은 각각 0..2159 및 2159를 포함하는 두 개의 새 버킷으로 나뉩니다. ..2160.

버킷이 가득 차면 새 노드가 쉽게 삭제됩니다. 버킷에 있는 노드가 오프라인 상태가 되면 교체됩니다. 지난 15분 동안 노드가 핑되지 않은 경우 해당 노드를 핑합니다. 응답이 반환되지 않으면 해당 노드도 교체됩니다.

각 버킷에는 이 버킷의 활동을 나타내는 마지막 변경 속성이 있어야 합니다. 이 필드는 다음 상황에서 업데이트됩니다.

1. 버킷의 노드가 ping되고 응답이 있습니다.

2. 이 버킷에 노드가 추가됩니다.

3. 버킷의 노드가 교체됩니다. 15입니다. 이 필드가 몇 분 내에 업데이트되지 않으면 버킷 범위 내의 ID가 무작위로 선택되고 find_node 작업이 수행됩니다.

KRPC 프로토콜

DHT 네트워크는 KRPC 프로토콜을 사용하여 메시지를 전달합니다.

1.ping

ping 쿼리는 주로 하트비트 확인에 사용됩니다.

2.find_node

노드를 찾기 위해 상대방은 자신의 라우팅 테이블에서 가장 가까운 N개 노드를 쿼리하여 반환합니다. 일반적으로 8

3.get_peers

infohash를 기반으로 infohash를 소유한 피어를 찾습니다. 피어가 발견되면 노드를 반환하고, 찾을 수 없으면 노드를 반환합니다.

4.announce_peer

다른 피어에게 다음과 같이 알립니다. 그들은 또한 infohash를 소유하고 있습니다.

위 4개는 라우팅 테이블을 새로 고치는 점에 유의하세요처음에는 라우팅 테이블에 노드가 없으므로 슈퍼 노드(예:

, 등), 반환된 노드는 Perform find_node에 있습니다.

dht.transmissionbt.com제가 직접 구현한 라우팅 테이블은 위에서 설명한 것과 조금 다릅니다.

dht 네트워크는 데이터 전송에 udp를 사용하므로 upd 포트를 열고 지속적으로 find_node 요청을 보내 라우팅 테이블을 설정한 다음 get_peers 및 Announce_peer를 통해 시드의 infohash를 얻으면 됩니다. dht 네트워크에 가입하면 위에서 소개한 네 가지 방법을 통해서만 시드 파일의 infohash를 얻을 수 있으므로 infohash를 통해 시드를 다운로드해야 합니다. 자세한 내용은 bep_009http://를 참조하세요. www.bittorrent.org/beps /bep_0009.html

우리는 주로 bep_009를 사용하여 시드의 이름 필드를 얻은 후 이름과 infohash를 기반으로 색인을 생성하여 검색을 제공할 수 있습니다. (

여기서 주요 목적은 마그넷 링크를 구축하는 것입니다. 마그넷 링크를 사용하면 Thunder, Baidu Netdisk 등으로 이동하여 리소스를 다운로드할 수 있습니다

)대부분의 마그넷 링크 형식: Magnet:?xt=urn:btih:infohash

위에서 소개한 방법은 infohash를 획득하여 마그넷 링크를 구축한 다음 타사 소프트웨어의 도움을 받아 다운로드하는 것입니다. 물론 관심이 있는 경우 BitTorrent 프로토콜을 통해 직접 다운로드할 수도 있습니다. 스스로요.

알겠습니다. 위에서는 몇 가지 구현 단계를 간략하게 소개했을 뿐입니다. 많은 세부 사항과 구체적인 구현은 언급되지 않았습니다. 제 말로는 일부 github dht 프로젝트를 참조하여 직접 구현한 것입니다. https: / /github.com/mistletoe9527/dht-spider

위 내용은 Java를 사용하여 P2P 시드 검색 기능을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

자바의 완전수 자바의 완전수 Aug 30, 2024 pm 04:28 PM

Java의 완전수 가이드. 여기서는 정의, Java에서 완전 숫자를 확인하는 방법, 코드 구현 예제에 대해 논의합니다.

자바의 웨카 자바의 웨카 Aug 30, 2024 pm 04:28 PM

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 스미스 번호 Java의 스미스 번호 Aug 30, 2024 pm 04:28 PM

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

Java Spring 인터뷰 질문 Java Spring 인터뷰 질문 Aug 30, 2024 pm 04:29 PM

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Feb 07, 2025 pm 12:09 PM

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 날짜까지의 타임스탬프 Java의 날짜까지의 타임스탬프 Aug 30, 2024 pm 04:28 PM

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐의 양을 찾기위한 Java 프로그램 캡슐의 양을 찾기위한 Java 프로그램 Feb 07, 2025 am 11:37 AM

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

Spring Tool Suite에서 첫 번째 Spring Boot 응용 프로그램을 실행하는 방법은 무엇입니까? Spring Tool Suite에서 첫 번째 Spring Boot 응용 프로그램을 실행하는 방법은 무엇입니까? Feb 07, 2025 pm 12:11 PM

Spring Boot는 강력하고 확장 가능하며 생산 가능한 Java 응용 프로그램의 생성을 단순화하여 Java 개발에 혁명을 일으킨다. Spring Ecosystem에 내재 된 "구성에 대한 협약"접근 방식은 수동 설정, Allo를 최소화합니다.

See all articles