Kapittel 5 · Computer Networking

Nettverkslaget:
Kontrollplanet

Hvordan rutere i et digert nettverk blir enige om hvor pakkene dine skal — og hvordan de roper om hjelp når noe går galt.

I dette kapittelet lærer du
  • Hva kontrollplanet faktisk er
  • Forskjellen på forwarding og routing
  • Per-router vs. sentralisert kontroll
  • Grunnleggende rutingprinsipper og klassifisering
  • Hvordan ICMP fungerer under panseret
  • Hvorfor traceroute er genialt
Pensum fra kapittel 5: 5.1 Introduction, 5.2 Routing Algorithms (kun intro — ikke 5.2.1 Link-State eller 5.2.2 Distance-Vector), og 5.6 ICMP. Resten av stoffet på denne siden er utdypning og bakgrunn.
01 · Utgangspunktet

Problemet kontrollplanet løser

Før vi snakker om algoritmer og protokoller: hvorfor trenger vi i det hele tatt et "kontrollplan"?

Tenk deg at du sender en e-post fra laptoppen din i Trondheim til en venn i Tokyo. Pakken din må gjennom titalls rutere — kanskje hundre — før den kommer frem. På hver eneste ruter underveis må noen ta en beslutning: hvilken utgang skal denne pakken ut av? Det er ikke én enkelt avgjørelse. Det er tusenvis av mikro-beslutninger som må være konsistente med hverandre, ellers havner pakken i en løkke eller i en blindvei.

Kurose og Ross deler derfor nettverkslaget i to deler, og skillet er helt essensielt for å forstå resten av kapittelet:

De to planene

Dataplanet (data plane) gjør selve jobben: det flytter en pakke fra innganger på en ruter til riktig utgang. Dette skjer i nanosekunder — milliarder av ganger i sekundet på en stor ruter. Operasjonen er enkel fordi tabellen allerede ligger klar.

Kontrollplanet (control plane) bygger den tabellen. Det bestemmer hvilken utgang som er riktig for hver mulige destinasjon. Dette skjer på en mye langsommere tidsskala — sekunder til minutter — og involverer at rutere snakker med hverandre for å bli enige om nettverkets form.

Analogien som hjelper: dataplanet er som en postsorterer som leser adressen på konvolutten og legger den i riktig binge. Kontrollplanet er rutelaget som bestemte hvilken binge som skal gå hvor — det er bakromjobben som ingen kunde ser, men uten den kaster postsortereren bare ting tilfeldig.

Merk terminologien. "Forwarding" er dataplanjobben (flytt pakken). "Routing" er kontrollplanjobben (finn ruten). På norsk sier vi ofte bare "ruting" for begge — men i dette kapittelet er skillet viktig.

To måter å organisere kontrollplanet

Det finnes grovt sett to filosofier for hvordan kontrollplanet skal bygges:

1. Per-ruter kontroll (tradisjonell). Hver ruter kjører sin egen lille routing-algoritme, snakker med sine naboer, og bygger sin egen lokale forwarding-tabell. Ingen sjef. Alle er likeverdige. Dette er slik internett er bygget i dag, og det er det vi fokuserer på i dette kapittelet.

2. Logisk sentralisert kontroll (Software Defined Networking, SDN). En sentral kontroller et sted i nettverket beregner alle forwarding-tabeller og dytter dem ut til alle ruterne. Ruterne blir "dumme" — de bare gjør det kontrolleren sier. Dette er moderne, og brukes i store datasentere, men er utenfor rammen for dette kapittelet.

CONTROL PLANE Routing-algoritme "Hvor skal pakker til X sendes?" DATA PLANE Forwarding-tabell dst 10.0.1.0 → port 2 dst 10.0.2.0 → port 3 fyller inn pakke pakke INNE I EN RUTER
De to planene lever side om side inne i én og samme ruter. Kontrollplanet jobber sakte og tenksomt; dataplanet jobber lynraskt og mekanisk.
Sjekkspørsmål
En pakke ankommer en ruter, ruteren slår opp i forwarding-tabellen sin og sender pakken ut på port 3. Hvilket plan var involvert i denne handlingen?
Riktig — selve flyttingen av pakken er en dataplan-operasjon. Kontrollplanet jobbet tidligere (kanskje minutter tidligere) med å bygge tabellen, men akkurat i øyeblikket pakken ankommer, er det bare et raskt oppslag.
❋  ❋  ❋
02 · Rutingprotokoller

Hvordan rutere finner gode veier

Målet er enkelt å beskrive, men fryktelig vanskelig å løse: finn en god vei fra avsender til mottaker gjennom et nettverk du ikke har oversikt over.

En rutingprotokoll har ett hovedmål: bestemme gode ruter (paths) fra sendende verter til mottakende verter, gjennom nettverket av rutere. La oss pakke opp den setningen nøye, for hvert ord betyr noe.

En rute (eller path) er rett og slett sekvensen av rutere en pakke passerer gjennom, fra startverten til destinasjonen. Hvis du sender en pakke fra laptoppen din og den går gjennom rutere R1 → R4 → R7 → R9 før den når målet, så er det ruten.

Men hva betyr "god"? Det kommer an på hva du optimerer for. Vanlige tolkninger er lavest kostnad (kanskje målt i antall hopp, kanskje i båndbredde, kanskje i pengeleieavtaler mellom ISP-er), raskest (minst forsinkelse), eller minst overbelastet (unngå lenker der det står i kø). Hver ruterprotokoll gjør sine egne valg om hva "god" betyr — og det er en del av grunnen til at ruting regnes som en av de klassiske "topp 10"-utfordringene innen nettverk.

Ruting er vanskelig fordi nettverket ikke står stille. Lenker går ned, kommer opp igjen, blir overbelastet, får ny kapasitet. Rutere kommer og går. En god algoritme må håndtere endringer uten at alt stopper opp mens den tenker.

To akser for klassifisering

Rutingalgoritmer kan klassifiseres langs to uavhengige akser. Forstår du disse to, forstår du grunnstrukturen til alt vi snakker om videre.

Akse 1 — Global eller desentralisert informasjon?

Global betyr at alle rutere på en eller annen måte kjenner hele nettverkets topologi: hvilke rutere finnes, hvilke lenker de har mellom seg, og hva kostnaden på hver lenke er. Med full kunnskap kan hver ruter uavhengig beregne den beste stien til alle destinasjoner. Dette er ideen bak link-state-algoritmer.

Desentralisert betyr at ingen har hele bildet. Hver ruter kjenner bare kostnaden til sine direkte naboer i starten. Så snakker rutere med naboene sine, utveksler det de vet, og gradvis blir alle enige om de beste stiene gjennom en iterativ prosess. Dette er ideen bak distance-vector-algoritmer.

Akse 2 — Statisk eller dynamisk?

Statiske ruter endres sjelden (kanskje når en nettverksadministrator manuelt konfigurerer noe). Dynamiske ruter oppdateres fortløpende — enten med jevne mellomrom eller som respons på at en lenke endrer kostnad eller forsvinner. Moderne nettverk bruker nesten alltid dynamiske algoritmer, fordi internett endrer seg for ofte til å holde tritt manuelt.

Utdypning — utenfor pensum

Det som følger om link-state og distance-vector er ikke pensum (5.2.1 og 5.2.2 er eksplisitt utelatt). Det er tatt med som nyttig bakgrunn for å forstå hvordan rutingalgoritmer faktisk fungerer i praksis.

Link-state: "jeg har kartet"

Link-state-algoritmer bygger på en enkel, men sterk idé: hvis hver ruter har et komplett kart over nettverket, kan hver enkelt beregne de beste stiene helt alene, uten å måtte spørre noen. Spørsmålet blir da: hvordan skaffer man seg det kartet?

Løsningen er flooding. Hver ruter lager en liten melding — en Link-State Advertisement (LSA) — som beskriver alle lenkene den selv har og hva de koster. Så sender den LSA-en til alle sine naboer. Naboene videresender den til sine naboer. Osv. Etter kort tid har hver ruter i nettverket mottatt LSA-er fra alle andre, og har dermed kunnskap om hele topologien.

Når en ruter har dette komplette kartet, kjører den en kortest-sti-algoritme (typisk Dijkstras algoritme) lokalt for å finne den beste stien til hver mulige destinasjon. Resultatet fylles inn i forwarding-tabellen, og dataplanet er klart til å flytte pakker.

Fordeler med link-state

Rask konvergens: Når noe endrer seg (en lenke går ned), sprer den nye informasjonen seg raskt gjennom hele nettverket, og alle rutere kan raskt oppdatere seg. God skalering: Håndterer store, komplekse nettverk godt. Tilpasningsevne: Egner seg for nettverk som endrer seg ofte.

Distance-vector: "jeg stoler på naboene mine"

Distance-vector-algoritmer tar en helt annen tilnærming. I stedet for at alle skal ha hele kartet, har hver ruter bare en distansevektor — en tabell som sier "til destinasjon X, er min beste avstand Y, og jeg sender pakken ut via nabo Z". Ruteren får ikke noe globalt overblikk; den får bare sin egen lille liste.

Slik fungerer det i praksis:

Steg 1 — Informasjonsdeling. Hver ruter sender sin egen distansevektor til sine direkte naboer. "Slik ser verden ut fra mitt ståsted," sier den.

Steg 2 — Oppdatering. Når en ruter mottar en naboene sine sin vektor, sammenligner den: "Hmm, nabo B sier den kan nå destinasjon X med kostnad 5. For å nå nabo B koster det meg 2. Så hvis jeg sender via B, kan jeg nå X med kostnad 7. Er det bedre enn det jeg hadde?" Hvis ja, oppdaterer den sin egen tabell.

Steg 3 — Konvergens. Hver gang en ruters tabell endres, sender den ut sin nye vektor til naboene, som kanskje oppdaterer sine tabeller, som kanskje sender ut nye vektorer, osv. Etter en stund stabiliserer alt seg, og alle rutere har konsistente og (forhåpentligvis) optimale tabeller.

Analogien. Link-state er som å gi alle et GPS-kart over hele byen. Distance-vector er som å spørre naboene dine: "Hvor langt er det til butikken herfra?" — og de spør sine naboer — til dere alle har blitt enige om korteste rute.

Sammenligning

Egenskap Link-State Distance-Vector
Kunnskap Hele topologien (globalt) Bare naboer (lokalt)
Beregning Dijkstra lokalt hos hver ruter Iterativ utveksling med naboer
Meldinger LSA-er flood-es til alle Vektorer sendes bare til naboer
Konvergens Rask Kan være tregere; kan ha "count to infinity"
Skalerbarhet God for store nett Best for mindre nett
Eksempel OSPF RIP
Sjekkspørsmål
Et nytt ruter-nabopar oppdager at lenken mellom dem nettopp har fått dobbelt så stor forsinkelse. Hvilken algoritme-type vil typisk reagere raskest på denne endringen?
Riktig — link-state sprer endringer via flooding, slik at alle rutere får vite det nesten umiddelbart og kan rekalkulere sine tabeller. Distance-vector kan ta lengre tid fordi informasjonen må "bølge" gjennom nettverket en nabo om gangen.
❋  ❋  ❋
03 · Internet Control Message Protocol

ICMP: når nettverket må snakke med seg selv

Rutingprotokoller bestemmer hvor pakker skal. Men hva skjer når noe går galt underveis? Det er her ICMP kommer inn.

Tenk deg at du sender en pakke til en IP-adresse som ikke finnes. Hva skjer? Noen må fortelle deg det — ellers sitter du og venter for alltid på et svar som aldri kommer. Eller: en pakke har levd for lenge i nettverket (kanskje den gikk i en løkke) og må kastes. Hvem gir beskjed til avsenderen? Svaret på begge spørsmål er ICMP — Internet Control Message Protocol.

ICMP er nettverkets signalspråk. Det brukes av verter og rutere til å utveksle nettverks-nivå-informasjon med hverandre. De to viktigste kategoriene av meldinger er:

Feilrapportering. Når noe går galt — destinasjonsvert er utilgjengelig, nettverk er utilgjengelig, port er stengt, protokoll finnes ikke — sender en ruter eller vert en ICMP-melding tilbake til avsenderen som sier hva som gikk galt.

Echo request/reply. Det er dette kommandoen ping bruker. Du sender en "er du der?"-melding, og hvis mottakeren lever, sender den et "ja!" tilbake.

Hvor passer ICMP i stakken?

Her er en detalj som ofte forvirrer: ICMP regnes som en del av nettverkslaget, men ICMP-meldinger transporteres inni IP-datagram. Så strengt tatt ligger ICMP "oppå" IP, selv om begge regnes som del av nettverkslaget. Tenk på ICMP som en liten hjelpeprotokoll som snylter på IP for å komme fram.

En ICMP-melding inneholder tre hovedfelter:

  • Type — hvilken kategori melding dette er (f.eks. 3 = "destination unreachable", 8 = "echo request")
  • Code — en underkategori som gir mer detaljer (f.eks. type 3 + code 1 = "host unreachable")
  • De første 8 bytene av IP-datagrammet som forårsaket feilen — slik at avsenderen vet hvilken pakke ICMP-meldingen gjelder

De viktigste ICMP-typene

Her er tabellen over de ICMP-meldingene du kommer til å møte oftest. Legg spesielt merke til type 0 og 8 (som ping bruker) og type 11 (som traceroute er avhengig av — mer om det snart).

TypeCodeBeskrivelse
00echo reply (svaret på ping)
30destinasjonsnett utilgjengelig
31destinasjonsvert utilgjengelig
32destinasjonsprotokoll utilgjengelig
33destinasjonsport utilgjengelig
36destinasjonsnett ukjent
37destinasjonsvert ukjent
40source quench (ikke i bruk)
80echo request (selve ping-forespørselen)
90route advertisement
100router discovery
110TTL expired (pakken levde for lenge)
120feil i IP-headeren
❋  ❋  ❋
04 · Traceroute

Traceroute: et genialt hack

Hvordan kan du finne ut hvilke rutere pakkene dine passerer gjennom på vei til en destinasjon — uten å ha tilgang til noen av dem? Svaret er et av nettverks-verdens fineste triks.

Kommandoen traceroute (og variantene tracert på Windows, mtr osv.) viser deg en liste over alle rutere en pakke passerer på vei til et mål. Det er utrolig nyttig når du feilsøker — men hvordan i all verden klarer den det? Du kan jo ikke spørre hver ruter underveis om navnet sitt. De vet ikke engang at du prøver å nå dem.

Trikset utnytter en feature som egentlig er laget for å hindre at pakker lever evig: TTL-feltet (Time To Live) i IP-headeren. TTL er et tall som dekrementeres med 1 hver gang en pakke passerer en ruter. Når TTL treffer 0, kaster ruteren pakken og sender en ICMP-melding tilbake til avsenderen: "type 11, code 0 — TTL expired". Og — dette er nøkkelen — den meldingen inneholder ruterens egen IP-adresse.

Ser du hvor dette bærer?

Traceroute-trikset

Hvis du sender en pakke med TTL = 1, vil første ruter dekrementere det til 0 og returnere en TTL-expired-melding. Du får vite første ruters adresse.

Send så en pakke med TTL = 2. Den overlever første ruter, men blir droppet av den andre, som returnerer en TTL-expired-melding. Du får vite andre ruters adresse.

Fortsett til TTL = 3, 4, 5, ... og du har hele stien.

Det er så enkelt det er, og så vakkert. Traceroute misbruker TTL-mekanismen for å tvinge hver ruter på ruten til å "avsløre" seg selv, én etter én.

Slik fungerer det steg for steg

Kildemaskinen sender ut sett av UDP-segmenter (vanligvis tre per TTL-verdi, for å kunne måle RTT-variasjon). Hver pakke i et sett har samme TTL.

  • Sett 1 har TTL = 1 → dør på ruter 1 → ruter 1 sender "TTL expired"
  • Sett 2 har TTL = 2 → dør på ruter 2 → ruter 2 sender "TTL expired"
  • Sett 3 har TTL = 3 → dør på ruter 3 → ruter 3 sender "TTL expired"
  • ... og så videre

Når ICMP-meldingen kommer tilbake, registrerer avsenderen rundtrippstiden (RTT) og ruterens IP. Den viser dem fortløpende på skjermen din — det er det du ser mens traceroute kjører.

Når stopper det?

To ting kan skje som avslutter traceroute:

1. UDP-segmentet når til slutt faktisk frem til destinasjonen (når TTL er stor nok). Nå er det ikke noen ruter som dropper den — men destinasjonen har sannsynligvis ikke en tjeneste som lytter på UDP-porten traceroute brukte (den velger bevisst en usannsynlig port). Så destinasjonen svarer med en ICMP "destination port unreachable"-melding (type 3, code 3).

2. Kilden ser denne meldingen og skjønner: aha, vi har nådd målet. Den stopper.

Det vakre er at traceroute aldri egentlig "ba om" informasjonen. Den utnyttet bare to helt normale ICMP-mekanismer — TTL expired og port unreachable — til å tvinge frem et resultat ingen hadde tenkt den skulle få. Det er hackeråndens beste uttrykk.
Animasjon: traceroute steg for steg
Steg 1 / 6
kilde R1 R2 R3 R4 mål
Start: Kilden er klar til å traceroute mot målet. Den vet ingenting om rutene mellom dem.
Sjekkspørsmål
Hvorfor sender traceroute UDP-segmenter til en usannsynlig høy portnummer på destinasjonen?
Helt riktig. Traceroute trenger et tydelig "slutt"-signal fra destinasjonen. Ved å sende til en port ingen lytter på, garanterer den at destinasjonen svarer med ICMP "port unreachable" (type 3, code 3) — noe som forteller traceroute at neste steg ikke er en mellomruter, men selve målet.
❋  ❋  ❋
05 · Avslutning

Og til slutt: nettverksadministrasjon

Rutingalgoritmer og ICMP er byggesteinene. Men noen må sette alt sammen, overvåke det, og fikse det når det går i stykker.

Ikke pensum. Nettverksadministrasjon er ikke del av pensum for kapittel 5, men gir nyttig kontekst.

Et moderne autonomt system — det tekniske ordet for "et nettverk drevet av én organisasjon", for eksempel en ISP, et universitet eller en stor bedrift — består av tusenvis av samhandlende maskinvare- og programvarekomponenter. Å holde orden på noe så komplekst krever et eget fagfelt: nettverksadministrasjon.

Den klassiske definisjonen fra Saydam & Magedanz (1996) fanger bredden godt: nettverksadministrasjon omfatter utrulling, integrering og koordinering av maskinvare, programvare og menneskelige elementer for å overvåke, teste, konfigurere, analysere, evaluere og kontrollere nettverket og dets ressurser — slik at kravene til ytelse og tjenestekvalitet møtes til en rimelig kostnad.

Oversatt til hverdagsspråk: noen må sørge for at lyset er på, at ingenting er på fyr, og at brukerne ikke ringer og klager. Andre komplekse systemer har samme type utfordring — et passasjerfly, et atomkraftverk, en stor fabrikk — alle må overvåkes og kontrolleres kontinuerlig for ikke å kollapse.

Hva tar du med deg fra dette kapittelet

Nettverkslaget har to ansikter: dataplanet som raskt flytter pakker etter ferdige tabeller, og kontrollplanet som bygger disse tabellene ved at rutere snakker sammen via rutingprotokoller. Link-state-algoritmer gir alle hele kartet; distance-vector-algoritmer lar hver ruter lære av sine naboer. Og når noe går galt, eller når vi bare vil peke på stien pakken tok, fungerer ICMP som nettverkets indre signalspråk — lavmælt og diskret, men helt avgjørende.