2009-04-04 14 views
11

Ich kenne das Wort „Verbindung“ nicht wirklich geeignet ist, wenn über UDP sprechen, aber ...UDP, NAT und Einrichten „Verbindungen“

Wie kann ein Server (der mit dem bekannten IP) erhält seine UDP-Pakete über das Internet an einen Client, der hinter NAT steht?

Beispiel: Sagen Sie, ein Client verbindet und authentifiziert sich mit dem Server mithilfe einiger Nachrichten über TCP. An diesem Punkt ist der Server bereit, Daten über UDP an den Client zu senden, aber woher weiß der Server, wo er die UDP-Pakete ansprechen soll, damit sie ihren Weg durch alle NAT-Router zum Client finden?

Wenn der Client eine Nachricht "Ich bin bereit für das Streaming bitte" über UDP sendet, würden die NAT-Router den Port offen lassen, damit der Server mit seinem Stream von UDP-Daten antworten kann?

Oder bin ich hier auf der Strecke?

+0

entwerfen Sie Ihr eigenes Protokoll oder versuchen Sie, ein vorhandenes Protokoll zu aktivieren? – Alnitak

+0

Ich würde etwas Neues implementieren. – chardy

Antwort

1

Im Allgemeinen kann das NAT vor dem Client auf TCP-Ebene feststellen, dass die Verbindung beim UDP erstellt wurde. Allerdings muss das NAT auf der Client-Seite so konfiguriert werden, dass UDP-Pakete vom SRC-Server-Port akzeptiert und dann an die interne Ziel-IP (Client) weitergeleitet werden. Es ist wichtig zu wissen, ob NAT der Anrufer und wer der Angerufene ist. NATs unterscheiden sich in der Implementierung und der Fähigkeit, so dass eine generische, einfach zu implementierende Lösung wahrscheinlich das ist, was Sie je nach Ihren Anforderungen implementieren möchten.

Sie sind richtig in der Annahme, ich denke, dass in Ihrem Fall Client nicht in der Lage sein wird, den UDP-Stream in Informationen zu erhalten. In diesem Fall muss Ihr Client seine WAN-IP an Ihren Server senden, um die UDP-Verbindung herzustellen. Finden Sie Ihre Kunden WAN IP kann knifflig sein, aber es gibt Webseiten, die Ihnen helfen, Ihre WAN IP zu bestimmen, indem Sie sie auf einer Textseite zurückgeben.

Wenn die UDP-Verbindung nach der TCP-Verbindung erstellt wird, indem der Server einen Socket zum Client zu einem bekannten UDP-Port öffnet, dann lohnt es sich, UPnP anzuschauen, damit Sie Ihren Port automatisch auf Ihrem NAT einrichten können Das ist nur möglich, wenn Ihr NAT UPnP unterstützt, wie es bei DSL-Routern der Fall ist.

Ein Work-a-Round wäre Client zu öffnen sowohl TCP-und UDP-Sockets für den Server. Da der Client hinter dem NAT die Verbindung initiiert hat, werden die Zustände der TCP- und UDP-Verbindungen der Verbindungstabelle des NAT hinzugefügt.

+0

"Ein Work-a-Round wäre Client zu öffnen sowohl TCP-und UDP-Sockets für den Server." Ist dies eine standardmäßige und zuverlässige Methode, um die Datagramme des Servers zurück auf den Client zu bringen? Ich suche nach dem geringsten Aufwand für die Person, die Client verwendet. – chardy

4

Ignorieren der Bereitstellung von bekannten Port Translation (das heißt Daten auf diese Port geht diese-Adresse) in Ihrem Router (die NAT-), können Sie UDP Hole Punching verwenden.

Ich nehme an, du sprichst nicht über multicasting, in dem jeder Peer einer Gruppe beitritt und dies den Interessenten (in diesem Fall dem Router) mitteilt, die dann das entsprechende Routing durchführen können. Obwohl dies normalerweise für die effiziente Weiterleitung von Datenverkehr an mehrere Hosts verwendet wird, funktioniert der Routing-für-Gruppe-Mechanismus wie oben beschrieben.

+0

Danke Brian für diese Information - Wie ich es verstehe, würde UDP Hole Punching in einem Peer-Peer-Szenario verwendet werden, wo beide Enden hinter einer Firewall sind? Wäre das immer noch nötig, wenn sich mein Server auf einer WAN-IP befindet? – chardy

+0

Ich glaube nicht, aber ich gestehe, ich bin kein Experte. –

1

Wenn Sie von Streaming-Protokollen wie SIP oder RTSP sprechen, funktioniert der UDP-Port, an den der Client den Server senden soll, in der Anforderung zur Anruferstellung.

Der Server sendet an diesen Port und der Datenverkehr kann oder kann nicht zum Client gelangen, je nachdem, ob das NAT die Auswahl des Ports auf eine andere Nummer umgestellt hat oder nicht.

Wenn der Server sein erstes UDP-Streaming-Paket vom Client empfängt und wenn es auf einem anderen Port als demjenigen ist, auf dem es gesendet hat, wird es zu diesem wechseln. Dadurch kann der UDP vom Server das NAT durchlaufen, da der Client das NAT-Mapping bereits durch Senden an den Server erstellt hat.