MAC 주소는 고유하지 않습니다
MAC과 중복 될 수 있습니다. 그 이유는 여러 가지가 있습니다. 하나는 (전 세계적으로) 고유 할 필요가 없기 때문 입니다.
MAC은 로컬 네트워크에서 고유해야하므로 ARP / NDP가 작업을 수행 할 수 있으며 스위치는 들어오는 데이터 그램을 전송할 위치를 알고 있습니다. 일반적으로 (필요하지는 않지만) 전제 조건이 충족되고 상황이 정상적으로 작동합니다. 단순히 동일한 LAN에 두 개의 동일한 MAC이 고유하지는 않더라도 매우 낮기 때문입니다.
또 다른 이유는 단순히 주소보다 많은 장치가 존재하기 때문입니다. 48 비트 주소는 끝날 때까지 모든 사람에게 충분한 주소가있는 것처럼 들리지만 그렇지 않습니다.
주소 공간은 2 개의 24 비트 반으로 나뉩니다 (약간 더 복잡하지만 작은 세부 사항은 무시합시다). 절반은 IEEE에 등록하고 회사에 약 2000 달러를 할당 할 수있는 OUI입니다. 나머지 24 비트는 원하는대로합니다. 물론 여러 OUI를 등록 할 수 있으며, 이는 더 큰 플레이어가하는 일입니다.
인텔을 예로 들어 보겠습니다. 총 7 개의 OUI를 등록하여 총 1 억 1,600 만 개의 주소를 제공합니다.
내 컴퓨터의 메인 보드 (X99 칩셋 사용)와 노트북의 메인 보드 및 지난 10-15 년 동안 소유 한 모든 x86 기반 컴퓨터 의 메인 보드 는 칩셋의 일부로 인텔 네트워크 카드를 가지고있었습니다. 확실히 세계에는 1 억 1 천 6 백만 대 이상의 인텔 기반 컴퓨터가 있습니다. 따라서 MAC 은 고유 할 수 없습니다 (전 세계적으로 고유 한 의미로).
또한, 더 싸고 ... 제조업체가 단순히 다른 사람의 OUI로부터 주소를 "스털링"하는 사례도보고되었습니다. 즉, 그들은 단지 임의의 주소를 사용했습니다. 전체 제품군에 동일한 주소를 사용하는 제조업체에 대해서도 들었습니다. 그 중 어느 것도 실제로 적합하거나 많은 의미가 없지만, 그것에 대해 무엇을 할 수 있습니까? 이 네트워크 카드가 존재합니다. 다시 : 주소가 의도 한대로 사용되는 경우 실제 문제가 될 가능성 은 여전히 매우 낮 습니다. 동일한 LAN에 두 개가 있어야 통지 할 수 있습니다.
이제 문제에 대해 어떻게해야합니까?
해결책은 생각보다 간단 할 것입니다. IoT 장치에는 시간 개념이 필요할 것입니다. 일반적으로 시간은 NTP를 통해 자동으로 얻습니다. NTP의 일반적인 정밀도는 마이크로 초 범위 (예, 밀리미터가 아닌 마이크로 미터)입니다. 나는 방금 달려서 2-20ntpq -c rl
으로 들었다 .
두 장치가 정확히 동일한 마이크로 초에 처음으로 켜질 가능성은 매우 낮습니다. 일반적으로 일어날 수 있습니다 (특히 짧은 시간에 수백만 대를 판매하는 경우 성공을 축하합니다!). 그러나 실제로는 그렇지 않을 것입니다. 따라서 영구 저장소에서 처음 부팅 한 후 시간을 절약하십시오.
IoT 장치의 부팅 시간은 모든 장치에서 동일합니다. 그건 사실이 아닙니다 .
고해상도 타이머가 주어지면 부팅 시간은 매번 같은 장치에서도 측정 할 수있는 차이가 있습니다. CPU의 타임 스탬프 카운터와 같은 것을 읽는 경우 수십만 개의 클록 틱 만 다르므로 매우 독특하지는 않지만 엔트로피가 추가됩니다.
마찬가지로 connect
API 사이트에 처음 액세스 할 때 반환하는 데 걸리는 시간은 매번 약간 씩 다르지만 측정 가능할 수 있습니다. 마찬가지로 getaddrinfo
웹 API의 호스트 이름을 처음으로 검색 할 때 모든 기기에 대해 약간 다른 측정 시간이 걸립니다.
엔트로피의 3 ~ 4 가지 소스 (MAC 주소, 최초 전원 공급 시간, 처음 부팅 시간, 연결 시간)를 연결하고 해시를 계산하십시오. MD5는 그 목적에 적합합니다. 당신은 독특합니다.
이것이 고유성을 실제로 보장 하지는 않지만 무시할 수없는 실패 가능성으로 "거의"보장합니다. 동일한 마이크로 초에 처음으로 켜진 동일한 MAC을 가진 두 개의 장치가 있어야하고, 부팅하고 사이트에 연결하는 데 정확히 같은 시간이 걸렸습니다. 그런 일은 일어나지 않을 것입니다. 그것이 발생하면 모든 출연으로 인해 복권을 즉시 시작해야합니다. 승리가 보장됩니다.
그러나 "발생하지 않을 것"이 보장만큼 충분하지 않은 경우, 처음으로 웹 API에 액세스 할 때 각 장치를 순차적으로 증가하는 수 (서버에서 생성됨)를 전달하십시오. 장치가 해당 번호를 저장하게하십시오.