Jak to liczymy: kalkulator podsieci

Ta strona opisuje dokładnie to, co liczy kod kalkulatora (subnet.js), tak żeby każdy mógł sprawdzić wynik ręcznie. Ograniczenia są wypisane w sekcji Czego kalkulator nie uwzględnia, a tabela wszystkich prefiksów IPv4 w sekcji Ściąga prefiksów.

Każdy symbol ma na całej stronie jedno znaczenie. Wszystkie są w ramce „Oznaczenia” (na telefonie: przycisk na dole ekranu), a po najechaniu na symbol we wzorze albo dotknięciu go pojawia się jego opis. Adres traktujemy jak jedną liczbę całkowitą: IPv4 ma 32 bity, IPv6 128. AND, OR i NOT działają na każdym bicie osobno.

1. Adres, prefiks i maska

IPv4 zapisujemy jako cztery liczby 0–255 rozdzielone kropkami; każda to 8 bitów. Liczby z zerem na początku (np. 010) odrzucamy, bo część systemów czyta je ósemkowo (010 = 8). IPv6 to osiem grup po 1–4 cyfry szesnastkowe rozdzielonych dwukropkami; raz w adresie „::” zastępuje jedną albo więcej grup zer, a ostatnie 32 bity można zapisać jak IPv4 (::ffff:192.0.2.1). Wielkość liter nie ma znaczenia.

Prefiks mówi, ile pierwszych bitów adresu to numer sieci. Maska to te same bity zapisane jak adres:

L = 32 (IPv4) albo 128 (IPv6) M = (2p − 1) × 2L − p (p jedynek, potem L − p zer) W = NOT M = 2L − p − 1 (wildcard)

Przykład: /26 to 26 jedynek i 6 zer, czyli 255.255.255.192; wildcard 0.0.0.63. Maskę wpisaną jak adres (np. 255.255.252.0) zamieniamy na prefiks, licząc jedynki; jeśli jedynki nie idą jedna po drugiej od lewej (np. 255.0.255.0), to nie jest maska podsieci i kalkulator zgłasza błąd.

2. Adres sieci, broadcast i hosty (IPv4)

N = A AND M (adres sieci: część urządzenia wyzerowana) B = N OR W (broadcast: część urządzenia wypełniona jedynkami) R = 2L − p (wszystkich adresów) H = R − 2 dla p ≤ 30 (pierwszy host N + 1, ostatni B − 1) H = 2 dla p = 31 (oba adresy dla urządzeń, bez broadcastu) H = 1 dla p = 32 (jeden adres)

Przykład: 192.168.1.130/26. 130 = 10000010, maska kończy się na 11000000, więc AND daje 10000000 = 128: sieć 192.168.1.128, broadcast 192.168.1.191 (128 + 63), R = 26 = 64, H = 62. Pierwszy adres sieci (sam adres sieci) i ostatni (broadcast) nie trafiają do urządzeń. Wyjątki: sieć /31 to łącze punkt–punkt dwóch urządzeń, w którym oba adresy są dla nich (RFC 3021), a /32 to pojedynczy adres (np. w trasach i regułach zapory). Wpisany adres może być dowolnym adresem w sieci: kalkulator pokazuje wtedy, do której sieci należy.

Ciekawostka: w chmurze AWS i Azure z każdej podsieci IPv4 znikają jeszcze trzy adresy (router, DNS, rezerwa), razem 5, więc /24 ma tam 251 adresów dla maszyn. Kalkulator tego nie odejmuje (dokumentacja obu firm w źródłach).

Przykładowy pakiet (kafelek „Nagłówek pakietu”)

Kolumna „Przykład” to ping (ICMP echo z 56 bajtami danych) z wpisanego adresu (gdy wpisano adres sieci: z kolejnego) do adresu do dokumentacji 203.0.113.10 albo 2001:db8::10, z wartościami, jakie ustawia Linux: TTL i limit przeskoków 64, w IPv4 flaga DF, identyfikacja 0x3a1f (dowolna). Sumę kontrolną nagłówka IPv4 liczymy według RFC 1071: nagłówek dzielimy na 16-bitowe słowa (z polem sumy równym 0), dodajemy je, przeniesienia ponad 16 bitów dodajemy z powrotem do wyniku, a na koniec odwracamy wszystkie bity. Przykład: dla 192.168.1.130 → 203.0.113.10 wychodzi 0x0255.

3. Rodzaj adresu i klasa

Rodzaj to najwęższy zakres z tabeli, który zawiera całą sieć. Gdy sieć tylko częściowo pokrywa zakresy z tabeli (np. 10.0.0.0/7 to 10.0.0.0/8 prywatna i 11.0.0.0/8 publiczna), piszemy „kilka rodzajów adresów”. Gdy nie dotyka żadnego: IPv4 jest publiczny, a IPv6 poza 2000::/3 zarezerwowany. Tabela według rejestrów adresów specjalnych IANA (RFC 6890), plus dwa bloki z rejestru multicastu (224.0.0.0/24, 239.0.0.0/8). Bez pojedynczych adresów wewnątrz bloków IETF i bez bloków wycofanych. Ta sama lista jest w kalkulatorze w panelu „Adresy specjalne”, z opisem każdego bloku:

ZakresRodzajDokument
0.0.0.0/8„ta sieć”RFC 791, RFC 1122
10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16prywatneRFC 1918
100.64.0.0/10wspólne operatora (CGNAT)RFC 6598
127.0.0.0/8pętla zwrotnaRFC 1122
169.254.0.0/16link-local (APIPA)RFC 3927
224.0.0.0/4multicastRFC 5771
224.0.0.0/24multicast lokalnyRFC 5771, rejestr multicast IANA
239.0.0.0/8multicast organizacjiRFC 2365
255.255.255.255/32broadcast ograniczonyRFC 919, RFC 8190
192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24dokumentacjaRFC 5737
233.252.0.0/24dokumentacja multicastuRFC 6676
198.18.0.0/15testy wydajnościRFC 2544
192.0.0.0/24przypisania protokołów IETFRFC 6890
192.31.196.0/24, 192.175.48.0/24AS112 (DNS)RFC 7535, RFC 7534
192.52.193.0/24AMTRFC 7450
192.88.99.0/246to4 (wycofane)RFC 7526
240.0.0.0/4zarezerwowane (klasa E)RFC 1112
::/128, ::1/128nieokreślony, pętla zwrotnaRFC 4291
fe80::/10link-localRFC 4291
fc00::/7lokalne unikatowe (ULA)RFC 4193
ff00::/8multicastRFC 4291
2000::/3globalne (publiczne)RFC 4291
::ffff:0:0/96IPv4 zapisany jako IPv6RFC 4291
64:ff9b::/96, 64:ff9b:1::/48NAT64, NAT64 lokalnyRFC 6052, RFC 8215
2002::/166to4RFC 3056
2001::/32TeredoRFC 4380
2001:db8::/32, 3fff::/20dokumentacjaRFC 3849, RFC 9637
2001:2::/48testy wydajnościRFC 5180
100::/64do odrzucania ruchuRFC 6666
2001::/23przypisania protokołów IETFRFC 2928
2001:20::/28ORCHIDv2RFC 7343
2001:3::/32AMTRFC 7450
2001:4:112::/48, 2620:4f:8000::/48AS112 (DNS)RFC 7535, RFC 7534
5f00::/16identyfikatory SRv6RFC 9602

Klasa (tylko IPv4) wynika z pierwszej liczby wpisanego adresu: A 0–127 (domyślnie /8), B 128–191 (/16), C 192–223 (/24), D 224–239 (multicast), E 240–255 (zarezerwowana). To podział sprzed 1993 r., zastąpiony przez CIDR (RFC 4632); kalkulator pokazuje go tylko jako informację, maskę zawsze bierze z prefiksu.

4. IPv6

N = A AND M (L = 128) B = N OR W (ostatni adres; IPv6 nie ma broadcastu) H = R = 2128 − p sieci /64 = 264 − p dla p ≤ 64

IPv6 nie ma broadcastu (zastępuje go multicast), więc wszystkie adresy sieci liczymy jako dostępne. Liczby powyżej 1012 pokazujemy jako potęgę dwójki z przybliżeniem (np. 264 ≈ 1,84 × 1019). Adresy wypisujemy w zapisie zalecanym przez RFC 5952: małe litery, bez zer na początku grup, najdłuższy ciąg co najmniej dwóch grup zer zastąpiony „::” (przy równych ciągach pierwszy), pojedyncza grupa zer zostaje jako 0; adresy ::ffff:0:0/96 kończymy zapisem IPv4.

Krok po kroku pokazuje adres jako 32 cyfry szesnastkowe; każda cyfra to 4 bity, więc prefiks obejmuje d pełnych cyfr i s bitów kolejnej:

d = ⌊p / 4⌋ s = p − 4 × d

Przykład: 2001:db8:abcd:12ff::1/57: d = 14, s = 1. 15. cyfra to f = 1111; zostaje pierwszy bit (1000 = 8), więc sieć to 2001:db8:abcd:1280::/57, a ostatni adres 2001:db8:abcd:12ff:ffff:ffff:ffff:ffff.

Zakładka „IPv6”: prefiks na sieci /64

Każda sieć lokalna w IPv6 to /64, więc prefiks od operatora albo z chmury (p ≤ 64) dzielimy na sieci /64 o kolejnych numerach i, od 0:

liczba sieci /64 = 264 − p Ni = N + i × 264 dla i = 0 … 264 − p − 1

Numer i pokazujemy też szesnastkowo, z tyloma cyframi, ile potrzeba dla ostatniej sieci (⌈(64 − p) / 4⌉). Przykład: 2001:db8:ab00::/56 to 256 sieci, od 2001:db8:ab00::/64 (00) do 2001:db8:ab00:ff::/64 (ff). W tabeli najwyżej 256 pierwszych sieci. Prefiks dłuższy niż /64 nie ma całych sieci /64.

5. Podział sieci (IPv4)

Według liczby hostów (VLSM)

Dla podsieci, która ma mieć h hostów, bierzemy najmniejszy blok, w którym zmieszczą się one razem z adresem sieci i broadcastem:

q = min(L − ⌈log2(h + 2)⌉, 30) H = 2L − q − 2

Przykład: 50 hostów: 50 + 2 = 52, najbliższa potęga dwójki w górę to 64 = 26, więc /26 (62 hosty). Najmniejsza podsieć to /30 (2 hosty); /31 kalkulator wybiera tylko w podziale na równe części, bo nadaje się wyłącznie na łącze dwóch urządzeń.

Podsieci układamy jedna po drugiej od początku sieci. Blok o rozmiarze 2L − q musi zaczynać się od adresu podzielnego przez ten rozmiar (inaczej nie byłby siecią /q), więc kolejna podsieć zaczyna się od pierwszego takiego adresu nie mniejszego niż X, pierwszy wolny adres:

N = ⌈X / 2L − q⌉ × 2L − q

Kolejność „Od największej” (domyślna): podsieci sortujemy od największego bloku (równe zostają w kolejności z listy). Wtedy każdy blok zaczyna się dokładnie tam, gdzie skończył się poprzedni (większy blok jest wielokrotnością mniejszego), więc nie ma dziur i mieści się wszystko, gdy suma bloków nie przekracza rozmiaru sieci. „Jak wpisane”: kolejność z listy; między podsieciami mogą zostać dziury. Wolne miejsce (dziury i koniec sieci) wypisujemy jako bloki CIDR sposobem z sekcji 6.

Gdy sieć jest za mała (któraś podsieć nie mieści się przed końcem sieci), kalkulator wypisuje podsieci bez miejsca i szuka najmniejszej większej sieci: zmniejsza prefiks o 1 (sieć dwa razy większa, zawierająca wpisaną: N = A AND M dla nowego prefiksu) i układa podsieci od nowa w tej samej kolejności, aż się zmieszczą. Pokazuje podział tej sieci. Przykład: 10.0.0.0/22, „Jak wpisane”, 200, 500 i 50 hostów: /24 na 10.0.0.0, /23 dopiero na 10.0.2.0 (10.0.1.0 nie dzieli się przez 512), na /26 nie ma miejsca, więc potrzebna jest 10.0.0.0/21. Przy „Od największej” to samo mieści się w /22.

Podpowiedź „Taniej”. Duża podsieć potrafi zmarnować prawie połowę bloku: 5100 hostów wymaga /19 (8190 hostów). Dla każdej podsieci sprawdzamy więc podział na dwie: blok o połowę mniejszy od jej bloku (który wypełni w całości, przy 5100: /20, 4094 hosty) i najmniejszy blok na resztę (1006 hostów: /22). Podpowiadamy ten podział, który najbardziej zmniejsza potrzebną sieć (np. 200 + 5100 + 50 hostów: /18 bez podziału, /19 z podziałem); gdy żaden nie zmniejsza, podpowiedzi nie ma.

Na równe części

k = ⌈log2 n⌉ q = p + k Ni = N + i × 2L − q dla i = 0 … 2k − 1

Dzielimy, dokładając k bitów do prefiksu, więc części jest zawsze 2k: przy n = 3 powstają 4 podsieci, ostatnia w zapasie. Hosty w każdej liczymy jak w sekcji 2 (także /31 i /32). Gdy q > 32, podziału nie ma; listę ograniczamy do 4096 podsieci.

6. Lista → CIDR

Odczyt listy

W wklejonym tekście szukamy wpisów. Wszystko inne (przecinki, średniki, cudzysłowy, nawiasy, słowa z logu) tylko je oddziela. Wpis to adres IPv4 albo IPv6, a po nim może być:

Wpisy, które wyglądają na adres, ale są błędne (300.1.1.1, prefiks /33, zera na początku liczby, zakres od IPv4 do IPv6), wypisujemy jako pominięte. Ciągi z dwukropkami bez „::” i z mniej niż 7 dwukropkami (godziny 10:00:01, adresy MAC) pomijamy bez słowa. Każdy wpis to przedział adresów od S do E; IPv4 i IPv6 liczymy osobno. Przedziały sortujemy i łączymy te, które na siebie nachodzą albo się stykają (kolejny zaczyna się najpóźniej w E + 1).

Dokładnie

Każdy połączony przedział zamieniamy na najmniejszą liczbę bloków CIDR, które razem obejmują dokładnie adresy od S do E. Zaczynając od X = S, bierzemy największy blok, który zaczyna się w X (X podzielne przez jego rozmiar) i nie wychodzi poza E; potem przesuwamy X za ten blok i powtarzamy:

X = S (na początku) q = najmniejsze, dla którego X mod 2L − q = 0 i X + 2L − q − 1 ≤ E X ← X + 2L − q dopóki X ≤ E

Przykład: 10.0.0.5–10.0.1.20 (272 adresy) daje 10 bloków: 10.0.0.5/32, 10.0.0.6/31, 10.0.0.8/29, 10.0.0.16/28, 10.0.0.32/27, 10.0.0.64/26, 10.0.0.128/25, 10.0.1.0/28, 10.0.1.16/30, 10.0.1.20/32. Jeden blok tu nie wystarczy, bo blok ma zawsze 2L − q adresów i zaczyna się od adresu podzielnego przez ten rozmiar. Takie rozbicie jest tylko jedno, więc wynik jest zawsze ten sam. Sąsiednie wpisy łączą się w większe bloki: 10.0.0.0/25, 10.0.0.128/25 i 10.0.1.0/24 dają 10.0.0.0/23.

Dla porównania pokazujemy też jeden blok obejmujący całą listę: najdłuższy prefiks wspólny dla pierwszego i ostatniego adresu (w przykładzie 10.0.0.0/23, czyli 512 adresów, w tym 240 spoza listy).

Uprość

Zaczynamy od całej przestrzeni adresów (/0) i schodzimy w dół. Blok /q bierzemy, gdy jest cały na liście albo gdy z listy jest co najmniej t jego adresów i bez niego potrzeba by co najmniej dwóch bloków dokładnych. Inaczej tak samo sprawdzamy obie jego połówki /(q + 1):

blok /q wchodzi, gdy Z = 2L − q albo Z ≥ t × 2L − q i adresy z listy w bloku to co najmniej 2 bloki dokładne

Przykład: 10.1.1.0/24 bez adresów .100 i .200. Dokładnie: 14 bloków. Przy t = 75%: Z = 254 ≥ 0,75 × 256 = 192, więc jeden blok 10.1.1.0/24 i 2 adresy spoza listy. Próg można ustawić od 50 do 99%. Pojedynczy adres (albo inny wpis, który sam jest blokiem CIDR) nigdy nie rośnie do większego bloku, bo nic by to nie dało. Dla każdego bloku pokazujemy Z, a w odpowiedzi sumę adresów spoza listy i same te adresy (najwyżej 10 zakresów).

7. Ściąga prefiksów IPv4

Hosty według sekcji 2 (/31: 2, /32: 1).

PrefiksMaskaWildcardAdresówHostów
/00.0.0.0255.255.255.2554 294 967 2964 294 967 294
/1128.0.0.0127.255.255.2552 147 483 6482 147 483 646
/2192.0.0.063.255.255.2551 073 741 8241 073 741 822
/3224.0.0.031.255.255.255536 870 912536 870 910
/4240.0.0.015.255.255.255268 435 456268 435 454
/5248.0.0.07.255.255.255134 217 728134 217 726
/6252.0.0.03.255.255.25567 108 86467 108 862
/7254.0.0.01.255.255.25533 554 43233 554 430
/8255.0.0.00.255.255.25516 777 21616 777 214
/9255.128.0.00.127.255.2558 388 6088 388 606
/10255.192.0.00.63.255.2554 194 3044 194 302
/11255.224.0.00.31.255.2552 097 1522 097 150
/12255.240.0.00.15.255.2551 048 5761 048 574
/13255.248.0.00.7.255.255524 288524 286
/14255.252.0.00.3.255.255262 144262 142
/15255.254.0.00.1.255.255131 072131 070
/16255.255.0.00.0.255.25565 53665 534
/17255.255.128.00.0.127.25532 76832 766
/18255.255.192.00.0.63.25516 38416 382
/19255.255.224.00.0.31.25581928190
/20255.255.240.00.0.15.25540964094
/21255.255.248.00.0.7.25520482046
/22255.255.252.00.0.3.25510241022
/23255.255.254.00.0.1.255512510
/24255.255.255.00.0.0.255256254
/25255.255.255.1280.0.0.127128126
/26255.255.255.1920.0.0.636462
/27255.255.255.2240.0.0.313230
/28255.255.255.2400.0.0.151614
/29255.255.255.2480.0.0.786
/30255.255.255.2520.0.0.342
/31255.255.255.2540.0.0.122
/32255.255.255.2550.0.0.011

8. Czego kalkulator nie uwzględnia

9. Źródła

← Wróć do kalkulatora