2017-02-11 3 views
1

lerne ich vor kurzem Bit-Torrent-Protokoll, und ich habe mein Skript erfolgreich von Gleichaltrigen durch DHT-Protokoll sind abhängig von Dokument bep_0005 Adresse erhalten Tonne gemacht:Wie kann ich mit Kollegen aus dem DHT-Netzwerk kommunizieren?

http://www.bittorrent.org/beps/bep_0005.html

Wenn der abgefragte Knoten Peers für die hat InfoShash, sie werden in einem Schlüssel "Werte" als eine Liste von Zeichenfolgen zurückgegeben. Jede Zeichenfolge enthält "compact" Format Peer-Informationen für einen einzelnen Peer.

Also dekodiere ich diese "Werte" zu IP/Port.

Ich versuchte Verbindung mit ihnen über TCP-Socket, Timeout, Netzwerk ist nicht erreichbar, Verbindung verweigert Fehler ausgelöst.

Ich versuchte send-Handshake-Nachricht abhängig von bep_0029 über UDP-Socket, aber keiner von ihnen antwortete.

Jeder kann mir sagen, ist etwas falsch? Was ist der richtige Weg, um diese Peers zu verbinden? oder Ist das normal 99% von ihnen sind nicht in der Lage zu verbinden, ich habe nur nicht diese 1% gute Kollegen?

Vielen Dank!

Dies ist TCP Antwort von Peers, dass ich von Tracker bekam

Aber kein Glück von DHT.

# This is function I decode ip/port 
def decode_peers(peers): 
    ret = [] 
    for ipport in peers: 
     try: 
      ret.append((socket.inet_ntoa(ipport[:4]), unpack('>H', ipport[-2:])[0])) 
     except Exception as err: 
      logging.critical(err) 
    return ret 

# This is an bdecoded example what I received from nodes, and I passed "value" part to the upon function. 
[03:53:05](DEBUG): OrderedDict([(b'ip', b'n\xbc;,\xf1\x87'), (b'r', OrderedDict([(b'id', b'\xcf\[email protected]\xfb\x86?\x17\xb0\x95\xd1\xb9:\x9a\xf1\x9c\xf1v\x03\xa82'), (b'nodes', b'\x85\xd7\x80\x1b\x8a"V\xd9>\xf8<\xa2\x0e2~\x84j\x94wIA\xb2\x19&\x8b\x0c\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde0\x05\xb2\xce\xe2\x0b8j\xd1\xd3.\x85\x8cH\x8c\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde0\x06\x8d\x81\x1f\xe4\xc5\x88\xec\xad\xfc\x1a\xcf\x9e\xa6\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde0\x07 \xbcR\x1d*u\x0e.\xa8E\x12G\xdb\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x80r\xfdn\x8d!\r\x17\xbfU\xb5\x87\x81t\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x81\x90\xc0\x13Pw\x91\x87\xc25\x9d1\x881\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x82m"\x12-\x96\xc7\x1fY}\xe4_\x9f\xff\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x83\x82\xdb\xf0\x10\xeb&I\xc5}\xece\x13\xc9'), (b'token', b'\na\xb8\x15'), (b'values', [b'9Bq\xf1X\xea', b'9\x07r7\x9a\xee', b'\x7fg\xb8\x17\x9e\x90', b'\xc1d\xfa\xa5\x01\x94', b'\x04r=!C\x9a', b'Fv\x7f\xa7\x86\x9e', b'\x89s\x7f\xf3\xc8\xa4'])])), (b't', b'\xc3\x8b\xc2\x9d'), (b'v', b'LT\x00\x11'), (b'y', b'r')]) 

# This is result I got from decode function, there is no difference when I compare to what Wireshark decode under DHT protocol. 
[04:03:56](DEBUG): [('57.66.113.241', 22762), ('57.7.114.55', 39662), ('127.103.184.23', 40592), ('193.100.250.165', 404), ('4.114.61.33', 17306), ('70.118.127.167', 34462), ('137.115.127.243', 51364)] 
+0

Post einige Paketerfassung + was Sie dekodiert. und Sie möchten vielleicht einen beliebten Torrent testen. und vergleichen Sie mit einer vorhandenen Implementierung, um zu sehen, ob das funktioniert – the8472

+0

Haben Sie Ihre TCP-Peer-Protokoll-Implementierung mit Nicht-DHT-Peers bereits verifiziert? Ich habe kürzlich Bits einer neuen BitTorrent-Implementierung getestet, und ich fand es viel einfacher, wenn ich einen Client lokal auf einem bekannten Port ausführte, bevor ich versuchte, mich mit Peers im Internet zu verbinden. (In meinem Fall benutze ich ein Docker-Bild ([basierend darauf] (https://github.com/camillebaronnet/docktorrent)), so dass ich den Status meines Test-Peers leicht teilen und zurücksetzen kann.) –

+0

Danke, antwortete mir Ich habe bereits den Screenshot der Paketerfassung von Wireshark hochgeladen. Sie können sehen, dass meine TCP-Implementierung möglicherweise korrekt funktioniert.Aber ich kann immer noch keine Antwort von Kollegen in DHT bekommen, alle von ihnen können nur nicht Verbindung hergestellt werden, das ist frustriert –

Antwort

1

('127.103.184.23', 40592)

Dies ist eindeutig Junk. Der Block 127.0.0.0/8 wird nicht über das Internet geroutet, daher sollte kein Knoten Daten enthalten, die eine Adresse enthalten.

Ich schlage vor, dass Sie einen beliebten, bekannten Torrent nehmen, seine Ankündigungs-URLs entfernen und ihn in einen Client mit DHT-Unterstützung einfügen. Dann beobachte sein Verhalten und vergleiche es mit deiner eigenen Implementierung.

Im Allgemeinen wird ein Bruchteil von Junk erwartet, da es fehlerhafte oder bösartige Implementierungen gibt. Aber im Allgemeinen sollte das nur ein kleiner Bruchteil (kleiner als 99%) sein und das Finden einer einzigen guten Adresse sollte genug sein, um mit dem Schwarm zu verbinden und dann PEX durchzuführen, um mehr Peers zu bekommen. Wenn Sie einen böswilligen ISP haben, der Datenverkehr manipuliert, um gefälschte Daten einzufügen, ist dieser Bruch möglicherweise viel höher als normal.

+0

Okay, ich folgte deinem Vorschlag, endlich habe ich das Problem, dass ich "Werte" falsch dekodiere. Ich habe eine funktionierende Anwendung installiert, dekodiert Adressen völlig anders, vergleiche weder meine noch Wireshark (es gibt nichts, wenn ich versuche, ip.addr == zu filtern [einige IPs, die Wireshark dekodiert]). Gibt es Magie für "Werte"? –

+0

keine Magie, jeder Eintrag "Werte" ist 4 oder 16 Bytes für die IP IP, gefolgt von 2 Bytes für den Port, alle Bigendian. Haben Sie zum Vergleich mit dem Client überprüft, ob es sich um eingehende oder ausgehende Verbindungen handelt? ankommende stimmen nicht unbedingt mit dem überein, was Sie von den 'get_peers' bekommen haben – the8472

Verwandte Themen