# Kommunikation übers Internet



## MaxJava (10. Feb 2015)

Hallo zusammen,
wenn ich per TCP/IP ein Programm erstelle kann ich durch entsprechende Konfiguration an meinem Router über die externe IP andere Rechner im Internet erreichen.

Es gibt doch aber jede Menge Spiele, die man online spielen kann ohne irgendetwas im Router einzustellen. Wie funktionieren diese? Oder auch Chat-Programme wie Skype, icq? Laufen die auch über TCP? Ich meine mal gehört zu haben Skype funktioniert mit UDP aber auch hier müsste ich doch erst den Port am Router freigeben? Wie genau wird das in solchen Programmen realisiert?

Danke schonmal für eure Antworten :rtfm:


----------



## BRoll (10. Feb 2015)

Du meinst sicher die hier? Liste der standardisierten Ports


----------



## MaxJava (10. Feb 2015)

Also in der Liste finde ich jetzt einige Chat Programme und die Zuordnung zu den Ports, wie kommen die denn durch den Router durch?


----------



## Ch4t4r (10. Feb 2015)

Router blocken nur einen Verbindunggsaufbau von außerhalb (Firewall), lassen aber Antworten auf von dir aufgebaute Verbindungen zu. Im Sinne von Skype:
Du-> Server-> speichert die Nachricht
Ziel-> Server -> antwortet mit gespeicherten Nachrichten. 
Ein Server vermittelt also zwischen Clients


----------



## MaxJava (10. Feb 2015)

Also antwortet der Server nicht direkt, sonder der Client fragt an ob es neue Antworten gibt. Ist dies der Fall, werden die neuen Antworten gesendet? 
Das würde Sinn machen ;D


----------



## Ch4t4r (10. Feb 2015)

Es geht darum, dass der Client die Verbindung aufbaut (so gesehen anfragt) und nicht der Server zum Client. Zum Verständnis: eine Firewall schützt nicht vor Viren, sie verhindert nur, dass die Verbindung auf einem gewissen Port zu dir aufgebaut wird. Steht eine Verbindung erstmal können beide Seiten lesen und empfangen.


----------



## InfectedBytes (10. Feb 2015)

Nicht unbedingt, es ist eher so, das der Client eine (dauerhafte) Verbindung zum Server herstellt. Der Router lässt dies zu, da es vom Clienten ausgeht. Jetzt können Client und Server beliebig Daten austauschen.

Wenn jedoch jemand von außerhalb eine Verbindung zu dir aufbauen will, dann wird der Router dies blockieren (sofern nicht anders eingestellt).


----------



## MaxJava (10. Feb 2015)

Okay danke, 
also ich schreibe einen Client und stelle eine Verbindung zum Server her. Solange diese Verbindung zwischen Client und Server besteht wird das in der Firwall vermerkt und es werden Daten, die der Server mir schickt, durchgelassen, da die Verbindung vom Client initiiert wurde?
Das ist jetzt aber richtig oder? 

Funktionieren auf diese Weise auch Online Multiplayer Spiele? Also per TCP mein ich?

Und noch zum Schluss eine Frage:
Die Liste von Wikipedia zeigt, dass es tausende von Ports gibt. Welche Gründe haben Programme auf bestimmten Ports (z. B. icq port 5190) zu laufen? Das Programm könnte doch genauso gut auf Port 6200 laufen? Sind die Ports einfach willkürlich ausgewählt? 

Die Ports von 0-1023 sind standardisiert (Wikipedia) und man benötigt admin rechte. Können diese trotzdem überschrieben werden?


----------



## InfectedBytes (10. Feb 2015)

MaxJava hat gesagt.:


> Okay danke,
> also ich schreibe einen Client und stelle eine Verbindung zum Server her. Solange diese Verbindung zwischen Client und Server besteht wird das in der Firwall vermerkt und es werden Daten, die der Server mir schickt, durchgelassen, da die Verbindung vom Client initiiert wurde?
> Das ist jetzt aber richtig oder?


jop, so ist es.



MaxJava hat gesagt.:


> Funktionieren auf diese Weise auch Online Multiplayer Spiele? Also per TCP mein ich?


Die meisten Onlinespiele (nicht alle) haben einen zentralen Server, welcher sich um die Kommunikation kümmert.
Wenn ein Onlinespiel TCP nutzt, dann läuft das im Grunde so ab, wie oben beschrieben. 
Viele nutzen jedoch das verbindungslose UDP, bei dem es ein bisschen anders aussieht.



MaxJava hat gesagt.:


> Und noch zum Schluss eine Frage:
> Die Liste von Wikipedia zeigt, dass es tausende von Ports gibt. Welche Gründe haben Programme auf bestimmten Ports (z. B. icq port 5190) zu laufen? Das Programm könnte doch genauso gut auf Port 6200 laufen? Sind die Ports einfach willkürlich ausgewählt?
> 
> Die Ports von 0-1023 sind standardisiert (Wikipedia) und man benötigt admin rechte. Können diese trotzdem überschrieben werden?



Die Ports sind willkürlich gewählt, idealerweise nimmt man eben einen, welcher von keinem "wichtigen" Programm genutzt wird. 
Und die ersten 1024 Ports können grundsätzlich benutzt werden wie jeder andere Port (bei manchen Betriebssystemen benötigt man admin rechte, bei manchen nicht), allerdings sollte man dies nicht tun, da sie eben standardports.


----------



## mbrain (11. Feb 2015)

Was du meinst ist P2P und dazu solltest du dich in erster Linie mit NAT und in weiterer Folge mit NAT Traversal beschäftigen.

Das ist ziemlich aufwendig und hat auch nichts mehr speziell mit JAVA zu tun sondern mit Netzwerktechnik allgemein. Im Prinzip schreibt man dazu ein Programm (in welcher Sprache auch immer) welches nach einem bestimmten Protokollmuster mit einem eigens konfigurierten Server Daten austauscht und dabei herausfindet, wie der eigene Router genau arbeitet und Verbindungen durchlässt, umleitet oder eben blockt. SOCKS ist dabei das älteste Protokoll für NAT Traversal

Nach Erlangtem Wissen über Verhältnis von Mapping, Filtering und Allocation (beschrieben in RFC3947) des Routers kommt sogenanntes Hole Punching zum Einsatz - meißt UDP Hole Punching. Dabei sendet PC-A erstmal einige sinnbefreite UDP Pakete an PC-B welche (wenn ein NAT Problem besteht) verworfen werden, da PC-B diese Pakete ja zuvor nicht bestellt hat und somit kein Eintrag in der NAT Tabelle für eingehende Pakete von PC-A vorliegt. Gleichzeitig dazu sendet PC-B auch UDP Pakete an PC-A, welche von PC-A empfangen werden, da PC-A ja zuvor Pakete an PC-B gesendet hat und diese nun als Antwort darauf interpretiert werden. PC-A sendet weiterhin Pakete an PC-B die jetzt auch nicht mehr verworfen werden, weil ja PC-B ja auch Pakete an PC-A gesendet hat welche jetzt wiederum als Antwort darauf interpretiert werden. Dann müssen noch beide ein sogenanntes ACK-Paket senden welches dem jeweils anderen Router mitteilt, das die Verbindung aufgebaut wurde.

Dadurch erstellt der Router einen neuen Eintrag in der NAT Tabelle und öffnet einen (jetzt erlaubten) Eingang für den anderen Computer über einen verbindungsorientierten TCP Tunnel.

Danach muss man nur mehr darauf achten das in regelmässigen Intervallen Pakete über diese Verbindung gesendet werden, weil der Router sonst nach einer bestimmten Zeit unbenutzte Ports automatisch schliesst und du das ganze Prozedere vom Server, über Hole Punching bis hin zum Verbindungsaufbau wiederholen musst.


----------

