Địa chỉ MAC không phải là duy nhất
Có thể có, và sẽ trùng lặp với MAC. Có một số lý do cho điều đó, một lý do là chúng không cần phải là duy nhất (trên toàn cầu).
MAC phải là duy nhất trên mạng cục bộ, vì vậy ARP / NDP có thể thực hiện công việc của nó và công tắc biết nơi gửi các datagram đến. Thông thường (không nhất thiết) điều kiện tiên quyết được thực hiện và mọi thứ hoạt động tốt, đơn giản vì khả năng có hai MAC giống nhau trên cùng một mạng LAN, ngay cả khi chúng không phải là duy nhất, là khá thấp.
Một lý do khác là đơn giản là tồn tại nhiều thiết bị hơn là có địa chỉ. Mặc dù địa chỉ 48 bit nghe có vẻ như có đủ địa chỉ cho mọi người cho đến cuối ngày, nhưng thực tế không phải vậy.
Không gian địa chỉ được chia thành hai nửa 24 bit (phức tạp hơn một chút, nhưng hãy bỏ qua các chi tiết nhỏ nhặt). Một nửa là OUI mà bạn có thể đăng ký với IEEE và chỉ định cho công ty của bạn khoảng 2000 đô la. 24 bit còn lại, bạn làm bất cứ điều gì bạn muốn. Tất nhiên bạn có thể đăng ký một số OUI, đó là những gì người chơi lớn hơn làm.
Lấy Intel làm ví dụ. Họ đã đăng ký tổng cộng 7 OUI, cung cấp cho họ tổng cộng 116 triệu địa chỉ.
Mainboard của máy tính của tôi (sử dụng chipset X99) cũng như mainboard của máy tính xách tay của tôi cũng như mainboard của mọi máy tính dựa trên x86 mà tôi sở hữu trong suốt 10-15 năm qua đã có card mạng Intel như một phần của chipset. Chắc chắn có hơn 116 triệu máy tính dựa trên Intel trên thế giới. Do đó, MAC của họ không thể là duy nhất (theo nghĩa duy nhất trên toàn cầu).
Ngoài ra, các trường hợp đã được báo cáo về việc ... rẻ hơn ... các nhà sản xuất chỉ đơn giản là "đánh cắp" địa chỉ từ OUI của người khác. Nói cách khác, họ chỉ sử dụng một số địa chỉ ngẫu nhiên. Tôi cũng đã nghe nói về các nhà sản xuất chỉ sử dụng cùng một địa chỉ cho một phạm vi sản phẩm hoàn chỉnh. Điều đó không thực sự phù hợp hoặc có nhiều ý nghĩa, nhưng bạn có thể làm gì về nó. Những card mạng tồn tại. Xin nhắc lại: Khả năng nó trở thành một vấn đề thực tế vẫn còn rất thấp nếu địa chỉ được sử dụng cho mục đích của chúng, bạn cần phải có hai trong số chúng trên cùng một mạng LAN để nhận thấy.
Bây giờ, phải làm gì về vấn đề của bạn?
Giải pháp có thể đơn giản hơn bạn nghĩ. Các thiết bị IoT của bạn có thể sẽ cần một số khái niệm về thời gian, thông thường thời gian sẽ tự động có được thông qua NTP. Độ chính xác điển hình của NTP là trong phạm vi micro giây (vâng, đó là vi mô chứ không phải milli). Tôi chỉ chạy ntpq -c rl
để chắc chắn và được bảo 2 -20 .
Khả năng hai thiết bị của bạn được bật lần đầu tiên ở cùng một micrô giây chính xác là rất thấp. Điều đó thường có thể xảy ra (đặc biệt là nếu bạn bán hàng triệu trong số đó trong một thời gian rất ngắn, xin chúc mừng thành công của bạn!), Chắc chắn. Nhưng nó không có khả năng lắm - trong thực tế nó sẽ không xảy ra. Vì vậy, tiết kiệm thời gian sau lần khởi động đầu tiên trên cửa hàng vĩnh viễn.
Thời gian khởi động của thiết bị IoT của bạn sẽ giống nhau trên mọi thiết bị. Ngoại trừ điều đó không đúng chút nào .
Với bộ hẹn giờ độ phân giải cao, thời gian khởi động khác nhau đáng kể ngay cả trên cùng một thiết bị, mọi lúc. Có thể chỉ một vài đồng hồ tích tắc khác nhau (hoặc vài trăm nghìn, nếu bạn đọc thứ gì đó như bộ đếm thời gian của CPU), vì vậy không hoàn toàn độc đáo, nhưng nó chắc chắn sẽ thêm một số entropy.
Tương tự, thời gian cần connect
để quay lại lần đầu tiên bạn truy cập trang web API của mình sẽ hơi khác nhau, nhưng có thể đo được, mỗi lần khác nhau. Tương tự, getaddrinfo
sẽ mất một lượng thời gian hơi khác nhau, có thể đo được cho mọi thiết bị khi lần đầu tiên tìm kiếm tên máy chủ API web của bạn.
Kết hợp ba hoặc bốn nguồn entropy đó (địa chỉ MAC, thời gian bật nguồn lần đầu tiên, thời gian khởi động lần đầu tiên, kết nối thời gian) và tính toán một hàm băm từ đó. MD5 sẽ làm tốt cho mục đích đó. Ở đó, bạn là duy nhất.
Mặc dù điều đó không thực sự đảm bảo tính duy nhất, nhưng "khá nhiều" đảm bảo nó, với một cơ hội thất bại có thể phủ nhận. Bạn sẽ phải có hai thiết bị có MAC giống hệt nhau được bật lần đầu tiên trên cùng một micro giây và mất cùng thời gian để khởi động và kết nối với trang web của bạn. Điều đó sẽ không xảy ra. Nếu điều đó xảy ra, bạn nên bắt đầu chơi xổ số ngay lập tức bởi vì trong tất cả các lần xuất hiện, bạn được đảm bảo sẽ giành chiến thắng.
Tuy nhiên, nếu "sẽ không xảy ra" là không đủ đảm bảo, chỉ cần chuyển cho mỗi thiết bị một số tăng liên tục (được tạo trên máy chủ) trong lần đầu tiên chúng truy cập API web của bạn. Hãy để thiết bị lưu số đó, xong.