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.
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:
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.
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).
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.
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:
| Zakres | Rodzaj | Dokument |
|---|---|---|
| 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/16 | prywatne | RFC 1918 |
| 100.64.0.0/10 | wspólne operatora (CGNAT) | RFC 6598 |
| 127.0.0.0/8 | pętla zwrotna | RFC 1122 |
| 169.254.0.0/16 | link-local (APIPA) | RFC 3927 |
| 224.0.0.0/4 | multicast | RFC 5771 |
| 224.0.0.0/24 | multicast lokalny | RFC 5771, rejestr multicast IANA |
| 239.0.0.0/8 | multicast organizacji | RFC 2365 |
| 255.255.255.255/32 | broadcast ograniczony | RFC 919, RFC 8190 |
| 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 | dokumentacja | RFC 5737 |
| 233.252.0.0/24 | dokumentacja multicastu | RFC 6676 |
| 198.18.0.0/15 | testy wydajności | RFC 2544 |
| 192.0.0.0/24 | przypisania protokołów IETF | RFC 6890 |
| 192.31.196.0/24, 192.175.48.0/24 | AS112 (DNS) | RFC 7535, RFC 7534 |
| 192.52.193.0/24 | AMT | RFC 7450 |
| 192.88.99.0/24 | 6to4 (wycofane) | RFC 7526 |
| 240.0.0.0/4 | zarezerwowane (klasa E) | RFC 1112 |
| ::/128, ::1/128 | nieokreślony, pętla zwrotna | RFC 4291 |
| fe80::/10 | link-local | RFC 4291 |
| fc00::/7 | lokalne unikatowe (ULA) | RFC 4193 |
| ff00::/8 | multicast | RFC 4291 |
| 2000::/3 | globalne (publiczne) | RFC 4291 |
| ::ffff:0:0/96 | IPv4 zapisany jako IPv6 | RFC 4291 |
| 64:ff9b::/96, 64:ff9b:1::/48 | NAT64, NAT64 lokalny | RFC 6052, RFC 8215 |
| 2002::/16 | 6to4 | RFC 3056 |
| 2001::/32 | Teredo | RFC 4380 |
| 2001:db8::/32, 3fff::/20 | dokumentacja | RFC 3849, RFC 9637 |
| 2001:2::/48 | testy wydajności | RFC 5180 |
| 100::/64 | do odrzucania ruchu | RFC 6666 |
| 2001::/23 | przypisania protokołów IETF | RFC 2928 |
| 2001:20::/28 | ORCHIDv2 | RFC 7343 |
| 2001:3::/32 | AMT | RFC 7450 |
| 2001:4:112::/48, 2620:4f:8000::/48 | AS112 (DNS) | RFC 7535, RFC 7534 |
| 5f00::/16 | identyfikatory SRv6 | RFC 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.
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:
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.
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:
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.
Dla podsieci, która ma mieć h hostów, bierzemy najmniejszy blok, w którym zmieszczą się one razem z adresem sieci i broadcastem:
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:
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.
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.
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).
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:
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).
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):
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).
Hosty według sekcji 2 (/31: 2, /32: 1).
| Prefiks | Maska | Wildcard | Adresów | Hostów |
|---|---|---|---|---|
| /0 | 0.0.0.0 | 255.255.255.255 | 4 294 967 296 | 4 294 967 294 |
| /1 | 128.0.0.0 | 127.255.255.255 | 2 147 483 648 | 2 147 483 646 |
| /2 | 192.0.0.0 | 63.255.255.255 | 1 073 741 824 | 1 073 741 822 |
| /3 | 224.0.0.0 | 31.255.255.255 | 536 870 912 | 536 870 910 |
| /4 | 240.0.0.0 | 15.255.255.255 | 268 435 456 | 268 435 454 |
| /5 | 248.0.0.0 | 7.255.255.255 | 134 217 728 | 134 217 726 |
| /6 | 252.0.0.0 | 3.255.255.255 | 67 108 864 | 67 108 862 |
| /7 | 254.0.0.0 | 1.255.255.255 | 33 554 432 | 33 554 430 |
| /8 | 255.0.0.0 | 0.255.255.255 | 16 777 216 | 16 777 214 |
| /9 | 255.128.0.0 | 0.127.255.255 | 8 388 608 | 8 388 606 |
| /10 | 255.192.0.0 | 0.63.255.255 | 4 194 304 | 4 194 302 |
| /11 | 255.224.0.0 | 0.31.255.255 | 2 097 152 | 2 097 150 |
| /12 | 255.240.0.0 | 0.15.255.255 | 1 048 576 | 1 048 574 |
| /13 | 255.248.0.0 | 0.7.255.255 | 524 288 | 524 286 |
| /14 | 255.252.0.0 | 0.3.255.255 | 262 144 | 262 142 |
| /15 | 255.254.0.0 | 0.1.255.255 | 131 072 | 131 070 |
| /16 | 255.255.0.0 | 0.0.255.255 | 65 536 | 65 534 |
| /17 | 255.255.128.0 | 0.0.127.255 | 32 768 | 32 766 |
| /18 | 255.255.192.0 | 0.0.63.255 | 16 384 | 16 382 |
| /19 | 255.255.224.0 | 0.0.31.255 | 8192 | 8190 |
| /20 | 255.255.240.0 | 0.0.15.255 | 4096 | 4094 |
| /21 | 255.255.248.0 | 0.0.7.255 | 2048 | 2046 |
| /22 | 255.255.252.0 | 0.0.3.255 | 1024 | 1022 |
| /23 | 255.255.254.0 | 0.0.1.255 | 512 | 510 |
| /24 | 255.255.255.0 | 0.0.0.255 | 256 | 254 |
| /25 | 255.255.255.128 | 0.0.0.127 | 128 | 126 |
| /26 | 255.255.255.192 | 0.0.0.63 | 64 | 62 |
| /27 | 255.255.255.224 | 0.0.0.31 | 32 | 30 |
| /28 | 255.255.255.240 | 0.0.0.15 | 16 | 14 |
| /29 | 255.255.255.248 | 0.0.0.7 | 8 | 6 |
| /30 | 255.255.255.252 | 0.0.0.3 | 4 | 2 |
| /31 | 255.255.255.254 | 0.0.0.1 | 2 | 2 |
| /32 | 255.255.255.255 | 0.0.0.0 | 1 | 1 |