Skip to content
Snippets Groups Projects
Commit a07d50ff authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Notizen und Schreenshot 8.6.2020

parent 2e9bfea0
No related branches found
No related tags found
No related merge requests found
20200608/HTTP_Antwort.png

16.5 KiB

Netzwerke, 08.06.2020, 15:06:52
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
verschiedene Netzwerk-Protokolle:
- heute: TCP/IP
- früher: Novell (IPX), AppleTalk, NetBOUI(?)
Netzwerk-Geräte:
- keine Geräte-Dateien, sondern separat durch Kernel verwaltet
--> historische Gründe
Netzwerk-Geräte wurden bereits sehr früh zur Laufzeit ausgetauscht,
andere Geräte üblicherweise nicht.
Dann kam USB. Seitdem kann man auch Gerätedateien zur Laufzeit austauschen.
(Manche Unixe haben hier für Netzwerk-Geräte Geräte-Dateien.)
- auflisten: ifconfig -a # a = all
cassini/home/peter> /sbin/ifconfig -a
enx0022cff76a6c: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::2e32:a070:3d5c:b18f prefixlen 64 scopeid 0x20<link>
ether 00:22:cf:f7:6a:6c txqueuelen 1000 (Ethernet)
RX packets 22074567 bytes 25327005142 (23.5 GiB)
RX errors 1 dropped 0 overruns 0 frame 0
TX packets 17433143 bytes 5171001572 (4.8 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Lokale Schleife)
RX packets 2837413 bytes 2303026505 (2.1 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2837413 bytes 2303026505 (2.1 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1492
inet 85.212.20.155 netmask 255.255.255.255 destination 62.27.93.144
ppp txqueuelen 3 (Punkt-zu-Punkt-Verbindung)
RX packets 22034618 bytes 25060750410 (23.3 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17340266 bytes 4639072651 (4.3 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vlan.7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::222:cfff:fef7:6a6c prefixlen 64 scopeid 0x20<link>
ether 00:22:cf:f7:6a:6c txqueuelen 1000 (Ethernet)
RX packets 22074567 bytes 25238706874 (23.5 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17379259 bytes 5020937806 (4.6 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether ee:9a:9f:dc:22:2b txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Dieses Notebook hat 5 Netzwerk-Adapter.
3 davon haben sogenannte MAC-Adressen (Hardware-Adressen, "ether"):
enx0022cff76a6c: ether 00:22:cf:f7:6a:6c
vlan.7: ether 00:22:cf:f7:6a:6c --> virtuelles Sub-Interface von enx...
wlan0: ether ee:9a:9f:dc:22:2b
früher: Hardware-Adapter heißen "eth0", "eth1", "eth2", ...
heute: Hardware-Adapter heißen "enx" + MAC-Adresse
MAC-Adressen werden weltweit eindeutig vergeben
und identifizieren den Hardware-Adapter eindeutig.
Rechner, die miteinander verkabelt sind, können sich über ihre MAC-Adressen
eindeutig identifizieren. Man könnte also auf diesem Wege kommunizieren.
Probleme:
- Man müßte alle Rechner direkt (physikalisch) miteinander verkabeln.
- Wenn ein Netzwerk-Adapter ausgetauscht wird, ändert sich die MAC-Adresse.
Lösung: TCP-IP-Schichtenmodell
- Schicht 1: Ethernet (MAC-Adresse): so weit das Kabel reicht
- Schicht 2: IP-Adressen
- IP-Adressen
- Wir teilen jedem Rechner eindeutig eine IP-Adresse zu.
- Jeder Rechner merkt sich eine Tabelle mit den MAC- und IP-Adressen
seiner Kommunikationspartner: ARP-Tabelle.
phoenix/root# arp -n
Address Wtype HWaddress Flags Mask Iface
192.168.0.68 ther 00:21:27:c6:3c:55 C eth1
192.168.0.1 ther a4:2b:b0:de:ee:27 C eth1
Damit komme ich bis zum Ende des Kabels.
- Darüber hinaus: Routing
phoenix/root# route -n
Kernel-IP-Routentabelle
Ziel Router Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth1
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
- Routing-Tabelle: Wenn ich einen Rechner mit der IP-Adresse x.x.x.x erreichen
will, muß ich mich ggf. an einen anderen Rechner wenden.
Beispiel: Ich will main-0.cvh-server.de = 88.99.194.201 erreichen.
In Routing-Tabelle nachschlagen:
Und-Verknüpfung der IP mit der Maske (Genmask)
Wenn dann das herauskommt, was unter "Ziel" steht,
muß ich mich an den "Router" wenden.
Wenn dort "0.0.0.0" steht, ist der Rechner direkt erreichbar.
2. Zeile:
88.99.194.201 & 255.255.255.0 = 88.99.194.0 != 192.168.0.0
--> Router "0.0.0.0" nicht verwendbar = nicht direkt erreichbar
1. Zeile:
88.99.194.201 & 0.0.0.0 = 0.0.0.0 = 0.0.0.0
--> Router "192.168.0.1" verwendbar = Ziel über 192.168.0.1 erreichbar
Das Datenpaket erreicht sein Ziel mit Umweg über einen (oder mehrere) Router.
- ping <Ziel-IP>: Erreichbarkeit prüfen
- traceroute <Ziel-IP>: Route anzeigen lassen
Routing funktioniert nur, wenn alle beteiligten Rechner die Routen kennen,
und zwar in beiden Richtungen. Andernfalls sind Rechner nicht erreichbar.
Wir können nun jeden Rechner im Netzwerk über seine IP-Adresse erreichen.
Problem: Mit welcher Software auf dem Rechner wollen wir kommunizieren?
Lösung: TCP-IP-Schichtenmodell
- Schicht 1: Ethernet (MAC-Adresse): so weit das Kabel reicht
- Schicht 2: IP-Adressen
- Schicht 3: TCP-Ports
- Schicht 4: Protokolle
- TCP-Ports
- Ein (TCP-)Port ist eine Nummer, die einen Netzwerk-Teilnehmer (Software)
auf dem Rechner eindeutig identifiziert.
Beispiel: Spreche mit 88.99.194.201 auf Port 80 (Webseiten abrufen)
Protokoll ("Sprache"): HTTP
phoenix/root# nc 88.99.194.201 80
Hallo?
HTTP/1.1 400 Bad Request
Date: Mon, 08 Jun 2020 14:06:48 GMT
Server: Apache/2.4.38 (Debian)
Strict-Transport-Security: max-age=15768000; includeSubDomains
Content-Length: 307
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.4.38 (Debian) Server at 0.cvh-server.de Port 80</address>
</body></html>
Beispiel: Spreche mit 88.99.194.201 auf Port 25 (E-Mails austauschen)
Protokoll ("Sprache"): ESMTP
phoenix/root# nc 88.99.194.201 25
220 main-0.cvh-server.de ESMTP Exim 4.92 Mon, 08 Jun 2020 16:07:40 +0200
Hallo?
500 unrecognized command
Quit
221 main-0.cvh-server.de closing connection
Port selbst öffnen: nc -l
main-0/home/pgerwinski> nc -p 8088 -l
phoenix/home/peter> nc 88.99.194.201 8088
Hallo?
Hier auch hallo.
Scheint zu klappen.
:-)
^C
phoenix/home/peter>
http://88.99.194.201:8088 geht ebenfalls auf
den Rechner 88.99.194.201, Port 8088.
main-0/home/pgerwinski> nc -p 8088 -l
GET /HalloPeterGrussMarkus HTTP/1.1
Host: 88.99.194.201:8088
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
HTTP/1.1 200 OK
<html>
<body>
<h1>Hallo!</h1>
<p>Dies ist ein Test.</p>
<p>:–)</p>
</body>
</html>
Besser:
<p>:&ndash;)</p>
Selbst eine Internet-Anwendung schreiben:
main-0/home/pgerwinski/test> nc -p 8088 -l -e ./hello
main-0/home/pgerwinski/test>
Dasselbe in einer Endlosschleife:
main-0/home/pgerwinski/test> while true; do nc -p 8088 -l -e ./hello; done
phoenix/home/peter> nc 88.99.194.201 8088
Hello, world!
Auf diese Weise kann man z.B. einen Roboter, der von einem Einplatinencomputer
gesteuert wird, per WLAN fernsteuern: Auf dem Einplatinencomputer läuft die
Steuer-Software in der o.a. Endlosschleife mit nc; der Steuercomputer sendet
Befehle an den Roboter an dessen IP-Adresse und Port.
Der Erfolg des Internet beruht darauf, daß es dermaßen einfach ist,
Internet-Anwendungen zu schreiben.
ACHTUNG: Wenn man eine Internet-Anwendung schreibt, muß man mit Angriffen
Dritter auf diese Anwendung rechnen! Sicherheitsaspekte beachten!
(Z.B. Einlesen von Strings mit scanf() wäre ein Sicherheitsloch!)
Speicherverwaltung, 08.06.2020, 17:12:09
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mikrocontroller:
- Es läuft überhaupt nur 1 Programm.
- Dieses hat vollen Zugriff auf den gesamten Speicher.
DOS: Real Mode
- Es läuft überhaupt nur 1 Programm.
- Dieses hat vollen Zugriff auf den gesamten Speicher.
- Speicheradressen sind zweigeteilt, z.B.: b800:0100 (im Bildschirmspeicher)
Nebenschauplatz: Probleme mit Virtualisierung (kvm)
Tastatur in der virutellen Maschine: ":" eingegeben ergibt "Ö"
vermuteter Grund: Auf "Ö" liegt in der US-Tastenbelegung der ":".
Die Software sieht einen ":", vermutet, daß "Ö" gedrückt wurde,
und korrigiert das dann.
Behelfslösung: virtuelle Maschine auf US-Tastatur umstellen,
dann korrigiert sie nicht mehr alles.
Speicheradressen in DOS-Rechnern: Segment:Offset
16-Bit-Prozessor: 8086
Ein 16-Bit-Register kann 2^16 = 65536 verschiedene Zahlen enthalten.
--> Mit einem 16-Bit-Zeiger kann man maximal 64 kiB ansprechen.
Tatsächlich kann der 8086 bis zu 1 MiB ansprechen. Wie?
Speicheradresse = 16 * Segment + Offset
Beispiel: b800:0100 = b8000 ist dasselbe wie b808:0080 = b8080
+ 0100 + 0080
----- --¹--
physikalische Adresse: b8100 b8100
--> Wir verwenden 32-Bit-Zeiger, um maximal 1 MiB anzusprechen.
Warum?
--> Es erleichtert die Relokation von Programmen.
.----.
Programm v v
[------------]
[------------------------------------------------------------------]
Speicher
Programm an anderer Stelle im Speicher --> Sprünge müssen antepaßt werden.
.----.
Programm v v
[------------]
[------------------------------------------------------------------]
Speicher
Lösung beim 8086: Beim Laden des Programms wird eine Segment-Adresse fest
vergeben. Innerhalb des Programms wird nur mit Offset-Adressen gearbeitet.
--> Programme können bis zu 64 kiB groß sein.
Mehr als 64 kiB: Unterteilung des Speichers des Programms in verschiedene
Segmente mit verschiedenen Zwecken:
Codesegment (CS): ausführbarer Code
Datensegment (DS): globale Variable
Stack-Segment (SS): lokale Variable, Rücksprungadressen usw.
Extra-Segment (ES): dynamischer Speicher (malloc())
--> Programme können bis zu 256 kiB groß sein.
Mehr als 256 kiB: Verwendung von 32-Bit-Zeigern für dynamischen Speicher
--> Programme können bis zu 1 MiB groß sein.
Tatsächlich: 640 kiB, da das Betriebssystem 384 kiB für sich reserviert
DOS: Protected Mode
32-Bit-Prozessor: 80386
"protected mode": Speicherschutzmechanismen
Offset-Adressen: 32 Bit statt 16 Bit --> bis 4 GiB adressierbar
Segment-Adressen umgewidmet zu "Selektoren": Array-Index für Deskriptorentabelle
Deskriptorentabelle enthält Beschreibungen von Speichersegmenten
Anfangsadresse, Länge, Zugriffsrechte (z.B. ausführbar, lesbar, schreibbar)
--> Relokation von Programmen im Speicher funktioniert weiterhin.
Lösung beim 80386: Beim Laden des Programms werden Segmente definiert und fest
vergeben. Innerhalb des Programms wird nur mit Offset-Adressen gearbeitet.
--> Programme können bis zu 4 GiB groß sein.
--> Da Länge und Zugriffsrechte bekannt sind, kann nun die Hardware dafür sorgen,
daß sich verschiedene Programme nicht gegenseitig in den Speicher schreiben.
--> Wenn ein Programm diese Rechte verletzt, wird eine "Exception" ausgelöst,
eine Art Interrupt, die das laufende Programm unterbricht und die Kontrolle
an das Betriebssystem zurückgibt. Dieses beendet das Programm mit einer
Fehlermeldung.
Virtueller Speicher
32-Bit-Prozessor: 80386
64-Bit-Prozessor: AMD-64-Bit-Architektur, Nachfolger des 80386 (64-Bit-Offset-Adressen)
MMU = Memory Management Unit
Zunächst: Speicheradresse = Nummer der Speicherzelle
MMM bekommt virtuelle Speicheradresse (Prozessorregister Segment:Offset)
und bildet sie auf physikalische Speicherzelle ab.
Der Speicher ist unterteilt in "Seiten" (pages) à 4 kiB.
Die Zuordnung von virtuellen Speicheradressen auf physikalischen Speicher
wird vom Betriebssystem bestimmt und kann beliebig sein.
Insbesondere auch erlaubt: virtuelle Adresse hat keinen physikalischen Speicher.
Wenn dann eine Anwendung darauf zugreift: Exception
Das Betriebssystem kann dann bei Bedarf Speicher zuweisen
und dafür nötigenfalls an anderer Stelle Speicher auf Platte auslagern.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment