Sockets: Internet-IP und dann ...?
-
edit: Ich sehe gerade, dass dein Problem weitaus einfacher ist, als ich bei der ersten Frage erwartet hatte. Die richtige Zuweisung der Pakete an die Clients im LAN macht schon der Router, du brauchst dich auf dem Server um nichts zu kümmern. Für den Server ist das bloß so, als hätte der Router zwei Verbindungen zu ihm.
Das verstehe ich nicht ganz. Die beiden LAN-Clienten teilen sich doch die gleiche Internet-IP. Wenn nun der server mit sendto() ein Paket an diese Adresse schickt, kommt das Paket doch an allen Clienten im Netzwerk an? Oder welche Daten schicke ich mit sendto() unbewusst mit, anhand dessen der Router die Clienten unterscheiden kann?
-
jeder rechner erstellt eine eindeutige ip/id kombination schickt die an den switch, da kommt dann die mac zum einsatz... und dann geht es weiter zum router, der erstellt eine eigene ip/id kombination und schickt die daten weiter.
@edit: der router sollte sich natürlich merken, welche versendete kombination zu welchem rechner gehört...
-
UPS! Ich hab nochmal meinen ersten Post durchgelesen, ich glaub ich drücke mich da etwas unklar aus:
Die beiden Clienten sind zwar im gleichen LAN, aber nicht im geichen LAN wie der Server. Ansonsten wär es ja kein Problem
-
Kopfschmerznetzwerg schrieb:
Die beiden Clienten sind zwar im gleichen LAN, aber nicht im geichen LAN wie der Server. Ansonsten wär es ja kein Problem
Es ist auch keine Problem! Der Router löst die Probleme, die dabei auftreten könnten:
http://en.wikipedia.org/wiki/NATAber ich bin verwirrt, ob es dir nun um die Technik des Sendens geht (da brauchst du gar nichts weiter zu tun) oder um Authentifizierung (die muss auf Anwendungsebene erfolgen).
-
Es geht mir um die Authetifizierung.
Mal ein Beispiel:
1 Server, irgendwo im Internet.
3 Clienten, davon 2 im gleichen LAN, ich nenn die beiden mal A und B.Das erste Byte von jeder Nachricht ist entweder mit 'c', 'd', oder 'n' gefülllt.
'c' steht für connect, mit dieser Nachricht wird name und passwort mitgeschickt und vom server geprüft. Wenn alles OK ist, merkt sich der Server, dass dieser Client nun den Namen hat, der mitgeschickt wird.Nun schicken jedoch 2 clienten ein connect, die im gleichen LAN sind, sprich der Server bekommt von client A name/pw zugeschickt und wird vom server gemerkt. Nun kommt client B, der die gleiche IP Adresse hat, und der Server ist verwirrt: Ist es nun der gleiche Client, oder ein anderer?
Wenn nun der Server nur an Client B eine nachricht schicken will, wie soll er das machen? Beide haben die gleiche IP Adresse, das einzige worin die beiden sich unterscheiden ist halt der Benutzername mit dem sie sich eingelogt haben.
Der Server kann nun mit jedem Packet den Nutzername mitschicken oder z.b. client A und B unterschiedliche Ports zuweisen oder sonst was. Ich frage mich, welche MEthode am geignetesten wäre, oder ob über UDP solche Daten automatisch über das Internet mitgeschickt werden, anhand dessen ich die beiden clienten unterscheiden kann.
-
Wovor willst du dich schuetzen? Was soll passieren, wenn mittendrin die LAN-Ips beider CLients vertauscht werden?
-
crispin kenton schrieb:
Gruum schrieb:
crispin kenton schrieb:
kopfschmerznetzwerg schrieb:
Wird die MAC-Adresse über UDP mitgeschickt?
ja
Nein, die MAC-Adresse wir nicht über UDP mitgeschickt.
Aber natürlich, MAC ist OSI-Schicht 1/2... die ist immer dabei!
*patsch*
Gerade weil es sich in den tieferen Schichten abspielt, und UDP nicht nur über Ethernet versendet werden kann, kann man nichtmal davon ausgehen dass es immer und überall eine MAC gibt die mitgeschickt werden könnte.----
Die Gegenstelle auf der anderen Seite des Internet bekommt die MAC nicht mit. Und das war die frage - wie ein Rechner im Internet das auseinanderhalten kann.
-
Kopfschmerznetzwerg schrieb:
Nun schicken jedoch 2 clienten ein connect, die im gleichen LAN sind, sprich der Server bekommt von client A name/pw zugeschickt und wird vom server gemerkt. Nun kommt client B, der die gleiche IP Adresse hat, und der Server ist verwirrt: Ist es nun der gleiche Client, oder ein anderer?
das ganze muss ja bijektiv sein, deshalb macht deine homerouterbuechse auch nat+pat. sonst koennten viele dienste in einem lan nicht parallel hinter einem nat-router arbeiten.
-
hustbaer schrieb:
crispin kenton schrieb:
Gruum schrieb:
crispin kenton schrieb:
kopfschmerznetzwerg schrieb:
Wird die MAC-Adresse über UDP mitgeschickt?
ja
Nein, die MAC-Adresse wir nicht über UDP mitgeschickt.
Aber natürlich, MAC ist OSI-Schicht 1/2... die ist immer dabei!
*patsch*
Gerade weil es sich in den tieferen Schichten abspielt, und UDP nicht nur über Ethernet versendet werden kann, kann man nichtmal davon ausgehen dass es immer und überall eine MAC gibt die mitgeschickt werden könnte.----
Die Gegenstelle auf der anderen Seite des Internet bekommt die MAC nicht mit. Und das war die frage - wie ein Rechner im Internet das auseinanderhalten kann.
war das jetzt der erguss, der sich nach den ersten posts gebildet hat? über den von dir angesprochenen punkt waren wir schon längst hinaus
-
Kopfschmerznetzwerg schrieb:
Es geht mir um die Authetifizierung.
Mal ein Beispiel:
1 Server, irgendwo im Internet.
3 Clienten, davon 2 im gleichen LAN, ich nenn die beiden mal A und B....
Wenn nun der Server nur an Client B eine nachricht schicken will, wie soll er das machen? Beide haben die gleiche IP Adresse, das einzige worin die beiden sich unterscheiden ist halt der Benutzername mit dem sie sich eingelogt haben.
Client A macht bind() auf IP A, Port PA.
Client B macht bind() auf IP B, Port PB.
Der Router hängt mit IP R im Internet.Wenn Client A ein UDP Paket an den Server schickt, dann übersetzt der Router die Absender-Adresse zu IP R, Port PAX.
Und merkt sich in einer Tabelle dass Port PAX für A, Port PA verwendet wird.Wenn Client B ein UDP Paket an den Server schickt, dann übersetzt der Router die Absender-Adresse zu IP R, Port PBX.
Und merkt sich in einer Tabelle dass Port PBX für B, Port PB verwendet wird.Wenn dann ein 2. Paket von Client A rausgeht, dann findet der Router den Eintrag in seiner Tabelle wo drinsteht dass Port PAX verwendet werden soll, und nimmt wieder den selben.
Langer Rede kurzer Sinn: für den Server sieht es so aus als ob beide "Datenströme" von der selben IP kommen, aber von unterschiedlichen Ports. Ganz so als ob das selbe Programm 2x gleichzeitig auf einem Rechner laufen würde. Was ja in vielen Fällen auch ein ganz normales Szenario ist, welches unterstützt werden muss.
-
@crispin kenton
Ist bloss eine Reaktion darauf dass du regelmässig über Dinge schreibst von denen du offenbar keine Ahnung hast.
Aber hey, hauptsacht du schreibst was, ob's stimmt oder nicht darum geht's ja wohl nicht.
-
hustbaer schrieb:
@crispin kenton
Ist bloss eine Reaktion darauf dass du regelmässig über Dinge schreibst von denen du offenbar keine Ahnung hast.
Aber hey, hauptsacht du schreibst was, ob's stimmt oder nicht darum geht's ja wohl nicht.zum glück gibt es ja mr. perfect, was würden wir nur ohne dich machen
-
Kopfschmerznetzwerg schrieb:
Ich dachte accept() nutzt man nur bei TCP?
Ja. Schriebst Du nicht etwas von 'verbinden'? UDP ist doch verbindungslos ...
Ich hätte auch vermutet, dass man für diese Zwecke üblicherweise TCP benutzt ...
-
@hustbear: Danke, das hilft mir schonmal sehr weiter, aber ...
Wenn Client A ein UDP Paket an den Server schickt, dann übersetzt der Router die Absender-Adresse zu IP R, Port PAX.
Und merkt sich in einer Tabelle dass Port PAX für A, Port PA verwendet wird.Also der Router verändert den Port automatisch?
Beispiel:Client A: 192.168.0.1:2000 -> 88.167.34.135:20000
Client B: 192.168.0.2:2000 -> 88.167.34.135:20001Oder muss man die Portveränderung doch selbst vornehmen?
-
Kopfschmerznetzwerg schrieb:
Also der Router verändert den Port automatisch?
Beispiel:Client A: 192.168.0.1:2000 -> 88.167.34.135:20000
Client B: 192.168.0.2:2000 -> 88.167.34.135:20001Oder muss man die Portveränderung doch selbst vornehmen?
Wer ist in diesem Szenario "man"? Der einzige, der hier etwas vornehmen muss ist der Router und sein Administrator.
-
Ah, ich glaub jetzt versteh ichs
Im sockaddr_in auf das ich in revcfrom() referenziere stehen dann unterschiedliche Ports bei den. z.B. 20000 bei packeten von Client A, und 20001 von Client B, obwohl beide Clienten über den Port 2000 bei sendto() schicken?
Oder bin ich immernoch auf dem Holzweg?
-
Der Router verändert die Ports, ja. Deswegen habe ich doch oben
http://en.wikipedia.org/wiki/NAT
verlinkt, welches alles erklärt hätte, was hier seither nochmal erklärt wurde. Nicht gelesen?Einführung auf Wikipedia schrieb:
However, it is common to hide an entire IP address space, usually consisting of private IP addresses, behind a single IP address (or in some cases a small group of IP addresses) in another (usually public) address space. To avoid ambiguity in the handling of returned packets, a one-to-many NAT must alter higher level information such as TCP/UDP ports in outgoing communications and must maintain a translation table so that return packets can be correctly translated back.
Was in wenigen Worten das ist, was hustbaer seither nochmal ausführlich erklärt hat (und was auf Wikipedia natürlich auch nochmal viel ausführlicher beschreiben ist im Rest des Artikels).
-
Du solltest dich natürlich nicht zur Authentifizierung von Clienten darauf verlassen, da hilft nur Verschlüsselung.
-
SeppJ schrieb:
Der Router verändert die Ports, ja. Deswegen habe ich doch oben
http://en.wikipedia.org/wiki/NAT
verlinkt, welches alles erklärt hätte, was hier seither nochmal erklärt wurde. Nicht gelesen?Einführung auf Wikipedia schrieb:
However, it is common to hide an entire IP address space, usually consisting of private IP addresses, behind a single IP address (or in some cases a small group of IP addresses) in another (usually public) address space. To avoid ambiguity in the handling of returned packets, a one-to-many NAT must alter higher level information such as TCP/UDP ports in outgoing communications and must maintain a translation table so that return packets can be correctly translated back.
Was in wenigen Worten das ist, was hustbaer seither nochmal ausführlich erklärt hat (und was auf Wikipedia natürlich auch nochmal viel ausführlicher beschreiben ist im Rest des Artikels).
ich brauchte noch weniger worte. aber antworten gelten hier wohl nur als wertvoll, wenn sie nicht nur richtig sind, sondern auch schoen viel drum herum erzaehlt wird.
-
Kopfschmerznetzwerg schrieb:
Also der Router verändert den Port automatisch?
Beispiel:Client A: 192.168.0.1:2000 -> 88.167.34.135:20000
Client B: 192.168.0.2:2000 -> 88.167.34.135:20001Oder muss man die Portveränderung doch selbst vornehmen?
Der Router verändert den ABSENDERport automatisch. Weil ... sonst würde das ja nicht gehen können, wenn zwei interne PCs mit dem selben Absenderport was schicken.
Könnte er ja nimmer wissen wohin er Antworten zurückschicken muss.Das ganze funktioniert übrigens bei TCP und UDP gleich. Der einzige Unterschied ist, dass es bei TCP ein definiertes Ende der Verbindung gibt. D.h. der Router kann zu dem Zeitpunkt dann sicher sein dass die Verbindung nicht mehr existiert, und sie aus seiner Tabelle rauswerfen.
Bei UDP wird dagegen einfach ein Timeout verwendet. Kann bei den meisten Routern eingestellt werden. D.h. wenn z.B. 5 Minuten lang nix mehr über einen bestimmten Tabelleneintrag weitergeleitet wurde (egal in welcher Richtung, also LAN->Internet oder Internet->LAN), dann löcht er den Tabelleneintrag einfach.
Falls dann doch nochmal was kommt sieht es für den Router wie ne neue "Verbindung" aus, und er macht nen neuen Eintrag. Für den Rechner im Internet sieht es dann ebenso wie ne neue "Verbindung" aus, da ja ein neuer Port vom Router vergeben wurde.