Adresy MAC nie są unikalne
Mogą istnieć i będą duplikaty z MAC. Istnieje kilka powodów, z których jeden nie musi być (globalnie) wyjątkowy.
MAC musi być unikalny w sieci lokalnej, więc ARP / NDP może wykonywać swoje zadania, a przełącznik wie, gdzie wysyłać przychodzące datagramy. Zwykle (niekoniecznie) ten warunek wstępny jest spełniony i wszystko działa dobrze, po prostu dlatego, że prawdopodobieństwo posiadania dwóch identycznych adresów MAC w tej samej sieci LAN, nawet jeśli nie są one unikalne, jest dość niskie.
Innym powodem jest to, że istnieje po prostu więcej urządzeń niż adresów. Podczas gdy adresy 48-bitowe brzmią tak, jakby każdy miał wystarczającą liczbę adresów do końca dni, tak nie jest.
Przestrzeń adresowa jest podzielona na dwie 24-bitowe połówki (jest nieco bardziej skomplikowana, ale pomińmy drobne szczegóły). Jedna połowa to OUI, które można zarejestrować w IEEE i przypisać do swojej firmy za około 2000 dolarów. Pozostałe 24 bity, robisz co chcesz. Oczywiście możesz zarejestrować kilka OUI, co robią więksi gracze.
Weźmy przykład Intela. Zarejestrowali łącznie 7 OUI, dając im łącznie 116 milionów adresów.
Płyta główna mojego komputera (używająca chipsetu X99) oraz płyta główna mojego laptopa, a także płyta główna każdego komputera z procesorem x86, którego posiadałem w ciągu ostatnich 10-15 lat, posiadała kartę sieciową Intel jako część chipsetu. Z pewnością na świecie jest ponad 116 milionów komputerów z procesorami Intel. Tak więc ich MAC-y nie mogą być unikalne (w sensie unikalności globalnej).
Zgłoszono również przypadki ... tańsze ... producenci po prostu „kradną” adresy z cudzego OUI. Innymi słowy, użyli tylko losowego adresu. Słyszałem o producentach, którzy po prostu używają tego samego adresu, aby uzyskać pełną gamę produktów. Żadna z tych rzeczy nie jest zgodna ani nie ma sensu, ale co możesz z tym zrobić. Te karty sieciowe istnieją. Ponownie: Prawdopodobieństwo, że stanie się to problemem praktycznym, jest nadal bardzo niskie, jeśli adresy są używane do tego, do czego są przeznaczone. Musisz mieć dwie z nich w tej samej sieci LAN, aby nawet zauważyć.
Co teraz zrobić z twoim problemem?
Rozwiązanie może być prostsze niż myślisz. Twoje urządzenia IoT będą najprawdopodobniej potrzebowały trochę czasu, zazwyczaj czas jest uzyskiwany automatycznie przez NTP. Typowa precyzja NTP jest w zakresie mikrosekund (tak, to jest mikro, a nie milli). Po prostu pobiegłem, ntpq -c rl
żeby być pewnym i powiedziano mi 2 -20 .
Prawdopodobieństwo, że dwa urządzenia zostaną włączone po raz pierwszy z taką samą mikrosekundą, jest bardzo niskie. Zwykle jest to możliwe (szczególnie, jeśli sprzedasz miliony z nich w bardzo krótkim czasie, gratuluję sukcesu!). Ale to mało prawdopodobne - w praktyce tak się nie stanie. Oszczędzaj więc czas po pierwszym uruchomieniu w stałym sklepie.
Czas rozruchu urządzenia IoT będzie taki sam na każdym urządzeniu. Tyle że wcale nie jest to prawdą .
Biorąc pod uwagę zegar o wysokiej rozdzielczości, czasy rozruchu są wymiernie różne nawet na tym samym urządzeniu, za każdym razem. Może tylko kilka taktów zegara różni się (lub kilkaset tysięcy, jeśli czytasz coś takiego jak licznik znaczników czasu procesora), więc zupełnie nie jest to wyjątkowe, ale z pewnością dodaje pewną entropię.
Podobnie czas connect
powrotu do pierwszego dostępu do witryny API będzie nieznacznie, ale wymiernie, za każdym razem inny. Podobnie, getaddrinfo
po raz pierwszy zajmiemy się nieco innym, wymiernym czasem dla każdego urządzenia podczas wyszukiwania nazwy hosta API.
Połącz te trzy lub cztery źródła entropii (adres MAC, czas pierwszego włączenia, czas rozruchu po raz pierwszy, czas połączenia) i oblicz z tego hash. W tym celu MD5 będzie dobrze. Tam jesteś wyjątkowy.
Mimo, że nie naprawdę gwarantują wyjątkowość, to „dość dużo” gwarantuje to, ze neglegible przypadek awarii. Musiałbyś mieć dwa urządzenia z identycznymi MAC-ami, które są włączane po raz pierwszy na tej samej mikrosekundie, i potrzebowały dokładnie tego samego czasu na uruchomienie i połączenie się z witryną. To się nie wydarzy. Jeśli tak się stanie, powinieneś natychmiast rozpocząć grę na loterii, ponieważ na wszystkie sposoby masz pewność, że wygrasz.
Jeśli jednak „nie zdarzy się” nie jest wystarczające jako gwarancja, wystarczy przekazać każdemu urządzeniu kolejno rosnącą liczbę (generowaną na serwerze) przy pierwszym dostępie do interfejsu API sieci. Pozwól urządzeniu zapisać ten numer.