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
localhostoch0.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.
Förberedelser
Section titled “Förberedelser”Ö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.
Från URL till svar
Section titled “Från URL till svar”När någon öppnar https://coursepress.lnu.se/kurser/ sker fyra steg:
- DNS. Webbläsaren tar reda på vilken IP-adress
coursepress.lnu.sehar. - TCP. Webbläsaren öppnar en anslutning till den adressen, på port 443.
- TLS. Webbläsaren och servern kommer överens om kryptering och kontrollerar serverns
certifikat. Det är det som gör
httptillhttps. - 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.
Nätverksterminologi
Section titled “Nätverksterminologi”| 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 |
TCP/IP-modellen
Section titled “TCP/IP-modellen”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.
IP-adresser
Section titled “IP-adresser”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.
Portar
Section titled “Portar”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.
TCP och UDP
Section titled “TCP och UDP”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.
Kommandon
Section titled “Kommandon”| 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. |
Övningar
Section titled “Övningar”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.
1. Från namn till adress
Section titled “1. Från namn till adress”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?
Lösningsförslag
Section titled “Lösningsförslag”nslookup coursepress.lnu.secoursepress.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.
2. Mät de fyra stegen
Section titled “2. Mät de fyra stegen”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?
curl -s -o /dev/null -w 'dns: %{time_namelookup} tcp: %{time_connect} tls: %{time_appconnect} svar: %{time_starttransfer}\n' https://coursepress.lnu.se/Lösningsförslag
Section titled “Lösningsförslag”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.
3. DNS i Node
Section titled “3. DNS i Node”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(() => []))Lösningsförslag
Section titled “Lösningsförslag”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.
4. Porten är upptagen
Section titled “4. Porten är upptagen”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}`))Lösningsförslag
Section titled “Lösningsförslag”netstat -an | grep 3000# TCP 127.0.0.1:3000 0.0.0.0:0 LISTENINGPå 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.
5. Vem kan nå din server?
Section titled “5. Vem kan nå din server?”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?
Lösningsförslag
Section titled “Lösningsförslag”curl http://127.0.0.1:3000# Hej!ipconfig # macOS: ifconfig, Linux: ip addrcurl http://<din-ip>:3000# curl: (7) Failed to connect ... Could not connect to serverProgrammet 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.
Fördjupning
Section titled “Fördjupning”- How DNS works, en tecknad berättelse om vad som händer när du slår upp ett namn
- Mess With DNS av Julia Evans, där du får en egen domän och kan pröva att skapa DNS-poster
- What is the OSI model? i Cloudflares Learning Center, som också har bra artiklar om DNS, TCP och HTTPS
- High Performance Browser Networking av Ilya Grigorik, en fri bok om hur nätverket påverkar webbens prestanda
- Computerphile, korta videor om bland annat TCP, DNS och kryptering
Kursens inspelningar om nätverk, TCP/IP och DNS från 2021 finns kvar i tidigare kursomgångar.