9.8. Ports¶
Eine IP-Adresse gibt an, für welchen Host ein Paket bestimmt ist. Ein moderner Host führt viele Programme gleichzeitig aus – einen Webbrowser, einen Chat-Client, einen Videoanruf, eine Backup-Aufgabe – und jedes davon sendet und empfängt parallel Pakete. Die IP-Schicht hat keine Möglichkeit, sie auseinanderzuhalten; sie übergibt einfach jedes ankommende Paket an „den Host“. Irgendetwas muss entscheiden, welches Paket zu welchem Programm gehört.
Die Portnummer ist die Antwort. Jedes Paket auf der Transportschicht trägt zwei zusätzliche Felder über den IP-Header hinaus: einen Quellport und einen Zielport. Jeder ist eine 16-Bit-Ganzzahl, sodass es 65535 mögliche Portnummern pro Host gibt. In Kombination mit der IP-Adresse identifiziert der Port einen bestimmten Endpunkt innerhalb eines Hosts – die bestimmte Kommunikation eines bestimmten Programms.
Viele Programme teilen sich eine IP-Adresse; der Zielport leitet jedes ankommende Paket an das richtige weiter.¶
9.8.1. Bekannte Ports¶
Die ersten 1024 Portnummern sind per Konvention für Standarddienste reserviert. Einige, denen die Leserin begegnen wird:
22 – SSH (das Secure-Shell-Protokoll, verwendet für verschlüsselte Fernanmeldung).
53 – DNS, das Domain Name System (behandelt auf Namen und DNS).
80 – HTTP, das Hypertext Transfer Protocol – das unverschlüsselte Protokoll des Webs.
123 – NTP, das Network Time Protocol (wie Geräte ihre Uhren von einem Zeitserver stellen).
443 – HTTPS, HTTP über TLS übertragen (Transport Layer Security, der Standard-Verschlüsselungsmantel für Internetprotokolle) – das Protokoll hinter jeder Webseite, die im Browser ein Schlosssymbol anzeigt.
Die Konvention ermöglicht es einem Browser, sich mit http://example.com ohne Angabe eines Ports zu verbinden – er nimmt 80 an, weil das der bekannte Port für HTTP ist. Eine Kamera, die sich mit einem Webserver verbindet, tut dasselbe.
Oberhalb von 1024 sind Portnummern uneingeschränkt, und jedes Programm kann eine beanspruchen. Datenbankserver (5432 für PostgreSQL, 3306 für MySQL), Anwendungsserver und benutzerdefinierte Protokolle liegen alle irgendwo im höheren Bereich.
9.8.2. Flüchtige Ports¶
Server lauschen auf einem bekannten Port. Clients verwenden auf ihrer eigenen Seite einen anderen Port, der für jede ausgehende Verbindung neu gewählt wird.
Wenn sich die Kamera mit einem Webserver auf Port 443 verbindet, läuft die Kommunikation zwischen
camera IP : <some-port> <--> server IP : 443
Der <some-port> ist ein flüchtiger Port – MicroPython wählt eine ungenutzte Nummer aus einem hohen Bereich, verwendet sie für die Dauer der Verbindung und gibt sie danach wieder frei. Das Skript muss sich nicht darum kümmern, welche Nummer gewählt wurde; die Socket-Schicht erledigt das.
9.8.3. Lauschen vs. Sprechen¶
Welche Rolle ein Port spielt, hängt davon ab, auf welcher Seite der Kommunikation er sich befindet. Zwei verschiedene Fälle:
Ein lauschender Port gehört zu einem Programm, das unaufgeforderte Verbindungen empfangen möchte. Das Programm teilt MicroPython mit „alle eingehenden Pakete, die an mich auf Port 80 adressiert sind, gehören mir“, und wartet. Server tun dies.
Ein verbundener Port gehört zu einem Programm, das eine Kommunikation initiieren möchte. Das Programm wählt (oder bittet MicroPython, zu wählen) einen flüchtigen Port, sendet ein Paket mit diesem als Quellport und dem bekannten Port des Servers als Zielport und verwendet dasselbe Portpaar für den Rest der Kommunikation.
Ein einzelnes Programm kann beides gleichzeitig tun und für jede Rolle unterschiedliche Ports halten. Eine Kamera könnte auf Port 8000 auf eingehende HTTP-Verbindungen von einer Konfigurationsoberfläche lauschen und eine ausgehende HTTPS-Verbindung zu einem entfernten Server auf Port 443 halten. Die beiden Rollen stören sich nicht – jede Kommunikation wird durch das vollständige Quadrupel (src IP, src port, dst IP, dst port) identifiziert, und keine zwei Kommunikationen teilen sich dasselbe Quadrupel.
9.8.4. Was Ports ermöglichen¶
Mit vorhandenen Ports kann die Transportschicht endlich das Problem der Programm-zu-Programm-Zustellung lösen. Ein Paket trägt nun genug Informationen, um nicht nur zum richtigen Host (der IP-Adresse), sondern auch zum richtigen Socket innerhalb dieses Hosts (der Portnummer) geleitet zu werden.
Die nächsten beiden Seiten behandeln die beiden Varianten, die die Transportschicht auf dieser Adressierung anbietet: UDP (das User Datagram Protocol – jedes Paket unabhängig, keine Garantien) und TCP (das Transmission Control Protocol – ein verbundener, zuverlässiger, geordneter Datenstrom).