Att kunna räkna ut nätmasken på ett snabbt och enkelt sätt underlättar vid planerandet och byggandet av TCP/IP-nätverk. Det är nätmasken som bestämmer hur stort ett nät kan vara och hur IP-adresserna kommer att se ut. I denna artikel kommer jag endast att gå igenom IPv4, då IPv6 fungerar på ett lite annorlunda sätt. IPv4 är fortfarande det som används mest idag även om IPv6 har fått en rejäl ökning de senaste två åren, framförallt eftersom allt fler VPS-leverantörer erbjuder IPv6 som standard. Men här kommer vi alltså att gå igenom hur IPv4-nätverk fungerar och är uppbyggda med fokus på nätmasken.

Vad är en IP-adress och var kommer nätmasken in i bilden?

En IP-adress är som ett telefonnummer som pekar på en viss enhet i nätverket. Enheten kan vara alltifrån en skrivare eller en mobiltelefon till en dator eller server. Med IP-adressen kan du nå den specifika datorn i det nätverket den befinner sig. Men det är här nätmasken kommer in. Det är nätmasken som bestämmer nätets gränser, d.v.s. vilka som är den första respektive sista adressen i nätverket. Om vi tar ett vanligt hemmanätverk så brukar dessa ha adresser i nätet 192.168.0.0/24. Vad betyder då detta? Jo, en hel del faktiskt. Utifrån denna information får vi reda på allt vi behöver för att koppla in oss på nätverket och kunna nå de andra datorerna som befinner sig på samma nätverk. Först och främst tittar vi på /24. Detta innebär att nätet har en 24-bitars nätmask. En 24-bitars nätmask innebär att de första 24 bitarna redan är satta, d.v.s. upptagna och går inte att använda. Här kommer vi in på det binära talsystemet. Varje bit är en etta eller en nolla. Om vi sätter 24 stycken “ett”-bitar från vänster till höger, i kolumner om 8 bitar separerade med punkter, och fyller ut resterande 8-bitarna med nollor så att vi sammanlagt får 32 bitar, kommer det att se som nedan. En komplett IP-adress eller nätmask är på sammanlagt 32 bitar.

11111111.11111111.11111111.00000000

Om vi tar och översätter detta till vanlig decimalform så får vi nätmasken enligt nedan.

255.255.255.0

Detta innebär då i sin tur att vi bara kan använda den sista oktetten (oktett är en sekvens om 8 bitar) till adresser i vårt nätverk. Adresserna vi kan använda är då alltså 0-255. Fast detta är faktiskt inte helt sant, första adressen, nollan, går inte att använda som adress på en enhet, denna är reserverad för att peka på själva nätet. Den sista adressen går inte heller att använda, 255, den är reserverad för broadcast-trafik.

Så nu vet vi alltså att vi kan använda adresser i spannet 192.168.0.1 till 192.168.0.254 till våra datorer. Dessutom vi att nätmasken ska vara 255.255.255.0. T.ex. kan du använda adressen 192.168.0.15 med nätmasken 255.255.255.0 för din dator.

Räkna ut nätmasken

Finns det då något enkelt sätt att räkna ut hur många adresser det finns i ett visst nät? Det finns det, och det är dessutom inte särskilt svårt. Om $n$ är nätmasken i slash-notation så får vi formeln nedan.

Om vi antar att nätmasken är 24, från vårt exempel ovan, så får vi 256 adresser som visas nedan.

Ett exempel till

Om vi istället har nätet 172.168.0.0/16 så ser vi att vi har nätmasken /16 i slash-notation vilket innebär att de första 16-bitarna redan är satta. Detta blir då som sedan

11111111.11111111.0.0

Och detta i sin tur kan översättas till

255.255.0.0

Här har vi alltså istället två oktetter som vi kan använda för adresser i vårt nät. Vi har alltså adresserna från 172.168.0.0 till 172.168.255.255 (tänk då på att nollan och 255 inte går att använda till enheter, dessa är reserverade).

Om vi använder formeln från ovan så får vi antalet adresser i nätet.

Detta innebär i sin tur att det får plats 65534 datorer i nätverket (65536-2).

Några små program för att räkna ut nätmasken

Baserat på formeln $2^{32-n}$ kan vi göra följande lilla Python-program för att snabbt och enkelt räkna ut antalet adress i nätet.

#!/usr/bin/env python3

try:
    slash = int(input("Ange nätmasken i slash-notation: "))
except(ValueError):
    print ("Ange endast heltal mellan 0 och 32")
    quit()

if ((slash < 1) or (slash > 32)):
    print ("Ange endast värden mellan 0 och 32")
    quit()

print ("Totalt antal adresser i nätet:", 2**(32-slash))
print ("Totalt antal användbara adresser i nätet:", 2**(32-slash)-2)

Jag har även gjort ett lite större Python-program som även visar hur nätmasken ser ut i dotted-decimal-formatet. Programmet finns på Github och heter subcalc.py. Jag har även gjort ett annat program i PHP som heter netcalc.php. Detta program visar resultatet både i binärt format, dotted-decimal-format samt hur många sammanlagda adresser det finns och hur många adresser som är användbara.