Ein frei kopier- und anpassbares Lehrmittel von eduskript.org

Lernziele
  • Sie kennen den Aufbau einer IP-Adresse (Version 4).
  • Sie wissen, wie man dezimal aus IP-Adresse und Standard-Subnetmaske die Netzwerkadresse herleitet.
  • Sie können erklären, wie ein Computer anhand der Netzwerkadresse entscheidet, ob eine Ziel-IP-Adresse im selben Netzwerk liegt, oder nicht.

Computer kommunizieren in Netzwerken in einer Serie von Paketen. In den nächsten Lektionen behandeln wir, wie diese Paketen Ihren Weg durchs Netzwerk finden.

Als Analogie stellen Sie sich den Paketversand der Post vor. Dort finden die Pakete den richtigen Empfänger anhand der Adresse:

Marc Chéhab
Lehrerstrasse 3
8000 Zürich

Nun beachten Sie etwas an dieser Adresse, das wir auch bei Computernetzwerken sehen werden: Die Adresse hat die verschiedene Elemente (Ort, Strasse, Person, evtl. sogar Land), die vorzu genauer definieren, wo das Paket hin muss.

Wieso macht man das so? Besprechen Sie das kurz.

Lösung

Das ist wieder eine Art, wie man ein grosses Problem in kleinere Probleme zerlegt.

  • Anstatt alle Adressen der Schweiz anzuschauen, engt die Ortsangabe dies ein auf alle Adressen eines Ortes.
  • Anstatt alle Adressen des Ortes anzuschauen, engt der Strassenname das auf eine einzelne Strasse ein, und die Hausnummer sagt genau, welches Haus.
  • Anstatt alle Personen im Haus, definiert der Empfängername die exakte Person, die das Paket erhalten soll.

Diese Angaben sind voneinander abhängig: Der Strassenname ist ohne Ortsangabe meistens wertlos! So gibt es beispielsweise in 650 Schweizer Orten eine "Dortstrasse".

IP: Das "Internet Protokoll"

In der Analogie zum Postversand ist Ihr Computer ein Gebäude. Wie Sie sich sicher vorstellen können, hat Ihr Computer eine Hauptadresse. Das ist die Adresse des "Internet Protokolls", oder kurz: IP. Und wie bei einem Gebäude ist diese Adresse unterteilt in eine Art Ortsangabe und eine spezifische Adresse für den Computer.

Wieso ist das wichtig? Weil wenn Sie wissen, dass sich eine Adresse am gleichen Ort befindet, können Sie Ihr Paket lokal direkt verschicken. Wenn die Adresse nicht im eigenen Dort ist, müssen Sie auf die Post...

Soweit die Analogie. Schauen wir uns nun IP-Adressen an. Hier vier Beispiele:

192.168.1.4
10.32.4.12
243.123.129.45
88.210.255.25

Wie würden Sie diese Zahlen beschreiben? Was ist die grösste einzelne Zahl, die Sie finden? Was für eine Datenmenge könnte das sein?

Mögliche Antwort
  • Es sind jeweils vier Dezimalzahlen durch Punkte getrennt.
  • Die höchste Zahl ist 255. Das ist in der Informatik immer eine verdächtige Zahl, weil es genau einem vollen Byte entspricht: 1111'11112 = 25510.
  • Und so vermuten wir korrekt: IP-Adressen bestehen aus vier Bytes.

Wie viele Geräte kann man damit adressieren?

Halten wir kurz inne. Eine IP-Adresse besteht aus vier Bytes, also aus 4×8=324 \times 8 = 32 Bit. Jedes Bit kann 0 oder 1 sein - wie viele verschiedene Adressen ergibt das?

232=42949672962^{32} = 4'294'967'296

Das sind rund 4.3 Milliarden mögliche IP-Adressen. Das klingt nach unvorstellbar viel. Aber überlegen Sie kurz: Reicht das für die ganze Welt?

Mögliche Antwort

Auf der Erde leben rund 8 Milliarden Menschen - das sind beinahe doppelt so viele Menschen, wie es überhaupt IPv4-Adressen gibt. Und kaum jemand besitzt nur ein einziges Gerät: Smartphone, Laptop, vielleicht ein Smart-TV, eine Spielkonsole, eine Smartwatch...

Die rund 4.3 Milliarden Adressen reichen also bei Weitem nicht aus. Tatsächlich sind die freien IPv4-Adressen längst aufgebraucht.

Dieses Problem nennt man IPv4-Adressknappheit. Es gibt clevere Tricks, um damit umzugehen - einen davon, die privaten Netzwerke, lernen Sie in dieser Lektion noch kennen. Die eigentliche Lösung ist aber eine neuere Version des Internet Protokolls: IPv6.

IPv6-Adressen sind nicht 32, sondern 128 Bit lang. Das ergibt:

21283.4×10382^{128} \approx 3.4 \times 10^{38}

Das ist eine 39-stellige Zahl! Zur Veranschaulichung: Es sind so viele Adressen, dass man jedem Sandkorn auf der Erde problemlos eine eigene IP-Adresse geben könnte - und trotzdem wäre kaum ein Bruchteil des Adressraums verbraucht. In dieser Lektion bleiben wir aber bei den anschaulicheren IPv4-Adressen.

Aufbau: Netzwerkteil und Hostteil

Doch wie ist eine IP-Adresse aufgebaut, damit das Netzwerk weiss, wohin ein Paket gehört? Schauen wir genauer hin.

Bei Ihnen zuhause könnten mögliche IP-Adressen so aussehen:

192.168.1.5
192.168.1.41
192.168.1.53

Sie sehen:

  • Der erste Teil aller IP-Adressen ist gleich. Das ist, weil alle Computer im gleichen Netzwerk sind. Man nennt das den Netzwerkteil der Adresse. Das ist wie bei der Post die Ortsangabe.
  • Der zweite Teil ist pro Gerät (Host) unterschiedlich. Man nennt das den Hostteil. Dieser Teil ist wie bei der Post die genaue Adresse des Gebäudes.

Diese Unterscheidung ist für den Netzwerkverkehr so elementar, wie die Ortsangabe bei der Post: Denn wenn etwas im gleichen Netzwerk ist, kann man es lokal direkt verschicken. Wenn es nicht im eigenen Netzwerk ist, müssen wir in ein anderes Netzwerk oder ins Internet.

Klassische Subnetmasken

Aber Achtung: Die Grenze zwischen Netzwerk- und Hostteil ist nicht fix vorgegeben, sondern muss mit einer Subnetmaske selbst konfiguriert werden. Sie besteht ebenfalls aus vier Bytes und bestimmt, bis wo der Netzwerkteil geht und wo der Hostteil beginnt. Aber wie?

Merken Sie sich: Beim Hostteil ist die Subnetmaske 0.

  • Wenn Ihre eigene IP-Adresse 192.168.1.5 ist und Sie die Subnetmaske 255.255.255.0 haben, erachten Sie alle IP-Adressen des Musters 192.168.1.x als Teil Ihres Netzwerks.
  • Wenn Sie aber mit derselben IP-Adresse 192.168.1.5 die Subnetmaske 255.255.0.0 hätten, müssten IP-Adressen nur das Muster 192.168.x.x erfüllen, damit Sie als Teil Ihres Netzwerks anerkannt werden.

Solche Subnetmasken, die nur aus vollen (255) und leeren (0) Bytes bestehen, nennt man klassische Subnetmasken. Bei diesen kann man sich die Logik also dezimal erklären:

  • Im Netzwerkteil sind die Bytes der Subnetmaske 255.
  • Im Hostteil sind die Bytes der Subnetmaske 0.

Die Subnetmaske ist also eine "Maske", weil man sie auf die IP-Adresse legt und sieht, was der Netzwerkteil und was der Hostteil ist.

Wie machen das Computer konkret? Mit der Netzwerkadresse

Bisher war die Erklärung der Logik für Sie als Menschen nachvollziehbar. Aber wie rechnet sich das ein Computer aus? Dahinter muss ja letztlich ein Algorithmus oder eine Rechnung stecken.

Obwohl die Grenze zwischen Netzwerk- und Hostteil bei jedem Netzwerk von unterschiedlichen Subnetmasken definiert sein kann, wurde eine elegante Lösung gefunden, die in allen Fällen funktioniert: die sogenannte Netzwerkadresse. Das ist die tiefstmögliche Adresse eines Netzwerks, nämlich dort wo der gesamte Hostteil 0 ist. Die Netzwerkadresse ist eine spezielle Adresse, die zu keinem Gerät im Netzwerk gehört - genau wie eine Ortsangabe (8000 Zürich) kein Gebäude adressiert.

Wie erleichtert das unseren Maschinen die Entscheidung, ob eine Ziel-IP-Adresse im gleichen Netzwerk liegt? Die Netzwerkadresse setzt ja den Hostteil 0. Das heisst: Alle IP-Adressen eines Netzwerks sollten die gleiche Netzwerkadresse erzeugen.

Ein Computer mit einer IP-Adresse 192.168.1.5 und einer Subnetmaske 255.255.255.0 geht also wie folgt vor:

  1. Wenn die IP konfiguriert wird, formt und speichert er bereits die Netzwerkadresse seines eigenen Netzwerks: 192.168.1.0.
  2. Wenn er jetzt eine Nachricht an die IP-Adresse 192.168.1.12 senden soll, testet er, ob mit seiner eigenen Subnetmaske dieselbe Netzwerkadresse resultieren würde. In diesem Fall stimmt das: 192.168.1.0, also liegt die IP im selben Netzwerk.
  3. Wenn er eine Nachricht an die IP-Adresse 192.168.2.54 senden soll, testet er erneut mit seiner eigenen Subnetmaske, ob die Netzwerkadresse übereinstimmt. In diesem Fall tut sie das nicht: 192.168.2.0, also liegt die IP in einem fremden Netzwerk.

Weitere solche Beispiele:

Mit der Eigenschaft kann Ihr Computer also sehr einfach urteilen:

  • Wenn sich aus beiden IP-Adressen zweimal die gleiche Netzwerkadresse bildet, urteilt er, dass sich das Ziel im gleichen Netzwerk befindet und er das Paket selbst direkt verschicken kann.
  • Wenn sich die Netzwerkteile unterscheiden und somit verschiedene Netzwerkadressen bilden (rote Kreise), urteilt er, dass sich das Ziel in einem anderen Netzwerk befindet. Dann braucht er quasi die Hilfe der Post, um das Paket zu verschicken: Er schickt das Paket an seinen Default Gateway (auch Standardgateway genannt) - das ist typischerweise Ihr Router. Dieser kennt den Weg ins Internet und leitet das Paket weiter (mehr dazu in der nächsten Lektion).

🐍 Programmierübungen: IP-Adressen mit Python

Genug Theorie - jetzt rechnen Sie wie ein Computer. Die folgenden Aufgaben lösen Sie direkt im Browser. Klicken Sie nach dem Schreiben auf Check, dann sehen Sie sofort, was stimmt und was noch nicht.

Erinnerung

Eine IP-Adresse ist ein String wie "192.168.1.5". Mit "192.168.1.5".split(".") erhalten Sie die Liste ["192", "168", "1", "5"]. Mit ".".join(liste) setzen Sie eine Liste von Strings wieder mit Punkten zusammen.

Aufwärmen: Wie viele Adressen?

Auf dieser Seite haben wir gesehen: 32 Bit ergeben 2322^{32} Adressen. Schreiben Sie eine Funktion, die für eine beliebige Anzahl Bits ausrechnet, wie viele verschiedene Adressen möglich sind.

PythonLoading editor…
def anzahl_adressen(bits):
    # Jedes Bit kann 0 oder 1 sein.
    # Wie viele Kombinationen ergeben sich aus `bits` Bits?
    ...

print(anzahl_adressen(8))    # 256
print(anzahl_adressen(32))   # 4294967296

Aufgabe 1: IP-Adresse prüfen

Nicht jeder String ist eine gültige IP-Adresse. Schreiben Sie ist_gueltig(ip), das True zurückgibt, wenn die Adresse aus genau vier Zahlen von 0 bis 255 besteht - sonst False.

PythonLoading editor…
def ist_gueltig(ip):
    teile = ip.split(".")
    # 1) Es müssen genau 4 Teile sein.
    # 2) Jeder Teil muss eine Zahl von 0 bis 255 sein.
    #    Tipp: int(teil) wandelt einen String wie "192" in die Zahl 192 um.
    ...

print(ist_gueltig("192.168.1.5"))   # True
print(ist_gueltig("256.1.1.1"))     # False (256 ist zu gross)
print(ist_gueltig("10.0.0"))        # False (nur 3 Teile)

Aufgabe 2: Netzwerkadresse berechnen

Jetzt der Kern dieser Lektion. Schreiben Sie netzwerkadresse(ip, maske) für klassische Subnetmasken (nur 255 oder 0). Regel: Wo die Maske 255 ist, übernehmen Sie das IP-Oktett; wo sie 0 ist, schreiben Sie 0.

PythonLoading editor…
def netzwerkadresse(ip, maske):
    ip_teile = ip.split(".")
    maske_teile = maske.split(".")
    ergebnis = []
    for i in range(4):
        # Wenn das Masken-Oktett 255 ist: das IP-Oktett anhängen.
        # Wenn es 0 ist: "0" anhängen.
        ...
    return ".".join(ergebnis)

print(netzwerkadresse("192.168.1.5", "255.255.255.0"))   # 192.168.1.0
print(netzwerkadresse("10.32.4.12", "255.255.0.0"))      # 10.32.0.0

Aufgabe 3: Gleiches Netzwerk?

Damit kann Ihr Computer jetzt die entscheidende Frage beantworten: Liegt eine Ziel-Adresse im eigenen Netzwerk (direkt verschicken) oder nicht (an den Gateway schicken)? Die Funktion netzwerkadresse aus Aufgabe 2 ist hier schon eingebaut - nutzen Sie sie.

PythonLoading editor…
def netzwerkadresse(ip, maske):
    ip_teile = ip.split(".")
    maske_teile = maske.split(".")
    ergebnis = []
    for i in range(4):
        if int(maske_teile[i]) == 255:
            ergebnis.append(ip_teile[i])
        else:
            ergebnis.append("0")
    return ".".join(ergebnis)

def gleiches_netz(ip1, ip2, maske):
    # Bilde beide Netzwerkadressen und vergleiche, ob sie gleich sind.
    ...

print(gleiches_netz("192.168.1.5", "192.168.1.12", "255.255.255.0"))  # True
print(gleiches_netz("192.168.1.5", "192.168.2.54", "255.255.255.0"))  # False

Ein binäres Verständnis Subnetmasken (nicht Prüfungsstoff)

Letztlich muss man Subnetmasken aber binär verstehen. Hier dieselben Beispiele nochmals mit den Binärzahlen.

So gesehen besteht eine Subnetmaske aus einer Serie von 1, gefolgt von 0. Nun kann aber die Grenze zwischen Netzwerk- und Host-Teil mitten durch eines der vier Byte laufen! Diese Grenze muss klar sein - d.h. es darf nur eine Grenze zwischen 1 und 0 haben. Man kann die Subnetmaske deshalb auch kürzer angeben, indem man einfach die Anzahl 1 notiert: hier also 24.

Binär wird die Erklärung dafür, wie IP und Subnetmaske die Netzwerkadresse bilden, paradoxerweise eher einfacher. Wir multiplizieren eigentlich einfach Bit um Bit die IP mit der Subnetmaske. Das ist eine logische UND-Operation, weil nur wenn IP und Subnetmaske eine 1 haben, ergibt sich in der Netzwerkadresse auch eine 1.

Hier wird also ein logischer UND-Operator Bit für Bit angewandt. Deswegen heisst diese Operation "Bitwise AND" mit dem Zeichen "&". Im Beispiel sieht man: Meine IP & Subnet-Maske=Netzwerkadresse\text{Meine IP } \& \text{ Subnet-Maske} = \text{Netzwerkadresse}

Achten Sie sich nun auf die erste IP-Adresse 192.168.0.13. Die Netzwerkadresse unterscheidet sich zu unserer (orangen) Netzwerkadresse bloss im letzten Bit des Netzwerkteils.

Wenn wir unser Netzwerk grösser machen möchten, dass diese Adresse auch noch in unser Netzwerk gehört, müssten wir die Grenze zwischen Netzwerkteil und Hostteil in der Subnetmaske um ein Bit nach vorne verschieben.

Überlegen Sie sich, was für eine Dezimalzahl Sie bei der Subnetmaske eingeben müssten, um das zu erzeugen.

Lösung (unbedingt anschauen!)

Sie müssten die Subnetmaske zu 255.255.254.0 ändern. Alle IP-Adressen in den Bereichen 192.168.0.x und 192.168.1.x bilden nun dieselbe Netzwerkadresse: nämlich 192.168.0.0

🐍 Bonus: Netzwerkadresse mit bitweisem UND

Oben haben wir die Netzwerkadresse dezimal gebildet - das klappt nur bei klassischen Masken. Mit dem bitweisen UND (&) geht es für jede Maske, genau wie es der Computer macht. In Python verknüpft 13 & 254 zwei Zahlen Bit für Bit.

Vervollständigen Sie die eine fehlende Zeile:

PythonLoading editor…
def netzwerkadresse_and(ip, maske):
    ip_teile = ip.split(".")
    maske_teile = maske.split(".")
    ergebnis = []
    for i in range(4):
        # Verknüpfe IP-Oktett und Masken-Oktett mit bitweisem UND (&).
        # Tipp: int(...) & int(...)
        oktett = ...
        ergebnis.append(str(oktett))
    return ".".join(ergebnis)

print(netzwerkadresse_and("192.168.1.13", "255.255.255.0"))      # 192.168.1.0
print(netzwerkadresse_and("192.168.1.130", "255.255.255.192"))   # 192.168.1.128
Jetzt sind Sie dran

Versuchen Sie die IP-Adresse Ihres Geräts herauszufinden. Dazu finden Sie auf Google leicht eine Anleitung, z.B. IP-Adresse finden Windows 10 oder IP-Adresse finden Android