Poorten
Een IP-adres brengt een pakket tot bij het juiste toestel. Maar op dat toestel draaien tientallen programma's tegelijk: een browser, een dev server, een databank, een mailclient. Wie krijgt dat pakket?
Daarvoor dient het poortnummer. Het IP-adres wijst het gebouw aan, de poort de juiste deur.
193.190.253.10 : 443
└─── welk toestel ──┘ └─ welk programma ─┘
Een poort is een getal van 16 bits
Poortnummers lopen van 0 tot 65535. Dat is geen willekeurige grens: het veld in de TCP- en UDP-header is 16 bits groot, en 2¹⁶ geeft precies 65 536 mogelijkheden.
Ze zijn opgedeeld in drie zones:
| Bereik | Naam | Waarvoor |
|---|---|---|
0 – 1023 | Well-known ports | Vaste diensten: HTTP, HTTPS, SSH, DNS. Op Linux en macOS heb je beheerdersrechten nodig om er een te gebruiken |
1024 – 49151 | Registered ports | Toegekend aan software: databanken, dev servers, applicaties |
49152 – 65535 | Dynamische poorten | Tijdelijk toegekend aan uitgaande verbindingen |
Die laatste groep zie je zelden bewust, maar je gebruikt ze constant. Als je browser een pagina opvraagt, krijgt hij zelf een willekeurige poort toegewezen om het antwoord op te ontvangen:
jouw laptop 192.168.0.14:53412 ──► 193.190.253.10:443
▲ ▲
tijdelijke bronpoort vaste doelpoort (HTTPS)
Bron-IP, bronpoort, doel-IP en doelpoort. Die combinatie heet een socket, en ze is uniek. Daarom kan je tien tabbladen naar dezelfde site open hebben: het doel is telkens hetzelfde, maar elke verbinding heeft een eigen bronpoort.
Veelgebruikte poorten
| Poort | Protocol | Waarvoor |
|---|---|---|
| 20 / 21 | FTP | Bestandsoverdracht (verouderd, onversleuteld) |
| 22 | SSH / SFTP | Beveiligd inloggen op een server, git push via SSH |
| 25 | SMTP | Mail tussen servers |
| 53 | DNS | Domeinnamen opzoeken |
| 80 | HTTP | Onversleuteld web |
| 143 / 993 | IMAP | Mail ophalen (993 = versleuteld) |
| 443 | HTTPS | Versleuteld web |
| 587 | SMTP | Mail versturen vanuit je mailclient |
| 3306 | MySQL / MariaDB | Databank |
| 5432 | PostgreSQL | Databank |
| 6379 | Redis | Cache |
| 27017 | MongoDB | Databank |
| 3000 / 5173 / 8000 / 8080 | – | Dev servers (Node, Vite, Python, Java) |
De eerste vier rijen en 443 ken je best uit het hoofd. De rest zoek je op wanneer je ze nodig hebt.
Het scheme in een URL bepaalt de standaardpoort: http:// gaat naar 80, https:// naar 443. https://ap.be en https://ap.be:443 zijn identiek. Zie ook URI's en URL's.
De poort van je eigen dev server
http://localhost:5173 bevat alle informatie die je nodig hebt om te begrijpen wat er gebeurt:
| Onderdeel | Betekenis |
|---|---|
http | Onversleuteld, dus standaard poort 80 … |
localhost | … maar het verkeer blijft op je eigen toestel |
5173 | … en gaat naar het programma dat op poort 5173 luistert: je dev server |
De poort staat er expliciet bij omdat 5173 niet de standaard is. Zou je server op poort 80 luisteren, dan volstond http://localhost.
Een dev server claimt die poort zodra hij start. Vanaf dat moment is ze bezet voor elk ander programma:
npm run dev -- --port 3001 # Vite op een andere poort
python -m http.server 8001 # Python op 8001 in plaats van 8000
Error: listen EADDRINUSE: address already in use :::5173
Dit betekent altijd hetzelfde: een ander proces houdt die poort al vast. Meestal is dat een dev server uit een vorige sessie die nog draait. Twee oplossingen: kies een andere poort, of zoek het proces op en sluit het af. Hoe je dat proces vindt, staat hieronder.
Kijken welke poorten actief zijn
| Besturingssysteem | Commando |
|---|---|
| Windows | netstat -ano |
| Linux | ss -tulpn (ouder: netstat -tulpn) |
| macOS | lsof -i -P -n |
Beperk je tot wat luistert, dan is de uitvoer meteen leesbaar:
netstat -ano | findstr LISTENING # Windows
ss -tulpn | grep LISTEN # Linux
Proto Lokaal adres Extern adres Status PID
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1064
TCP 127.0.0.1:5173 0.0.0.0:0 LISTENING 6724
TCP 192.168.0.14:53412 93.184.216.34:443 ESTABLISHED 9120
Elke kolom vertelt iets:
| Kolom | Wat je eruit leest |
|---|---|
| Proto | TCP of UDP |
| Lokaal adres | Op welk adres én welke poort dit proces luistert. 127.0.0.1 betekent enkel bereikbaar op dit toestel, 0.0.0.0 betekent op alle interfaces |
| Extern adres | Bij een lopende verbinding: met wie. Bij een luisterende poort staat hier niets zinvols |
| Status | LISTENING: wacht op verbindingen. ESTABLISHED: er loopt er een |
| PID | Het procesnummer, waarmee je uitzoekt welk programma het is |
Van PID naar programmanaam:
Get-Process -Id 6724 # Windows (PowerShell)
tasklist | findstr 6724 # Windows (cmd)
# Output:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
1346 940 108504 140204 6724 0 nordvpn-service
ps -p 6724 # macOS en Linux
En zo sluit je een vergeten dev server af:
Stop-Process -Id 6724 # Windows
kill 6724 # macOS en Linux
- Je dev server luistert op
127.0.0.1:5173en je klasgenoot geraakt er niet aan. Logisch: hij luistert enkel op loopback. Start hem met--hosten het lokale adres verschijnt in de lijst. Zie ook IP-adressering. - Je krijgt
EADDRINUSE. In de lijst zie je welk PID de poort vasthoudt, en metGet-Processwelk programma dat is.
Gesloten poorten en firewalls
Een firewall beslist welk verkeer een poort mag bereiken. Dat verklaart het verschil tussen twee foutmeldingen die je vaak ziet:
| Wat je merkt | Wat er waarschijnlijk gebeurt |
|---|---|
Meteen connection refused | Het toestel is bereikbaar, maar niets luistert op die poort |
| Lange stilte, dan een time-out | Een firewall laat het verkeer stilletjes vallen |
Servers laten daarom bewust maar enkele poorten open: 443 voor het web, 22 voor beheer. Een databank op 3306 die van het hele internet bereikbaar is, is een klassieke inbraakroute.
Test jezelf
1. Welke rol speelt het getal 5173 in `http://localhost:5173`?
2. In de uitvoer van netstat zie je `TCP 127.0.0.1:5173 ... LISTENING`. Wat betekent dat?
3. Je start je dev server en krijgt `EADDRINUSE`. Wat is er aan de hand?
4. Waarom heeft je browser bij elke verbinding een andere bronpoort?
- Een poort is een getal van 0 tot 65535 dat zegt welk programma op een toestel het verkeer krijgt.
- 0–1023 zijn de well-known poorten (80 HTTP, 443 HTTPS, 22 SSH, 53 DNS); hogere nummers zijn voor toepassingen en tijdelijke verbindingen.
- Een verbinding wordt bepaald door vier gegevens: bron-IP, bronpoort, doel-IP, doelpoort.
- Met
netstat -ano,ss -tulpnoflsof -izie je welke poorten luisteren, en met welk PID. LISTENINGop127.0.0.1betekent enkel lokaal bereikbaar; op0.0.0.0ook voor andere toestellen.EADDRINUSEbetekent dat een ander proces de poort al vasthoudt.