MAC-Adressen sind nicht eindeutig
Es kann und wird Duplikate mit MACs geben. Dafür gibt es mehrere Gründe, einer ist, dass sie nicht (global) eindeutig sein müssen.
Der MAC muss im lokalen Netzwerk eindeutig sein, damit ARP / NDP seine Aufgabe erfüllen kann und der Switch weiß, wohin eingehende Datagramme gesendet werden sollen. Normalerweise (nicht unbedingt) ist diese Voraussetzung erfüllt, und die Dinge funktionieren einwandfrei, einfach weil die Wahrscheinlichkeit, dass zwei identische MACs im selben LAN sind, selbst wenn sie nicht eindeutig sind, recht gering ist.
Ein weiterer Grund ist, dass es einfach mehr Geräte gibt als Adressen. Während 48-Bit-Adressen so klingen, als ob es bis zum Ende der Tage genug Adressen für alle gibt, ist dies nicht der Fall.
Der Adressraum ist in zwei 24-Bit-Hälften unterteilt (etwas komplizierter, aber die kleinen Details werden ignoriert). Die eine Hälfte ist die OUI, die Sie beim IEEE registrieren und Ihrem Unternehmen für rund 2000 Dollar zuweisen können. Die restlichen 24 Bits machen Sie, was Sie wollen. Natürlich können Sie mehrere OUIs registrieren, was auch die größeren Spieler tun.
Nehmen Sie als Beispiel Intel. Sie haben insgesamt 7 OUIs registriert und geben ihnen insgesamt 116 Millionen Adressen.
Die Hauptplatine meines Computers (die einen X99-Chipsatz verwendet) sowie die Hauptplatine meines Laptops und die Hauptplatine aller x86-basierten Computer, die ich in den letzten 10 bis 15 Jahren besessen habe, verfügten über eine Intel-Netzwerkkarte als Teil des Chipsatzes. Mit Sicherheit gibt es weltweit mehr als 116 Millionen Intel-basierte Computer. Daher können ihre MACs möglicherweise nicht eindeutig sein (im Sinne von global eindeutig).
Es wurde auch über Fälle berichtet, in denen ... billigere ... Hersteller Adressen einfach aus der OUI eines anderen "stehlen". Mit anderen Worten, sie verwendeten nur eine zufällige Adresse. Ich habe von Herstellern gehört, die die gleiche Adresse auch für ein komplettes Produktsortiment verwenden. Weder passt das wirklich noch ergibt es viel Sinn, aber was können Sie dagegen tun? Diese Netzwerkkarten existieren. Nochmals: Die Wahrscheinlichkeit, dass es zu einem praktischen Problem wird, ist immer noch sehr gering, wenn Adressen für das verwendet werden, was sie beabsichtigt sind. Sie müssen zwei davon im selben LAN haben, um es überhaupt zu bemerken.
Was tun gegen Ihr Problem?
Die Lösung ist vielleicht einfacher als Sie denken. Ihre IoT-Geräte werden höchstwahrscheinlich einige Zeit benötigen, normalerweise wird die Zeit automatisch über NTP bezogen. Die typische Präzision von NTP liegt im Mikrosekundenbereich (ja, das ist Mikro, nicht Milli). Ich bin nur gelaufen ntpq -c rl
, um sicherzugehen, und mir wurde gesagt, dass ich 2 -20 bin .
Die Wahrscheinlichkeit, dass zwei Ihrer Geräte zum ersten Mal mit genau derselben Mikrosekunde eingeschaltet werden, ist sehr gering. Das ist im Allgemeinen möglich (vor allem, wenn Sie Millionen davon in kürzester Zeit verkaufen, herzlichen Glückwunsch zu Ihrem Erfolg!). Aber es ist nicht sehr wahrscheinlich - in der Praxis wird es nicht passieren. Sparen Sie also Zeit, nachdem Sie das System zum ersten Mal in einem permanenten Speicher hochgefahren haben.
Die Startzeit Ihres IoT-Geräts ist auf jedem Gerät gleich. Außer das stimmt überhaupt nicht .
Bei einem Timer mit hoher Auflösung sind die Startzeiten jedes Mal messbar unterschiedlich, auch auf demselben Gerät. Es ist vielleicht nur ein paar Uhr-Ticks anders (oder ein paar hunderttausend, wenn Sie so etwas wie den Zeitstempelzähler der CPU lesen), also nicht sehr einzigartig, aber es fügt sicher etwas Entropie hinzu.
Ebenso ist die Zeit, die connect
für die Rückgabe beim ersten Zugriff auf Ihre API-Site erforderlich ist, geringfügig, aber messbar unterschiedlich. In ähnlicher Weise getaddrinfo
wird für jedes Gerät eine etwas andere, messbare Zeit benötigt, wenn der Hostname Ihrer Web-API zum ersten Mal nachgeschlagen wird.
Verketten Sie diese drei oder vier Entropiequellen (MAC-Adresse, Zeitpunkt des ersten Einschaltens, Zeitpunkt des ersten Starts, Verbindungszeit) und berechnen Sie daraus einen Hash. MD5 wird für diesen Zweck gut geeignet sein. Dort bist du einzigartig.
Das garantiert zwar nicht wirklich die Einzigartigkeit, aber "so ziemlich" mit einer vernachlässigbaren Wahrscheinlichkeit des Scheiterns. Sie müssten über zwei Geräte mit identischen MACs verfügen, die zum ersten Mal in derselben Mikrosekunde eingeschaltet werden und genau die gleiche Zeit benötigen, um zu starten und eine Verbindung zu Ihrer Site herzustellen. Das wird nicht passieren. In diesem Fall sollten Sie sofort mit dem Lotto beginnen, da Sie anscheinend garantiert gewinnen werden.
Wenn "wird nicht passieren" jedoch als Garantie nicht ausreicht, übergeben Sie einfach jedem Gerät eine fortlaufend steigende Nummer (auf dem Server generiert), wenn es zum ersten Mal auf Ihre Web-API zugreift. Lassen Sie das Gerät diese Nummer speichern, fertig.