Hoppa till innehåll

Nätverk

Den här sidan förklarar det du behöver veta om nätverk som webbprogrammerare: vad som händer mellan webbläsaren och din server när någon öppnar en URL. Den innehåller:

  • de fyra stegen från URL till svar
  • nätverksterminologi
  • TCP/IP-modellen
  • IP-adresser, portar och skillnaden mellan localhost och 0.0.0.0
  • TCP och UDP
  • DNS, systemet som översätter namn till adresser
  • några kommandon för att undersöka och felsöka
  • övningar att göra på egen hand

Du behöver inte kunna bygga nätverk. Men när en sida inte nås, en port redan är upptagen eller en ändring i DNS inte slår igenom, behöver du förstå vilket steg som går fel. Nästa sida, HTTP, handlar om det sista steget: det webbläsaren och servern säger till varandra.

Tidsåtgång: Ungefär 20–25 minuter att läsa och 40 minuter för övningarna.

Övningarna görs i en Bash-terminal på din egen dator: Git Bash på Windows och Terminal på macOS och Linux. Några övningar använder Node.js, som du behöver installera om du inte redan har det.

Kommandona är desamma överallt, med två undantag. Datorns IP-adresser visas med ipconfig på Windows, ifconfig på macOS och ip addr på Linux. ping skickar fyra paket och slutar på Windows, men fortsätter tills du trycker Ctrl+C på macOS och Linux.

När någon öppnar https://coursepress.lnu.se/kurser/ sker fyra steg:

  1. DNS. Webbläsaren tar reda på vilken IP-adress coursepress.lnu.se har.
  2. TCP. Webbläsaren öppnar en anslutning till den adressen, på port 443.
  3. TLS. Webbläsaren och servern kommer överens om kryptering och kontrollerar serverns certifikat. Det är det som gör http till https.
  4. HTTP. Webbläsaren skickar sin förfrågan, GET /kurser/, och servern svarar.

Varje steg tar tid, eftersom meddelanden måste gå fram och tillbaka över nätverket. Den tiden kallas latens. Det är därför webbläsare återanvänder anslutningar, varför DNS-svar cachas och varför stora webbplatser har servrar nära användarna.

Begrepp Betydelse
Värd (host) En dator eller annan enhet i ett nätverk
Klient och server Klienten ställer en förfrågan, servern svarar. Samma dator kan vara både och.
Protokoll Regler för hur två parter kommunicerar: vilka meddelanden som finns och i vilken ordning
Paket Ett block med data som skickas genom nätverket, med en header som anger vart det ska
Router En enhet som skickar paket vidare mellan nätverk. Varje router på vägen är ett hopp.
Standard-gateway Den router, oftast routern hemma, som tar emot allt som ska ut ur det lokala nätet
Socket En IP-adress tillsammans med en port, till exempel 127.0.0.1:3000
Bandbredd Hur mycket data som kan skickas per sekund
Latens Hur lång tid det tar för data att nå mottagaren, alltså en riktning
RTT Round-trip time, tiden fram och tillbaka. Det är RTT som ping visar, och i praktiken är det oftast RTT som avses när någon säger latens.
Brandvägg Filtrerar trafik och avgör vilka portar som går att nå utifrån

Nätverkskommunikation delas upp i lager, där varje lager löser ett problem och bara behöver känna till lagret under. Internet bygger på TCP/IP-modellen med fyra lager:

Lager Uppgift Adresserar med Exempel
Applikation Det applikationerna säger till varandra URL, domännamn HTTP, DNS, SSH, TLS
Transport Kommunikation mellan program på två datorer Portnummer TCP, UDP
Internet Att hitta vägen mellan nätverk IP-adress IP
Länk Kommunikation inom det lokala nätverket MAC-adress Ethernet, Wi-Fi

När din webbläsare skickar en förfrågan lägger varje lager till sin egen header, som ett kuvert i ett kuvert. HTTP-förfrågan läggs i ett TCP-segment med portnummer, som läggs i ett IP-paket med adresser. Mottagaren packar upp kuverten i omvänd ordning. Det kallas inkapsling.

Du stöter också på OSI-modellen, som delar upp samma sak i sju lager. Den används för att resonera om nätverk. De tre översta OSI-lagren, applikation, presentation och session, motsvarar applikationslagret i TCP/IP, och de två understa, datalänk och fysiskt, motsvarar länklagret. Därför talar man ibland om “lager 4” för transport och “lager 7” för applikation.

Varje dator på ett nätverk nås via en IP-adress. Det finns två versioner: IPv4, till exempel 194.47.176.29, och IPv6, till exempel 2001:db8::1. Det finns inga oanvända IPv4-adresser kvar att dela ut. De som finns återanvänds, säljs vidare och delas av många datorer, och IPv6 blir allt vanligare.

Några adresser behöver du känna igen:

Adress Betydelse
127.0.0.1 och ::1 Den egna datorn (loopback). Namnet localhost pekar hit.
192.168.x.x, 10.x.x.x, 172.16.x.x–172.31.x.x Privata adresser, som i ditt hemnätverk. Nås inte från internet.
0.0.0.0 När en server lyssnar på den: alla nätverkskort på datorn

En IP-adress består av en del som anger nätet och en del som anger värden på nätet. Hur stor del som är nät skrivs med ett snedstreck och antalet bitar: 192.168.1.0/24 betyder att de första 24 bitarna, 192.168.1, är nätet, och att adresserna 192.168.1.0 till 192.168.1.255 hör till samma nät. Datorer på samma nät når varandra direkt. Allt annat skickas via standard-gatewayen.

Hemma har din dator en privat adress. Routern översätter den till en enda publik adress när trafiken går ut på internet. Det betyder att andra på internet inte kan nå en server på din dator, och att en server på din dator som lyssnar på 127.0.0.1 inte ens nås från andra datorer hemma.

En IP-adress pekar ut en dator, men på datorn körs många program. Portar, tal mellan 0 och 65535, pekar ut vilket program trafiken ska till. När du startar din Node-app säger du vilken port den ska lyssna på.

Port Tjänst
22 SSH
53 DNS
80 HTTP
443 HTTPS
3000 Vanlig port för Node-appar under utveckling
27017 MongoDB

Bara ett program åt gången kan lyssna på en viss port. Försöker ett till får det felet EADDRINUSE. Portar under 1024 kräver administratörsrättigheter, vilket är en anledning till att appen lyssnar på 3000 och en webbserver framför den tar emot trafiken på 80 och 443. Det gör du på din egen server senare i kursen.

Transportlagret har två huvudprotokoll:

TCP UDP
Anslutning Upprättas först Ingen, paketen skickas direkt
Tillförlitlighet Allt kommer fram, i rätt ordning Paket kan försvinna eller komma i fel ordning
Används av HTTP/1.1, HTTP/2, SSH, databaser DNS, videosamtal och HTTP/3

En TCP-anslutning öppnas med en trevägshandskakning: klienten skickar SYN, servern svarar SYN-ACK och klienten svarar ACK. Först därefter kan data skickas. Det kostar en resa fram och tillbaka innan första byten, och med TLS ytterligare en. HTTP/3 använder därför protokollet QUIC över UDP, som slår ihop anslutning och kryptering till ett steg.

DNS (Domain Name System) översätter namn till IP-adresser. Din dator frågar en DNS-server, oftast hos din internetleverantör, som vid behov frågar sig fram genom en hierarki: först roten ., sedan toppdomänen se och sist den server som ansvarar för lnu.se. Svaret cachas i den tid som posten anger, dess TTL (time to live).

Det här är de poster du oftast har att göra med:

Post Innehåll När du stöter på den
A IPv4-adress När din domän ska peka på din server
AAAA IPv6-adress Samma sak, för IPv6
CNAME Alias för ett annat namn När en tjänst ber dig peka www till deras namn
MX E-postservrar När domänen ska kunna ta emot e-post
TXT Fri text När en tjänst vill att du bevisar att du äger domänen

Innan datorn frågar DNS läser den filen hosts (/etc/hosts på macOS och Linux, C:\Windows\System32\drivers\etc\hosts på Windows). Där står bland annat att localhost är 127.0.0.1.

Kommando Vad det gör
ipconfig, ifconfig eller ip addr Visar datorns IP-adresser på Windows, macOS respektive Linux
ping <värd> Testar om en värd svarar, och hur lång tid det tar
nslookup <namn> Slår upp ett namn i DNS. -type=MX frågar efter en annan typ av post.
netstat -an | grep 3000 Visar om något lyssnar på port 3000. På Linux: ss -ltn | grep 3000.
curl <url> Hämtar en URL. Mer om curl på sidan HTTP.

Tidsåtgång: Ungefär 40 minuter för alla fem övningarna.

När du har gått igenom sidan kan du pröva dina kunskaper med övningarna nedan. Försök själv innan du tittar på lösningsförslaget. Resultaten beror på vilket nätverk du sitter på, så dina svar kan se annorlunda ut än exemplen.

Tidsåtgång: Ungefär 5 minuter.

Slå upp coursepress.lnu.se med nslookup. Vilken IP-adress har den? Svaret innehåller också ett annat namn. Vad är det, och vilken typ av DNS-post ger upphov till det?

Terminal window
nslookup coursepress.lnu.se

coursepress.lnu.se är ett alias, en CNAME-post, för serverns egentliga namn. Det är vanligt när flera webbplatser ligger på samma server, eller när servern kan behöva bytas utan att adressen som användarna ser ändras.

Tidsåtgång: Ungefär 5 minuter.

curl kan mäta hur lång tid varje steg från URL till svar tar. Kör kommandot nedan två gånger efter varandra. Vilket steg tar längst tid? Varför går DNS-steget snabbare andra gången?

Terminal window
curl -s -o /dev/null -w 'dns: %{time_namelookup} tcp: %{time_connect} tls: %{time_appconnect} svar: %{time_starttransfer}\n' https://coursepress.lnu.se/

Tiderna är ackumulerade sekunder från start. tcp är alltså när anslutningen var klar, tls när krypteringen var klar och svar när den första byten av svaret kom.

Andra gången är DNS-svaret cachat, så uppslaget tar någon hundradels sekund i stället för kanske en halv. Varje steg kräver minst en resa fram och tillbaka, så med hög latens blir hela kedjan långsam, även om servern svarar direkt.

Tidsåtgång: Ungefär 10 minuter.

Skapa filen dns-lookup.mjs med koden nedan och kör den med node dns-lookup.mjs. Pröva även med andra namn som argument, till exempel node dns-lookup.mjs www.lnu.se. Vad är skillnaden mellan lookup och resolve4? Hur länge får svaret cachas?

import { lookup, resolve4, resolveCname } from 'node:dns/promises'
const host = process.argv[2] ?? 'coursepress.lnu.se'
console.log('lookup:', await lookup(host))
console.log('resolve4:', await resolve4(host, { ttl: true }))
console.log('CNAME:', await resolveCname(host).catch(() => []))

lookup frågar operativsystemet, precis som webbläsaren gör, och läser därför också hosts-filen. Det är lookup som används när din Node-app ansluter till en databas eller ett API. resolve4 frågar en DNS-server direkt.

ttl anger hur många sekunder svaret får cachas. Ett kort TTL gör att en ändring slår igenom snabbt, men ger fler frågor.

Tidsåtgång: Ungefär 10 minuter.

Skapa filen listen.mjs med koden nedan och starta den med node listen.mjs. Kontrollera i en annan terminal att något lyssnar på port 3000. Starta sedan samma program i en tredje terminal. Vad händer?

import { createServer } from 'node:http'
createServer((req, res) => res.end('Hej!\n'))
.listen(3000, '127.0.0.1', () => console.log(`Lyssnar på port 3000, process ${process.pid}`))
Terminal window
netstat -an | grep 3000
# TCP 127.0.0.1:3000 0.0.0.0:0 LISTENING

På Linux, där netstat ofta saknas, skriver du ss -ltn | grep 3000.

Det andra programmet avslutas med felet EADDRINUSE: adressen används redan. Du kommer att se felet många gånger, oftast när en tidigare körning av din app fortfarande är igång i en annan terminal. Då avslutar du den, eller startar appen på en annan port.

Tidsåtgång: Ungefär 10 minuter.

Låt programmet från övning 4 vara igång och anslut till det med curl http://127.0.0.1:3000. Ta reda på din dators IP-adress i nätverket och pröva curl http://<din-ip>:3000. Varför fungerar det ena men inte det andra? Vad behöver ändras för att en kamrat i samma nätverk ska kunna nå programmet, och varför skulle hen ändå inte kunna nå det hemifrån?

Terminal window
curl http://127.0.0.1:3000
# Hej!
ipconfig # macOS: ifconfig, Linux: ip addr
curl http://<din-ip>:3000
# curl: (7) Failed to connect ... Could not connect to server

Programmet lyssnar bara på 127.0.0.1, så det nås bara via loopback. Ändrar du till 0.0.0.0 lyssnar det på alla nätverkskort, och en kamrat i samma nätverk kan nå det om brandväggen släpper igenom trafiken. Hemifrån når hen det ändå inte, eftersom din adress är privat och routern inte släpper in trafik utifrån. Det är en av anledningarna till att du senare i kursen får en egen server med en publik adress.

Kursens inspelningar om nätverk, TCP/IP och DNS från 2021 finns kvar i tidigare kursomgångar.

CCBY