Ders 10 / 20
Ağ Bölütleme ve Silahtan Arındırılmış Bölge
Sekiz bölgelik bir grafikte dört yerleşim koşturulur: düz ağ, yalnız çevre denetimi, silahtan arındırılmış bölge olmadan bölütleme ve tam bölütleme; her birinde açık yol sayısı, dış bölgeden ilk atlamada ve geçişli olarak erişilen kalem, bir bölge düştüğünde ulaşılan bölge ve kural yazımında gözden kaçan meşru akış sayılır.
İçindekiler
Önceki ders sınırda duran kutunun ne görebildiğini saydı ve kanıtlanmayan her iddianın arkadaki ağa girdiğini varsaydı. Varsayımın kendisi bu dersin konusudur: “arkadaki ağ” tek bir şey miydi? Sekiz akış sınıfı da aynı düzlükte duruyordu; sayaç toplayıcısına ulaşan bir mesaj, faturalama arayüzüne de aynı hamleyle ulaşabiliyordu. Bölütleme kutunun kanıtladığı iddia sayısını değiştirmez; iddianın sunulabileceği yolun sayısını değiştirir.
Ölçülen üç şey var. Bölge grafiğinde kaç yönlü çift açık, bir bölge düştüğünde kaçına ulaşılıyor ve bölgeler arası meşru trafiğin sürmesi kaç kural satırı istiyor. Bulut ağı ölçeğinde adres planı ve alt ağ aritmetiği başka bir kursta ölçüldü; buradaki eksen adres değil, bölge grafiğinin kendisidir.
- CS7. Sekiz bölge, kalem sayıları ve kural listesi kurgusal bölgesel ölçüm ağına aittir.
Gerçek trafik akmıyor; ölçülen şey
nodeile kurulan grafik modelidir. - CS8. Bölge içinde kısıt yok sayıldı: bir bölgedeki kaleme ulaşan, o bölgenin bütün kalemlerine ulaşır. Gerçekte bölge içi denetim de yazılabilir; kalem sayısını düşürür, bölgeler arası ölçümün yönünü değiştirmez.
- CS9. Dış bölge varış noktası sayıldı, geçiş noktası sayılmadı. İç bir bölgeden dışarıya çıkmak, dış bölgenin ulaşabildiği her yere ulaşmak anlamına gelmiyor.
- CS10. Kural satırı yönlü bölge çifti düzeyinde sayıldı. Gerçekte her satır kapı ve protokol de belirtir; satır sayısını büyütür, karşılaştırmanın yönünü değiştirmez.
- CS11. “Bölge düştü” ifadesi yalnız o bölgedeki bir kalemin denetim dışına çıktığı durumu adlandırıyor. Nasıl çıktığı modellenmedi ve yazılmadı.
- CS12. Kural yazımında gözden kaçan iki meşru akış modele elle konuldu. Gerçekte bu sayı gözlem süresine ve akışın seyrekliğine bağlıdır.
Bölge Grafiği ve Dört Yerleşim
Model bölgeleri düğüm, izin verilen yönlü çiftleri kenar olarak tutuyor. Dört yerleşim aynı işi görüyor ve yalnız iki eksende ayrılıyor: iç bölgeler arasında sınır var mı ve dışa bakan kalemler ayrı bir bölgede mi duruyor. Dışa bakan kalemler ayrı durduğunda o bölge silahtan arındırılmış bölgedir; durmadığında aynı kalemler uygulama bölgesinin içine yerleşir.
// bolge.mjs — bolge grafigi, kalem sayilari ve dort yerlesim; model, gercek ag degil const ORTAK = { dis: 0, sube: 120, saha: 60, veri: 6, yonetim: 5, yedek: 3 }; export const KALEM = { // genel arayuz kalemleri ayri bolgede mi, uygulamayla ayni bolgede mi ayri: { ...ORTAK, dmz: 4, uygulama: 12 }, icinde: { ...ORTAK, uygulama: 16 }, }; // Kural yazilan mesru akislar: varsayilan reddet altinda izin verilen yonlu bolge cifti export const MESRU = [ ['dis', 'dmz'], ['dmz', 'uygulama'], ['saha', 'dmz'], ['sube', 'dmz'], ['sube', 'uygulama'], ['uygulama', 'veri'], ['uygulama', 'dis'], ['veri', 'yedek'], ['yedek', 'dis'], ...['dmz', 'sube', 'saha', 'uygulama', 'veri', 'yedek'].map((b) => ['yonetim', b]), ]; // Kural yaziminda gozden kacan iki mesru akis: ceyrek sonu mutabakati ve sube arsivi export const KACAN = [['saha', 'veri'], ['sube', 'yedek']]; const tek = (l) => [...new Set(l.map((e) => e.join('>')))].map((s) => s.split('>')); const katla = (l) => tek(l.map(([a, b]) => [a === 'dmz' ? 'uygulama' : a, b === 'dmz' ? 'uygulama' : b])) .filter(([a, b]) => a !== b); const duzKenar = (bl) => { // ic bolgeler arasi kisit yok, giden yon serbest const ic = bl.filter((b) => b !== 'dis'); return [...ic.flatMap((x) => ic.filter((y) => y !== x).map((y) => [x, y])), ...ic.map((b) => [b, 'dis'])]; }; const B8 = ['dis', 'dmz', 'sube', 'saha', 'uygulama', 'veri', 'yedek', 'yonetim']; const B7 = B8.filter((b) => b !== 'dmz'); export const YERLESIM = { // [bolgeler, kenar, yazilmis kural, kalem haritasi] duz: [B7, [...duzKenar(B7), ['dis', 'uygulama']], 0, 'icinde'], cevre: [B8, [...duzKenar(B8), ['dis', 'dmz']], 1, 'ayri'], dmzsiz: [B7, katla(MESRU), katla(MESRU).length, 'icinde'], bolutlu: [B8, MESRU, MESRU.length, 'ayri'], }; export function ulasilan(kenar, bas) { // gecisli erisim; dis bolge varis noktasidir, gecis noktasi degil const gor = new Set(), kuyruk = [bas]; while (kuyruk.length) { const b = kuyruk.shift(); if (b === 'dis' && bas !== 'dis') continue; for (const [x, y] of kenar) if (x === b && !gor.has(y)) { gor.add(y); kuyruk.push(y); } } gor.delete(bas); return gor; } export function mesafe(kenar, bas, hedef) { // hedefe varmak icin kac bolge siniri geciliyor let kat = new Set([bas]), n = 0; const gor = new Set([bas]); while (kat.size) { n++; const yeni = new Set(); for (const [x, y] of kenar) if (kat.has(x) && !gor.has(y)) { gor.add(y); yeni.add(y); } if (yeni.has(hedef)) return n; kat = yeni; } return '-'; } export const yol = (bl, kenar) => bl.reduce((a, b) => a + ulasilan(kenar, b).size, 0); export const kalemi = (kume, h) => [...kume].reduce((a, b) => a + (KALEM[h][b] ?? 0), 0); export const ilk = (kenar, bas) => new Set(kenar.filter(([x]) => x === bas).map(([, y]) => y)); export const dogrudan = (kenar, [a, b]) => kenar.some(([x, y]) => x === a && y === b);
İki ölçü işlevi grafiğin üzerinde yürüyor. Geçişli erişim, bir bölgeden başlayıp kenarları izleyerek ulaşılan bütün bölgeleri topluyor; mesafe işlevi aynı yürüyüşü katman katman yapıp hedefe kaç sınırda varıldığını veriyor. Kalem sayıları iki haritadan okunuyor, çünkü dışa bakan dört kalem ya kendi bölgesinde ya uygulama bölgesinin içinde duruyor ve toplam iki yüz on kalem her iki durumda da aynı kalıyor. Yer değiştiren şey kalem sayısı değil, kalemin hangi sınırın arkasında olduğudur.
Dört Yerleşimin Açtığı Yol
// kosum1.mjs — dort yerlesimde acik yol, dis bolgeden erisilen kalem ve kesilen mesru akis import { YERLESIM, MESRU, KACAN, ulasilan, mesafe, yol, kalemi, ilk, dogrudan } from './bolge.mjs'; console.log(`kural yazilan mesru akis ${MESRU.length}, kural yaziminda gozden kacan ${KACAN.length}\n`); console.log(`${'yerlesim'.padEnd(9)} ${'bolge'.padStart(5)} ${'kural'.padStart(5)} ${'acik/tum yol'.padStart(12)} ` + `${'ilk atlama kalem'.padStart(16)} ${'gecisli kalem'.padStart(13)} ${'veriye sinir'.padStart(12)} ${'kesilen mesru'.padStart(13)}`); for (const [ad, [bl, kenar, kural, h]] of Object.entries(YERLESIM)) { const tum = bl.length * (bl.length - 1); console.log(`${ad.padEnd(9)} ${String(bl.length).padStart(5)} ${String(kural).padStart(5)} ` + `${`${yol(bl, kenar)}/${tum}`.padStart(12)} ${String(kalemi(ilk(kenar, 'dis'), h)).padStart(16)} ` + `${String(kalemi(ulasilan(kenar, 'dis'), h)).padStart(13)} ${String(mesafe(kenar, 'dis', 'veri')).padStart(12)} ` + `${String(KACAN.filter((m) => !dogrudan(kenar, m)).length).padStart(13)}`); } console.log('\ndis bolgeden ulasilan bolgeler:'); for (const [ad, [, kenar]] of Object.entries(YERLESIM)) console.log(` ${ad.padEnd(9)} ${[...ulasilan(kenar, 'dis')].join(', ')}`); const kes = KACAN.filter((m) => !dogrudan(YERLESIM.bolutlu[1], m)); console.log(`\nbolutlu yerlesimde kesilen mesru akis: ${kes.map(([a, b]) => `${a} -> ${b}`).join(', ')}`);
kural yazilan mesru akis 15, kural yaziminda gozden kacan 2 yerlesim bolge kural acik/tum yol ilk atlama kalem gecisli kalem veriye sinir kesilen mesru duz 7 0 42/42 16 210 2 0 cevre 8 1 56/56 4 210 2 0 dmzsiz 7 12 23/42 16 25 2 2 bolutlu 8 15 31/56 4 25 3 2 dis bolgeden ulasilan bolgeler: duz uygulama, sube, saha, veri, yedek, yonetim cevre dmz, sube, saha, uygulama, veri, yedek, yonetim dmzsiz uygulama, veri, yedek bolutlu dmz, uygulama, veri, yedek bolutlu yerlesimde kesilen mesru akis: saha -> veri, sube -> yedek
İkinci satır bu dersin en pahalı yanılgısını sayıyor. Çevre yerleşiminde dışa bakan kalemler ayrı bir bölgeye taşındı, dışarıdan yalnız o bölgeye izin veren tek bir kural yazıldı ve dış bölgenin ilk atlamada eriştiği kalem on altıdan dörde indi. Buna karşılık geçişli kalem iki yüz onda kaldı ve açık yol elli altıda tam. İç bölgeler arasında hiçbir sınır olmadığı için, dışa bakan dört kalemden birine ulaşan taraf altı iç bölgenin tamamına ulaşıyor. Silahtan arındırılmış bölge tek başına bir bölge değil, bir ilk atlamadır; arkasında sınır yoksa yalnız ilk adımı geciktirir.
Üçüncü ve dördüncü satırlar aynı bölütlemeyi iki ayrı yerleşimde gösteriyor. İkisi de geçişli kalemi iki yüz ondan yirmi beşe indiriyor; fark ilk atlamadadır. Dışa bakan kalemler uygulama bölgesinin içinde bırakıldığında dış bölgeden gelen bağlantı doğrudan on altı kalemin yanına iniyor ve bölge içinde sınır olmadığı için hepsine ulaşıyor. Ayrı bölgeye taşındığında bu sayı dörde iniyor ve veri bölgesine varmak için geçilmesi gereken sınır sayısı ikiden üçe çıkıyor. Ayrı bölgenin bütün kazancı bu iki sayıdır: on iki kalem ve bir sınır.
Kural sütunu bedeli veriyor. Düz yerleşimde hiç kural yok; bölütlü yerleşim on beş satır istiyor ve bu on beş satır bölge çiftinden ibaret, kapı ve protokol eklendiğinde her satır birkaç satıra bölünür. Sağdaki sütun daha sinsi bir bedeli veriyor: bölütleme iki meşru akışı kesiyor. Çeyrek sonu mutabakatı saha bölgesinden veri bölgesine, şube arşivi şube bölgesinden yedek bölgesine gidiyordu; ikisi de kural yazılırken kimsenin aklına gelmedi, çünkü ikisi de seyrek çalışıyor. Düz ağda bu akışlar hiç kural istemediği için hiç görünmemişti.
Açık yol sütununda bir ters okuma tuzağı var. Bölütlü yerleşim otuz bir açık yol gösteriyor, silahtan arındırılmış bölgesi olmayan yerleşim yirmi üç; sayıya bakılırsa ikincisi daha dar görünüyor. Fark bölge sayısındandır: sekiz bölgeli grafikte elli altı, yedi bölgeli grafikte kırk iki yönlü çift vardır. Bölge eklemek çift sayısını büyütür. Yol sayısı bu yüzden tek başına karşılaştırılamaz; karşılaştırılabilen şey yolun indiği kalemdir ve o sütun iki yerleşimde de yirmi beştir.
Bölge Düştüğünde
// kosum2.mjs — bir bolge dustugunde ulasilan bolge ve kalem; duz ile bolutlu yerlesim yan yana import { YERLESIM, ulasilan, kalemi } from './bolge.mjs'; const [B, DUZ] = [YERLESIM.duz[0], YERLESIM.duz[1]]; const BOL = YERLESIM.bolutlu[1]; const ic = (k) => [...k].filter((b) => b !== 'dis'); console.log(`${'dusen bolge'.padEnd(11)} ${'duz bolge'.padStart(9)} ${'duz kalem'.padStart(9)} ` + `${'bolutlu bolge'.padStart(13)} ${'bolutlu kalem'.padStart(13)} bolutlu yerlesimde ulasilan`); let [td, tb] = [0, 0]; for (const b of B.filter((x) => x !== 'dis')) { const [d, s] = [ic(ulasilan(DUZ, b)), ic(ulasilan(BOL, b))]; td += d.length; tb += s.length; console.log(`${b.padEnd(11)} ${String(d.length).padStart(9)} ${String(kalemi(d, 'icinde')).padStart(9)} ` + `${String(s.length).padStart(13)} ${String(kalemi(s, 'ayri')).padStart(13)} ${s.join(', ') || '-'}`); } console.log(`\nulasilan bolge toplami duz ${td} bolutlu ${tb} kapanan ${td - tb} (%${Math.round((td - tb) * 100 / td)})`); const d = ic(ulasilan(BOL, 'dmz')), y = ic(ulasilan(BOL, 'yonetim')); console.log(`dmz dustugunde ${d.length} bolge, ${kalemi(d, 'ayri')} kalem (${d.join(', ')})`); console.log(`yonetim dustugunde ${y.length} bolge, ${kalemi(y, 'ayri')} kalem — ${BOL.filter(([a]) => a === 'yonetim').length} dogrudan kural`); console.log(`bolutlemenin kapattigi yol ${td - tb}; kapatamadigi bolge 1`);
dusen bolge duz bolge duz kalem bolutlu bolge bolutlu kalem bolutlu yerlesimde ulasilan sube 5 90 4 25 dmz, uygulama, veri, yedek saha 5 150 4 25 dmz, uygulama, veri, yedek uygulama 5 194 2 9 veri, yedek veri 5 204 1 3 yedek yedek 5 207 0 0 - yonetim 5 205 6 205 dmz, sube, saha, uygulama, veri, yedek ulasilan bolge toplami duz 30 bolutlu 17 kapanan 13 (%43) dmz dustugunde 3 bolge, 21 kalem (uygulama, veri, yedek) yonetim dustugunde 6 bolge, 205 kalem — 6 dogrudan kural bolutlemenin kapattigi yol 13; kapatamadigi bolge 1
Düz sütunda her satır aynı sayıyı veriyor: beş bölge. Hangi bölgenin düştüğü değişmiyor, sonuç değişmiyor; ikinci sütundaki kalem farkı yalnız düşen bölgenin kendi kalemlerinin dışarıda bırakılmasından geliyor. Bölütlü sütunda satırlar birbirinden ayrışıyor ve ayrışmanın yönü kural listesinin yönüdür. Yedek bölgesi düştüğünde hiçbir bölgeye ulaşılmıyor, çünkü o bölgeden çıkan tek kural dışarıya bakıyor. Veri bölgesi düştüğünde yalnız yedek bölgesine ulaşılıyor. Akışın yönü aşağı doğru olduğu için zincirin altındaki bölgeler yukarı çıkamıyor.
Şube ve saha bölgeleri en kalabalık kalem kümesini taşıyor — yüz yirmi ve altmış kalem — ve düşen bölge onlar olduğunda ulaşılan kalem yirmi beşte kalıyor. Düz yerleşimde aynı iki satır doksan ve yüz elli veriyordu. Kapanan yolun toplamı otuz üzerinden on üç; bölütleme bölge çiftlerinin yaklaşık yarısını kapatıyor, tamamını değil.
Kesilen iki meşru akışın bu tabloda bir karşılığı var. Saha bölgesinden veri bölgesine giden mutabakat akışı için bir kural yazılırsa satır sayısı on altıya çıkar ve saha bölgesi düştüğünde ulaşılan kalem yirmi beşten otuz bire gider. Kural yazmak yolu geri açar; akış meşru olduğu için de yazılır. Bölütlemenin ölçüsü bu yüzden kurulduğu gün alınan sayı değildir. Her yeni meşru akış bir satır ekler, her satır bir yol açar ve satırlar tek yönde birikir — akış durduğunda kuralı silmek için kimseye bir uyarı gitmez.
Son satırlar bölütlemenin kapatamadığı bölgeyi adlandırıyor. Yönetim bölgesi altı bölgeye doğrudan yazılmış durumda ve düştüğünde iki yüz beş kaleme ulaşılıyor — bölütlü yerleşimde bile düz ağdakiyle aynı sayı. Bunun nedeni bir eksiklik değil, işin kendisidir: yönetim bölgesi yapılandırma dağıtmak ve arıza gidermek için her bölgeye erişmek zorundadır. Bölütleme bu bölgede hiçbir yol kapatmıyor. Silahtan arındırılmış bölge düştüğünde ulaşılan yirmi bir kalem de aynı sınıftandır: dışa bakan bölge tanımı gereği içeriye bir kural taşır, o kural olmasa bölge hiçbir işe yaramaz. Bölütlemenin kapattığı yol sayılabilir; kapatamadığı bölge de sayılabilir ve bir tanedir.
Özet
- Yalnız çevre denetimi dış bölgenin ilk atlamada eriştiği kalemi 16’dan 4’e indiriyor ama geçişli kalem 210’da kalıyor: iç bölgeler arasında sınır yoksa dışa bakan tek kaleme ulaşan taraf 6 iç bölgenin tamamına ulaşıyor.
- Bölütleme geçişli kalemi 210’dan 25’e indiriyor. Dışa bakan kalemleri ayrı bölgeye taşımanın kazancı bunun üstüne 2 sayıdır: ilk atlamada erişilen kalem 16’dan 4’e, veri bölgesine giden sınır sayısı 2’den 3’e gidiyor.
- Bedeli 15 kural satırı ve 2 kesilen meşru akıştır. Kesilen ikisi de seyrek çalışan işlerdir (çeyrek sonu mutabakatı, şube arşivi); düz ağda hiç kural istemedikleri için hiç görünmemişlerdi.
- Bir bölge düştüğünde ulaşılan bölge toplamı düz yerleşimde 30, bölütlü yerleşimde 17: kapanan yol 13. Şube bölgesi düştüğünde ulaşılan kalem 90’dan 25’e iniyor.
- Bölütlemenin kapatamadığı bölge yönetim bölgesidir: 6 bölgeye doğrudan yazılmıştır ve düştüğünde 205 kaleme ulaşılıyor — bölütlü yerleşimde de düz yerleşimdeki sayının aynısı.
Sonraki Adım
Yönetim bölgesi satırı çözülmemiş bir kalem bırakıyor: altı bölgeye doğrudan yazılan bir bölge, bölütlemenin hiçbir yol kapatmadığı tek yerdir. Sonraki dersin sorusu bu bölgeyi kaldırmak değil, oradan çıkan bağlantıları tek bir noktadan geçirmenin ne kazandırdığıdır. Bir denetim noktası konulduğunda kaç bağlantı o noktadan geçiyor, o noktanın kaydettiği ve kanıtladığı iddia sayısı ne oluyor, nokta düştüğünde kaç yol birden kesiliyor ve en önemlisi — kaç yol o noktayı hiç kullanmadan hedefe varıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.