9.8. Poorten¶
Een IP-adres geeft aan voor welke host een pakket bestemd is. Een moderne host draait veel programma’s tegelijk – een webbrowser, een chatclient, een videogesprek, een back-uptaak – en elk daarvan verstuurt en ontvangt pakketten parallel. De IP-laag heeft geen manier om ze van elkaar te onderscheiden; ze geeft elk binnenkomend pakket gewoon door aan “de host”. Iets moet beslissen welk pakket bij welk programma hoort.
Het poortnummer is het antwoord. Elk pakket op de transportlaag draagt twee extra velden bovenop de IP-header: een bronpoort en een bestemmingspoort. Elk is een 16-bit-geheel getal, dus er zijn 65535 mogelijke poortnummers per host. Gecombineerd met het IP-adres identificeert de poort één specifiek eindpunt binnen een host – het specifieke gesprek van één specifiek programma.
Veel programma’s delen één IP-adres; de bestemmingspoort stuurt elk binnenkomend pakket naar het juiste programma.¶
9.8.1. Bekende poorten¶
De eerste 1024 poortnummers zijn volgens afspraak gereserveerd voor standaarddiensten. Een paar die de lezer zal tegenkomen:
22 – SSH (het Secure Shell-protocol, gebruikt voor versleutelde externe aanmelding).
53 – DNS, het Domain Name System (behandeld op Namen en DNS).
80 – HTTP, het Hypertext Transfer Protocol – het onversleutelde protocol van het web.
123 – NTP, het Network Time Protocol (hoe apparaten hun klokken instellen vanaf een tijdserver).
443 – HTTPS, HTTP gedragen over TLS (Transport Layer Security, de standaard versleutelingsverpakking voor internetprotocollen) – het protocol achter elke webpagina die een slotpictogram in de browser toont.
De afspraak is wat het mogelijk maakt voor een browser om verbinding te maken met http://example.com zonder een poort op te geven – ze gaat uit van 80 omdat dat de bekende poort voor HTTP is. Een camera die verbinding maakt met een webserver doet hetzelfde.
Boven 1024 zijn poortnummers onbeperkt en kan elk programma er een claimen. Databaseservers (5432 voor PostgreSQL, 3306 voor MySQL), applicatieservers en aangepaste protocollen leven allemaal ergens in het hogere bereik.
9.8.2. Vluchtige poorten¶
Servers luisteren op een bekende poort. Clients gebruiken aan hun eigen kant een andere poort, telkens opnieuw gekozen voor elke uitgaande verbinding.
Wanneer de camera verbinding maakt met een webserver op poort 443, is het gesprek tussen
camera IP : <some-port> <--> server IP : 443
De <some-port> is een vluchtige poort – MicroPython kiest een ongebruikt nummer uit een hoog bereik, gebruikt het voor de duur van de verbinding en geeft het daarna vrij. Het script hoeft zich niet te bekommeren om welk nummer werd gekozen; de socketlaag handelt dit af.
9.8.3. Luisteren versus communiceren¶
De rol die een poort speelt hangt af van welke kant van het gesprek ze zich bevindt. Twee verschillende gevallen:
Een luisterende poort behoort tot een programma dat ongevraagde verbindingen wil ontvangen. Het programma vertelt MicroPython “alle binnenkomende pakketten die aan mij gericht zijn op poort 80 zijn van mij”, en wacht. Servers doen dit.
Een verbonden poort behoort tot een programma dat een gesprek wil initiëren. Het programma kiest (of vraagt MicroPython om te kiezen) een vluchtige poort, verstuurt een pakket met die als bronpoort en de bekende poort van de server als bestemming, en gebruikt hetzelfde poortpaar voor de rest van het gesprek.
Eén enkel programma kan beide tegelijk doen en verschillende poorten voor elke rol vasthouden. Een camera zou kunnen luisteren op poort 8000 voor inkomende HTTP-verbindingen van een configuratie-interface en tegelijk een uitgaande HTTPS-verbinding naar een externe server op poort 443 vasthouden. De twee rollen verstoren elkaar niet – elk gesprek wordt geïdentificeerd door het volledige (src IP, src port, dst IP, dst port)-viertal, en geen twee gesprekken delen hetzelfde viertal.
9.8.4. Wat poorten mogelijk maken¶
Met poorten op hun plaats kan de transportlaag eindelijk het programma-naar-programma-leveringsprobleem oplossen. Een pakket draagt nu genoeg informatie om niet alleen naar de juiste host (het IP-adres) maar ook naar de juiste socket binnen die host (het poortnummer) te worden gerouteerd.
De volgende twee pagina’s behandelen de twee varianten die de transportlaag bovenop die adressering biedt: UDP (het User Datagram Protocol – elk pakket onafhankelijk, geen garanties) en TCP (het Transmission Control Protocol – een verbonden, betrouwbare, geordende stroom).