Pregunta

Tengo un par de preguntas sobre el protocolo Bittorrent Peer Wire. Estoy tratando de implementarlo en Java usando esta especificación .

En la sección Protocolo de cable de pares, dice que todos los enteros son valores de big endian de cuatro bytes. AFAIK Java utiliza Big Endian. ¿Eso significa decir si quiero enviar un mensaje de estrangulamiento

estrangulador: < len = 0001 > < id = 0 >

¿Acabo de escribir en el sokcet 1 seguido de 0?

En cuanto a mi segunda pregunta. cuando solicito una pieza, ¿creo que varios archivos son un gran archivo continuo? o pensar en archivos individuales? porque la longitud de la pieza no se alineará con los archivos, ¿entonces un índice puede contener el final de un archivo y el comienzo de otro?

En cuanto a mi última pregunta cuando abro una conexión con el compañero y envío mi apretón de manos, ¿sigo solicitando piezas o solicito y luego espero un momento para ver si nos solicitará algo? ¿Cómo se lleva a cabo la conversación? Sobre todo he hecho programación de red tipo http donde pido algo, espero una respuesta. pero si sigo solicitando piezas, ¿cómo voy a enviarlas?

¿Fue útil?

Solución

Pregunta 1

Se adhieren a métodos simples, si está utilizando E / S basadas en secuencias, use DataInputStream y DataOutputStream al escribir tipos primitivos (por ejemplo, byte , int , long , etc.):

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

Si está utilizando E / S sin bloqueo (por ejemplo, clases del paquete java.nio), use ByteBuffer s:

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 :)

Cada uno de estos métodos se ocupará de los problemas de pedido de bytes en su nombre.

Pregunta 2

(Tenga en cuenta que generalmente está transfiriendo bloques , que son fragmentos de piezas, en el cable. Lo pasaré por alto aquí :))

Al enviar / recibir piezas, es mejor pensar en los archivos (o archivo) como continuos, como usted dijo. El archivo .torrent contiene información sobre los límites del archivo, en el diccionario de información. En el caso de múltiples archivos , cada archivo tiene una ruta y una longitud; el caso de archivo único tiene un nombre y una longitud opcionales. Como conoce el tamaño de la pieza, el número de piezas y la longitud total del contenido (todo del archivo .torrent), puede colocar las piezas & Quot; en el lugar correcto & Quot; a medida que los recibes.

Una cosa simple que hacer es crear un solo archivo igual al tamaño del torrent. Cuando reciba una pieza, escríbala en el desplazamiento de bytes correcto dentro de este único archivo (a veces llamado archivo & "; Descargando &"). Por ejemplo, considere un torrent que consta de dos archivos:

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

Supongamos que numeramos piezas y desplazamientos de bytes que comienzan con cero. Supongamos que recibe toda la pieza 1. ¿En qué (byte) desplazamiento de byte va en my_torrent.downloading? Va a (1 * pz) = (1 * 50) = 50 . ¿A dónde va la pieza 0? En (0 * pz) = (0 * 50) = 0 . Y así sucesivamente ...

Apuesto a que ahora puedes descubrir cómo convertir este archivo .downloading en " real " contenido dentro de tu torrent.

Pregunta 3

Cuando participa en un enjambre de BitTorrent, está cargando y descargando piezas hacia y desde múltiples pares simultáneamente . Piensa en eso por un segundo. Al mismo tiempo que solicita una pieza de un compañero, otro compañero podría estar haciendo lo mismo de usted. Muy diferente de la semántica de HTTP como ya señaló. Entonces, para hablar directamente a su pregunta, otros pares le pedirán los datos que les interesen. :)

Solo para asegurarse, antes de solicitar una pieza a de un compañero, asegúrese de que el compañero tenga la pieza que desea (consulte el bitfield y tiene mensajes ) y ha respetado el asfixia / interés adecuado comportamiento. Dado eso, lo que normalmente desea hacer es solicitar datos de su lista de pares conocidos (que el rastreador o DHT le informaron) en el orden más raro primero . La especificación habla de esto y aquí hay MUCHAS optimizaciones y consideraciones de cortesía. (Comportamiento de ojo por ojo, por ejemplo). Puede notar que la spec no deletrea un Mucho de esto. Esto se debe a que gran parte de la salsa secreta de los clientes de BitTorrent reside en esta parte de la implementación. :)

¡Espero que esto te ayude un poco!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top