Tüm geçerli klas genel tek noktaya yayın IPv4 adreslerini çıktılar


10

IPv4 adresleri 32 bit genişliğindedir ve bu nedenle adres alanının boyutu 2 32 veya 4.294.967.296'dır. Ancak, bu sadece teorik bir üst sınırdır. Genel internette kullanılabilecek tüm adreslerin doğru bir temsili değildir.

Bu zorluğun amaçları doğrultusunda, tüm adreslemenin klasik olduğu varsayılmaktadır . Gerçekte, adres alanının sınıfsal alt bölümünün yerini CIDR (Sınıfsız Alanlar Arası Yönlendirme ve VLSM (Değişken Uzunluk Alt Ağ Maskelemesi) almıştır , ancak bu sorun için bu yok sayılır.

Sınıfsal adres şemasına göre 3 sınıf vardır:

  • Sınıf A - 0.0.0.0için 127.255.255.255olan /8maskesi uzunluk
  • Sınıf B - 128.0.0.0için 191.255.255.255olan /16maskesi uzunluk
  • C Sınıfı - 192.0.0.0için 223.255.255.255olan /24maskesi uzunluk

Sınıf D (çoklu yayın) ve E (ayrılmış) da tanımlanır, ancak bunlar genel tek noktaya yayın adresleri için kullanılmaz.

Her sınıf, o sınıfın ağ maskesine göre ağlara bölünür.

Böylece 3.0.0.0A Sınıfı ağın bir örneğidir. Bu ağ için tam adres alanı yani Sınıf A için ağ maskesi uzunluğu 8'dir 3.0.0.0için 3.255.255.255. Ancak, ilk adres ( 3.0.0.0) ağ adresi olarak ve son adres ( 3.255.255.255) o ağ için yayın adresi olarak ayrılmıştır. Böylece kullanılabilir adreslerden gerçek aralığı 3.0.0.1için 3.255.255.2542 olduğu 24 - 2 (= 16.777.214) toplam adresleri.

Benzer şekilde, 200.20.30.0C Sınıfı bir ağ örneğidir. Bu ağ için tam adres alanı yani Sınıf C için ağ maskesi uzunluğu, 24 olduğunu 200.20.30.0için 200.20.30.255. Ağ ve yayın adresleri yaprakları kullanılabilir adreslerden gerçek dizi kaldırma olduğu 200.20.30.1için 200.20.30.254olan 2'dir 8 2 (X = 254) toplam adresleri -.

Genel tek noktaya yayın için kullanılabilecek adres aralıklarıyla ilgili başka sınırlamalar da vardır. RFC 6890'a göre izin verilmeyen aralıklar:

  • 0.0.0.0/8 - Yerel ağ oluşturma
  • 10.0.0.0/8 - Özel kullanım
  • 100.64.0.0/10 - Paylaşılan Adres Alanı
  • 127.0.0.0/8 - Geri döngü
  • 169.254.0.0/16 - Yerel Bağlantı
  • 172.16.0.0/12- Özel kullanım
  • 192.0.0.0/24 - IETF Protokolü Atamaları
  • 192.0.2.0/24 - Dokümantasyonda kullanılmak üzere ayrılmıştır
  • 192.88.99.0/24 - 6to4 Geçiş Anycast
  • 192.168.0.0/16 - Özel kullanım
  • 198.18.0.0/15 - Kıyaslama
  • 198.51.100.0/24 - Dokümantasyonda kullanılmak üzere ayrılmıştır
  • 203.0.113.0/24 - Dokümantasyonda kullanılmak üzere ayrılmıştır

Yukarıdaki listenin, bir aralığı verimli bir şekilde belirlemek için VLSR ağ maskeleri kullandığını unutmayın. Bir durum dışındaki tüm durumlarda, verilen maske uzunluğunun, aralığın başlangıcı için normal klasik maske uzunluğundan daha az veya ona eşit olduğu özgüllüğü vardır. Dolayısıyla, bu VLSR aralıklarının her biri bir veya daha fazla klas ağa eşdeğerdir. Örneğin 172.16.0.0/12B sınıfı ağları eşdeğerdir 172.16.0.0için 172.31.0.0veya adres aralığına 172.16.0.0kadar 172.31.255.255.

Bu kuralın istisnası 100.64.0.0/10, 100.0.0.0A Sınıfı aralığından daha spesifik olan VLSR aralığıdır. Böylece 100.0.0.0, ortasında 4.194.304 adresli bir delik olması haricinde, diğer Sınıf A aralıkları gibi ele alınacaktır. Bu sınıfı aralığında geçerli adresler olacak 100.0.0.0kadar 100.63.255.255ve 100.128.0.0hiç 100.255.255.2542 olmak üzere toplam 24 2 - 22 - 2 (= 12.582.910) toplam adresleri.

Bu zorluğun amacı, halka açık bir internet ana bilgisayarına geçerli olarak atanabilecek tüm Sınıf A, B ve C tek noktaya yayın IPv4 adreslerini vermektir (yani, yukarıda ayrıntıları verilenler hariç).

  • Hiçbir girdi verilmeyecektir ve beklenmemelidir.

  • Çıktı dilinize uygun herhangi bir biçimde olabilir, örneğin dizi, liste, sınırlandırılmış dize. Adresler standart noktalı ondalık biçimde yazılmalıdır.

  • Çıktı sırası önemli değil.

  • Özellikle gerekli adres aralığını veren yapılara izin verilmez. Benzer şekilde , genel internet için bir BGP (veya başka bir protokol) yönlendirme tablosunu dinamik olarak inceleme yöntemlerine izin verilmez.

Sayısal olarak en düşük adres 1.0.0.1ve sayısal olarak en yüksek adres olacaktır 223.255.255.254.


Bu zorluk Tüm IPv6 adreslerini yazdır ile benzerdir , ancak kısıtlamalar nedeniyle önemsiz derecede farklı bir uygulama gerektirir.

Yanıtlar:


2

PowerShell, 648 641 625 bayt

for([uint64]$a=16MB;$a-lt2GB-16mb;$a++){if(($a%16mb)*(($a+1)%16mb)*($a-lt160MB-or$a-gt176MB)*($a-lt1604MB-or$a-ge1608MB)){([ipaddress]$a).IPAddressToString}}
for($a=2GB;$a-lt3GB;$a++){if(($a%64kb)*(($a+1)%64kb)*($a-lt2785152kb-or$a-gt2720mb)*($a-lt2753mb-or$a-gt2754mb)){([ipaddress]$a).IPAddressToString}}
for($a=3221225728;$a-lt3.5GB;$a++){if(($a%256)*(($a+1)%256)*(($a-lt3221225984-or$a-gt3221226240))*(($a-lt3227017984-or$a-gt3151385kb))*(($a-lt3156480kb-or$a-gt3156544kb))*(($a-lt3245184kb-or$a-gt3245312kb))*(($a-lt3247321kb-or$a-gt3325256959))*(($a-lt3405803776-or$a-gt3405804032))){([ipaddress]$a).IPAddressToString}}

Düzenleme 1 - Ek iki baytlık tasarruf sağlayan iki operatörün kalan tüm güçlerini golf oynadım.
Edit 2 - Oyuncuyu [uint64]ilk bildirimine $ataşıdı ve 16 bayt tasarruf eden diğer iki yayın yok edildi .

Üç satır, A Sınıfı / B Sınıfı / C Sınıfı. Okunabilirlik için ayrı satırlar olarak bırakılmıştır. ;-)

Neler olup bittiğini anlamak için iki önemli nokta:

  • PowerShell, iki işleve sahiptir KB, MB, GB. Örneğin, int olarak 4KBdönecektir 4096. Düzinelerce bayt tıraş etmek için birden fazla yerde kullanıyoruz.
  • .NET [ipaddress]sınıfı , numaranın ikili gösterimini alarak sayısal bir değeri IP adresi olarak ayrıştırmaya çalışacaktır . Bu IPAddressToStringyapıcıyı çıktı argümanı ile kullanıyoruz .

Bu iki şeyi birleştirerek, IP adreslerini sayı olarak ele alabilir ve bunlarla bir for()döngü oluşturabiliriz. Örneğin, A sınıfı alt ağlar için ilk ilmek gider 16MBiçin 2GB-16MBile veya 16777216hiç 2130706432. İkili gösterimi 16777216olan 1000000000000000000000000ya 00000001.00000000.00000000.00000000biz 8 bitlik parçalar halinde bölmek eğer kolayca bu karşılık gelir görebilirsiniz 1.0.0.0noktalı ondalık gösterimle. Benzer şekilde, 2130706432olarak yazılabilir 01111111000000000000000000000000ya 01111111.00000000.00000000.00000000ya 127.0.0.0. Burada kullanılan her bir tamsayı veya ikisinin gücü tamsayı bu şekilde bir IP adresi olarak yeniden yazılabilir.

Böylece, her döngü yinelemesi için, if()ayrı ayrı ifadeleri bir araya getirerek hariç tutulan adresleri ayıklamak için bir ifade oluştururuz. Her bir ilk ifade yana ifbir tamsayıdır (modülo testi sayesinde) olduğu, geri kalan Boolean değerleri ya dönüştürülür 0veya 1/ Yanlış için. İfadelerden herhangi biri yanlışsa, çarpma işleminin tamamı dönüşür 0ve dolayısıyla yanlış olur. Böylece, yalnızca tüm ifadeler doğruysa, çözümlemenin sonucunu çıkaracağız.

Hafifçe Ungolfed:

# Class A
for($a=16MB;$a-lt2GB-16mb;$a++){
  $b=($a%16mb)                     # x.0.0.0
  $b*=(($a+1)%16mb)                # x.255.255.255
  $b*=($a-lt160MB-or$a-gt176MB)    # 10.0.0.0/8
  $b*=($a-lt1604MB-or$a-ge1608MB)  # 100.64.0.0/10
  if($b){([ipaddress]::Parse($a)).IPAddressToString}
}

# Class B
for($a=2GB;$a-lt3GB;$a++){
  $b=($a%64kb)                           # x.y.0.0
  $b*=(($a+1)%64kb)                      # x.y.255.255
  $b*=(($a-lt2785152kb-or$a-gt2720mb))  # 169.254.0.0/16
  $b*=(($a-lt2753mb-or$a-gt2754mb))      # 172.16.0.0/12
  if($b){([ipaddress]::Parse($a)).IPAddressToString}
}

# Class C
for($a=3221225728;$a-lt3.5GB;$a++){
  $b=($a%256)                               # x.y.z.0
  $b*=(($a+1)%256)                          # x.y.z.255
  $b*=(($a-lt3221225984-or$a-gt3221226240)) # 192.0.2.0/24
  $b*=(($a-lt3227017984-or$a-gt3151385kb)) # 192.88.99.0/24
  $b*=(($a-lt3156480kb-or$a-gt3156544kb)) # 192.168.0.0/16
  $b*=(($a-lt3245184kb-or$a-gt3245312kb)) # 198.18.0.0/15
  $b*=(($a-lt3247321kb-or$a-gt3325256959)) # 198.51.100.0/24
  $b*=(($a-lt3405803776-or$a-gt3405804032)) # 203.0.113.0/24
  if($b){([ipaddress]::Parse($a)).IPAddressToString}
}

1

Toplu, 1930 1884 1848 1830 bayt

@echo off
for /l %%a in (1,1,9)do call:a1 %%a
for /l %%a in (11,1,99)do call:a1 %%a
for /l %%b in (0,1,63)do call:a2 100 %%b
for /l %%b in (128,1,255)do call:a2 100 %%b
for /l %%a in (101,1,126)do call:a1 %%a
for /l %%a in (128,1,168)do call:b1 %%a
for /l %%b in (0,1,253)do call:b2 169 %%b
call:b2 169 255
call:b1 170
call:b1 171
for /l %%b in (0,1,15)do call:b2 172 %%b
for /l %%b in (32,1,255)do call:b2 172 %%b
for /l %%a in (173,1,191)do call:b1 %%a
call:c3 192 0 1
for /l %%c in (3,1,255)do call:c3 192 0 %%c
for /l %%b in (1,1,87)do call:c2 192 %%b
for /l %%c in (0,1,98)do call:c3 192 88 %%c
for /l %%c in (100,1,255)do call:c3 192 88 %%c
for /l %%b in (89,1,167)do call:c2 192 %%b
for /l %%b in (169,1,255)do call:c2 192 %%b
for /l %%a in (193,1,197)do call:c1 %%a
for /l %%b in (0,1,17)do call:c2 198 %%b
for /l %%b in (20,1,50)do call:c2 198 %%b
for /l %%c in (0,1,99)do call:c3 198 51 %%c
for /l %%c in (101,1,255)do call:c3 198 51 %%c
for /l %%b in (52,1,255)do call:c2 198 %%b
for /l %%a in (199,1,202)do call:c1 %%a
for /l %%c in (0,1,112)do call:c3 203 0 %%c
for /l %%c in (114,1,255)do call:c3 203 0 %%c
for /l %%b in (1,1,255)do call:c2 203 %%b
for /l %%a in (204,1,223)do call:c1 %%a
exit/b
:a1
for /l %%b in (0,1,255)do call:a2 %1 %%b
exit/b
:a2
for /l %%c in (0,1,255)do call:a3 %1 %2 %%c
exit/b
:a3
for /l %%d in (0,1,255)do if not %2%3%%d==000 if not %2%3%%d==255255255 echo %1.%2.%3.%%d
exit/b
:b1
for /l %%b in (0,1,255)do call:b2 %1 %%b
exit/b
:b2
for /l %%c in (0,1,255)do call:b3 %1 %2 %%c
exit/b
:b3
for /l %%d in (0,1,255)do if not %3%%d==00 if not %3%%d==255255 echo %1.%2.%3.%%d
exit/b
:c1
for /l %%b in (0,1,255)do call:c2 %1 %%b
exit/b
:c2
for /l %%c in (0,1,255)do call:c3 %1 %2 %%c
exit/b
:c3
for /l %%d in (1,1,254)do echo %1.%2.%3.%%d

Düzenleme: Gereksiz alanları kaldırarak 46 82 bayt kaydedildi . Kullanarak 18 bayt Kaydedilen exit/byerine goto:eof.


1
1872 bayt sayıyorum. Sen teknik gerekmez @echo off, hem de.
Addison Crump

@FlagAsSpam Muhtemelen CR'ler; Not Defteri onları kaydetmeyi sever.
Neil

Unix UTF-8 bayt olarak saydığımız için bunları kaldırabilirsiniz.
Addison Crump
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.