image: tcpip.webp

TCP/IP-Verbindungen

In diesem Kapitel lernst du, wie du mit Linux Netz­werk­ver­bin­dun­gen auf­baust und mit anderen Rechnern kommunizierst. Du wirst lernen, wie du die IP-Adresse deines Com­puters herausfindest, wie du andere Rechner im Netzwerk anpingst, Da­tei­en mit wget herunterlädst und mit curl APIs abfragst. Außerdem wirst du lernen, wie du mit netcat chatten kannst.

Stelle zuerst sicher, dass du keinen Ordner geöffnet hast. Um sicherzugehen, drücke einfach den Shortcut für »Ordner schließen«: StrgK und dann F. Dein Work­space sollte jetzt ungefähr so aussehen:

Schließe die linken Seitenleiste, indem du StrgB drückst, um mehr Platz zu haben. Öffne als nächstes das Ter­mi­nal, indem du den Shortcut StrgJ drückst. Dein Work­space sollte jetzt ungefähr so aussehen:

Du kannst das Ter­mi­nal auch maximieren, indem du auf den Pfeil in der rechten oberen Ecke des Ter­mi­nals klickst. Die linke Seitenleiste kannst du jederzeit mit StrgB ein- und ausblenden.

1. Eigene IP-Adresse herausfinden

In diesem Abschnitt lernst du den Befehl ifconfig kennen.

Um die IP-Adresse deines Com­puters herauszufinden, gib einfach den Befehl ifconfig ein und drücke Enter:

ifconfig

Du solltest nun folgende Ausgabe sehen:

Zu sehen sind zwei Netzwerkadapter:

  • eth0 (»Ethernet«) mit der IP-Adresse 172.17.0.12, der mit dem Internet verbunden ist
  • lo (»Loopback«) mit der IP-Adresse 127.0.0.1, der nur für lokale Verbindungen genutzt wird
Deine IP-Adresse für eth0 ist wahr­schein­lich anders als die hier gezeigte. Das ist in Ordnung – es ist nur ein Beispiel. Merk dir deine IP-Adresse für dieses Tutorial oder schreib sie dir auf.

Du siehst außerdem die MAC-Adresse deines Netzwerkadapters (ether), die Broadcast-Adresse (broadcast) und die Subnetzmaske (netmask) sowie die Gesamtmenge der bisher übertragenen Daten (RX bytes für »received« und TX bytes für »transmitted«).

Es kann sein, dass du statt eines eth0-Adapters einen anderen Netzwerkadapter hast, z.B. enp0s3 oder auch wlp2s0, falls du über WLAN verbunden bist. Das ist in Ordnung – die Befehle funktionieren genauso.

2. Andere Rechner anpingen

In diesem Abschnitt lernst du den Befehl ping kennen.

Um zu überprüfen, ob du andere Rechner erreichen kannst, kannst du den Befehl ping verwenden. Gib einfach ping gefolgt von der IP-Adresse eines anderen Rechners ein. Wir verwenden in diesem Beispiele die IP-Adresse von Googles DNS-Server:

ping 8.8.8.8

Anschließend solltest du eine Ausgabe wie diese sehen:

Der Befehl ping sendet ICMP-Pakete an die angegebene IP-Adresse und wartet auf eine Antwort. Wenn du eine Antwort be­kommst, bedeutet das, dass du den anderen Rechner erreichen kannst. Die Pakete werden im Abstand von einer Sekunde gesendet, bis du den Befehl mit StrgC abbrichst.

Die Angabe, die du unter »time« siehst, ist die Zeit in Millisekunden, die das Paket benötigt hat, um zum Ziel zu gelangen und zurück. Umso kleiner die Zeit, desto besser ist die Verbindung: im Bild oben beträgt die Zeit ca. 5,3 ms.

Wenn du deinen eigenen Rechner anpingst, sollte die »Roundtrip Time« sehr gering sein, da die Pakete nicht das lokale Netzwerk verlassen müssen:

ping 127.0.0.1

Wie du siehst, ist die »Roundtrip Time« mit ca. 0,05 ms sehr viel kleiner:

Wenn wir hingegen einen Server anpingen, der etwas weiter entfernt ist, z.B. einen Server in Peru, dann ist die »Roundtrip Time« etwas höher:

ping rubiomonocoat.pe

Die Roundtrip Time beträgt jetzt ca. 14,5 ms:

Statt einer IP-Adresse kannst du auch eine Domain, z.B. google.com oder rubiomonocoat.pe, angeben. Die Domain wird dann mit Hilfe eines DNS-Servers in eine IP-Adresse aufgelöst.

3. Den Pfad von IP-Paketen verfolgen

In diesem Abschnitt lernst du den Befehl traceroute kennen.

Um den Pfad zu einem anderen Rechner im Netzwerk zu verfolgen, kannst du den Befehl traceroute verwenden. Gib einfach traceroute gefolgt von der IP-Adresse oder Domain des anderen Rechners ein:

traceroute -q 1 8.8.8.8
Wir haben hier noch den Parameter -q 1 hinzugefügt, um nur ein Paket pro Hop zu senden und damit die Ausgabe etwas übersichtlicher zu machen.

Anschließend solltest du eine Ausgabe wie diese sehen:

Um traceroute zu verstehen, ist es wichtig zu wissen, dass jedes IP-Paket eine sogenannte »Time To Live« (TTL) hat. Diese TTL gibt an, wie viele Hops von einem zum nächsten Rechner maximal durchlaufen werden dürfen, bevor das Paket verworfen wird.

traceroute funktioniert, indem es zuerst ein Paket mit TTL 1 an den Zielrechner sendet. Das Paket wird wegen der geringen TTL beim ersten Router verworfen, der dann eine Fehlermeldung zurücksendet. traceroute weiß nun, dass der erste Router auf dem Weg zum Zielrechner ist und gibt seine IP-Adresse und ggfs. den Hostnamen aus. Anschließend erhöht traceroute die TTL auf 2 und sendet das Paket erneut. Dieses Mal wird das Paket den ersten Router passieren und beim zweiten Router verworfen. traceroute wiederholt diesen Vorgang, bis das Paket den Zielrechner erreicht.

Ein Stern * in der Ausgabe bedeutet, dass der Router das Paket verworfen hat, ohne eine Fehlermeldung zurückzusenden, weshalb hier keine IP-Adresse angezeigt werden kann. Eine ausführlichere Erklärung findest du in diesem Blogpost von David Varghese.

4. Da­tei­en herunterladen

In diesem Abschnitt lernst du den Befehl wget kennen.

Um Da­tei­en aus dem Internet herunterzuladen, kannst du den Befehl wget verwenden. Gib einfach wget gefolgt von der URL der Datei ein, die du herunterladen möchtest:

wget https://github.com/begilbert-sys/2048-in-C/raw/main/main.c

Du solltest sehen, wie die Datei main.c heruntergeladen wird:

Du solltest jetzt eine Datei main.c in deinem aktuellen Verzeichnis haben:

Es handelt sich um ein Mini-Spiel, das in der Pro­gram­mier­spra­che C programmiert worden ist. Du kannst es mit dem Befehl gcc kompilieren und anschließend ausführen.

gcc main.c -o 2048 -lncurses -lm
Das Spiel benötigt die Bib­lio­theken ncurses und math, weshalb wir dem Compiler mit den Option -lncurses und -lm mitteilen, dass er diese Bib­lio­theken einbinden soll.

Das Spiel ist jetzt kompiliert und kann mit dem Befehl ./2048 ausgeführt werden:

./2048

Du kannst das Spiel mit den Pfeiltasten steu­ern und mit StrgC beenden.

5. Mit APIs interagieren

In diesem Abschnitt lernst du den Befehl curl kennen.

Du kannst auch Da­tei­en herunterladen, indem du den Befehl curl verwendest. Der Unterschied zwischen wget und curl ist, dass curl standardmäßig den Inhalt der Datei im Ter­mi­nal ausgibt, während wget die Datei speichert. curl eignet sich auch gut, um mit Web­sei­ten und APIs zu kommunizieren. Gib den folgenden Befehl ein, um eine Webseite Datei mit curl herunterzuladen, wie es auch ein Webbrowser tun würde:

curl https://gymnasiumsteglitz.de | less

Verwende die Pfeiltasten, um durch die Webseite zu scrollen, und drücke Q, um less zu beenden.

Du kannst curl auch verwenden, um dir die HTTP-Header anzuschauen, die ein Webserver zurücksendet:

curl -I https://gymnasiumsteglitz.de

curl ist ein sehr mächtiges Werkzeug, um mit Web­sei­ten und APIs zu kommunizieren. Ein Beispiel für eine API ist die »Cat Facts« API, die dir zufällige Fakten über Katzen zurückgibt:

curl https://catfact.ninja/fact

Die Ausgabe ist etwas schwer zu lesen:

Die Antwort ist im JSON-Format formatiert. Dieses Format einigt sich hervorragend, um es in einem Programm oder Skript zu verarbeiten. Du kannst die Ausgabe auch mit jq formatieren, einem Werkzeug, das JSON-Daten in einer schönen und übersichtlichen Form ausgibt:

curl -s https://catfact.ninja/fact | jq
Wir haben hier noch die Option -scurl übergeben, um die Fortschrittsanzeige zu deaktivieren.

Die Ausgabe ist jetzt viel übersichtlicher:

Du kannst die Abfrage beliebig oft wiederholen und solltest jedesmal einen zufälligen, neuen Fakt über Katzen erhalten.

Es gibt eine Vielzahl von APIs, die du mit curl abfragen kannst. Manche davon sind frei zugänglich, aber einige benötigen einen API-Schlüssel. Die Dokumentation der API sollte dir sagen, wie du den Schlüssel erhältst und wie du ihn in deinen Abfragen verwendest. Jemand hat sich die Mühe gemacht und eine Liste von Public APIs zusammengestellt, die du durchsuchen kannst.

6. ASCII-Kino

In diesem Abschnitt lernst du den Befehl telnet kennen, den du aber gar keinen Fall verwenden solltest, um Verbindungen zu anderen Servern aufzubauen. Wir verwenden ihn hier nur, um die ASCII-Version von Star Wars zu schauen.

Früher gab es den Befehl telnet, um Verbindungen zu anderen Servern aufzubauen. Dieser Befehl ist jedoch unsicher, da die Verbindung unverschlüsselt ist und Passwörter im Klartext übertragen werden. Wir verwenden ihn heutzutage nur noch für einen einzigen Zweck: um die ASCII-Version von Star Wars zu schauen. Gib einfach den folgenden Befehl ein:

telnet towel.blinkenlights.nl

Du kannst jetzt die ASCII-Version von Star Wars sehen:

Da telnet etwas umständlich zu beenden ist, drücke einfach auf die Mülltonne in der rechten oberen Ecke des Ter­mi­nals, um das Ter­mi­nal zu schließen und anschließend auf das Pluszeichen, um ein neues Ter­mi­nal zu öffnen.

7. Chatten mit netcat

In diesem Abschnitt lernst du den Befehl netcat kennen. Achtung: Partnerarbeit! Hierfür brauchst du eine zweite Person, die ebenfalls Zugriff auf einen eigenen Work­space hat.

Findet zunächst beide eure IP-Adressen heraus, indem ihr den Befehl ifconfig eingebt. Merkt euch eure IP-Adresse oder schreibt sie euch auf.

In diesem Beispiel hat der erste Rechner die IP-Adresse 172.17.0.12 und der zweite Rechner die IP-Adresse 172.17.0.13.

Einer von euch beiden ist der Server und der andere der Client. Der Server öffnet einen Port, auf dem der Client sich verbinden kann. Der Client verbindet sich dann mit dem Server. Nehmen wir mal an, links ist der Server und rechts ist der Client. Der Server öffnet den Port 1234:

netcat -l -p 1234

Die Parameter -l und -p 1234 bedeuten, dass netcat auf dem Port 1234 (-p 1234) lauschen soll (-l steht für »listen«). Der Server (links) wartet jetzt darauf, dass sich ein Client verbindet:

Anschließen verbindet sich der Client (rechts) mit dem Server:

netcat 172.17.0.12 1234

Der Client verbindet sich mit dem Server unter der angegeben IP-Adresse auf dem Port 1234.

Falls sich der Client nicht mit dem Server verbinden kann, überprüft bitte, ob die IP-Adresse und der Port korrekt sind. Der Server muss den Port geöffnet haben, bevor sich der Client verbinden kann.

Sobald die Verbindung hergestellt ist, könnt ihr miteinander chatten! Ihr könnt nun Nachrichten hin- und herschicken. Wenn ihr fertig seid, könnt ihr die Verbindung beenden, indem ihr auf beiden Rechnern StrgC drückt.

Der Zweck von netcat ist es eigentlich nicht, zu chatten. Man kann es verwenden, um ohne Protokoll oder Verschlüsselung Daten zwischen zwei Rechnern zu übertragen.

8. Zusammenfassung

In diesem Kapitel hast du gelernt, wie du mit Linux Netz­werk­ver­bin­dun­gen auf­baust und mit anderen Rechnern kommunizierst. Du hast gelernt, wie du die IP-Adresse deines Com­puters herausfindest, wie du andere Rechner im Netzwerk anpingst, Da­tei­en mit wget herunterlädst und mit curl APIs abfragst. Außerdem hast du gelernt, wie du mit netcat chatten kannst.