Ders 09 / 21
Aktarımda Şifreleme
Aktarım şifrelemesi zorunlu kılındığında ne oluyor sayılır: 16 bağlantı bacağının 9'u açık, 4'ünün durumu bilinmiyor. Üç aşamalı zorlama 23 yapılandırma kalemi değiştiriyor ve 79 bağlantı kırıyor; 34'ü yükseltilemiyor. Altı yolun ancak biri uçtan uca kanıtlı hale geliyor, hepsi için kendi katmanında şifreleme gerekiyor.
İçindekiler
Beklemede duran veri için soru yanıtlandı. Veri hareket ettiğinde ise ortada bir kutu değil, bir zincir var: ölçüm ağının bir kaydı kenar cihazdan alım ucuna, oradan ağ geçidine, toplayıcıya ve veritabanına gidiyor; her sıçrama ayrı bir bacak ve her bacağın kendi durumu var. Bu dersin sorusu el sıkışmanın maliyeti değil — o ölçüm daha önce yapıldı — şifrelemenin hangi noktada sonlandığı da değil; o da ölçüldü. Buranın sorusu zorunlu kılmaktır: hangi bacaklar şifreli, hangileri “iç ağ” gerekçesiyle açık bırakılmış, politikayla zorunlu kılınınca kaç bağlantı kırılıyor ve kaç kalem yapılandırma değişiyor.
Üçüncü bir durum daha var: sağlayıcının kendi ağı içindeki taşımanın şifreli olup olmadığı kiracı
tarafından doğrulanamaz. O bacaklar “bilinmiyor” olarak durur, sağlayıcının varsayılanı bir
varsayım olarak yazılır ve bilinmiyor olmanın kendisi bir kalem sayılır. Ölçüm bölgesel ölçüm
ağı üzerindedir, kurgudur ve node ile yazılmış bir modeldir.
BG7. Veri yolu 16 bağlantı bacağına ayrılır; bacak kataloğu, istemci sayıları, yapılandırma kalemleri ve istek hacimleri kurgudur. BG8. Her bacak üç ağ türünden birindedir: genel ağ, özel hat, sağlayıcı içi ağ. BG9. Bacağın durumu üç değerlidir — şifreli, açık, bilinmiyor. Üçüncü değer yalnız sağlayıcı içi taşıma için kullanılır ve doğrulanamaz. BG10. Her açık bacakta şifrelemeyi desteklemeyen istemci sayısı ve bunların kaçının yükseltilebildiği yazılıdır; yükseltilemeyen istemci zorlamada kalıcı olarak kırılır. BG11. Zorlama üç aşamadadır: önce genel ağ, sonra özel hat, sonra sağlayıcı içi ağ. Geçiş penceresi 90 gündür (kurgu) ve uyarı modunda 61 gün geçmiştir. BG12. “Bilinmiyor” bacakların şifreli olduğu ancak kiracının kendi katmanında şifreleme yapmasıyla kanıtlanabilir; bunun yapılandırma bedeli bacak başına yazılıdır.
Bacaklar, Yollar ve Aşamalı Zorlama
// bacak.mjs — aktarim bacaklari, yollar ve asamali zorlama. MODELDIR. // Bolgesel olcum agi KURGUDUR: bacak katalogu, istemci sayilari ve istek hacimleri uydurmadir. // durum "bilinmiyor" = saglayici ici tasima; kiraci dogrulayamaz, VARSAYIM olarak durur. export const BACAK = [ // id, ad, ag, durum, istemci, destekmeyen, yapKalemi, istekBin, kanitKalemi, yukseltilebilir ["b1", "kenar cihaz -> alim ucu", "genel", "acik", 340, 54, 3, 4820, 0, 38], ["b2", "alim ucu -> ag gecidi", "saglayici-ici", "sifreli", 6, 0, 1, 4820, 0, 0], ["b3", "ag gecidi -> toplayici", "saglayici-ici", "bilinmiyor", 12, 0, 2, 4820, 4, 0], ["b4", "toplayici -> veritabani", "saglayici-ici", "acik", 12, 0, 4, 1960, 0, 0], ["b5", "toplayici -> kuyruk", "saglayici-ici", "acik", 12, 2, 2, 3100, 0, 2], ["b6", "isleyici -> kuyruk", "saglayici-ici", "acik", 9, 0, 2, 3100, 0, 0], ["b7", "isleyici -> nesne deposu", "saglayici-ici", "bilinmiyor", 9, 0, 1, 640, 3, 0], ["b8", "isleyici -> onbellek", "saglayici-ici", "acik", 9, 9, 2, 5400, 0, 0], ["b9", "servis -> gunluk toplayici", "saglayici-ici", "acik", 21, 0, 3, 8900, 0, 0], ["b10", "gunluk toplayici -> arsiv", "saglayici-ici", "bilinmiyor", 2, 0, 1, 190, 2, 0], ["b11", "arsiv -> ikincil bolge", "saglayici-ici", "bilinmiyor", 2, 0, 1, 190, 2, 0], ["b12", "fatura ihraci -> mutabakat", "genel", "sifreli", 1, 0, 1, 12, 0, 0], ["b13", "is ortagi beslemesi -> alim", "genel", "acik", 7, 3, 2, 260, 0, 1], ["b14", "operator -> yonetim ucu", "genel", "sifreli", 20, 0, 1, 45, 0, 0], ["b15", "yonetim ucu -> servis", "saglayici-ici", "acik", 20, 0, 3, 45, 0, 0], ["b16", "olcum agi bakim kanali", "ozel-hat", "acik", 28, 11, 2, 70, 0, 4], ].map(([id, ad, ag, durum, istemci, kirilan, yap, istek, kanit, yuk]) => ({ id, ad, ag, durum, istemci, kirilan, yap, istek, kanit, yuk })); export const YOL = { // bir istegin gectigi bacak dizisi "olcum alimi": ["b1", "b2", "b3", "b4"], "ozet uretimi": ["b5", "b6", "b7"], "gunluk akisi": ["b9", "b10", "b11"], "fatura ihraci": ["b4", "b7", "b12"], "yonetim erisimi": ["b14", "b15"], "is ortagi alimi": ["b13", "b3", "b4"], }; export const bul = (id) => BACAK.find((b) => b.id === id); export const AG = ["genel", "ozel-hat", "saglayici-ici"]; // zorlama asamalarinin sirasi export const PENCERE = 90, GECEN = 61; // kurgu gecis penceresi, gun const top = (l, f) => l.reduce((a, b) => a + f(b), 0); const B = [26, 7, 9, 10, 12, 13, 15]; export const yz = (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0])) .join(""); if (import.meta.url === `file://${process.argv[1]}`) { console.log(`model: ${BACAK.length} bacak, ${Object.keys(YOL).length} yol, ` + `${top(BACAK, (b) => b.istek)} bin istek/gun (kurgu)`); console.log("\n" + yz(["ag turu", "bacak", "sifreli", "acik", "bilinmiyor", "istemci", "istek(bin)"])); for (const a of AG) { const l = BACAK.filter((b) => b.ag === a); const s = (d) => l.filter((b) => b.durum === d).length; console.log(yz([a, l.length, s("sifreli"), s("acik"), s("bilinmiyor"), top(l, (b) => b.istemci), top(l, (b) => b.istek)])); } // asamali zorlama: her asamada o ag turundeki acik bacaklar sifreye cekilir. const durum = new Map(BACAK.map((b) => [b.id, b.durum])); console.log("\n" + yz(["asama", "bacak", "yap.kal.", "kirilan", "istek(bin)", "kalan acik", "bilinmiyor"])); const satir = (ad, l) => { for (const b of l) durum.set(b.id, "sifreli"); console.log(yz([ad, l.length, top(l, (b) => b.yap), top(l, (b) => b.kirilan), top(l, (b) => b.istek), [...durum.values()].filter((d) => d === "acik").length, [...durum.values()].filter((d) => d === "bilinmiyor").length])); }; satir("0. uyari modu", []); for (const a of AG) satir(`${AG.indexOf(a) + 1}. ${a}`, BACAK.filter((b) => b.ag === a && durum.get(b.id) === "acik")); // yol basina uctan uca: bir yolun her bacagi sifreliyse yol kanitli sayilir. const yolSatir = (ad, d) => { const l = YOL[ad].map(bul); const say = (x) => l.filter((b) => d(b) === x).length; console.log(yz([ad, l.length, say("sifreli"), say("acik"), say("bilinmiyor"), say("bilinmiyor") === 0 && say("acik") === 0 ? "kanitli" : "hayir", top(l.filter((b) => d(b) !== "sifreli"), (b) => b.istek)])); }; console.log("\n" + yz(["yol (zorlamadan once)", "bacak", "sifreli", "acik", "bilinmiyor", "uctan uca", "kanitsiz(bin)"])); for (const ad of Object.keys(YOL)) yolSatir(ad, (b) => b.durum); console.log("\n" + yz(["yol (uc asama sonrasi)", "bacak", "sifreli", "acik", "bilinmiyor", "uctan uca", "kanitsiz(bin)"])); for (const ad of Object.keys(YOL)) yolSatir(ad, (b) => durum.get(b.id)); }
model: 16 bacak, 6 yol, 38372 bin istek/gun (kurgu) ag turu bacak sifreli acik bilinmiyor istemci istek(bin) genel 4 2 2 0 368 5137 ozel-hat 1 0 1 0 28 70 saglayici-ici 11 1 6 4 114 33165 asama bacak yap.kal. kirilan istek(bin) kalan acik bilinmiyor 0. uyari modu 0 0 0 0 9 4 1. genel 2 5 57 5080 7 4 2. ozel-hat 1 2 11 70 6 4 3. saglayici-ici 6 16 11 22505 0 4 yol (zorlamadan once) bacak sifreli acik bilinmiyor uctan uca kanitsiz(bin) olcum alimi 4 1 2 1 hayir 11600 ozet uretimi 3 0 2 1 hayir 6840 gunluk akisi 3 0 1 2 hayir 9280 fatura ihraci 3 1 1 1 hayir 2600 yonetim erisimi 2 1 1 0 hayir 45 is ortagi alimi 3 0 2 1 hayir 7040 yol (uc asama sonrasi) bacak sifreli acik bilinmiyor uctan uca kanitsiz(bin) olcum alimi 4 3 0 1 hayir 4820 ozet uretimi 3 2 0 1 hayir 640 gunluk akisi 3 1 0 2 hayir 380 fatura ihraci 3 2 0 1 hayir 640 yonetim erisimi 2 2 0 0 kanitli 0 is ortagi alimi 3 2 0 1 hayir 4820
İlk tablo bir kalıbı hemen ele veriyor: genel ağdaki 4 bacağın 2’si şifreli, sağlayıcı içi 11 bacağın yalnız 1’i. Şifreleme dışarıya bakan yüzde uygulanmış, içeride uygulanmamıştır — gerekçe yazılıdır: “iç ağ”. O gerekçenin taşıdığı hacim sayılıdır: sağlayıcı içi bacaklardan günde 33.165 bin istek geçiyor, toplamın yüzde seksen altısı.
Aşama tablosu faturayı üçe bölüyor. Genel ağ aşaması ucuzdur — 2 bacak, 5 yapılandırma kalemi — ama 57 bağlantı kırar, çünkü kenar cihazların 54’ü ve iş ortağı beslemesinin 3 istemcisi şifreli aktarımı desteklemiyor. Özel hat aşaması 1 bacak, 2 kalem, 11 kırık. Sağlayıcı içi aşama en pahalısıdır: 6 bacak, 16 kalem ve günde 22.505 bin isteğin yolu; kırdığı bağlantı ise yalnız 11’dir. Dağılım sezgiye ters çıkıyor — en çok yapılandırma değiştiren aşama, en az bağlantı kıran aşamadır.
Yol tabloları asıl cümleyi kuruyor. Zorlamadan önce altı yolun hiçbiri uçtan uca şifreli değil. Üç aşamadan sonra da yalnız biri kanıtlı hale geliyor: yönetim erişimi, çünkü geçtiği iki bacak da doğrulanabilir. Kalan beş yol en az bir “bilinmiyor” bacak taşıdığı için kanıtlanamıyor. Kanıtsız hacim 11.600’den 4.820 bin isteğe düşüyor ama sıfırlanmıyor; sebebi tek bir bacaktır — ağ geçidiyle toplayıcı arasındaki sıçrama, ölçüm alımının ve iş ortağı alımının ortak parçası.
Zorunlu Kılmanın Defteri
// kirilan.mjs — zorunlu kilmanin defteri: kirilan baglanti, kalici kirik, istisna ve kanit bedeli. import { BACAK, YOL, PENCERE, GECEN } from "./bacak.mjs"; const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0])) .join(""); const yz = gen([28, 9, 11, 10, 8, 10, 12]); // kirilan baglanti tablosu const yk = gen([27, 10, 14, 11, 13, 13, 15]); // karar tablosu const SINIR = 2; // kurgu politika: kalici istisna tavani const top = (l, f) => l.reduce((a, b) => a + f(b), 0); const ACIK = BACAK.filter((b) => b.durum === "acik"); const BILINMIYOR = BACAK.filter((b) => b.durum === "bilinmiyor"); const kalici = (b) => b.kirilan - b.yuk; console.log(yz(["kirilan bacak", "istemci", "destekmez", "yukselir", "kalici", "yap.kal.", "istek(bin)"])); for (const b of ACIK.filter((x) => x.kirilan > 0)) console.log(yz([b.ad, b.istemci, b.kirilan, b.yuk, kalici(b), b.yap, b.istek])); console.log(yz(["toplam", top(ACIK, (b) => b.istemci), top(ACIK, (b) => b.kirilan), top(ACIK, (b) => b.yuk), top(ACIK, kalici), top(ACIK, (b) => b.yap), top(ACIK, (b) => b.istek)])); // Bir karar: hangi bacaklar zorlanir, hangileri kendi katmaninda sifrelenir, vekil kurulur mu. const degerlendir = (zorlanan, kendi, vekil) => { const d = new Map(BACAK.map((b) => [b.id, b.durum])); let kirik = 0, yap = 0; for (const b of BACAK) { if (zorlanan.has(b.id)) { d.set(b.id, "sifreli"); yap += b.yap; kirik += vekil ? 0 : kalici(b); } if (kendi.has(b.id)) { d.set(b.id, "sifreli"); yap += b.kanit; } } if (vekil) yap += 3 * BACAK.filter((b) => zorlanan.has(b.id) && kalici(b) > 0).length; const kanitli = Object.values(YOL) .filter((y) => y.every((id) => d.get(id) === "sifreli")).length; const kanitsiz = top(BACAK.filter((b) => d.get(b.id) !== "sifreli"), (b) => b.istek); return { kirik, yap, kanitli, kanitsiz, istisna: BACAK.filter((b) => b.durum === "acik" && !zorlanan.has(b.id)).length }; }; const id = (l) => new Set(l.map((b) => b.id)); const bos = new Set(); const muaf = ACIK.filter((b) => kalici(b) > 0); // kalici kirik ureten bacaklar const KARAR = { "0 uyari modu": [bos, bos, false], "1 zorlama, istisnasiz": [id(ACIK), bos, false], "2 zorlama + vekil katman": [id(ACIK), bos, true], "3 vekil + kendi sifrelemen": [id(ACIK), id(BILINMIYOR), true], "4 zorlama + istisna": [id(ACIK.filter((b) => kalici(b) === 0)), bos, false], }; console.log("\n" + yk(["karar", "zorlanan", "kalici kirik", "muaf acik", "kanitli yol", "ek yap.kal.", "kanitsiz(bin)"])); for (const [ad, [z, k, v]] of Object.entries(KARAR)) { const s = degerlendir(z, k, v); console.log(yk([ad, z.size, s.kirik, s.istisna, `${s.kanitli}/${Object.keys(YOL).length}`, s.yap, s.kanitsiz])); } const acikIstek = top(ACIK, (b) => b.istek); console.log(`\ngecis penceresi: ${PENCERE} gun, ${GECEN} gun gecti, ${PENCERE - GECEN} gun kaldi; ` + `uyari modunda gecen surede ${acikIstek * GECEN} bin istek acik bacaktan gecti`); console.log(`kalici istisna siniri ${SINIR} bacak (kurgu politika); istenen ${muaf.length}, ` + `${muaf.length - SINIR} bacak sinirin disinda`); console.log(`istemci yukseltmesi: ${top(ACIK, (b) => b.yuk)} istemci, ` + `${ACIK.filter((b) => b.yuk > 0).length} bacakta; geri kalan ${top(ACIK, kalici)} istemci ` + `yukseltilemiyor`); console.log(`\nbilinmiyor kalemi: ${BILINMIYOR.length} bacak, ` + `${top(BILINMIYOR, (b) => b.istek)} bin istek/gun, kanit bedeli ` + `${top(BILINMIYOR, (b) => b.kanit)} yapilandirma kalemi`); for (const b of BILINMIYOR) console.log(` ${b.ad.padEnd(26)} ${String(b.istek).padStart(6)} bin/gun, ` + `kanit ${b.kanit} kalem, varsayim: saglayici ici tasima sifreli`);
kirilan bacak istemci destekmez yukselir kalici yap.kal. istek(bin) kenar cihaz -> alim ucu 340 54 38 16 3 4820 toplayici -> kuyruk 12 2 2 0 2 3100 isleyici -> onbellek 9 9 0 9 2 5400 is ortagi beslemesi -> alim 7 3 1 2 2 260 olcum agi bakim kanali 28 11 4 7 2 70 toplam 458 79 45 34 23 27655 karar zorlanan kalici kirik muaf acik kanitli yol ek yap.kal. kanitsiz(bin) 0 uyari modu 0 0 9 0/6 0 33495 1 zorlama, istisnasiz 9 34 0 1/6 23 5840 2 zorlama + vekil katman 9 0 0 1/6 35 5840 3 vekil + kendi sifrelemen 9 0 0 6/6 46 0 4 zorlama + istisna 5 0 4 1/6 14 16390 gecis penceresi: 90 gun, 61 gun gecti, 29 gun kaldi; uyari modunda gecen surede 1686955 bin istek acik bacaktan gecti kalici istisna siniri 2 bacak (kurgu politika); istenen 4, 2 bacak sinirin disinda istemci yukseltmesi: 45 istemci, 4 bacakta; geri kalan 34 istemci yukseltilemiyor bilinmiyor kalemi: 4 bacak, 5840 bin istek/gun, kanit bedeli 11 yapilandirma kalemi ag gecidi -> toplayici 4820 bin/gun, kanit 4 kalem, varsayim: saglayici ici tasima sifreli isleyici -> nesne deposu 640 bin/gun, kanit 3 kalem, varsayim: saglayici ici tasima sifreli gunluk toplayici -> arsiv 190 bin/gun, kanit 2 kalem, varsayim: saglayici ici tasima sifreli arsiv -> ikincil bolge 190 bin/gun, kanit 2 kalem, varsayim: saglayici ici tasima sifreli
Kırılan bağlantı tablosu tek bir sayıyı ayırıyor: 79 istemci şifreli aktarımı desteklemiyor, 45’i yükseltilebiliyor ve 34’ü yükseltilemiyor. En sert satır önbellek bacağıdır: 9 istemcinin 9’u da desteklemiyor, hiçbiri yükseltilemiyor ve o bacak günde 5.400 bin istek taşıyor. İkincisi kenar cihazlarıdır: 54 cihazın 16’sı sahada duran, yazılımı değişmeyen donanım.
Karar tablosu beş yolu yan yana koyuyor. Uyarı modu hiçbir şey kırmaz ve hiçbir şeyi kanıtlamaz; 61 günde açık bacaklardan 1.686.955 bin istek geçmiştir ve bu geriye dönük kapatılamaz. İstisnasız zorlama 23 kalem değiştirir ve 34 bağlantıyı kalıcı koparır. Vekil katman kırığı sıfırlar, 12 kalem ekler: 35. Bu üç kararın hiçbiri kanıtlı yolu 1/6’nın üstüne çıkarmaz; çıkaran tek satır dördüncüsüdür — “bilinmiyor” bacakları kendi katmanında şifrelemek 11 kalem daha ekler, toplam 46 olur ve 6/6 yol kanıtlı hale gelir.
Son karar tersini gösteriyor: kalıcı kırık üreten 4 bacağı muaf tutmak yükü 14 kaleme indirir ve hiçbir bağlantı kırmaz, ama kanıtsız hacim 16.390 bin istek/güne çıkar. Kurgu politika 2 kalıcı istisna tanıyor; istenen 4’tür ve 2 bacak sınırın dışındadır. Geçiş penceresinin 90 gününün 61’i geçti, 29 gün kaldı.
Dört “bilinmiyor” bacağın her birinin yanında aynı cümle var: varsayım, sağlayıcı içi taşımanın şifreli olduğudur. Günde 5.840 bin istek taşıyorlar ve durumları kiracının hiçbir yapılandırmasından okunmuyor. Bilinmemek, açık olmakla aynı şey değildir ama kanıtlanabilir olmakla da aynı şey değildir.
Özet
- 16 bacağın 3’ü şifreli, 9’u açık, 4’ünün durumu bilinmiyor; sağlayıcı içi 11 bacağın yalnız 1’i şifreli ve o bacaklardan günde 33.165 bin istek geçiyor.
- Üç aşamalı zorlama 23 kalem değiştiriyor; en pahalı aşama (sağlayıcı içi, 16 kalem) en az bağlantı kırandır (11), en ucuz aşama 57 bağlantı kırar.
- 79 istemci şifreli aktarımı desteklemiyor; 45’i yükseltilebiliyor, 34’ü yükseltilemiyor ve vekil katman bu 34’ü kurtarırken 12 kalem ekliyor.
- Zorlamadan önce hiçbir yol uçtan uca şifreli değil; üç aşamadan sonra 1/6, kendi katmanında şifreleme eklenince 6/6 ve kanıtsız hacim 33.495’ten sıfıra iner.
- Muafiyet yolu yükü 14 kaleme indiriyor, kanıtsız hacmi 16.390 bin istek/güne çıkarıyor; kurgu politika 2 istisna tanıyor, 2 bacak sınırın dışında. Geçiş penceresinden 29 gün kaldı.
Sonraki Adım
Veri beklemede ve aktarımda şifreli hale getirildi. İkisi de aynı şeye dayanıyor: bir anahtar ya da kimlik bilgisi bir yerde saklanıyor ve servisler onu okuyor. Bir sonraki ders o saklama katmanına döner ve tek bir soruyu ölçer: sır döndürüldüğünde eski ile yeni değerin birlikte geçerli olduğu pencere ne kadar olmalı — kısa pencere kaç istemciyi kaçırıyor, uzun pencere sızıntı süresini ne kadar uzatıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.