Ders 16 / 16
Zaman ve Yönetim Protokolleri
Saat eşitlemenin tek varsayımı ve turun bakışımsızlığı: gidiş ile dönüş gecikmesi eşit değilse saat sapması doğrudan bu farktan doğar ve protokolün elinde farkı görecek hiçbir alan yoktur; yanında yoklayan ile bildiren yönetim modelinin tur ve karar dengesi.
İçindekiler
Önceki iki ders aracının bir iletiden ne okuyabildiğini ölçtü. Okumanın sessiz bir önkoşulu
vardı: bir önbelleğin tazelik ömrü, bir sertifikanın geçerlilik aralığı, bir postanın Date:
alanı — hepsi iki ucun saatinin birbirine yakın olduğunu varsayar.
Saatleri yakınlaştıran protokol, kursun ölçü ekseninin en saf örneğidir: elinde dört zaman damgası vardır ve tek bir turda saat sapmasını kestirir. Kestirim tek bir varsayıma dayanır — gidiş ile dönüş gecikmesinin eşit olduğuna. Bu dersin sorusu, varsayım tutmazsa ne olduğu ve protokolün tutmadığını görüp göremediğidir.
- DG51. Kurgu M04/K03’ün ortak kurgusudur:
istasyon.ornekve bir zaman kaynağı. Gerçek bir zaman sunucusu adı yazılmaz, gerçek bir ağ çağrısı yapılmaz. - DG52. Ölçülen küme 40 turdur. Kâhin kurguyu biz ürettiğimiz için bilinir: sunucu saati istemciden 12,500 ms ileridedir ve gidiş yolu dönüş yolundan 4,000 ms uzundur. Yollar tur başına oynar ama bakışımsızlık sistematiktir; protokol bu iki sayıyı görmez, yalnız dört damgayı görür.
- DG53. Aygıt yönetimi tarafında küme 40 aygıt ve 20 tiklik bir penceredir. Her aygıtın durumu pencere içinde bir kez değişir; ölçü, pencere sonunda yöneticinin doğru durumu bilip bilmediğidir.
- DG54. M03’ün Sistem Yönetimi kursu saat kaymasının günlüklerdeki belirtilerini ölçmüştü; o ölçüm tekrarlanmaz. Buradaki ölçü eşitlemenin kendi hatasıdır.
Dört Damga ve İki Hesap
Saat eşitlemesi tek bir alışverişle yapılır. Her uç, iletiye dokunduğu anda kendi saatini yazar; NTP’nin taşıdığı dört damga budur.
istemci sunucu (zaman kaynağı) | | |-- t1: istemcinin gönderme anı -------->| | t2: sunucunun alma anı | t3: sunucunun gönderme anı |<---------------------------------------| t4: istemcinin alma anı | t1, t4 istemcinin saatinde okunur t2, t3 sunucunun saatinde okunur
Bu döküm çalıştırılmadı; öğretilen biçimdir. İki hesap bu dört sayıdan çıkar:
Birincisi saat sapması (clock offset) kestirimidir, ikincisi turun toplam gecikmesi. İkinci hesap saat sapmasından tümüyle bağımsızdır: sapma bir kez artı bir kez eksi girdiği için düşer. Birinci hesap ise gidiş ile dönüşün eşit olduğunu varsayarak ikiye böler.
Varsayım tutmazsa hatanın kapalı biçimi vardır. Gidiş gecikmesi , dönüş gecikmesi olsun; kestirim ile gerçek sapma arasındaki fark tam olarak şudur:
Yani hata gürültüden değil, turun bakışımsızlığından doğar ve farkın yarısına eşittir.
Ölçüm: Bakışımsızlık
TOHUM = 20260809 SAPMA = 0.0125 # kâhin: sunucu saati istemciden bu kadar ileride (s) BAKISIMSIZLIK = 0.0040 # kâhin: gidiş yolu dönüş yolundan bu kadar uzun (s) def uretec(tohum): d = tohum % 2147483646 + 1 def r(n): nonlocal d d = (d * 48271) % 2147483647 return d % n return r def turlar(sayi=40, tohum=TOHUM): r, liste = uretec(tohum), [] for i in range(sayi): ortak = 0.0150 + 0.0001 * r(9) gidis = ortak + BAKISIMSIZLIK / 2 + 0.00002 * r(7) donus = ortak - BAKISIMSIZLIK / 2 + 0.00002 * r(7) t1 = 100.0 + i t2 = t1 + gidis + SAPMA t3 = t2 + 0.0002 t4 = t3 + donus - SAPMA liste.append((t1, t2, t3, t4)) return liste def kestir(d): t1, t2, t3, t4 = d return ((t2 - t1) + (t3 - t4)) / 2, (t4 - t1) - (t3 - t2) ol = turlar() kestirimler = [kestir(d) for d in ol] hatalar = [s - SAPMA for s, _ in kestirimler] enaz = min(kestirimler, key=lambda x: x[1]) print(f"tur {len(ol)}, gerçek sapma {SAPMA * 1000:.3f} ms, " f"bakışımsızlık {BAKISIMSIZLIK * 1000:.3f} ms") print(f"kestirim ortalaması {sum(s for s, _ in kestirimler) / len(ol) * 1000:.4f} ms") print(f"hata: ortalama {sum(hatalar) / len(hatalar) * 1000:.4f}, " f"en küçük {min(hatalar) * 1000:.4f}, en büyük {max(hatalar) * 1000:.4f} ms") print(f"bakışımsızlığın yarısı {BAKISIMSIZLIK / 2 * 1000:.4f} ms") print(f"en küçük gecikmeli tur: kestirim {enaz[0] * 1000:.4f} ms, " f"hata {(enaz[0] - SAPMA) * 1000:.4f} ms") fark = 0.0 for t1, t2, t3, t4 in ol: sapma_ikiz = ((t2 - t1) + (t3 - t4)) / 2 yari = ((t4 - t1) - (t3 - t2)) / 2 fark = max(fark, abs(t1 + yari + sapma_ikiz - t2), abs(t3 + yari - sapma_ikiz - t4)) print(f"ikiz dünyanın ürettiği damgaların en büyük farkı {fark:.3e} s")
tur 40, gerçek sapma 12.500 ms, bakışımsızlık 4.000 ms kestirim ortalaması 14.4917 ms hata: ortalama 1.9917, en küçük 1.9400, en büyük 2.0400 ms bakışımsızlığın yarısı 2.0000 ms en küçük gecikmeli tur: kestirim 14.4700 ms, hata 1.9700 ms ikiz dünyanın ürettiği damgaların en büyük farkı 2.842e-14 s
Protokolün Göremediği
Kestirimlerin ortalaması 14,4917 ms; gerçek sapma 12,500 ms; hata 1,9917 ms ve bakışımsızlığın yarısı 2,0000 ms. En küçük hata 1,9400, en büyük hata 2,0400 — kırk turun tamamı iki milisaniyenin çevresinde dar bir bantta duruyor. Hatanın rastgele olmadığının kanıtı budur: gürültü olsaydı hatalar sıfırın iki yanına dağılırdı.
Standart iyileştirme çok tur ölçüp en küçük gecikmeli turu seçmektir; en az kuyruklanmış tur en temiz ölçüm sayılır. O tur seçildiğinde hata 1,9917’den 1,9700 ms’ye iniyor. Süzme gürültüyü azaltıyor, bakışımsızlığı azaltmıyor — çünkü bakışımsızlık gürültü değil, yolun kendi özelliğidir.
Son satır işin özü. Aynı dört damgayı üreten ikinci bir dünya kuruldu: orada yol bakışımlı ve sunucunun saati gerçekten 14,4917 ms ileride. İki dünyanın damgaları saniyeye kadar aynı — bu da kayan noktalı sayının kendi çözünürlüğü. Dört damga iki farklı gerçeği ayırt edemez; kestirim yanlış hesaplanmış değildir, ikiz dünyada tam olarak doğrudur.
Bakışımsızlığı gösterecek bir alan olmadığı için bu bir tur borcu bile değil: kaç tur atılırsa atılsın kapanmaz. Kapatmanın yolu protokolün dışındadır — yolun bakışımlı olduğunu başka bir kaynaktan bilmek ya da damgaları yola girmeden önce koymak. Kursun dördüncü okuması burada en keskin biçimini alır: iletide yazanı doğrulayan hiçbir şey yoktur; burada iletide yazan doğrudur ve yine de yetmez.
Yoklayan ile Bildiren
Aygıt yönetimi aynı ekseni başka bir soruyla sorar: bir yönetici kırk aygıtın durumunu nasıl öğrenir. SNMP iki modeli birden tanımlar. Yoklayan modelde yönetici düzenli aralıklarla sorar ve her soru bir gidiş–dönüştür. Bildiren modelde aygıt durumu değişince kendisi haber verir; onaysız biçimi bir tur bile istemez, onaylı biçimi bir onay turu ister.
TOHUM = 20260809 AYGIT, PENCERE = 40, 20 def uretec(tohum): d = tohum % 2147483646 + 1 def r(n): nonlocal d d = (d * 48271) % 2147483647 return d % n return r def olaylar(): r = uretec(TOHUM + 1) return [{"aygit": i + 1, "tik": 1 + r(19), "dustu": r(9) == 0} for i in range(AYGIT)] def yoklama(aralik): tur = dogru = gecikme = 0 for o in olaylar(): tur += PENCERE // aralik gorulen = ((o["tik"] - 1) // aralik + 1) * aralik if gorulen <= PENCERE: dogru += 1 gecikme += gorulen - o["tik"] return tur, dogru, gecikme / max(dogru, 1) def bildirim(onayli): dusen = sum(x["dustu"] for x in olaylar()) return (AYGIT, AYGIT, 0.0) if onayli else (0, AYGIT - dusen, 0.0) print(f"{'model':<22s} {'tur':>5s} {'doğru':>6s} {'yanlış':>7s} {'gecikme':>9s}") for ad, (t, d, g) in (("yoklama, aralık 5", yoklama(5)), ("yoklama, aralık 10", yoklama(10)), ("yoklama, aralık 20", yoklama(20)), ("bildirim, onaysız", bildirim(False)), ("bildirim, onaylı", bildirim(True))): print(f"{ad:<22s} {t:5d} {d:6d} {AYGIT - d:7d} {g:6.2f} tik") print(f"\naygıt {AYGIT}, pencere {PENCERE} tik, " f"yolda düşen bildirim {sum(x['dustu'] for x in olaylar())}")
model tur doğru yanlış gecikme yoklama, aralık 5 160 40 0 2.08 tik yoklama, aralık 10 80 40 0 4.95 tik yoklama, aralık 20 40 40 0 10.95 tik bildirim, onaysız 0 34 6 0.00 tik bildirim, onaylı 40 40 0 0.00 tik aygıt 40, pencere 20 tik, yolda düşen bildirim 6
Yoklayan modelde tur ile yakalama gecikmesi doğrudan takas edilir: aralık beşten yirmiye çıkınca tur 160’tan 40’a iner, gecikme 2,08 tikten 10,95 tike çıkar. Doğru karar sayısı üçünde de kırktır — yoklama geç öğrenir ama yanlış öğrenmez.
Bildiren model takası kırar. Onaylı biçim en sık yoklamanın doğruluğunu 160 yerine 40 turla ve sıfır gecikmeyle veriyor. Onaysız biçim tur maliyetini sıfıra indiriyor ve altı aygıtta yanlış karar doğuruyor. Bu altı yanlışın niteliği önemli: yönetici sessizlik ile değişmemişlik arasında ayrım yapamaz ve yanıldığını da bilmez. Onay turu tam olarak bu ayrımı satın alır — kursun kuralının bu derse düşen biçimi budur: alınamayan karar bir tur borcudur, ve borç ödenmediğinde kararın yerini bir varsayım alır.
Özet
- Saat eşitlemesi dört zaman damgasından iki hesap çıkarır: gecikme hesabı saat sapmasından bağımsızdır, sapma kestirimi ise gidiş ile dönüşün eşit olduğunu varsayar.
- Varsayım tutmazsa hata rastgele değildir: 40 turda gerçek sapma 12,500 ms iken kestirimlerin ortalaması 14,4917 ms, hata 1,9917 ms — bakışımsızlığın tam yarısı. En küçük gecikmeli turu seçmek hatayı ancak 1,9700 ms’ye indirir; süzme gürültüyü alır, bakışımsızlığı almaz.
- Aynı dört damgayı üreten bakışımlı bir ikiz dünya kurulabiliyor; damgalar kayan nokta çözünürlüğüne kadar aynı, dolayısıyla protokolün bakışımsızlığı görecek alanı yok ve bu eksik tur atarak kapanmıyor.
- Yönetimde yoklayan model turu gecikmeyle takas eder (160 tur ve 2,08 tik, 40 tur ve 10,95 tik); onaylı bildiren model aynı doğruluğu 40 turla ve sıfır gecikmeyle verir.
- Onaysız bildirimde tur sıfırdır ama altı aygıtta karar yanlış çıkar; yönetici sessizlik ile değişmemişlik arasında ayrım yapamaz ve onay turu tam olarak bu ayrımı satın alır.
Kurs Kapanışı
| ders | ölçülen karar | gidiş–dönüşsüz alınan | yanlış ya da alınamayan |
|---|---|---|---|
| HTTP 01 · Yöntemler | yöntemden yinelenebilir, saklanabilir |
195/200 doğru, 0 tur | 5 yanlış: 2 eksik im, 3 doğrulayıcı |
| HTTP 02 · Durum kodları | ilk basamaktan saklama ve yeniden deneme | satır rejimi 309 doğru, 4004 bayt | 11 yanlış; gövdenin 6 kararı 673,3 bayt/karar |
| HTTP 03 · Başlıklar ve pazarlık | çözülen alan ile taşınan alanın ayrımı | 195 doğru; tam imle 13/13 doğru kopya | 5 yanlış; imsiz 9 yanlış kopya; 2960 bayt sıfır karar |
| HTTP 04 · Çerezler | kapsam kuralı ve saklanan yanıtın alıcısı | 195 doğru; kapsamlar 11, 24, 40 ileti taşır | 2 yanlış; im zarfta 80 karar uçlara, 40 tur |
| HTTP 05 · Sürümler | çerçevelemenin aracıya kazandırdığı | aynı 195 doğru, 3524 yerine 427 bayt | bağlamsız aracıda 189 alınamayan, 39 tur |
| HTTP 06 · Önbellekleme | doğrulayıcının çözünürlüğü | damga rejimi 195 doğru, 12 bayattan 9’u yakalanır | 3 kopyada damga kaçar; her seferinde sormak 40 tur |
| TLS 01 · Simetrik ve asimetrik | rolün tura maliyeti | tek kalıcı bağlantıda 0,025 tur/alışveriş | her iletide kurulumda 1,000 tur |
| TLS 02 · Sertifika zinciri | zincirin yerel doğrulanması | 33/40 doğru, 0 gidiş–dönüş; zincir uzasa da 0 | 7 yanlış, tamamı iptalden; sormak 111 tur, aynı tablo |
| TLS 03 · El sıkışması | tur bütçesi ve zarfın ödettiği karar | zarfta 40 karar, hiçbiri yanlış değil | 160 alınamayan, 40 tur; bayt 3524’ten 920’ye |
| TLS 04 · Sertifika yaşam döngüsü | iptalin tur borcu olması | sormayan istemci 0 tur; ara üç seçeneğin de alışveriş başına turu 0 | sormayan 22,02/40 yanlış kabul; her alışverişte sormak 120 tur, 0 yanlış |
| DİĞER 01 · WebSocket | yükseltmenin bir rejim değişimi olması | yükseltme isteği 5 kararın 2’sini verir | tünelde 200 alınamayan, 40 tur, 0 yanlış |
| DİĞER 02 · Sunucu akışı | akışın HTTP içinde kalması | 1 karar noktası, 5 karar, 87 bayt | 195 alınamayan, 39 tur; kapsamda 73 yanlış |
| DİĞER 03 · Yoklama | karar başına tur maliyeti | dört yaklaşımda da 0,200 tur/karar | harcanan tur ile tur borcunun toplamı hepsinde 40 |
| DİĞER 04 · Dosya aktarımı | denetim ile veri kanalının eşleşmesi | tek kanal açık 195 doğru, 0 tur | iki kanalda 8 yanlış, 3’ü bölünmeden; veri zarflı 40 tur |
| DİĞER 05 · Posta | posta zarfı ile başlığın ayrılması | zarf 60, başlıkla 140, anahtarla 180 doğru | 7 yanlış iletmeden; alınamayan 133’ten 13’e |
| DİĞER 06 · Zaman ve yönetim | turun bakışımsızlığı ve yönetim modeli | onaylı bildirim 40 doğru, 40 tur, 0 gecikme | hata 1,9917 ms, tur atarak kapanmaz; onaysızda 6 yanlış |
Tablodaki her sayı, o satırın kendi dersinin ölçümünden okunmuştur; hiçbir satır ortak tanımdan doldurulmamıştır.
Kursun tek bir cümlesi vardı ve on altı ders onu ölçtü: iletide ne yazıyorsa aracı onu bilir; yazmıyorsa bilmez; yanlış yazıyorsa yanlış bilir. Ölçü hep aynı kaldı — bir protokolün sayısı taşıdığı alan değil, alıcı tarafa fazladan bir gidiş–dönüş olmadan kaç kararı aldırdığıdır — ve alınamayan her karar bir tur borcu olarak yazıldı.
Kapanışta üç sonuç durur. Alan eklemek karar kazandırmaz: bayt büyür, karar tablosu değişmez; kazandıran şey baytın kendisi değil, adı ve anlamı sabitlenmiş bir alan olmasıdır. Gizlemenin bedeli bir kusur değil bir seçimdir: taşıma zarfı kapandığında aracı kararların çoğunu kaybeder, ama kalanların içinde yanlış yoktur. Ve kararı doğrulayan hiçbir şey yoktur: protokol bildirime inanır, çünkü bildirimden başka elinde bir şey yoktur. Son ders bunun en uç biçimini gösterdi — orada bildirim doğruydu ve yine de yetmedi, çünkü eksik olan bir alan değil bir dünyaydı.
Bütün bu kararları alan aracı, kurs boyunca iletiyi okudu. Bir sonraki kurs, Anahtarlama ve Yönlendirme, bir katman aşağı iner ve orada duran cihaza bakar: bir anahtarın çerçeveyi hangi bacaktan çıkaracağını, bir yönlendiricinin paketi hangi komşuya vereceğini, ve bu kararların hangi tablodan okunduğunu. Ölçü de yer değiştirir: burada aracı ne bildiğine göre sayılıyordu, orada cihaz ne kadar doğru ilettiğine göre sayılacak. Kararı alan aracıdan, paketi ileten cihaza.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.