9.2. Schichtenprotokolle

Ein Einzelbild von der Kamera an einen Server in einer anderen Stadt zu senden, bedeutet, mehrere Probleme gleichzeitig zu lösen. Das elektrische Signal muss es über die erste Leitung schaffen. Die Bytes auf dieser Leitung müssen ihren Weg durch einen lokalen Switch finden. Das lokale Netzwerk muss die Nachricht an das übergeben, was zwischen ihm und dem Rest des Internets liegt. Die Pakete, die die Reise überstehen, müssen in der richtigen Reihenfolge wieder zusammengesetzt werden. Der Empfänger muss wissen, welchem seiner Programme er sie geben soll. Und die Bytes selbst müssen etwas bedeuten, worauf sich beide Enden einigen.

Zu versuchen, all das in einem einzigen Codeblock zu lösen, wäre nicht zu bewältigen. Die Standardantwort besteht darin, die Aufgabe in Schichten aufzuteilen. Jede Schicht löst ein klar definiertes Problem und stellt der darüberliegenden Schicht einen einfachen Dienst bereit. Ein Programm spricht immer nur mit der direkt darunterliegenden Schicht; die Schichten darunter sind unsichtbar.

Ein vertikaler Stapel aus fünf Boxen, beschriftet von unten nach oben: Physical, Link, Network, Transport, Application. Ein Pfeil auf der rechten Seite zeigt den Stapel hinauf, beschriftet mit "was wir bauen". Ein Pfeil auf der linken Seite zeigt den Stapel hinunter, beschriftet mit "was bereitgestellt wird".

Jede Schicht eines Netzwerkstapels löst ein Problem und reicht eine saubere Abstraktion an die nächste weiter.

9.2.1. Die fünf Schichten

Die nachfolgenden Namen sind diejenigen, die der Rest dieses Abschnitts verwendet. Sie stammen aus dem Standardmodell, um das herum Netzwerke entworfen wurden. Die genauen Grenzen zwischen den Schichten sind manchmal unscharf, aber die Rolle, die jede einzelne spielt, ist stabil.

Physical-Schicht. Bewegt Bits zwischen zwei Geräten auf derselben Leitung oder Funkverbindung. Spannungspegel, Lichtimpulse, HF-Modulation. Die Aufgabe der Kamera besteht hier hauptsächlich darin, das richtige Kabel einzustecken oder dem richtigen drahtlosen Netzwerk beizutreten; den Rest erledigt die Hardware.

Link-Schicht. Bewegt Einzelbilder (kleine Byte-Blöcke) zwischen zwei Geräten, die sich ein lokales Segment teilen. Fügt Hardwareadressen hinzu, sodass jedes Einzelbild an einen bestimmten Nachbarn gerichtet werden kann. Ethernet und Wi-Fi sind die beiden Link-Technologien, denen die Kamera in der Praxis begegnet.

Network-Schicht. Bewegt Pakete zwischen beliebigen zwei Geräten im Internet, nicht nur auf demselben lokalen Segment. Fügt eine Adresse auf Softwareebene hinzu, die einen Host unabhängig davon identifiziert, an welchem Kabel er hängt, sowie einen Routing-Mechanismus, der ein Paket von einem lokalen Segment zum nächsten weiterleitet, bis es ankommt. Dies ist die erste Schicht, in der der Python-Code der Kamera anfängt, etwas zu sagen zu haben.

Transport-Schicht. Setzt auf den Paketen auf und bietet Zustellung zwischen Programmen auf zwei Hosts, nicht nur zwischen den Hosts selbst. Zwei Varianten sind verbreitet: Eine liefert einen verbundenen, geordneten Byte-Strom (das Arbeitspferd für den meisten Datenverkehr), die andere liefert in sich geschlossene Nachrichten, die unabhängig voneinander reisen (wird verwendet, wenn geringer Overhead wichtiger ist als Garantien). Fügt Portnummern hinzu, sodass mehrere Programme auf demselben Host parallel Gespräche führen können.

Application-Schicht. Alles oberhalb von Transport: die Protokolle, die den Bytes Bedeutung verleihen. Diejenigen, die ein Webbrowser spricht, um Seiten zu laden – und diejenigen hinter fast jedem anderen Internetdienst, den der Leser bereits täglich nutzt – befinden sich hier. Das Tutorial behandelt Transport ausführlich; diese Schicht erhält einen eigenen Folgeabschnitt.

9.2.2. Wie sich die Schichten zur Laufzeit stapeln

Wenn die Kamera Bytes über das Netzwerk sendet, fügt jede Schicht ihren eigenen Header vor den Daten hinzu, ähnlich wie das Verschachteln eines Umschlags in einem anderen Umschlag:

  • Die Bytes der Anwendung kommen zuerst hinein.

  • Die Transport-Schicht umhüllt sie mit einem kleinen Header, der angibt, zu welchem Programm sie gehören (die Portnummer).

  • Die Network-Schicht umhüllt das mit einem Header, der angibt, für welchen Host sie bestimmt sind (die Adresse auf Softwareebene).

  • Die Link-Schicht umhüllt das mit einem Header, der angibt, an welches Gerät auf dem lokalen Segment sie als Nächstes übergeben werden sollen (die Hardwareadresse).

  • Die Physical-Schicht verwandelt das gesamte Bündel in Bits auf einer Leitung.

Am anderen Ende schält jede Schicht ihren eigenen Header ab und reicht den Rest nach oben weiter. Die empfangende Anwendung erhält ihre Bytes zurück, ohne zu wissen, dass die Network-, Link- und Physical-Schichten jemals existiert haben.

Diese Verschachtelung ist der Grund, warum das Tutorial von unten nach oben vorgeht. Zu verstehen, was die darunterliegende Schicht tut, lässt die darüberliegende Schicht zwangsläufig erscheinen. Die unteren beiden Schichten werden in jeweils einer einzigen Seite behandelt, weil es von Python aus fast nichts zu konfigurieren gibt. Ab der Network-Schicht aufwärts verlangsamt sich das Tempo, da Pythons Rolle größer wird.