14. Netzwerkkommunikation

In diesem Kapitel wollen wir einen Einblick in die Netzwerkprogrammierung geben. Es werden verschiedene WWW Quellen verwendet, vorallem tinohempel.de.

Abbildung Beispiel eines Firmennetzwerkes zeigt beispielhaft ein Netzwerk.

_images/netzwerk.png

Beispiel eines Firmennetzwerkes

Erklärung:

  • Ein Small Business Server verwaltet das Firmennetzwerk.
  • Daran hängen Arbeitsrechner, Drucker, weitere Server (File Server), etc.
  • Diese Rechner können intern (z.B. über Business Server) und extern (via. Internet) kommunizieren.
  • Die externe Kommunikation wird mittels Firewall geschützt.
  • Mail- und Webserver stellt i.a. ein Drittanbieter (Provider) zur Verfügung.

14.1. Grundbegriffe

MAC Adresse
Die MAC (Media Access Control - Kennung der Netzkarte) Adresse ist eine eindeutig zugewiesene Adresse für einen Rechner. Beispiel: 00-80-41-ae-fd-7e. Vergleichbar ist dies mit dem Namen einer Person. Mehr Details unter WIKI_MAC.
IP Adresse
Die IP-Adresse (Internet Protokoll) ist eine Adresse in Computernetzenwerken (Netzwerkadresse). Diese wird einem Rechner (z.B. durch einen Provider/Internetanbieter) zugewiesen. Beispiel: 203.0.113.195. Vergleichbar ist dies mit der Wohnadresse einer Person. Mehr Details unter WIKI_IP.
Port

Eine IP-Adresse kann mehrere Verbindungen über soggenannte Ports zu einem anderen Rechner aufbauen um Datenpakete auszutauschen. Beispiel: System Ports von 0-1023, User Ports von 1024-49151, etc. Vergleichbar ist dies mit der Nummer einer Tür in der Wohnung einer Person. Mehr Details unter WIKI_Port.

Socket

Ein Socket (Steckdose) ist eine bidirektionale Software-Schnittstelle (senden+empfangen) zur Netzwerk- oder Prozesskommunikation. Ein Socket ist die Kombination aus IP Adresse + Port. Mehr Details unter WIKI_Socket.

Server
Ein Server (Diener) bietet bestimmte Dienstleistungen Clients (siehe unten) an. Der Server hat eine bekannte IP-Adresse im Netzwerk. Erhält ein Server eine Anfrage und akzeptiert diese, wird ein neuer Socket erzeugt.
Client
Der Client (Kunde) nimmt Dienstleistungen vom Server in Anspruch. Die Kommunikation beider erfolgt mit TCP oder UDP (siehe unten).

14.2. Schichtmodell

Die Kommunikation zwischen Rechnern erfolgt über ein Schichtmodell. Zum besseren Verständnis zunächst ein Beispiel, siehe Abbildung Kommunikation zweier Forscher:

_images/schichtmodell_forscher.png

Kommunikation zweier Forscher

Erklärungen:

  • Zwei Forscher kommunizieren in ihrer Fachsprache z.B russisch.
  • Diese kann unterschiedlich sein (russisch, englisch) und man braucht Dolmetscher. Diese kommunizieren z.B. in englisch.
  • Praktisch erfolgt die Kommunikation z.B. über das Telefon (elektromagnetische Welle).
  • D.h. die Kommunikation ist nicht direkt sondern geht über Schichten.

Daraus folgt für den Kommunikationsablauf (siehe: Abbildung Kommunikationsablauf einer Einzelschicht).

_images/schichtmodell_einzel.png

Kommunikationsablauf einer Einzelschicht

Erklärungen:

  • Jede beteiligte Person/Gerät realisiert eine Kommunikationsschicht.
  • Jede Schicht stellt einen Dienst der höheren Schicht zur Verfügung und nutzt den Dienst der niedrigeren Schicht.
  • Jede Schicht wickelt die Aufgabe intern nach bestimmten Regeln (sog. Protokoll) ab.
  • Die Übergabe von Informationen geschieht über genau definierte Schnittstellen.
  • Jede Kommunikationsschicht kommuniziert indirekt mit der jeweils gleichen Schicht auf der anderen Seite.

Netzkommunikation funktioniert nach dem gleichen Prinzip. Das derzeit verwendete Internetmodell zeigt Abbildung Internet Schichtmodell (TCP/IP).

_images/schichtmodell.png

Internet Schichtmodell (TCP/IP) (links) und dazugehörige Pakete (rechts)

Das TCP/IP Modell besteht aus insgesamt vier Schichten (siehe auch linux-praxis.de). Die Datenübertragung erfolgt mittels Paketen.

Anwendungsschicht - Application Layer

Applikationen, welche über das Internet miteinander kommunizieren. Das sieht der Anwender.

Beispiel-Protokolle: Hypertext Transfer Protocol - HTTP, File Tranfer Protocol - FTP, Simple Mail Transfer Protocol - SMTP.

Transportschicht - Transport Layer

Darunterliegende Schicht zur Ermöglichung von gesichertem/ungesicherten Datentransport mit/ohne Flußkontrolle (Überflutung, Wiederholung bei Timeout, Prüfsummenbildung, Festlegung von Portnummern).

Beispiel-Protokolle: TCP - Transport Control Protocol (gesichteter Transport mit Kontrolle), User Datagram Protocol - UDP (ungesicherter Transport).

Internetschicht - Internet Layer

Auch Vermittlungsschicht genannt. Diese dient zur Erzeugung und Versendung der Datenpakete mit Hilfe der IP-Adresse des Absenders und Empfängers, Wegsteuerung eines Paketes, Festlegung der Lebensdauer. Diese Schicht entscheidet wie das Paket weitergegeben wird TCP, UDP oder ob es in der Schicht verbleibt (ICMP).

Beispiel-Protokolle: Internet Protocol - IP (Datenübertragung), Internet Control Message Protocol - ICMP (für Kontrolle und Fehlersuche).

Netzzugangsschicht - Network Access Layer

Schicht für die Datenübertragung von direkt miteinander verbundenen Rechnern d.h. bekommt ein Paket aus dem Netz unter Berücksichtigung der Auflösung einer logischen IP-Adresse in eine MAC-Adresse (MAC - Media Access Control - Kennung der Netzkarte), Zugriffsprotokoll (z.B. Ethernet), usw.

Beispiel-Protokolle: Adress Resolution Protocol - ARP (Auflösung der IP in MAC-Adresse und umgekehrt), Ethernet, etc.

Die Tabelle Netzwerkprotokolle zeigt eine Übersicht von Protokollen und dazugehörigen Python Modulen.

Netzwerkprotokolle
Protokoll Beschreibung Modul
TCP verbindungsorientiertes Netzwerkprotokoll: Fehlerkorrektur, Flusskontrolle, HTTP, FTP socket
UDP verbindungsloses Netzwerkprotokoll: Datenübertragung ohne Kontrollen, Echtzeitvideos socket
FTP Dateiübertragung ftplib
SMTP Versenden von E-Mails smtplib
IMAP Abholen von E-Mails imaplib
Telnet Terminalemulation: Verbindung zu Rechner im Netzwerk telnetlib
HTTP Übertragen von Textdateien: Webseiten urllib

14.3. Internet-Kommunikation Socket API

Im Sinne der Programmierung ist primär die Transportschicht von Bedeutung. Abbildung Kommunikation zweier Rechner zeigt schematisch diesen Sachverhalt.

_images/schichtmodell_anwender.png

Kommunikation zweier Rechner

Hier ein kleines Python Beispiel wie man den Name und die IP Adresse von Rechnern anzeigen kann:

>>> import socket
>>> socket.gethostname()                        # Name des eigenen Rechners
'drpahr-office'
>>> socket.gethostbyname(socket.gethostname())  # IP-Adresse des eigenen Rechners
'127.0.1.1'
>>> socket.gethostbyname("www.tuwien.ac.at")    # IP-Adresse eines Rechners
'128.130.35.76'
>>> socket.gethostbyaddr("128.130.35.76")       # Name eines Rechners
('info.zserv.tuwien.ac.at', [], ['128.130.35.76'])

Dieses Beispiel funktioniert natürlich nur wenn Sie im Internet sind.

14.3.1. Netzwerkprotokoll UDP

Eine einfache UDP Kommunikationsvariante ist in Abbildung Server/Client Netzwerkprotokoll UDP ersichtlich.

_images/kommunikation_UDP.png

Server/Client Netzwerkprotokoll UDP

Erklärung:

  • Zwei Rechner (Client und Server) sind miteinander verbunden (via Ethernet, Internet, ...).
  • Der Client erzeugt einen Socket und sendet Daten.
  • Der Server erzeugt ebenfalls einen Socket
  • und bindet diesen (d.h. legt IP-Adresse und Port des Sockets fest).
  • Nun kann der Server Daten empfangen und diese verarbeiten.
  • Danach sendet der Server diese an den Client.
  • Dieser empfängt die Daten und verarbeitet diese.
  • Beide schließen Ihre Sockets

Im folgenden ein kleines Beispiel welches die Netzwerkkommunikation in Python aufzeigt. Dazu bedarf es immer einen

  • Server sowie
  • Client.

Betrachten wir zunächst den Quellcode des Clients (netzwerk_client.py):

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

ip = raw_input("IP-Adresse: ") 
nachricht = raw_input("Nachricht: ")

s.sendto(nachricht, (ip, 50000)) 
s.close()

Erklärung:

  • Zunächst wird mit socket eine Socket-Instanz erzeugt. Die Konstanten AF_INET und SOCK_DGRAM stehen dabei für Internet/IPv4 und UDP.
  • Danach werden zwei Angaben vom Benutzer eingelesen: die IP-Adresse, an die die Nachricht zu schicken ist, und die Nachricht selbst.
  • Zum Schluss wird die Nachricht unter Verwendung der Socket-Methode sendto zur angegebenen IP-Adresse geschickt, wozu der Port 50000 verwendet wird.
  • Abschließend wird der Socket mittels close geschlossen.

Das Clientprogramm allein ist wertlos, solange es kein dazu passendes Serverprogramm gibt. Der Quelltext des Servers sieht folgendermaßen aus (netzwerk_server.py):

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try: 
    s.bind(("", 50000)) 
    while True: 
        daten, addr = s.recvfrom(1024) 
        print "[%s] %s" % (addr[0], daten) 
finally: 
    s.close()

Erklärung:

  • Auch hier wird zunächst eine socket Instanz erstellt.
  • In der darauf folgenden try/finally Anweisung wird dieser Socket durch Aufruf der Methode bind an eine Adresse gebunden. Wenn keine IP-Adresse angegeben wurde ("" leerer String) bedeutet dies, dass Pakete über alle dem Server zugeordneten Adressen empfangen werden können.
  • Der Port ist auch hier 50000.
  • Nun können Daten empfangen werden. Dazu wird die Methode recvfrom in einer Endlosschleife aufgerufen.
  • Der Parameter 1024 kennzeichnet die maximale Paketgröße.
  • Wird der Server z.B. mit Strg-C (KeyboardInterrupt Exception) geschlossen, führt die try/finally Anweisung das close aus.

Zum Auführen startet man am Rechner den Server:

python server.py

Dieser “wartet”. Danach startet man den Client z.B.

python client.py

und gibt eine beliebige IP-Adresse sowie Nachricht ein:

IP-Adresse: 127.0.0.1
Nachricht: Hallo Server!

nach Eingabe von Enter sieht man auf der Server Seite die Ausgabe:

[127.0.0.1] Hallo Server!

14.3.2. Netzwerkprotokoll TCP

Die TCP Kommunikationsvariante ist in Abbildung Server/Client Netzwerkprotokoll TCP ersichtlich. Dies ist das Standardprotokoll für eine Datenübertragungen. .

_images/kommunikation_TCP.png

Server/Client Netzwerkprotokoll TCP

Erklärung:

  • Im Unterschied zu UDP muss der Client zunächst fragen ob er “akzeptiert” wird.
  • Erlaubt der Server eine Kommunikation, sendet er seine IP-Adresse.
  • Danach können wie oben Daten gesendet und empfangen werden.
  • Am Ende schließen beide ihre Sockets.