Forum: PC Hard- und Software Socket und NAT


von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Habe eine Frage.

Ein Socket zum Server wurde vom Client aus geöffnet - im "Stream" können 
Daten in beide Richtungen gesendet werden.

Wie ist das jetzt, wenn der Client hinter einer NAT sitzt? Kommen Bytes 
vom Server dann durch die NAT beim Client an? Auch ohne dass der Client 
vorher irgendwas durch den Stream anfragt? Ich kann die Situation grad 
nicht auf die Schnelle nachstellen. Aber ich denke es geht schon, wenn 
der Socket mal offen ist, oder? War doch scho immer so...? Weiß das 
jemand?

Falls es eine Rolle spielt: C#, TcpListener & TcpClient
Gruß, tsx

von blabla (Gast)


Lesenswert?

Die NAT Manipulation ist für CLient und Server komplett transparent (das 
ist ja schon seit Urzeiten bei jeder Internetverbindung so, die lokal 
virtuell von 192.168.x.y. ausgeht, aber beim Server als globale IP 
Adresse ankommt).

Solange die Verbindung offen ist, wird eine sauber programmierte 
Infrastruktur (also die dazwischen liegenden Router) das mapping nicht 
anrühren.

Probleme kannst Du dann kriegen, wenn mehrere zusammengehörige HTTP 
requests von verschiedenen mappings vorgenommen werden. Das hängt davon 
ab, wie strikt die Website damit umgeht.

von Max M. (jens2001)


Lesenswert?

Tim S. schrieb:
> Kommen Bytes
> vom Server dann durch die NAT beim Client an? Auch ohne dass der Client
> vorher irgendwas durch den Stream anfragt?

Warum sollte ein Server etwas senden ohne das ein Client etwas angefragt 
hat?
Und woher sol NATer wissen an welchen Client er das Paket senden soll?

von (prx) A. K. (prx)


Lesenswert?

Max M. schrieb:
> Warum sollte ein Server etwas senden ohne das ein Client etwas angefragt
> hat?

Beispiel hierfür ist IMAP IDLE. Da baut der Mail-Client eine Verbindung 
zur Server auf, hält die permanent offen und nichts passiert. Wenn der 
Server irgendwann einmal eine Mail für ihn hat, dann kommt plötzlich 
etwas rein.

von Max M. (jens2001)


Lesenswert?

A. K. schrieb:
> Da baut der Mail-Client eine Verbindung
> zur Server auf

EBEND! Merkst du was?

Und damit weiss der NATer auch bescheid.

von Sheeva P. (sheevaplug)


Lesenswert?

Tim S. schrieb:
> Ein Socket zum Server wurde vom Client aus geöffnet - im "Stream" können
> Daten in beide Richtungen gesendet werden.
>
> Wie ist das jetzt, wenn der Client hinter einer NAT sitzt? Kommen Bytes
> vom Server dann durch die NAT beim Client an? Auch ohne dass der Client
> vorher irgendwas durch den Stream anfragt?

Schauen wir auf ein SNAT, wie es jeder "Router" macht: Alice hat in 
ihrem Home-LAN die IP-Adresse 192.168.0.10 und möchte den Google-Server 
Bob mit der IP-Adresse 172.217.20.195 über ihren SNAT-Router Klaus 
ansprechen, der auf Alice' Computer als Standard-Gateway konfiguriert 
ist und seinerseits zwei IP-Adressen hat: die 192.168.0.254 in Alice' 
LAN, sowie im externen Internet die von Alice' Provider zugewiesene 
Adresse 80.128.1.1.

Jetzt schickt Alice' Rechner ein Datenpaket an Bob; das Datenpaket hat 
als Quelladresse die von Alice' Computer und als Zieladresse jene von 
Bob. Aber die Adresse von Alice' Computer ist ja in ihrem LAN! Deswegen 
schreibt der NAT-Gateway Klaus die Quelladresse des Pakets um, ersetzt 
die Adresse von Alice' Computer durch seine eigene externe IP-Adresse, 
merkt sich diese Verbindung in seiner NAT-Tabelle und schickt das Paket 
weiter zu Bob.

Bob bekommt jetzt ein Datenpaket mit Klaus' externer IP-Adresse als 
Quell- und seiner, Bobs, eigenen IP-Adresse als Zieladresse. Damit die 
Antwort ihren Rückweg findet, muß Bob die Quell- und Zieladressen des 
Pakets nun gegeneinander vertauschen; Bobs Antwortpaket hat nun als 
Quelladresse die externe IP-Adresse von Klaus und als Quelladresse die 
IP-Adresse von Bob.

Dieses Antwortpaket von Bob kommt nun bei Klaus an. Wenn es vorher keine 
Verbindung gegeben hätte, würde Klaus das Paket einfach verwerfen, aber 
unser Klaus ist ja kein kleines Dummerchen und hat sich die Verbindung 
oben ja in seiner NAT-Tabelle gemerkt. Klaus erinnert sich daran, daß 
Alice ein Paket an Bob geschickt hatte und daß dieses an ihn 
adressierte, aber nicht für ihn bestimmte Paket wohl die Antwort auf 
Alice' Paket ist.

Deswegen ersetzt Klaus jetzt die Zieladresse in Bobs Antwortpaket durch 
die gemerkte Quelladresse von Alice' Computer. Er leitet Bobs Paket dann 
in Alice' LAN weiter, wo Alice' Computer Bobs Antwort empfängt.

Lange Rede, kurzer Sinn: solange der NAT-Gateway sich die Verbindung von 
Alice zu Bob gemerkt hat -- also nach dem Verbindungsaufbau -- kann die 
Verbindung als bestehend betrachtet werden. Wer dann zuerst Daten 
sendet, spielt dann keine Rolle mehr.

Oder, anders gesagt: wenn es sich um einen Stream handelt, also um eine 
TCP-Verbindung, dann findet zum Aufbau ein Three-Way-Handshake statt, 
und dadurch kennt der NAT-Gateway die Verbindung. Bei UDP, das keinen 
Auf- und Abbau einer Verbindung, sondern nur einzelne Datenpakete kennt, 
kann das natürlich nicht funktionieren: da müßte Alice immer erst etwas 
zu Bob schicken, damit Klaus weiß, daß Alice mit Bob kommuniziert.

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Sheeva P. schrieb:
> Lange Rede, kurzer Sinn: solange der NAT-Gateway sich die Verbindung von
> Alice zu Bob gemerkt hat -- also nach dem Verbindungsaufbau -- kann die
> Verbindung als bestehend betrachtet werden.

Achja, genau - da war ja was. Ich hatte nicht bedacht, dass die NAT sich 
genau diesen Fall merkt - bzw. wollte ich auf Nummer sicher gehen, bevor 
ich jetzt drauf loß programmiere...

Sheeva P. schrieb:
> Wer dann zuerst Daten sendet, spielt dann keine Rolle mehr.

Genau das ist mein Ziel, dankeschön.

tsx

: Bearbeitet durch User
von Rolf Magnus (Gast)


Lesenswert?

Max M. schrieb:
> A. K. schrieb:
>> Da baut der Mail-Client eine Verbindung
>> zur Server auf
>
> EBEND! Merkst du was?

Du hast offenbar die Frage nicht verstanden...

> Und damit weiss der NATer auch bescheid.

... aber immerhin trotzdem die richtige Antwort gegeben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.