Verwenden von NAT Traversal, um Benutzer im passiven Modus zu verbinden

Dieser Artikel ist eine kostenlose Übersetzung eines der Einträge in DC++-Entwicklerblog.

Mit Erlaubnis des Autors (sowie aus Gründen der Klarheit und des Interesses) habe ich es mit Links gefärbt und durch einige persönliche Recherchen ergänzt.

Einführung

Mindestens ein Benutzer des Verbindungspaares muss sich zu diesem Zeitpunkt im aktiven Modus befinden. Der NAT-Traversal-Mechanismus ist nützlich, wenn der aktive Modus auf keiner Seite konfiguriert ist. Dies liegt normalerweise daran, dass eine Firewall oder ein NAT-Gerät eingehende Verbindungen blockiert.

Wenn sich beide Clients im aktiven Modus befinden

Der initiierende Client sendet einen Befehl mit seiner eigenen IP-Adresse und seinem eigenen Port $ConnectToMe an einen anderen Kunden. Anhand dieser Daten baut der Client, der den Befehl erhalten hat, eine Verbindung mit dem Initiator auf.

Wenn sich einer der Clients im Passivmodus befindet

Über den Hub ein passiver Client A sendet einen Befehl $RevConnectToMe aktiver Kunde Bder dann mit dem Befehl $ConnectToMe antwortet.

Verwenden von NAT Traversal, um Benutzer im passiven Modus zu verbinden
Als Server S Im obigen Fall handelt es sich um einen DC-Hub

Wenn sich beide Clients im Passivmodus befinden ADC-Hub

Clients hinter verschiedenen NATs A и B ist dem Hub beigetreten S.

Verwenden von NAT Traversal, um Benutzer im passiven Modus zu verbinden
So sieht die Verbindung zum Hub von Client-Seite aus A

Der Hub akzeptiert Verbindungen auf Port 1511. Client A stellt ausgehende Verbindungen von seinem privaten Netzwerk über Port 50758 her. Der Hub wiederum sieht die Adresse des NAT-Geräts, arbeitet mit ihm und sendet sie entsprechend ihrer Kennung an Clients.

Auftraggeber A sendet an den Server S Nachricht mit der Bitte um Hilfe bei der Verbindung mit einem Kunden B.

Hub: [Outgoing][178.79.159.147:1511] DRCM AAAA BBBB ADCS/0.10 1649612991

Auch im passiven Modus der Client BNachdem er diesen Befehl erhalten hat, muss er seinen privaten Port melden, der für die Verbindung zum Hub über NAT verwendet wird.

Hub: [Incoming][178.79.159.147:1511] DNAT BBBB AAAA ADCS/0.10 59566 1649612991

Nach Erhalt dieser Informationen wird der Kunde A versucht sofort, eine Verbindung mit dem Client aufzubauen B und meldet seinen eigenen privaten Port.

Hub:		[Outgoing][178.79.159.147:1511]	 	D<b>RNT</b> AAAA BBBB ADCS/0.10 <b>50758</b> 1649612991

Was ist das Interesse? Das Interesse besteht darin, den Endpunkt derselben Verbindung zu verschieben, indem über einen bereits verwendeten privaten Port eine neue Verbindung zu einer öffentlichen Adresse hergestellt wird.

Verwenden von NAT Traversal, um Benutzer im passiven Modus zu verbinden
Bingo!

In diesem Fall natürlich das Client-NAT B hat jedes Recht, die erste Verbindungsanfrage eines Kunden abzulehnen A, aber seine eigene Anfrage stürzt in das „Loch“, das durch genau diese Verbindung entsteht, und die Verbindung wird hergestellt.

Verwenden von NAT Traversal, um Benutzer im passiven Modus zu verbinden
Abbildung geeignet für den gesamten Prozess mit dem Vorbehalt, dass Protokoll verwendet keine öffentlichen Ports, die von der Sitzung geöffnet werden NAT- -Ssowie private Adressen.

Letzter Akt

Zum Zeitpunkt der Erstellung des (Original-)Artikels arbeitet etwa die Hälfte der DC-Clients im passiven Modus. Damit kann ein Viertel aller möglichen Verbindungen nicht hergestellt werden.

In der Zukunft DC++ kann NAT umgehenNutzung bestehender Verbindungen A- -S и B- -S um eine direkte Client-Client-Verbindung herzustellen, auch wenn A и B befinden sich im Passivmodus.

Source: habr.com

Kommentar hinzufügen