2017-12-03 9 views
0

Meine Situation sind folgende:Spiel mehr IP-Adressen zu einem Endpunkt

(ich weiß nicht, ob dies relevant ist, aber alle folgenden wird/soll mit c auf einer Linux-Maschine durchgeführt werden.)

Ich mache Peer-Erkennung in meinem lokalen Netzwerk mit IPv4-Broadcast-Pakete und IPv6-Multicast-Pakete. Peers, die ein Broadcast/Multicast-Paket von einem anderen Peer empfangen, senden eine Antwort zurück, die signalisiert, dass sie online sind.

Da ich auf allen Schnittstellen und unter Verwendung von sowohl IPv4 als auch IPv6 sende, erhalte ich mindestens zwei Antworten von einem Endpunkt (ein IPv4 und ein IPv6). Wenn ein anderer Endpunkt über mehrere Schnittstellen (WLAN + Ethernet) erreichbar ist, bekomme ich möglicherweise noch mehr Antworten von einem einzelnen Endpunkt.

Peer 2 gets a response via 3 Paths

In diesem Beispiel Peer 2 erhält drei Antworten von Peer 1 nach einem IPv4-Paket auf seinem WiFi und Ethernet-Karten senden und ein IPv6-Multicast-Paket mit seiner WiFi-Karte zu schicken. Peer 2 hat jetzt 3 Antworten vom gleichen Host mit unterschiedlichen IPs.

Meine Frage ist, ob es eine Möglichkeit gibt, all diese Antworten auf einen einzelnen Endpunkt zu übertragen, ohne irgendeine Art von ID in die Antwortpakete einzubetten.

Wenn das nicht möglich ist, wäre meine nächste Frage, wie man eine gute Identifikation auswählt. Die ID muss nicht pro Host eindeutig sein, sondern nur pro Host pro Sitzung. Eine einfache Zufallszahl könnte eine Kollision zwischen zwei Peers erzeugen, was ein Fall ist, den ich nicht behandeln möchte, wenn ich nicht muss. Die ID sollte auch kurz sein, um das Paket nicht zu sehr aufzublähen.

Ich freue mich über Kommentare/Antworten.

+0

Was ist, wenn Sie nur die MAC-Adresse der Ethernet-Schnittstelle als ID verwenden? Das wird für jeden Host einzigartig sein. Es sind nur 6 Bytes, die nicht "aufgebläht" erscheinen, es sei denn, Sie arbeiten mit eingebetteten Geräten mit in Kilobyte gemessenem Speicher. – larsks

+0

Ich habe schon darüber nachgedacht. Ich denke, dass dies nicht pro Host, sondern pro Netzwerkkarte einmalig sein wird. In dem gegebenen Beispiel könnte ich also beide WiFi-Pakete abgleichen, aber nicht alle drei. Nach meinem Wissen benötigt der Ethernet-Header rohe Sockets, die ich nicht verwenden kann, weil dies ohne besondere Privilegien funktionieren muss. – merl

+0

Ich glaube, du hast mich falsch verstanden. Ich schlage nicht vor, dass Sie versuchen, die MAC-Adresse aus dem Header der eingehenden Pakete zu extrahieren. Ich schlage vor, dass * Sie auf dem sendenden Client * die MAC-Adresse in Ihre Nachricht als die Client-ID einbetten. – larsks

Antwort

2

Meine Frage ist, ob es eine Möglichkeit gibt, all diese Antworten auf einen einzelnen Endpunkt zu bringen, ohne irgendeine Art von ID in die Antwortpakete einzubetten?

Es gibt keine Möglichkeit, mehrere Nachrichten von verschiedenen Adressen an den gleichen Quellhost zu korrelieren, ohne irgendeine Art von Identifikation in die Pakete Einbetten (oder irgendeine Art von Authentifizierungsaustausch zu Beginn einer TCP-Sitzung durchgeführt wird, in welchem ​​Fall Sie müssten die Kennung nicht in jedes Paket aufnehmen, solange es Teil einer hergestellten Verbindung ist.

Wenn das nicht möglich ist, wäre meine nächste Frage, wie man eine gute Identifikation auswählt. Die ID muss nicht pro Host eindeutig sein, sondern nur pro Host pro Sitzung.

Verwenden Sie die MAC-Adresse einer Netzwerkschnittstelle als Client-ID. Dadurch erhalten Sie eine sechs Byte lange Client-ID, die für jeden Host eindeutig ist. Verwenden Sie eine Regel wie "die MAC-Adresse eth0" oder "die MAC-Adresse der Schnittstelle mit der niedrigsten Nummer", um den Wert konsistent auszuwählen.

Wahrscheinlich ist erwähnenswert, dass, während die MAC-Adresse nicht garantiert sein kann, einzigartig zu sein, ist es effektiv garantiert: solange (a) alle Ihre Kunden teilen mindestens ein gemeinsames Netzwerk und (b) Wenn Sie die MAC-Adresse der Schnittstelle in diesem Netzwerk verwenden, ist diese entweder eindeutig oder Sie haben größere Probleme, da einer oder mehrere Ihrer Clients nicht am Netzwerk teilnehmen können.

Verwandte Themen