문제

Bittorrent 피어 와이어 프로토콜에 관한 몇 가지 질문이 있습니다. 나는 그것을 사용하여 Java로 구현하려고 노력하고 있습니다 이 사양.

피어 와이어 프로토콜 섹션에서는 모든 정수가 4 바이트 큰 엔디 언 값이라고합니다. Afaik Java는 Big Endian을 사용합니다. 그건 내가 초크 메시지를 보내고 싶다면 말하는 것을 의미합니까?

초크:u003Clen=0001>u003Cid=0>

나는 단지 sokcet 1에 쓴 다음 0에 써야합니까?

내 두 번째 질문은. 조각을 요청할 때 여러 파일이 하나의 큰 연속 파일로 생각합니까? 아니면 개별 파일로 생각하십니까? 조각 길이는 파일과 정렬되지 않으므로 한 인덱스는 한 파일의 끝과 다른 파일의 시작을 포함 할 수 있습니까?

동료와의 연결을 열고 악수를 보낼 때 마지막 질문에 관해서는, 조각을 계속 요청하거나 요청한 다음 잠시 기다려야합니까? 대화는 어떻게 이루어 집니까? 응답을 기다리는 것을 요구하는 HTTP 유형 네트워크 프로그래밍을 주로 수행했습니다. 그러나 조각을 계속 요청한다면 어떻게 조각을 보내겠습니까?

도움이 되었습니까?

해결책

질문 1

간단한 방법을 고수하고 스트림 기반 I/O를 사용하는 경우 사용하십시오. DatainputStream 그리고 DataOutputStream 원시 유형을 쓸 때 (예 : 바이트, int, , 등.):

Socket s; // assume this is already connected
DataOutputStream out = new DataOutputStream( s.getOutputStream );
out.writeByte( 1 );
out.writeInt( 0 );
out.flush(); // optional

비 블로킹 I/O (예 : java.nio 패키지의 클래스)를 사용하는 경우 사용하십시오. 바이트 버퍼 에스:

Socket s; // assume this is already connected
SocketChannel = s.getChannel();
ByteBuffer buf = ByteBuffer.allocate(8); // two 4-byte integers
buf.put( 1 ).putInt( 0 );
buf.flip();
c.write( buf ); // assuming channel is writable :)

이러한 각 방법은 귀하를 대신하여 바이트 주문 문제를 처리합니다.

질문 2

(보통 당신은 양도 중입니다 블록, 와이어에 조각 조각입니다. 나는 여기서 그 위에 글을 쓸 것이다 :))

조각을 보내거나받을 때, 당신이 말한 것처럼 파일 (또는 파일)을 연속적으로 생각하는 것이 가장 좋습니다. .TORRENT 파일에는 정보 사전에 파일 경계에 대한 정보가 포함되어 있습니다. 에서 멀티 파일 케이스, 각 파일에는 경로와 길이가 있습니다. 그만큼 단일 파일 케이스 선택적 이름과 길이가 있습니다. 조각 크기, 조각 수 및 총 컨텐츠 길이 (모두 .Torrent 파일에서)를 알고 있으므로, "올바른 장소에"조각을 넣을 수 있습니다.

간단한 일은 급류 크기와 동일한 단일 파일을 만드는 것입니다. 조각을 받으면이 단일 파일 내에서 올바른 바이트 오프셋 (때때로 ".download"파일이라고 함)에 적을 기록하십시오. 예를 들어 두 파일로 구성된 토런트를 고려하십시오.

a/b/file1.txt [100 bytes]
a/b/file2.txt [200 bytes]

piece size (pz) = 50 bytes
total size (tz) = 100+200 = 300 bytes
number pieces (np) = 300/50 = 6
file = my_torrent.downloading

0으로 시작하는 조각과 바이트 오프셋을 번호로 가정하십시오. 모든 조각 1을 받으십시오. (1*pz) = (1*50) =로갑니다. 50. 조각 0은 어디로가요? at (0*pz) = (0*50) = 0. 등등...

이제이 파일을 토런트 내부의 "실제"컨텐츠로 전환하는 방법을 알아낼 수 있습니다.

질문 3

Bittorrent Swarm에 참여할 때 여러 동료에게 작품을 업로드하고 다운로드합니다. 동시에 . 그것을 잠시 생각해보십시오. 동시에 일부 피어에게 작품을 요청하는 동시에 다른 동료는 동일한 작업을 수행 할 수 있습니다. 당신이 이미 지적했듯이 HTTP의 의미와는 상당히 다릅니다. 따라서 귀하의 질문에 직접 대화하기 위해 다른 동료들은 관심있는 데이터를 요청할 것입니다. :)

피어에게 작품 A를 요청하기 전에 피어가 원하는 조각을 가지고 있는지 확인하십시오 ( 비트 필드와 메시지가 있습니다) 그리고 당신은 적절한 것을 존중했습니다 질식/관심 행동. 이를 감안할 때, 당신이 일반적으로하고 싶은 것은 알려진 동료 목록 (트래커 또는 DHT가 말한)의 데이터를 가장 먼저 주문하다. 사양은 이것에 대해 이야기하며 여기에는 많은 최적화와 공손한 고려 사항이 있습니다. (예 : TIT-FOR-TAT 동작.) 투기 이것을 많이 철자하지 않습니다. Bittorrent 고객의 비밀 소스가 구현 의이 부분에 있기 때문입니다. :)

이것이 당신에게 도움이되기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top