Gli indirizzi MAC non sono univoci
Ci possono essere e saranno duplicati con i MAC. Ci sono diverse ragioni per ciò, una delle quali non deve essere (globalmente) unica.
Il MAC deve essere univoco sulla rete locale, quindi ARP / NDP può fare il suo lavoro e lo switch sa dove inviare i datagrammi in entrata. Di solito (non necessariamente) tale condizione è soddisfatta e le cose funzionano bene, semplicemente perché la probabilità di avere due MAC identici sulla stessa LAN, anche se non sono univoci, è piuttosto bassa.
Un altro motivo è che esistono semplicemente più dispositivi di quanti siano gli indirizzi. Mentre gli indirizzi a 48 bit sembrano avere abbastanza indirizzi per tutti fino alla fine dei giorni, non è così.
Lo spazio degli indirizzi è diviso in due metà a 24 bit (è leggermente più complicato, ma ignoriamo i piccoli dettagli). La metà è l'OUI che puoi registrare presso l'IEEE e assegnare alla tua azienda per circa 2000 dollari. I restanti 24 bit, fai quello che vuoi. Ovviamente puoi registrare diversi OUI, che è quello che fanno i giocatori più grandi.
Prendi Intel come esempio. Hanno registrato un totale di 7 OUI, dando loro un totale di 116 milioni di indirizzi.
La scheda madre del mio computer (che utilizza un chipset X99), nonché la scheda madre del mio laptop e la scheda madre di ogni computer basato su x86 di mia proprietà negli ultimi 10-15 anni, avevano una scheda di rete Intel come parte del chipset. Certamente ci sono più di 116 milioni di computer basati su Intel nel mondo. Pertanto, i loro MAC non possono essere unici (nel senso di globalmente unici).
Inoltre, sono stati segnalati casi di ... più economici ... produttori che semplicemente "rubano" indirizzi dall'OUI di qualcun altro. In altre parole, hanno appena usato un indirizzo casuale. Ho sentito parlare di produttori che usano lo stesso indirizzo anche per una gamma completa di prodotti. Niente di tutto ciò è veramente conforme o ha molto senso, ma cosa puoi fare al riguardo. Queste schede di rete esistono. Ancora una volta: la probabilità che diventi un problema pratico è ancora molto bassa se gli indirizzi vengono utilizzati per quello che sono destinati, è necessario averne due sulla stessa LAN per notarlo.
Ora, cosa fare del tuo problema?
La soluzione è forse più semplice di quanto pensi. Molto probabilmente i tuoi dispositivi IoT avranno bisogno di un po 'di tempo, di solito il tempo viene automaticamente ottenuto tramite NTP. La precisione tipica di NTP è nell'intervallo dei microsecondi (sì, è micro, non milli). Ho appena corso ntpq -c rl
per essere sicuro e mi è stato detto 2-20 .
La probabilità che due dei tuoi dispositivi vengano accesi per la prima volta nello stesso preciso microsecondo è molto bassa. In genere è possibile che accada (soprattutto se ne vendi milioni in poco tempo, congratulazioni per il tuo successo!), Certo. Ma non è molto probabile - in pratica non accadrà. Pertanto, risparmia tempo dopo il primo avvio nel negozio permanente.
Il tempo di avvio del dispositivo IoT sarà lo stesso su tutti i dispositivi. Solo che non è affatto vero .
Dato un timer ad alta risoluzione, i tempi di avvio sono misurabili in modo diverso anche sullo stesso dispositivo, ogni volta. Forse è solo qualche segno di spunta diverso (o qualche centinaio di migliaia, se leggi qualcosa come il contatore del timestamp della CPU), quindi non del tutto univoco, ma aggiunge sicuramente un po 'di entropia.
Allo stesso modo, il tempo necessario connect
per tornare la prima volta che accedi al tuo sito API sarà leggermente, ma misurabile, diverso ogni volta. Allo stesso modo, getaddrinfo
ci vorrà un tempo leggermente diverso e misurabile per ogni dispositivo quando si cerca per la prima volta il nome host dell'API Web.
Concatena queste tre o quattro fonti di entropia (indirizzo MAC, ora della prima accensione, tempo di avvio per la prima volta, tempo di connessione) e calcola un hash da quello. MD5 farà proprio bene a tale scopo. Ecco, sei unico.
Sebbene ciò non garantisca veramente l' unicità, "praticamente" lo garantisce, con una trascurabile possibilità di fallimento. Dovresti avere due dispositivi con MAC identici che vengono accesi per la prima volta nello stesso microsecondo e che richiedono lo stesso tempo per l'avvio e la connessione al tuo sito. Non succederà. Se ciò dovesse accadere, dovresti immediatamente iniziare a giocare alla lotteria perché, in tutte le apparenze, sei sicuro di vincere.
Se, tuttavia, "non accadrà" non è abbastanza valido come garanzia, è sufficiente passare ogni dispositivo un numero progressivamente crescente (generato sul server) la prima volta che accedono all'API Web. Lascia che il dispositivo memorizzi quel numero, fatto.