--- marp: true theme: gaia paginate: true backgroundColor: #fff header: "Grundlagen IT- und Internettechnik (223015c)" footer: "Michael Czechowski – HdM Stuttgart – WS 2025/26" title: "Termin 2: Netzwerke, Protokolle & CSS" ---  # Grundlagen IT- und Internettechnik **223015c** · Modul "Technik 1" · 1. Semester Digital- und Medienwirtschaft Hochschule der Medien Stuttgart **Wintersemester 2025/26** [https://librete.ch/hdm/223015c/](https://librete.ch/hdm/223015c/) ---  --- # Termin 2 – 10.01.2026 ## Netzwerke, Protokolle & CSS --- # Agenda **Teil 1: Die Reise eines Klicks** - Warum ist Netzwerk-Kommunikation kompliziert? - Was passiert, wenn du eine URL aufrufst? - DNS → TCP → HTTP → Response **Teil 2: CSS** - Grundlagen, Selektoren, Spezifität - Box-Modell, Farben, Einheiten --- # Ressourcen zum Selbstlernen * **CODE CRISPIES: https://codecrispi.es/** * Online Code-Editor: https://codepen.io/pen/ * MDN (Mozilla Developer Network): https://developer.mozilla.org/de/ * Flexbox-Spiel: https://flexboxfroggy.com/ * Grid-Spiel: https://cssgridgarden.com/ --- # Teil 1: Die Reise eines Klicks ## Was passiert, wenn du `www.hdm-stuttgart.de` aufrufst? --- # Das Szenario Du bist im WLAN der HdM angemeldest und gehst auf: ``` hdm-stuttgart.de ``` **Zwischen Enter und der fertigen Seite:** ~200 Millisekunden. In dieser Zeit passieren hunderte Operationen. Bevor wir sie durchgehen: **Warum ist das überhaupt so kompliziert?** --- # Das Grundproblem ## Warum brauchen wir Schichten, Adressen, Ports? --- # Was zwischen dir und dem Server liegt Du willst eine Webseite. Klingt einfach. Aber dazwischen liegen: - Deine WLAN-Karte - Der Router im Flur - Das Netzwerk der HdM - Das Internet (dutzende Router) - Der Webserver in Vaihingen **Jede Station spricht eine andere "Sprache":** - Dein Browser spricht HTTP ("Gib mir /index.html") - Das Kabel versteht nur Strom an/aus --- # Die Lösung: Aufgabenteilung Statt dass jedes Programm alles können muss, teilen wir die Arbeit auf: | Wer | Kümmert sich um | |-----|-----------------| | **HTTP** | "Was will ich?" (Webseite, Bild, Video) | | **TCP** | "Kommt alles an? In der richtigen Reihenfolge?" | | **IP** | "Wo muss es hin?" (welcher Rechner im Internet) | | **Ethernet** | "Wie kommt es zum nächsten Gerät?" | | **Physik** | "Strom oder Licht durch das Kabel" | Jeder macht seinen Job. Keiner muss wissen, wie die anderen arbeiten. --- # Warum ist das clever? **Ohne Schichten:** Dein Browser müsste wissen, wie man Ethernet-Frames baut, wie WLAN-Frequenzen funktionieren, wie Router Pakete weiterleiten... **Mit Schichten:** Dein Browser sagt nur: "Ich will diese Seite." Alles andere übernehmen die Schichten darunter. **Das Prinzip heißt Abstraktion:** Jede Schicht versteckt ihre Komplexität vor den anderen. --- # Warum brauchen wir IP-Adressen? --- # Das Internet ist kein einzelnes Netzwerk Das Internet besteht aus **tausenden** separaten Netzwerken: - Netzwerk der HdM - Netzwerk der Telekom - Netzwerk von Google - Netzwerk deines Heimrouters - ... Ein Paket muss von Netzwerk zu Netzwerk weitergereicht werden. **Router** entscheiden bei jedem Hop: "In welches Netzwerk als nächstes?" --- # IP-Adressen = Globale Adressen ``` 141.62.xxx.xxx ← HdM-Netzwerk 212.132.79.37 ← Ziel-Server ``` Die IP-Adresse sagt dem Router: 1. **In welchem Netzwerk** ist der Rechner? 2. **Welcher Rechner** in diesem Netzwerk? "141.62... ist nicht bei mir. Ich schicke das Paket Richtung eduroam." **Die IP-Adresse bleibt auf dem gesamten Weg gleich.** Sie ist die Empfängeradresse auf dem Brief. --- # Warum reicht die MAC-Adresse nicht? Jede Netzwerkkarte hat eine **MAC-Adresse** (z.B. `aa:bb:cc:dd:ee:ff`). **Problem:** MAC funktioniert nur **lokal**. - Dein Laptop kennt die MAC deines Routers - Dein Router kennt die MAC des nächsten Routers - Aber niemand kennt die MAC des Webservers in Vaihingen **MAC = "Wer ist mein direkter Nachbar?"** **IP = "Wo ist das Ziel im gesamten Internet?"** Deshalb brauchen wir beides. --- # Warum brauchen wir Ports? --- # Ein Rechner, viele Programme Dein Laptop hat **eine** IP-Adresse. Aber gleichzeitig laufen: - Browser - Mail-Programm - Spotify - Discord - System-Updates Ein Paket kommt an. **Für welches Programm ist es?** --- # Ports = Türnummern ``` IP-Adresse = Hausnummer → "Friedrichstraße 10" Port = Wohnungstür → "3. Stock links" ``` Jedes Programm "lauscht" auf einem Port: | Port | Dienst | |------|--------| | 80 | HTTP (Webseiten) | | 443 | HTTPS (Webseiten, verschlüsselt) | | 25 | SMTP (E-Mail senden) | | 22 | SSH (Terminal) | --- # Beide Seiten haben Ports ``` Dein Laptop: 141.62.xxx.xxx:52431 └─────── Dein Browser lauscht hier Server: 212.132.79.37:443 └─────── Webserver lauscht hier ``` **52431** ist ein zufälliger Port, den dein System für diese Verbindung vergeben hat. Die Antwort des Servers geht an `141.62.xxx.xxx:52431` – und landet bei deinem Browser, nicht bei Spotify. --- # Zusammenfassung: Die Bausteine --- # Was wir jetzt wissen | Konzept | Löst welches Problem? | |---------|----------------------| | **Schichten** | Komplexität aufteilen, Abstraktion | | **IP-Adresse** | Ziel im globalen Internet finden | | **MAC-Adresse** | Nächsten Nachbarn im lokalen Netz finden | | **Port** | Richtiges Programm auf dem Rechner finden | Mit diesen Bausteinen können wir jetzt die Reise eines Klicks verfolgen. --- # Die Reise beginnt ## Schritt für Schritt --- # Die Zeitlinie ``` [0 ms] DNS-Anfrage: "Welche IP hat www.hdm-stuttgart.de?" ↓ [~20 ms] DNS-Antwort: "212.132.79.37" ↓ [~25 ms] TCP-Handshake: Verbindung aufbauen ↓ [~50 ms] HTTP-Request: "GET /index.html" ↓ [~150 ms] HTTP-Response: Der HTML-Code kommt zurück ↓ [~200 ms] Browser rendert die Seite ``` Jeder dieser Schritte durchläuft alle Schichten – runter und wieder rauf. --- # Schritt 1: DNS ## "Wo wohnt hdm-stuttgart.de?" --- # Das Problem Dein Browser kennt nur den Namen: `www.hdm-stuttgart.de` Das Internet kennt nur Zahlen: `212.132.79.37` **Jemand muss übersetzen.** --- # DNS: Das Telefonbuch des Internets **D**omain **N**ame **S**ystem Dein Laptop fragt sich durch eine Hierarchie: 1. **Browser-Cache:** "War ich da kürzlich?" → Nein 2. **Betriebssystem-Cache:** "Kennt Windows/Mac die IP?" → Nein 3. **Router / ISP:** "Frag den DNS-Server deines Providers" Wenn auch der Provider es nicht weiß, beginnt die **rekursive Suche**. --- # Die DNS-Hierarchie ``` . (Root) /|\ / | \ .de .com .org / hdm-stuttgart | www ``` **Jede Ebene kennt nur die nächste Ebene darunter.** --- # Der DNS-Lookup ``` Dein Laptop → Resolver: "Wo ist www.hdm-stuttgart.de?" Resolver → Root (.): "Wer verwaltet .de?" ← "Frag 194.0.0.53" Resolver → .de-Server: "Wer verwaltet hdm-stuttgart.de?" ← "Frag den Nameserver der HdM" Resolver → HdM-NS: "Welche IP hat www?" ← "212.132.79.37" Resolver → Dein Laptop: "Die IP ist 212.132.79.37" ``` --- # DNS ist selbst ein Netzwerk-Request Die DNS-Anfrage ist nicht magisch. Sie ist selbst ein Paket, das durch alle Schichten muss: | Eigenschaft | Wert | |-------------|------| | Protokoll | UDP | | Port | 53 | | Inhalt | "A-Record für www.hdm-stuttgart.de?" | Das DNS-Paket macht die gleiche Reise wie später der HTTP-Request – nur zu einem anderen Ziel. --- # Nach dem DNS-Lookup **Ergebnis:** Dein Browser weiß jetzt: ``` www.hdm-stuttgart.de = 212.132.79.37 ``` Diese Information wird gecached. **Nächster Schritt:** Verbindung zum Server aufbauen. --- # Schritt 2: TCP-Handshake ## "Hallo Server, bist du da?" --- # Warum ein Handshake? HTTP läuft über **TCP** (Transmission Control Protocol). TCP ist **verbindungsorientiert**: Bevor Daten fließen, müssen sich beide Seiten einig sein, dass sie miteinander reden wollen. **Analogie:** Du rufst jemanden an. Das Telefon klingelt. Die Person nimmt ab. Erst dann redest du. --- # Der 3-Way-Handshake ``` Dein Laptop HdM-Server | | |-------- SYN (Seq=1000) --------------->| | "Ich will reden" | | | |<--- SYN-ACK (Seq=5000, Ack=1001) ------| | "OK, ich auch" | | | |-------- ACK (Ack=5001) --------------->| | "Gut, dann los" | | | | [ Verbindung steht ] | ``` **SYN** = Synchronize · **ACK** = Acknowledge --- # Warum die Sequenznummern? **Problem:** Pakete können im Internet: - Verloren gehen - Doppelt ankommen - In falscher Reihenfolge ankommen **Lösung:** Jedes Byte wird nummeriert. Der Empfänger weiß genau, welches Byte als nächstes kommen muss – und kann fehlende Pakete erneut anfordern. --- # Nach dem Handshake **Status:** Die TCP-Verbindung steht. ``` Dein Laptop ←————————————————→ 212.132.79.37:443 (Port 52431) (Port 443) ``` **Jetzt erst** kann der eigentliche HTTP-Request gesendet werden. --- # Schritt 3: Der HTTP-Request ## "Gib mir die Startseite" --- # Was dein Browser sendet ```http GET / HTTP/1.1 Host: www.hdm-stuttgart.de User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept: text/html Accept-Language: de-DE Connection: keep-alive ``` Das sind **~200 Bytes** Text. Aber diese 200 Bytes müssen durch das halbe Internet. **Wie?** --- # Die Verpackungsstraße ## Encapsulation: Schicht für Schicht --- # Jede Schicht verpackt ``` HTTP-Request: "GET / HTTP/1.1..." ↓ TCP packt ein: [ Ports + Seq-Nr ] + HTTP-Request = Segment ↓ IP packt ein: [ IP-Adressen ] + Segment = Paket ↓ Ethernet packt: [ MAC-Adressen ] + Paket + [ Prüfsumme ] = Frame ↓ Physik: 01001000 01010100 01010100 01010000 ... = Bits auf dem Kabel ``` --- # Layer 4: Transport (TCP) Der HTTP-Request wird zum **Segment**. ``` ┌─────────────────────────────────────────────────┐ │ TCP-Header │ │ ┌─────────────┬─────────────┬─────────────────┐ │ │ │ Source Port │ Dest Port │ Sequence Number │ │ │ │ 52431 │ 443 │ 1001 │ │ │ └─────────────┴─────────────┴─────────────────┘ │ ├─────────────────────────────────────────────────┤ │ Payload: "GET / HTTP/1.1..." │ └─────────────────────────────────────────────────┘ ``` **Neu hinzugekommen:** Ports (wer sendet? wer empfängt?) und Sequenznummer --- # Layer 3: Network (IP) Das Segment wird zum **Paket**. ``` ┌─────────────────────────────────────────────────┐ │ IP-Header │ │ ┌─────────────────┬─────────────────┐ │ │ │ Source IP │ Destination IP │ │ │ │ 141.62.xxx.xxx │ 212.132.79.37 │ │ │ └─────────────────┴─────────────────┘ │ ├─────────────────────────────────────────────────┤ │ TCP-Segment (von oben) │ └─────────────────────────────────────────────────┘ ``` **Neu:** IP-Adressen – woher kommt das Paket, wohin soll es? --- # Layer 2: Data Link (Ethernet) Das Paket wird zum **Frame**. ``` ┌─────────────────────────────────────────────────┐ │ Ethernet-Header │ │ ┌─────────────────┬─────────────────┐ │ │ │ Source MAC │ Destination MAC │ │ │ │ aa:bb:cc:dd:ee │ 11:22:33:44:55 │ │ │ └─────────────────┴─────────────────┘ │ ├─────────────────────────────────────────────────┤ │ IP-Paket (von oben) │ ├─────────────────────────────────────────────────┤ │ FCS (Prüfsumme) │ └─────────────────────────────────────────────────┘ ``` **Neu:** MAC-Adressen – aber Achtung: Das ist die MAC des **Routers**, nicht des Servers! --- # Layer 1: Physical Der Frame wird zu **Bits** – und die Bits zu physikalischen Signalen. | Medium | Signal | |--------|--------| | Kupferkabel | Spannung: High/Low | | Glasfaser | Licht: An/Aus | | WLAN | Funkwellen | ``` 01001000 01010100 01010100 01010000 ... ``` Ab hier übernimmt die Physik. --- # MAC vs. IP – nochmal genau | | IP-Adresse | MAC-Adresse | |---|-----------|-------------| | **Frage** | Wer ist das Endziel? | Wer ist der nächste Hop? | | **Reichweite** | Global (ganzes Internet) | Lokal (bis zum nächsten Router) | | **Ändert sich?** | Nein, bleibt gleich | Ja, bei jedem Hop | | **Analogie** | Empfänger auf dem Brief | "Nächstes Postamt: XY" | **Die MAC-Adresse im ersten Frame ist die MAC des Routers – nicht des Servers!** --- # Woher kennt dein Laptop die MAC des Routers? **ARP** – Address Resolution Protocol ``` Dein Laptop (Broadcast an alle): "Wer hat die IP 192.168.1.1? Sag mir deine MAC!" Router: "Das bin ich! Meine MAC ist 11:22:33:44:55:66" ``` Diese Information wird gecached. --- # Die Reise durch das Netz ## Hop für Hop --- # Der erste Hop: Dein Router ``` Dein Laptop → [Frame] → Router ``` Der Router empfängt den Frame: 1. **Layer 1:** Signale → Bits 2. **Layer 2:** Prüft Frame. "MAC stimmt, FCS okay" → Auspacken 3. **Layer 3:** Liest IP-Header. "212.132.79.37 – nicht mein Netz" **Routing-Entscheidung:** "Ich schicke es Richtung eduroam." --- # Der Router verpackt NEU Der Router erstellt einen **neuen Frame** für den nächsten Hop: ``` ┌─────────────────────────────────────────────────┐ │ Ethernet-Header (NEU!) │ │ ┌─────────────────┬─────────────────┐ │ │ │ Source MAC │ Destination MAC │ │ │ │ Router-MAC │ Nächster-Router │ │ │ └─────────────────┴─────────────────┘ │ ├─────────────────────────────────────────────────┤ │ IP-Paket (UNVERÄNDERT) │ │ Source: 141.62.xxx.xxx │ │ Dest: 212.132.79.37 │ └─────────────────────────────────────────────────┘ ``` **Die IP bleibt gleich. Die MAC ändert sich.** --- # Mehrere Hops ``` Dein Laptop ↓ [Frame mit MAC des HdM-Routers] Router (HdM-Netz) ↓ [Frame mit MAC des eduroam-Routers] Router (BelWü) ↓ [Frame mit MAC des nächsten Routers] ...weitere Router... ↓ [Frame mit MAC des Ziel-Servers] Webserver der HdM ``` Bei jedem Hop: Auspacken bis Layer 3, Routing-Entscheidung, neu verpacken. --- # Die Ankunft ## Decapsulation am Server --- # Der Server empfängt Am Webserver passiert alles **rückwärts** (Decapsulation): ``` Bits empfangen (Layer 1) ↓ Frame prüfen: MAC korrekt? FCS okay? → Auspacken (Layer 2) ↓ IP-Paket lesen: Ziel-IP = meine IP? Ja! → Auspacken (Layer 3) ↓ TCP-Segment lesen: Port 443, Seq-Nr passt → Auspacken (Layer 4) ↓ HTTP-Request lesen: "GET / HTTP/1.1" (Layer 7) ``` Der Webserver versteht: "Jemand will die Startseite." --- # Die Antwort ## Der gleiche Weg zurück --- # Der Server antwortet ```http HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length: 45231
...
``` --- # CSS-Anatomie ```css selector { property: value; } ``` **Beispiel:** ```css h1 { color: #333333; font-size: 2rem; margin-bottom: 1rem; } ``` --- # Selektoren: Element ```css /* Alle-Elemente */ p { color: gray; } /* Mehrere Elemente */ h1, h2, h3 { font-family: sans-serif; } ``` --- # Selektoren: Klasse ```html
Dieser Text ist wichtig.
Dieser nicht.
``` ```css .wichtig { color: red; font-weight: bold; } ``` **Punkt** vor dem Namen = Klasse --- # Selektoren: ID ```html ``` ```css #hauptnavigation { background: #333; padding: 1rem; } ``` **Raute** vor dem Namen = ID ⚠️ IDs sollten **einmalig** pro Seite sein. --- # Selektoren: Kombinationen ```css /* Nachfahre (beliebig tief) */ article p { line-height: 1.6; } /* Direktes Kind */ nav > a { text-decoration: none; } /* Nächstes Geschwister */ h2 + p { font-size: 1.2rem; } /* Element mit Klasse */ p.wichtig { color: red; } ``` --- # Spezifität: Welche Regel gewinnt? | Selektor | Spezifität | |----------|------------| | Element (`p`) | 0,0,0,1 | | Klasse (`.wichtig`) | 0,0,1,0 | | ID (`#header`) | 0,1,0,0 | | Inline (`style="..."`) | 1,0,0,0 | ```css p { color: blue; } /* 0,0,0,1 */ .text { color: green; } /* 0,0,1,0 → gewinnt */ ``` --- # Box-Modell ``` ┌─────────────────────────────────────┐ │ margin │ │ ┌─────────────────────────────┐ │ │ │ border │ │ │ │ ┌─────────────────────┐ │ │ │ │ │ padding │ │ │ │ │ │ ┌─────────────┐ │ │ │ │ │ │ │ content │ │ │ │ │ │ │ └─────────────┘ │ │ │ │ │ └─────────────────────┘ │ │ │ └─────────────────────────────┘ │ └─────────────────────────────────────┘ ``` --- # Box-Modell: CSS ```css .box { width: 200px; height: 100px; padding: 20px; border: 2px solid black; margin: 10px; /* Wichtig: */ box-sizing: border-box; } ``` `box-sizing: border-box` → width inkl. padding + border --- # Farben ```css /* Keyword */ color: red; /* Hex */ color: #FF0000; color: #F00; /* RGB/RGBA */ color: rgb(255, 0, 0); color: rgba(255, 0, 0, 0.5); /* HSL */ color: hsl(0, 100%, 50%); ``` --- # Einheiten | Einheit | Bedeutung | |---------|-----------| | `px` | Pixel (absolut) | | `%` | Prozent vom Parent | | `em` | Relativ zur Schriftgröße | | `rem` | Relativ zur Root-Schriftgröße | | `vw/vh` | Viewport-Breite/-Höhe | **Empfehlung:** `rem` für Schrift, `%` oder `vw/vh` für Layout --- # Pseudo-Klassen ```css a:hover { color: red; } a:visited { color: purple; } input:focus { border-color: blue; } li:first-child { font-weight: bold; } li:nth-child(odd) { background: #eee; } ``` --- # Pseudo-Elemente ```css .required::before { content: "* "; color: red; } p::first-letter { font-size: 2em; } ``` `:` = Pseudo-Klasse · `::` = Pseudo-Element --- # Responsive Design ```css /* Mobile First */ .container { padding: 1rem; } /* Ab 768px (Tablet) */ @media (min-width: 768px) { .container { padding: 2rem; max-width: 720px; } } ``` --- # Fragen & Diskussion **Nächster Termin:** 24.01.2026 – JavaScript **Kontakt:** lb-czechowski@hdm-stuttgart.de --- # Lizenz Diese Präsentation ist lizenziert unter **Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)** Basiert auf Material von: - Markus Thamm / Wolfgang Gruel (HdM Stuttgart) - Michael Czechowski Vollständige Lizenz: https://creativecommons.org/licenses/by-sa/4.0/