MAC-адреси не є унікальними
Можливо, будуть і будуть дублікати з MAC. Причин для цього є кілька, одна з яких - їх не потрібно (глобально) унікальними.
MAC повинен бути унікальним у локальній мережі, тому ARP / NDP може виконувати свою роботу, і комутатор знає, куди надсилати вхідні дейтаграми. Зазвичай (не обов'язково), що попередня умова виконується, і все працює нормально, просто тому, що ймовірність наявності двох однакових MAC в одній локальній мережі, навіть якщо вони не унікальні, досить низька.
Ще одна причина полягає в тому, що просто існує більше пристроїв, ніж є адреси. У той час як 48 бітові адреси звучать так, що достатньо адрес для всіх до кінця днів, це не так.
Адресний простір розділений на дві 24-бітні половинки (це трохи складніше, але давайте ігнорувати дрібні деталі). Половина - це OUI, який ви можете зареєструвати в IEEE та призначити вашій компанії приблизно 2000 доларів. Решта 24 біта ви робите все, що завгодно. Звичайно, ви можете зареєструвати кілька OUI, що і роблять більші гравці.
Візьмемо Intel як приклад. Вони зареєстрували загалом 7 OUI, надавши їм загалом 116 мільйонів адрес.
Материнська плата мого комп'ютера (для якої використовується чіпсет X99), а також материнська плата мого ноутбука, а також материнська плата кожного комп'ютера на базі x86, яким я володів протягом останніх 10-15 років, була мережевою карткою Intel як частина чіпсета. Звичайно, у світі набагато більше 116 мільйонів комп'ютерів на базі Intel. Таким чином, їх MAC неможливо бути унікальними (у значенні глобально унікальними).
Крім того, було зареєстровано випадки, коли ух ... дешевше ... виробники просто "крадуть" адреси з чужого OUI. Іншими словами, вони просто використовували якусь випадкову адресу. Я чув про виробників, які просто використовують ту саму адресу для повного асортименту товарів. Жодне з цього насправді не відповідає чи має багато сенсу, але що з цим робити. Ці мережеві карти існують. Знову ж таки: ймовірність того, що це стане практичною проблемою, все ще дуже низька, якщо адреси використовуються за тим, що вони призначені, вам потрібно мати дві в одній локальній мережі щоб навіть це помітити.
Тепер, що робити зі своєю проблемою?
Рішення, можливо, простіше, ніж ви думаєте. Вашим пристроям IoT, швидше за все, знадобиться поняття про час, зазвичай час автоматично отримується через NTP. Типова точність NTP знаходиться в діапазоні мікросекунд (так, це мікро, а не мілі). Я просто побіг, ntpq -c rl
щоб бути впевненим, і мені сказали 2 -20 .
Ймовірність першого ввімкнення двох ваших пристроїв при точно такій же мікросекунді дуже низька. Це взагалі може статися (особливо якщо ви продаєте мільйони за дуже короткий час, вітаю з успіхом!), Звичайно. Але це не дуже ймовірно - на практиці це не станеться. Таким чином, заощадите час після першого завантаження на постійному сховищі.
Час завантаження вашого пристрою IoT буде однаковим для кожного пристрою. За винятком того, що це зовсім не так .
Враховуючи таймер високої роздільної здатності, час завантаження помірно відрізняється навіть на одному і тому ж пристрої кожного разу. Це може бути лише декілька годинних відміток (або кілька сотень тисяч, якщо ви читаєте щось на зразок лічильника часових штампів процесора), тож не дуже унікальне, але це, безумовно, додає певної ентропії.
Так само час, який потрібно connect
для повернення першого разу, коли ви отримуєте доступ до свого веб-сайту API, буде дещо іншим, але помірно, різним. Аналогічно, getaddrinfo
для першого пристрою під час першого пошуку пошукового імені вашого веб-API буде потрібно дещо інший вимірний час.
Об’єднайте ці три-чотири джерела ентропії (MAC-адреса, час першого включення, час першого завантаження, підключіть час) та обчисліть хеш з цього. Для цієї мети MD5 буде чудово. Там ти унікальний.
Хоча це і справді не гарантує унікальності, воно "в значній мірі" гарантує це, маючи незначний шанс на провал. Вам потрібно було б мати два пристрої з однаковими МАС-кодами, які вперше вмикаються на одній мікросекунді, і для того, щоб завантажитися та підключитися до вашого сайту, потрібно було точно такий же час. Це не відбудеться. Якщо це все-таки трапиться, вам слід негайно почати грати в лотерею, оскільки, на всі виступи, ви гарантовано виграєте.
Якщо, однак, "не відбудеться" недостатньо гарної гарантії, просто передайте кожен пристрій послідовно збільшуючий номер (генерується на сервері) під час першого доступу до вашого веб-API. Нехай пристрій зберігає цей номер.