MAC adresleri benzersiz değil
MAC'ler olabilir ve çoğaltılır. Bunun birkaç nedeni vardır, bunlardan biri (küresel olarak) benzersiz olmaları gerekmez .
MAC yerel ağda benzersiz olmalıdır, bu yüzden ARP / NDP işini yapabilir ve anahtar gelen datagramların nereye gönderileceğini bilir. Genellikle (zorunlu olarak değil), önkoşul yerine getirilir ve işler aynı şekilde çalışır, çünkü benzersiz olmasalar bile, aynı LAN'da iki özdeş MAC'ye sahip olma olasılığı oldukça düşüktür.
Başka bir neden, adreslerden daha fazla cihaz olması. 48 bit adresler gün sonuna kadar herkes için yeterli adres varmış gibi görünse de durum böyle değil.
Adres alanı iki adet 24 bit yarıya bölünür (biraz daha karmaşıktır, ancak küçük ayrıntıları görmezden gelelim). Bir yarısı, IEEE'ye kaydolabileceğiniz ve şirketinize yaklaşık 2000 dolar için atayabileceğiniz OUI'dir. Kalan 24 bit, ne istersen yaparsın. Tabii ki daha büyük oyuncuların yaptığı birkaç OUI kaydedebilirsiniz.
Intel'i örnek olarak alalım. Toplam 7 OUI kaydettiler ve onlara toplam 116 milyon adres verdi.
Bilgisayarımın anakartı (X99 yonga seti kullanan) ve dizüstü bilgisayarımın anakartı ve son 10-15 yıl içinde sahip olduğum her x86 tabanlı bilgisayarın anakartı , yonga setinin bir parçası olarak bir Intel ağ kartına sahipti. Elbette dünyada 116 milyondan fazla Intel tabanlı bilgisayar var. Bu nedenle, MAC'leri muhtemelen benzersiz olamaz (küresel olarak benzersiz bir anlamda).
Ayrıca, vakalar uh ... ucuz ... üreticilerin sadece bir başkasının OUI adreslerini "çalmak" bildirilmiştir. Başka bir deyişle, sadece rastgele bir adres kullandılar. Tam bir ürün yelpazesi için de aynı adresi kullanan üreticileri duydum. Bunların hiçbiri gerçekten uyumlu değildir veya çok anlamlı değildir, ancak bu konuda ne yapabilirsiniz? Bu ağ kartları var. Yine: Adresler amaçlandıkları şekilde kullanılıyorsa, pratik bir sorun haline gelme olasılığı hala çok düşüktür , hatta fark etmek için ikisinin aynı LAN'da olması gerekir.
Şimdi, probleminiz hakkında ne yapmalı?
Çözüm düşündüğünüzden daha basit olabilir. IoT cihazlarınızın büyük olasılıkla bir zaman kavramına ihtiyacı olacaktır, genellikle zaman otomatik olarak NTP aracılığıyla alınır. NTP'nin tipik hassasiyeti mikrosaniye aralığındadır (evet, bu mikro değil, mili değil). Sadece koştum ntpq -c rl
emin olmak için ve 2 söylendi -20 .
Aynı mikrosaniyede iki cihazınızın ilk kez açılması ihtimali çok düşüktür. Genellikle gerçekleşmesi mümkündür (özellikle milyonları çok kısa sürede satarsanız, başarınız için tebrikler!), Elbette. Ama bu pek olası değil - pratikte olmayacak. Böylece, kalıcı mağazada önyükleme yaptıktan sonra zaman kazanın.
IoT cihazınızın önyükleme süresi her cihazda aynı olacaktır. Ancak bu hiç doğru değil .
Yüksek çözünürlüklü bir zamanlayıcı göz önüne alındığında, önyükleme süreleri her seferinde aynı cihazda bile ölçülebilir derecede farklıdır. Belki sadece birkaç saat keneler farklı (veya CPU'nun zaman damgası sayacı gibi bir şey okursanız birkaç yüz bin), bu yüzden tamamen benzersiz değil, ama kesinlikle biraz entropi ekliyor.
Benzer şekilde, connect
API sitenize ilk kez eriştiğinizde geri dönüş süresi her seferinde biraz, ancak ölçülebilir şekilde farklı olacaktır. Benzer şekilde, getaddrinfo
web API'nızın ana makine adını ilk kez ararken her cihaz için biraz farklı, ölçülebilir bir zaman alacaktır.
Bu üç veya dört entropi kaynağını (MAC adresi, ilk açılış zamanı, ilk kez önyükleme zamanı, bağlantı zamanı) birleştirin ve bundan bir karma hesaplayın. MD5 bu amaç için gayet iyi olacak. Orada eşsizsiniz.
Bu benzersizliği gerçekten garanti etmese de , anlaşılır bir başarısızlık şansı ile "hemen hemen" bunu garanti eder. Aynı mikrosaniyede ilk kez açılan ve aynı önyükleme yapan ve sitenize bağlanan aynı MAC'lara sahip iki cihazınız olması gerekir. Bu olmayacak. Eğer olursa, hemen piyango oynamaya başlamalısınız çünkü tüm maçlarda kazanacağınız garantilidir.
Bununla birlikte, "olmayacak" bir garanti olarak yeterince iyi değilse, web API'nize ilk kez eriştiklerinde her cihazı sıralı olarak artan bir sayı (sunucuda oluşturulan) iletin. Cihaz bu numarayı saklasın, bitti.