Evde epey cihaz birikmiş: ampuller, robot süpürge, kameralar, yazıcı, iki bilgisayar, telefonlar, bir priz, bir sıcaklık sensörü.
Basit bir soru: şu an ağda ne var? Kendime bir panel yazmaya karar verdim. Başladığım yer yanlıştı.
İlk deneme: TCP
Mantık şuydu: 1’den 254’e her adrese birkaç yaygın porttan bağlanmayı dene. Cevap veren varsa cihaz var demektir.
254 adres × 4 port = 1016 bağlantı denemesi
her başarısız deneme ≈ 1 sn zaman aşımı
Eşzamanlı yapınca hızlanır diye düşündüm. Windows’ta iki duvara çarptım:
- Yarı açık bağlantı kotası. İşletim sistemi aynı anda kurulmayı bekleyen bağlantı sayısını sınırlıyor; sınırın üstüne çıkınca yenileri kuyruğa giriyor.
- Soketi kapatmak bloke ediyor. Zaman aşımına uğramış bir soketi kapatma çağrısı hemen dönmüyordu. Taramanın ilerlemiyor görünmesinin sebebi buydu — iş bitmiş, temizlik takılmıştı.
Altı dakika sonra ilerleme %18’deydi. Durdurdum.
Eşzamanlılık sınırsız artırılamaz: select tabanlı bekleme FD_SETSIZE ile sınırlıdır ve üstünde davranış tanımsızlaşır. Çözüm daha çok soket açmak değil, açık soket sayısını tavanın altında tutan bir havuz.
Bir katman aşağı
Sonra bariz olanı fark ettim: cihaz keşfi bir taşıma katmanı işi değil.
TCP iki uç arasında bağlantı kurma protokolü. Ben bağlantı kurmak istemiyorum; orada bir şey olup olmadığını bilmek istiyorum. O bilgi bir alt katmanda zaten mevcut: aynı yerel ağdaki iki cihaz konuşmak için MAC adresine ihtiyaç duyar, bu eşlemeyi ARP yapar, ve işletim sistemi sonucu bir tabloda tutar.
# alt ağa kısa ping süpürmesi — cevap beklemeden
for ip in 192.168.1.1..254: ping -n 1 -w 100 $ip
# işletim sisteminin zaten doldurduğu tabloyu oku
arp -a
192.168.1.1 a4-2b-8c-… dinamik ← modem
192.168.1.34 ec-fa-bc-… dinamik ← Espressif (ampul)
192.168.1.51 28-6d-97-… dinamik ← Xiaomi (süpürge)
…
Üç saniye. Kırk bir cihaz.
Üstelik fazladan bir bilgiyle: MAC adresinin ilk üç baytı üreticiye tahsisli ve halka açık bir listede kayıtlı. Yani markası, hiçbir şey sormadan adresin kendisinden çıkıyor.
İsim nereden gelir
“Espressif” kullanıcı için bir şey ifade etmiyor. İsim için üç kaynağı sırayla deniyorum: ters DNS (modem kayıt tutuyorsa), mDNS (cihazın kendisi bildiriyorsa), NetBIOS (Windows makineler).
Üçü de başarısız olursa cihaz “bilinmeyen” kalıyor ve üretici adıyla gösteriliyor. Uydurma isim üretmiyorum — panelde “muhtemelen kamera” yazan bir satır, olmayan bir kameradan daha kötü.
Port taraması sonra gelir
Port taraması yanlış bir araç değildi; yanlış sıradaydı. Önce kimin var olduğunu bul, sonra sadece var olanların portlarına bak. 254 adres yerine 41 cihaz taranınca iş yönetilebilir hale geliyor.
Sonuçlar öğretici oldu. Bir kamera kimlik doğrulaması olmadan bir akış sunuyordu. Bir cihaz yönetim arayüzünü şifresiz açmıştı. Bir başkası, sertifikası üç yıl önce dolmuş bir HTTPS servisi çalıştırıyordu.
Ev ağı bir güvenlik sınırı değil. Sadece bir dolap — kapısı kapalı ama kilidi yok.
Ne öğrendim
Bir problemi çözerken ilk soru “hangi araç?” değil, “hangi katman?”
Cevabı bir üst katmanda aramaya kalkarsan yapman gereken iş artıyor, doğruluk azalıyor ve işletim sisteminin sınırlarına tosluyorsun. Cevap zaten bir alt katmanda üretilmişse, senin işin onu üretmek değil okumak.
Altı dakika ile üç saniye arasındaki fark daha iyi bir algoritma değildi. Doğru katmandı.