9.20. Özet

Bir ağ mesajının kameradan dünyanın geri kalanına giderken aştığı katmanları baştan sona gezdiniz:

  • Motivasyon – ağlar var çünkü birkaçtan fazla cihazın konuşması gerektiği anda, ya da karşı taraf aynı kabloda olmadığında, ya da birçok program aynı bağlantıyı aynı anda paylaştığında noktadan noktaya kablolama ölçeklenmeyi durdurur. Cevap, paylaşılan ortam, mantıksal adresler ve yönlendirmedir.

  • Katmanlı model – her biri tek bir sorunu çözen ve bir sonrakine temiz bir arayüz sunan beş katman. Fiziksel ve bağlantı katmanları, hemen komşular arasındaki bitleri ve çerçeveleri ele alır, ağ katmanı internet genelinde adresleme ve yönlendirmeyi ele alır, taşıma katmanı programdan programa teslimatı ele alır ve uygulama protokolleri tüm bunların üzerine inşa edilir.

  • Alt katmanlar – pratik bağlantı teknolojileri olarak Ethernet ve Wi-Fi; MAC adresleri yerel bir segmentteki donanımı tanımlar. Kameranın network modülü, bilmeye değer tek bir düğme açığa çıkarır: hangi Wi-Fi ağına katılınacağı. Bundan sonra, alttaki her şey otomatiktir.

  • Ağ katmanı (IP) – IPv4 ve IPv6 adresleri, ana bilgisayarları hangi kabloya takılı olduklarından bağımsız olarak tanımlar. Yönlendiriciler, paketleri varana kadar yerel segmentler arasında sektirir. Özel adres aralıkları ve NAT, ev ve ofis ağlarının kendi dahili adres alanlarına ve kenarda paylaşılan tek bir genel adrese sahip olmasının nedenidir; giden trafik serbestçe çalışır, gelen trafik yardıma ihtiyaç duyar.

  • Taşıma katmanı – portlar, bir ana bilgisayar içindeki programları tanımlar; tam (IP, port) çifti tek bir belirli soketi tanımlar. UDP, hiçbir garanti olmadan tek seferde kendi kendine yeten bir veri birimi gönderen ince bir katmandır – hızlı, ucuz ve kaybın kabul edilebilir olduğu durumda doğru araç. TCP, bağlantı yönelimli, güvenilir, sıralı bir bayt akışıdır – internet trafiğinin çoğu için iş atı, bir gidiş-dönüşlük el sıkışma gecikmesi karşılığında.

  • Python API’sisocket.socket, her iki protokol için de tek sınıftır. UDP için sendto() / recvfrom(); TCP için bağlan-ya-da-dinle desenleri artı send() / recv(). Soketler asyncio ile temiz bir şekilde eşleşir: asyncio.open_connection() ve asyncio.start_server() her TCP bağlantısına bir okuyucu/yazıcı çifti verir, böylece birçok eşzamanlı konuşma iş parçacığı (threading) kullanmadan tek bir olay döngüsünü paylaşır.

  • Adlar ve zamansocket.getaddrinfo(), example.com gibi bir adı, bir sokete teslim edilmeye hazır bir IP adresine dönüştürür. network.hostname(), kameranın kendi adını ayarlar; yönlendiriciler bu adı yerel DNS’leri altında kaydeder ve kameranın yerleşik mDNS yanıtlayıcısı bunu <name>.local olarak yanıtlar. ntptime.settime(), aynı “ağda bir şey ara” fikrinin duvar saati zamanına uygulanmış halidir; yerleşik saati genel bir NTP sunucusundan UTC’ye ayarlar.

  • Şifrelemessl, bir soketi TLS ile sarar. Kamera, hiçbir sertifika otoritesi deposu olmadan gelir, dolayısıyla kutudan çıktığı haliyle yalnızca şifreleme elde edersiniz – konuşma artık açık değildir, ancak kamera kimin yanıt verdiğini doğrulamaz. Gerçek kimlik doğrulama için – genel HTTPS sunucularını doğrulama, kamerayı bir TLS sunucusu olarak çalıştırma, karşılıklı TLS – sertifika tabanlı iş akışı TLS sertifikalarıyla çalışma sayfasında ele alınmıştır. DTLS (UDP üzerinden TLS), aynı modülü aynı şekilde kullanır.

  • Gerçek bir uygulama protokolü – altındaki her katmanın birbirine bağlandığı çalışılmış örnek olarak MQTT. 1 baytlık bir tür-ve-bayraklar baytı, değişken uzunluklu bir kalan-uzunluk alanı, uzunluk önekli bir UTF-8 konusu ve yük; hepsi, mesajı konudaki her aboneye dağıtan bir aracıya (broker) TCP üzerinden (ve isteğe bağlı olarak TLS içinde) ilerler. Birlikte gelen mqtt istemcisi, kablo formatını tek oturuşta okunacak kadar küçük bir connect / publish / subscribe API’sinde sarmalar.

Bu, diğer makinelerle konuşan, uzak hizmetlere veri yayınlayan, yerel ağdaki istemcilerden bağlantı kabul eden ve tüm bunları kameranın geri kalan işiyle eşzamanlı olarak yapan kamera uygulamaları yazmak için yeterlidir.

9.20.1. Bu referansı daha sonra kullanmak

Ağ bölümlerine referans materyali olarak yaklaşın; bir UDP dinleyicisinin ya da asyncio ile TLS deseninin tam şekli için geri dönmek, amaçlanan kullanımdır. network — ağ yapılandırması, socket — socket modülü, ssl — SSL/TLS modülü ve ntptime — basit NTP istemcisi referans sayfaları, soru sadece “bu çağrının tam adı nedir” olduğunda her yöntemi, bayrağı ve sabiti tek bir yerde listeler.

9.20.2. Buradan nereye gidilir

Web sunucuları, bir sonraki büyük konudur. Soketler çalışırken ve TLS kullanılabilirken, bir üst doğal katman bunların üzerine inşa edilen protokollerdir: içerik ve API’leri sunmak için HTTP, bağlantıları her iki yönde açık tutmak için WebSocket’ler ve şablon kodu gizleyen küçük çerçeveler. Bu bölümdeki her şey ileriye taşınır – ne de olsa bir web sunucusu, kabul ettiği soketlerde HTTP konuşan, çoğunlukla tüm her şeyi TLS ile saran bir TCP sunucusundan başka bir şey değildir.