Post by Remo HartwigIch nehme einfach mal den Serverport weiter auf 5000.
Bleibe ich also bei normal new Socket(serverip, 5000) ohne auf localhost:0
umzuleiten.
Wie realisiere ich folgendes?
10.0.0.1:5000\
\
10.0.0.2:5000--\ 1.2.3.4 (NAT, FW(5000 offen) ------ Server(5000)
/ /
10.0.0.3:5000/ 5.6.7.8:5000/
5.6.7.8 laeuft normal.
Wenn sich einer hinter 1.2.3.4 anmeldet laeufts weiter normal.
Wenn ein zweiter aus dem lokalen Netz auf den oeffentlichen Server will,
bricht alles kaputt.
Beispiel 5.6.7.8, 10.0.0.1 und 10.0.0.2 wollen gegeneinander Spielen, oder
irgendwelche Daten austauschen oder...
Bekomme ich sowas auf flach Java geloest?
Was benoetige ich ansonsten?
Ich glaube du hast da immer noch einige Missverständnisse auf deiner Seite
bezüglich der Begriffe "Server-Port" und "Client-Port" (bzw. local port)
auszuräumen.
Also nehmen wir den Server mal als Blackbox an und kümmern uns erst mal
nicht weiter um ihn. Die NAT/FW hat, wie du ja schon schreibst eine Regel
für den Port 5000, die ich nun auf tcp-5000-outgoing präzisieren möchte!
10.0.0.1 (=C1) und 10.0.0.2 (=C2) wollen also mit dem Server 5.6.7.8 (=S)
gegeneinander spielen. Es passiert folgendes:
1. C1 meldet sich an:
Socket s = new Socket(serverip, 5000);
Im Gegensatz zu deinem Bild sieht die Verbindung nun so aus:
Für C1:
10.0.0.1:ephemeral1 <--> serverip:5000
Die NAT/FW macht nun eine Umsetzung:
10.0.0.1:ephemeral1 == 1.2.3.4:ephemeral2 <--> serverip, 5000
Am Server scheint nur die NAT Adresse zu existieren, er sieht diese
Verbindung:
1.2.3.4:ephemeral2 <--> serverip, 5000
Soweit, kein Problem.
2. C2 meldet sich an:
Socket s = new Socket(serverip, 5000);
Weiterhin im Gegensatz zu deinem Bild sehen die Verbindungen nun so aus:
Für C1 und C2:
10.0.0.1:ephemeral1 <--> serverip:5000
10.0.0.2:ephemeral3 <--> serverip:5000
Die NAT/FW macht nun zwei Umsetzungen:
10.0.0.1:ephemeral1 == 1.2.3.4:ephemeral2 <--> serverip, 5000
10.0.0.2:ephemeral3 == 1.2.3.4:ephemeral4 <--> serverip, 5000
Am Server scheint nur die NAT Adresse zu existieren, er sieht diese
Verbindungen:
1.2.3.4:ephemeral2 <--> serverip, 5000
1.2.3.4:ephemeral4 <--> serverip, 5000
Alle erwähnten clientseitigen Ports sind sogenannte ephemeral ports, also
zufällig gewählte Ports (und damit in der Regel !=5000). Für diese gilt:
a) Da C1 und C2 verschiedene Hosts sind, könnten ephemeral1 und ephemeral3
gleich sein. Da sich aber die Adressen unterscheiden, kann die NAT/FW sie
auseinander halten.
b) ephemeral2 und ephemeral4 werden von der NAT/FW vergeben. Diese
garantiert, dass sie verschieden sind. Da der Server nur diese Ports
kennt, kann auch er die Verbindungen problemlos auseinander halten.
c) ephemeral2 kann von der NAT/FW gleich ephemeral1 gewählt werden, muss
aber nicht. Die NAT/FW wird das nur machen, wenn ephemeral2 auf der
NAT-Adresse 1.2.3.4 gerade nicht in Gebrauch ist.
d) wie c) für ephemeral4 und ephemeral3.
Du siehst, es gibt eigentlich keinerlei Kollisionen dabei. C1, C2 und S
können problemlos miteinander spielen. Aber es gibt natürlich nur jeweils
die Kommunikation zwischen C1 und S und C2 und S. Wollen C1 und C2
Datenaustauschen, müssen sie das über das Spiele-Protokoll indirekt über
den Server S tun.
Probleme kann es erst geben, wenn du an deiner NAT auf Port 5000 incoming
Traffic haben willst, aber das ist eine andere Geschichte.
Im Übrigen hat das alles nichts mit Java im Speziellen zu tun, sondern nur
allgemein mit Netzwerk, TCP/IP und NAT/FW.
cu