Alt ağ maskesi ve CIDR öneki, bir IP adresinin hangi bölümünün ağı, hangi bölümünün cihazı gösterdiğini belirler. /24, /26 ve /30 bloklarının ağ ve yayın adresini elle bulmayı, bloğu bölmeyi ve VLSM ile adres dağıtmayı örneklerle gösteriyoruz.
CIDR gösteriminde /24, adresin ilk 24 bitinin ağı, kalan 8 bitin cihazı gösterdiğini söyler; alt ağ maskesi (subnet mask) olarak 255.255.255.0 yazılır ve blokta 256 adres bulunur. Bunlardan ilki ağ adresi (network address), sonuncusu yayın adresi (broadcast address) olduğu için cihazlara 254 adres kalır (/31 ve /32 hariç). Önek bir büyüdükçe blok yarıya iner: /25'te 128, /26'da 64 adres vardır.
IPv4 adresi 32 bittir. 192.168.10.77 yazımında her sayı 8 bitlik bir parçadır (sekizli, octet). Adresin baştaki bitleri ağı, sondaki bitleri o ağdaki cihazı (host) gösterir. Sınırın yerini alt ağ maskesi belirler: maskede 1 olan bitler ağ kısmı, 0 olan bitler host kısmıdır.
CIDR (Classless Inter-Domain Routing, sınıfsız alanlar arası yönlendirme) aynı sınırı kısa yazar: adresin ardına / ve ağ bitlerinin sayısı (önek uzunluğu, prefix length) eklenir. Bu sayı 0 ile 32 arasındadır (RFC 4632 §3.1). CIDR ile eski A, B, C sınıf sistemi terk edildi (§3, §5): ağın boyutu adresin ilk bitlerinden değil, yazılan önekten anlaşılır. /8, /16 ve /24 eski sınıfların boyutlarıdır; aralarındaki her uzunluk da geçerlidir.
Örnek: /26, 26 tane 1 ve ardından 6 tane 0 demektir. Son sekizli 11000000 = 128 + 64 = 192 olduğu için maske 255.255.255.192 olur.
11111111.11111111.11111111.11000000
Maskenin 1'leri soldan başlayıp kesintisiz sürmelidir (RFC 4632 §5.1): 255.255.255.192 geçerli, 255.255.255.100 geçersizdir. Bir adresin ya da maskenin ikili, onaltılık ve tam sayı karşılığını IP dönüştürücüde görebilirsiniz.
Her satırın adres sayısı bir üstündekinin yarısıdır. Host sayısı, cihazlara verilebilen kullanılabilir adreslerin sayısıdır ve toplamdan iki eksiktir; nedenini ve /31 ile /32 istisnalarını küçük bloklar bölümünde bulursunuz. /16 eski B sınıfının, /24 eski C sınıfının boyutudur (RFC 4632 §3.1 tablosu).
| Önek | Alt ağ maskesi | Toplam adres | Host sayısı |
|---|---|---|---|
/16 | 255.255.0.0 | 65.536 | 65.534 |
/17 | 255.255.128.0 | 32.768 | 32.766 |
/18 | 255.255.192.0 | 16.384 | 16.382 |
/19 | 255.255.224.0 | 8.192 | 8.190 |
/20 | 255.255.240.0 | 4.096 | 4.094 |
/21 | 255.255.248.0 | 2.048 | 2.046 |
/22 | 255.255.252.0 | 1.024 | 1.022 |
/23 | 255.255.254.0 | 512 | 510 |
/24 | 255.255.255.0 | 256 | 254 |
/25 | 255.255.255.128 | 128 | 126 |
/26 | 255.255.255.192 | 64 | 62 |
/27 | 255.255.255.224 | 32 | 30 |
/28 | 255.255.255.240 | 16 | 14 |
/29 | 255.255.255.248 | 8 | 6 |
/30 | 255.255.255.252 | 4 | 2 |
Tabloyu Python ile üretip RFC 4632 §3.1'deki adres sayılarıyla karşılaştırdık. Elle hesaplamak için iki işlem yeter: host biti = 32 − önek; adres sayısı = 2 üzeri host biti.
Soru: 192.168.10.77/26 adresi hangi ağdadır, o ağın sınırları nedir?
192.168.10.64.192.168.10.127.192.168.10.65 ile 192.168.10.126 arası, yani 64 − 2 = 62 host.Sınama: adres ile maskenin bit bit VE (AND) işlemi ağ adresini verir. Maskenin ilk üç sekizlisi 255 (hepsi 1) olduğu için adres orada aynen kalır; yalnızca son sekizliye bakmak yeter.
77 = 01001101 adres, son sekizli 192 = 11000000 maske, son sekizli 64 = 01000000 VE sonucu
Aynı hesabı Python'un ipaddress modülüyle de sınadık. Çıktılar 26 Ekim 2026'da Python 3.14.4 ile alındı. Komutları, Python yorumlayıcısını (komut satırında python3) açıp >>> işaretinden sonrasını yazarak çalıştırabilirsiniz.
>>> import ipaddress
>>> n = ipaddress.ip_network('192.168.10.77/26', strict=False)
>>> print(n.network_address, n.broadcast_address)
192.168.10.64 192.168.10.127
>>> print(n.netmask, n.hostmask)
255.255.255.192 0.0.0.63
>>> h = list(n.hosts())
>>> print(h[0], h[-1], len(h), n.num_addresses)
192.168.10.65 192.168.10.126 62 64
>>> print(ipaddress.ip_address('192.168.10.80') in n)
True
>>> ipaddress.ip_network('192.168.10.77/26')
Traceback (most recent call last):
...
ValueError: 192.168.10.77/26 has host bits set
Son komut, strict=False olmadan Python'un neden hata verdiğini gösterir: 192.168.10.77/26 bir cihaz adresidir, ağ tanımı değildir. Ağ 192.168.10.64/26'dır.
Hesaplayıcıda 192.168.10.77/26 bağlantısını açın: sonuç kartı aynı değerleri verir ve ikili gösterimde ağ bitlerini kalın, host bitlerini soluk işaretler. Ağ adresi yerine cihaz adresi yazarsanız hesaplayıcı da adresin içinde bulunduğu bloğu gösterir. "Bir adres bu blokta mı?" denetimi, Python'daki in sorgusuyla aynı işi yapar. Hesap tarayıcınızda yapılır; yazdığınız adres sunucuya gönderilmez.
Bir IP raporunda "Servis sağlayıcı ve kayıt" kartındaki "IP bloğu" satırı CIDR olarak biliniyorsa, yanındaki "Hesapla" bağlantısı o bloğu aynı hesaplayıcıda açar.
Bloğun ilk adresinde host bitlerinin hepsi 0'dır; bu adres ağın kendisini adlandırır. Son adresinde hepsi 1'dir; bloktaki tüm cihazlara yayın için kullanılır. İkisi de cihaza verilmediği için bir /30 bloğu dört adresten yalnızca ikisini cihazlara verebilir (RFC 3021 §1). İki yönlendiriciyi bağlayan bir hat için bu, adreslerin yarısını harcamak demektir.
/31 bu yüzden RFC 3021 ile tanımlandı. Noktadan noktaya bir bağlantıda iki adresin ikisi de cihaza verilir; ağ ve yayın adresi yoktur (§2.1). Yalnızca iki ucu olan hatlarda kullanılır ve iki uç da desteklemelidir: yalnızca bir ucun desteklediği hat düzgün çalışmayabilir (§5). /32 tek bir adrestir; RFC 4632 tablosu bunu "host route" diye adlandırır.
>>> import ipaddress
>>> for p in (30, 31, 32):
... n = ipaddress.ip_network('192.168.10.8/%d' % p, strict=False)
... print(n, n.num_addresses, [str(a) for a in n.hosts()])
...
192.168.10.8/30 4 ['192.168.10.9', '192.168.10.10']
192.168.10.8/31 2 ['192.168.10.8', '192.168.10.9']
192.168.10.8/32 1 ['192.168.10.8']
Python da bu kuralı izler (hosts() açıklaması): /30'da 2, /31'de 2, /32'de 1 kullanılabilir adres. Hesaplayıcı aynı sayıları gösterir.
Bir bloğu bölmek için önek uzunluğunu artırırsınız; çıkan her parçaya alt ağ (subnet) denir. Her ek bit blok sayısını ikiye katlar: /22'den /24'e 2 bit eklenir, 2 üzeri 2 = 4 alt ağ çıkar. Her biri 256 adrestir; dördü 1.024 eder, yani /22'nin tamamı.
>>> import ipaddress
>>> blok = ipaddress.ip_network('10.0.0.0/22')
>>> print(*blok.subnets(new_prefix=24))
10.0.0.0/24 10.0.1.0/24 10.0.2.0/24 10.0.3.0/24
>>> print(*ipaddress.collapse_addresses(blok.subnets(new_prefix=24)))
10.0.0.0/22
Alt ağlar 10.0.0.x'ten 10.0.3.x'e gider, çünkü /22'nin maskesi 255.255.252.0: üçüncü sekizlide 256 − 252 = 4 değer (0, 1, 2, 3) kapsar.
İkinci komut ters yönü gösterir: ardışık ve hizalı bloklar tek blokta toplanır (yönlendirme tablolarında özetleme, aggregation; RFC 4632 §4.1). Birleşmek için bloklar yalnızca ardışık olmaz, birleşik bloğun boyutuna da hizalı olmalıdır. 10.0.2.0/24 ile 10.0.3.0/24 birleşip 10.0.2.0/23 olur. 10.0.1.0/24 ile 10.0.2.0/24 ardışıktır ama birleşemez, çünkü bir /23 üçüncü sekizlide yalnızca çift sayıyla başlar.
10.0.0.0/22 bloğunu hesaplayıcıda açın, "Bloğu daha küçük alt ağlara böl" bölümüne 24 yazıp Böl düğmesine basın: dört bloğu kullanılabilir aralıkları ve yayın adresleriyle listeler.
VLSM (Variable Length Subnet Mask, değişken uzunluklu alt ağ maskesi), bir bloğu eşit parçalara değil, her ağın ihtiyacına göre farklı önek uzunluklu parçalara bölmektir. İki cihazlık bir yönlendirici hattına /24 vermek 252 adresi boşa harcar; VLSM ile o hatta /30 verirsiniz.
Örnek: 192.168.0.0/24 bloğundan 50, 20, 10 ve 2 hostluk dört ağ çıkarılacak.
Sonuç:
192.168.0.0/26; kullanılabilir 192.168.0.1 – 192.168.0.62; yayın 192.168.0.63.192.168.0.64/27; kullanılabilir 192.168.0.65 – 192.168.0.94; yayın 192.168.0.95.192.168.0.96/28; kullanılabilir 192.168.0.97 – 192.168.0.110; yayın 192.168.0.111.192.168.0.112/30; kullanılabilir 192.168.0.113 – 192.168.0.114; yayın 192.168.0.115.192.168.0.116 ile 192.168.0.255 arasındaki 140 adres sonraki ağlar için boş kalır. Aynı yerleşimi Python ile hesapladık; çıktı sütunları sırasıyla istek, blok, ilk kullanılabilir adres, son kullanılabilir adres ve yayın adresidir.
>>> import ipaddress
>>> blok = ipaddress.ip_network('192.168.0.0/24')
>>> sonraki = int(blok.network_address)
>>> for ihtiyac in sorted([50, 20, 10, 2], reverse=True):
... bit = 2
... while 2**bit - 2 < ihtiyac: bit += 1
... ag = ipaddress.ip_network((sonraki, 32 - bit))
... print(ihtiyac, ag, ag[1], ag[-2], ag[-1])
... sonraki = int(ag.broadcast_address) + 1
...
50 192.168.0.0/26 192.168.0.1 192.168.0.62 192.168.0.63
20 192.168.0.64/27 192.168.0.65 192.168.0.94 192.168.0.95
10 192.168.0.96/28 192.168.0.97 192.168.0.110 192.168.0.111
2 192.168.0.112/30 192.168.0.113 192.168.0.114 192.168.0.115
>>> print(ipaddress.ip_address(sonraki), int(blok.broadcast_address) - sonraki + 1)
192.168.0.116 140
>>> ipaddress.ip_network('192.168.0.4/26')
Traceback (most recent call last):
...
ValueError: 192.168.0.4/26 has host bits set
Son komut sırayı bozmanın bedelini gösterir. /30'u önce 192.168.0.0'a koyarsanız sıradaki adres .4 olur; bir /26 bloğu .4'ten başlayamaz, .64'e atlamanız gerekir ve 60 adres boşa gider.
VLSM'in çalışması için yönlendirme protokolünün önek uzunluğunu taşıması gerekir. OSPF, IS-IS, RIPv2, EIGRP ve BGP-4 taşır; RFC 1058'deki eski RIP taşımaz (RFC 4632 §5).
Hesaplayıcıda 192.168.0.0/24 yazın, "İhtiyaca göre dağıt (VLSM, yalnızca IPv4)" bölümünü açın ve her satıra bir sayı yazın: 50, 20, 10, 2. Aynı dört bloğu verir. Hesaplayıcı VLSM'de /31 ve /32 kullanmaz; iki hostluk hatta /30 verir. İki uç da RFC 3021'i destekliyorsa o hat /31 olabilir.
Güvenlik duvarı kuralı, bulut güvenlik grubu ya da erişim listesi yazarken elinizde 192.168.1.10 - 192.168.1.200 gibi bir aralık olabilir. Bir CIDR bloğu kendi boyutuna hizalı bir adreste başlar; bu aralık hizalı başlamadığı için tek blok olmaz.
>>> import ipaddress
>>> ilk = ipaddress.ip_address('192.168.1.10')
>>> son = ipaddress.ip_address('192.168.1.200')
>>> bloklar = list(ipaddress.summarize_address_range(ilk, son))
>>> for b in bloklar: print(b, b.num_addresses)
...
192.168.1.10/31 2
192.168.1.12/30 4
192.168.1.16/28 16
192.168.1.32/27 32
192.168.1.64/26 64
192.168.1.128/26 64
192.168.1.192/29 8
192.168.1.200/32 1
>>> print(len(bloklar), sum(b.num_addresses for b in bloklar), int(son) - int(ilk) + 1)
8 191 191
Sekiz blok çıkar; adres sayılarının toplamı aralıktaki 191 adrese eşittir. Bloklar önce büyür, aralığın sonuna doğru küçülür. Kuralınız fazladan adres kapsayabiliyorsa aralığı genişletip tek blok kullanabilirsiniz (192.168.1.0/24 gibi).
IP aralığı → CIDR aracı aynı sekiz bloğu listeler; "Hepsini kopyala" düğmesi blokları satır satır panoya alır.
Cisco IOS erişim listelerinde (ACL) adres, alt ağ maskesiyle değil joker maskeyle (wildcard mask) yazılır. Joker maske alt ağ maskesinin tersidir: 255.255.255.255'ten maskeyi çıkarırsınız. 255.255.255.192 için sonuç 0.0.0.63'tür; yukarıdaki Python komutunda hostmask ile alınan değer budur.
Bitlerin anlamı da tersine döner: joker maskede 0, "bu bit adresle aynı olmalı"; 1, "bu biti yoksay" demektir. 192.168.10.64 0.0.0.63 çifti bu yüzden ilk üç sekizlisi 192.168.10 olan ve son sekizlisi 64 ile 127 arasında kalan adresleri, yani 192.168.10.64/26 bloğunu eşler. Hesaplayıcının sonuç kartında "Joker (wildcard) maske" satırı vardır.
RFC 1918 kurum içi kullanım için üç blok ayırır. Bu adresler internete yönlendirilmez ve kullanmak için bir kayıt kuruluşundan izin gerekmez (§3).
10.0.0.0/8: 10.0.0.0 – 10.255.255.255, 16.777.216 adres172.16.0.0/12: 172.16.0.0 – 172.31.255.255, 1.048.576 adres192.168.0.0/16: 192.168.0.0 – 192.168.255.255, 65.536 adresRFC 6598'in ayırdığı 100.64.0.0/10 (100.64.0.0 – 100.127.255.255, 4.194.304 adres) ise özel değil, paylaşılan adres alanıdır. Sağlayıcının CGN (Carrier-Grade NAT) cihazı ile müşteri modemi arasındaki bağlantıları numaralandırmak için ayrılmıştır (§1, §7) ve sağlayıcı sınırlarının ötesine iletilmez (§4). Modeminizin internet (WAN) tarafında bu blokta bir adres görüyorsanız sağlayıcınız CGN kullanıyor olabilir. Hesaplayıcı bu blokları "Özel ağ (RFC 1918)" ve "Paylaşılan adres alanı, CGNAT (RFC 6598)" olarak etiketler.
IPv6 adresi 128 bittir ve önek aynı biçimde yazılır: 2001:db8:abcd:1::/64 (RFC 4291 §2.3; 2001:db8::/32 belgeleme için ayrılmış bloktur, RFC 3849). Host biti sayısı 128 − önek uzunluğudur. Üç fark önemlidir.
hosts() işlevi de bu adresi atlar.RFC 6177, bir siteye en az bir /64 ve çoğu durumda çok daha fazlasının verilmesini ister; kesin boyutu sağlayıcı politikalarına bırakır. Elinize /48 geçtiyse içinde 65.536 tane /64 vardır.
>>> import ipaddress
>>> site = ipaddress.ip_network('2001:db8:abcd::/48')
>>> lan = ipaddress.ip_network('2001:db8:abcd:1::/64')
>>> print(lan.num_addresses, site.num_addresses // lan.num_addresses)
18446744073709551616 65536
>>> print(lan[0], next(lan.hosts()))
2001:db8:abcd:1:: 2001:db8:abcd:1::1
Hesaplayıcı IPv6 bloklarını da çözer; yayın adresi satırı göstermez, ilk ve son adresi verir.
192.168.10.77/26 bir ağ tanımı değildir; ağ 192.168.10.64/26'dır. Kural ve yönlendirme girdilerinde ağ adresini yazın.192.168.0.100/27 geçerli bir ağ değildir. /27 blokları 32'nin katlarında başlar; 100'ün bulunduğu blok 192.168.0.96/27'dir.010.1.1.1 sekizlik (octal) gösterimle karışabilir. Python 3.9.5'ten beri böyle adresleri hata sayar; hesaplayıcı da reddeder.Yazıdaki teknik bilgiler yukarıdaki kaynaklardan alınmış, komutlar ve örnekler çalıştırılarak denetlenmiştir. Bir hata görürseniz bize yazın; düzeltmeyi tarihiyle birlikte ekleriz.