Kapittel 9 · Datakommunikasjon (7. utgave)

Multimedia Networking

Hvordan lyd og video reiser over et nett som egentlig bare lover «best effort» — og hva som skjer når pakkene ikke kommer frem i tide.

01 · Grunnlaget

Lyd og video som bits

Før vi kan sende multimedia over et nettverk, må vi forstå hvordan analoge signaler blir til en strøm av bits.

Lyd er trykkbølger i luften. Video er en sekvens av bilder som vises raskt nok til at øyet oppfatter bevegelse. Ingen av delene er naturlig «digitale» — de er kontinuerlige, analoge størrelser. For å sende dem over et pakkenett må vi først gjøre dem om til en strøm av bits, og det er der sampling og kvantisering kommer inn.

Audio: sampling og kvantisering

Et analogt lydsignal samples ved en fast rate — verdien av signalet måles med jevne mellomrom. Hver måling kvantiseres, altså rundes av til nærmeste tillatte verdi. Hvis vi bruker 8 bits per sample, har vi 28 = 256 mulige verdier. Resultatet er en strøm av tall som representerer lyden.

BruksområdeSampling-rateBits/sampleBitrate
Telefon8 000 samples/s864 kbps
CD-musikk44 100 samples/s161,411 Mbps
MP344 100 samples/skomp.96–160 kbps
Internett-telefonivariererkomp.5,3 kbps og opp

Legg merke til forskjellen: en CD bruker 1,4 Mbps for å representere musikk. MP3 komprimerer den ned til under 160 kbps ved å fjerne lyddetaljer som de fleste ikke hører. Internett-telefoni trenger bare 5–64 kbps fordi menneskelig tale er mye enklere enn musikk.

Video: romlig og temporal koding

En video er en sekvens av bilder (typisk 24–30 bilder per sekund), der hvert bilde er et rutenett av piksler. Rå video krever enorm båndbredde, men det finnes to typer redundans vi kan utnytte for å komprimere:

Spatial (romlig) koding

Innenfor ett enkelt bilde er det store områder med samme farge. I stedet for å sende N like piksler, sender vi bare fargen og antallet — «200 piksler lilla». Dette er idéen bak all bildekomprimering.

Temporal koding

Mellom to påfølgende bilder er forskjellen ofte minimal — kanskje bare en liten bevegelse i ett hjørne. I stedet for å sende hele det neste bildet, sender vi bare differansen fra forrige bilde. Dette er grunnen til at MPEG-video er så mye mer effektiv enn å sende hvert bilde individuelt.

CBR vs. VBR

Når vi koder video, kan vi velge mellom to strategier:

  • CBR (Constant Bit Rate): Videoen kodes med en fast bitrate hele veien. Enkelt for nettverket å planlegge for, men kan gi unødvendig lav kvalitet i stille scener eller for dårlig kvalitet i komplekse scener.
  • VBR (Variable Bit Rate): Bitraten varierer etter hvor komplekst innholdet er. En enkel scene med lite bevegelse bruker få bits, mens en actionscene bruker mange. Bedre kvalitet, men vanskeligere for nettverket å håndtere.
EksempelBitrateMerknad (fra kapittelutdraget)
Tre versjoner av samme video300 kbps, 1 Mbps, 3 MbpsBrukeren velger etter tilgjengelig båndbredde (f.eks. mobil vs. høyhastighetslinje).
MPEG 1 / MPEG 2 (RTP-tabellen)variabelNevnes som videokodingsformater i RTP-payload-tabellen.

Hvor båndbredde-tung er video, egentlig?

For å sette tallene i kontekst, sammenlign tre brukere som er aktive i 67 minutter:

BrukerAktivitetBitrateBytes overført
Facebook-FrankBildetung surfing160 kbps80 MB
Martha-MusicSpotify-strømming128 kbps64 MB
Victor-VideoHD-film via streaming2 Mbps1 GB

Video bruker altså en hel størrelsesorden mer båndbredde enn musikk eller bildetunge nettsteder. Cisco anslo at video ville utgjøre rundt 80 % av all forbruker-Internett-trafikk i 2019 — og det er denne dominansen som gjør designvalg for video-streaming så viktige for hele Internett-økosystemet.

02 · Applikasjonstyper

Tre typer multimedia-applikasjoner

Ikke all multimedia har de samme kravene til nettverket.

Multimedia over nettverk kan deles inn i tre kategorier med vidt forskjellige nettverkskrav. Det er viktig å skille dem, fordi løsningene vi trenger er forskjellige for hver.

1. Streaming av lagret innhold

  • Video/lyd er ferdig innspilt og lagret på en server
  • Klienten kan begynne avspilling før hele filen er lastet ned
  • Serveren kan sende raskere enn avspillingsraten — klienten bufrer
  • Eksempler: YouTube, Netflix, Spotify

2. Samtale (voice/video)

  • Interaktiv kommunikasjon mellom mennesker
  • Svært strenge krav til forsinkelse — over 400 ms ødelegger samtalen
  • Tåler noe pakketap, men ikke mye forsinkelse
  • Eksempler: Skype, Google Talk, WeChat, VoIP-telefoni

3. Live streaming

En mellomting: innholdet strømmes i sanntid (fotballkamp, konsert), men er ikke interaktivt. Man tåler noen sekunders forsinkelse (det er derfor du av og til hører naboen juble før du ser målet). Kravene er omtrent som for lagret streaming, men man kan ikke spole fremover.

Den røde tråden er at alle tre typene har til felles at de er tidssensitive — bits som kommer for sent er verdiløse. En e-post som bruker 2 sekunder ekstra spiller ingen rolle, men 2 sekunder ekstra forsinkelse i en telefonsamtale gjør den ubrukelig. Hele resten av dette kapittelet handler om å takle denne tidsfølsomheten over et nettverk som bare lover «best effort».

03 · Lagret video

Streaming av lagret video

Klienten spiller av den ene enden mens serveren fremdeles sender den andre — og bufferen i midten gjør det hele mulig.

Hovedutfordringen med streaming er enkel å forklare: videoen ble spilt inn med en fast rate (f.eks. 30 bilder per sekund), og den spilles av med nøyaktig samme rate for at den skal se riktig ut. Men nettverket leverer pakker med variabel forsinkelse — noen ganger litt fortere, noen ganger litt tregere. Denne variabiliteten kalles jitter, og det er den klienten må kompensere for.

Continuous playout constraint

Når avspillingen først har begynt, må den fortsette med jevn rate. Hvis pakker som trengs for neste bilde ikke har kommet frem ennå, fryser videoen — den klassiske «buffering»-animasjonen vi alle hater. Vi kan ikke sende pakkene tilbake i tid, så den eneste strategien er å vente litt med å starte avspillingen, slik at vi bygger opp en buffer først.

Klient-side buffering

Idéen er elegant: klienten har en buffer med plass til en viss mengde video. Serveren fyller bufferen med variabel rate x(t) (påvirket av nettverksforhold), mens klienten tømmer bufferen med konstant avspillingsrate r.

Server x(t) variabel Buffer (B) Q(t) r konstant Avspilling x(t) > r i snitt → bufferen tømmes aldri x(t) < r → bufferen tømmes til slutt → frysing
Klient-side buffering: variabel fylling fra nettet, konstant tømming ved avspilling. Så lenge gjennomsnittlig x(t) > r og initiell forsinkelse er stor nok, unngår vi frysing.

Avveiningen: playout-forsinkelse

Jo lengre vi venter med å starte avspillingen, jo mer buffer bygger vi opp — og jo tryggere er vi mot korte perioder der nettverket er tregt. Men brukeren vil ikke vente. Denne avveiningen er fundamental:

Dra slideren for å se hvordan initial playout-forsinkelse påvirker bufferrobusthet og brukeropplevelse. Modellen er forenklet, men illustrerer kjernen av trade-off-en.

Teksten viser til DASH (Dynamic Adaptive Streaming over HTTP): flere komprimerte versjoner av samme video, slik at klienten kan tilpasse kvalitet til båndbredde. Det grunnleggende prinsippet med klient-side buffering er det samme.

Matematisk analyse av buffring

La oss formalisere intuisjonen. La B være bufferstørrelsen (i bits), Q antall bits som må bufres før avspilling starter (Q < B), r avspillingsraten (bits/s) og x fyllraten fra serveren (bits/s). Initial playout-forsinkelse tp er da tiden det tar å bygge opp Q bits:

tp = Q / x

Hva som skjer etter tp avhenger av forholdet mellom x og r:

x < r (treg fyllrate)

  • Bufferen tømmes raskere enn den fylles og kommer aldri opp i full B
  • Etter tp begynner playout, men reserven synker fra Q mot 0 med rate (r − x)
  • Når den når 0 fryser videoen til Q bits er bygget opp på nytt
  • Avspilling alternerer mellom continuous playout og freezing

x > r (rask fyllrate)

  • Bufferen fylles raskere enn den tømmes
  • Etter tp vokser den fra Q til B med rate (x − r)
  • Tid til full buffer: tf = (B − Q) / (x − r)
  • Når B er nådd bremser TCPs flytkontroll serveren ned til r — kontinuerlig playout resten av videoen

Hovedinnsikten: kontinuerlig avspilling krever bare at gjennomsnittlig x(t) holder seg over r. Korte perioder der x < r tåles fint, så lenge bufferen ikke tømmes helt. Wang et al. (2008) viste at hvis gjennomsnittlig TCP-throughput er rundt det dobbelte av mediabitraten, gir HTTP-streaming minimal frysing og lav playout-forsinkelse — det er denne tommelfingerregelen mange streamingtjenester planlegger etter.

04 · Transportvalg

UDP vs. HTTP-streaming

To helt forskjellige strategier for å få videobits fra server til klient.

Historisk har det vært to hovedtilnærminger for å strømme video. I de tidlige dagene brukte man oftest UDP; i dag har HTTP/TCP vunnet nesten fullstendig. Det er verdt å forstå begge og hvorfor pendelen svingte.

Streaming over UDP

  • Serveren sender med en rate som passer klienten, ofte lik kodingsraten (CBR)
  • Senderen bryr seg ikke om metning i nettet — kan «oversvømme» en flaskehals
  • Kort playout-forsinkelse (2–5 sek) for å fjerne jitter
  • Feilretting på applikasjonslaget om det er tid
  • Bruker RTP for multimediapayload
  • Blokkeres ofte av brannmurer (UDP-trafikk filtreres)

Streaming over HTTP/TCP

  • Videofilen hentes med vanlig HTTP GET
  • TCP sørger for pålitelig, ordnet levering (retransmisjon)
  • Sende-raten varierer pga. TCPs metningskontroll
  • Større playout-buffer trengs for å jevne ut variasjonen
  • Passerer brannmurer uproblematisk (HTTP/TCP, ofte tillatt der UDP blokkes)
  • Brukes av YouTube, Netflix, og stort sett alt i dag
Video- fil TCP send buffer TCP / Internet TCP recv buffer Playout buffer Server Spill av Klient variabel rate x(t)
HTTP/TCP-streaming: videofilen hentes med HTTP GET, bufres i TCP-mottakerbuffer og applikasjonsbuffer før avspilling. TCPs metningskontroll gjør at sende-raten varierer.

Grunnen til at HTTP/TCP vant er pragmatisk: det passerer brannmurer, det krever ingen spesiell serverinfrastruktur (vanlig webserver holder), og TCP gir pålitelig levering slik at man slipper å håndtere tap selv. Avveiningen er høyere playout-forsinkelse, men for streaming av lagret video er det akseptabelt.

Prefetching: laste ned raskere enn man spiller av

Når video strømmes over HTTP/TCP, prøver klienten å laste ned raskere enn forbruksraten r. Hvis nettverket leverer 1,5 Mbps og videoen krever 1 Mbps, går overskuddet på 500 kbps til å bygge opp en reserve i applikasjonsbufferen. Denne prefetching-en skjer naturlig — ikke fordi applikasjonen ber om det, men fordi TCPs metningskontroll prøver å bruke all tilgjengelig båndbredde. Reserven gjør at hvis nettverket senere droppes til under r i en kort periode, kan klienten fortsatt spille av kontinuerlig fra det som er bufret.

Et fullt applikasjonsbuffer setter også en indirekte øvre grense på sende-raten: når klientbufferen er full, slutter den å lese fra TCP-mottakerbufferen, som blir full, som «back-pressurer» tilbake til serveren via TCPs flytkontroll. Slik unngår man at en uendelig hurtig server fyller klientens minne unødig.

HTTP byte-range header: seek og repositionering

Når brukeren spoler i videoen (klikker et nytt punkt på tidslinjen), sender klienten en ny HTTP GET-forespørsel med en byte-range header som spesifiserer fra hvilken byte i filen serveren skal sende. Serveren glemmer da forrige forespørsel og starter på nytt fra det angitte punktet. Det er den samme mekanismen som lar HTTP fungere som streaming i utgangspunktet — klienten «late-binder» til filen i stedet for å laste ned alt i én blokk.

Wasted bandwidth ved early termination

Anta at klienten har prefetcha B bits ved tid t0. Hvis brukeren så spoler videre eller forlater siden, kastes alt det prefetcha innholdet — båndbredden og serverressursene som ble brukt på det er bortkastet. Av denne grunn bruker mange streamingsystemer en moderat bufferstørrelse, eller styrer hvor langt klienten prefetcher med byte-range. På mobilnett, der båndbredde er en begrenset ressurs, er dette spesielt viktig.

✻ ✻ ✻
05 · VoIP

Voice-over-IP: samtale over pakkenett

Kravene til interaktiv tale er fundamentalt annerledes enn for lagret video — forsinkelse er fienden.

Når to mennesker snakker sammen, forventer de et svar innen brøkdelen av et sekund. Hjernen vår er utrolig sensitiv for forsinkelser i samtaler — allerede ved 150 millisekunder merker vi at noe er «rart», og ved 400 ms bryter samtalen sammen i en pinlig dans av «snakket du? nei, du først». Denne forsinkelsessensitiviteten gjør VoIP til et mye vanskeligere problem enn streaming av video.

VoIP-karakteristikker

En typisk VoIP-strøm ser slik ut:

  • Taleren veksler mellom snakkefaser og stillhet (talk spurts vs. silence). Pakker genereres bare under snakkefaser.
  • Under snakking: 64 kbps (= 8 Kbytes/s) med PCM-koding.
  • Lyden deles opp i 20 ms biter — hver bit er 160 bytes med lyddata.
  • Til hver bit legges en applikasjonsheader, og resultatet pakkes i et UDP- eller TCP-segment.
  • Applikasjonen sender én pakke hvert 20. millisekund under en snakkefase.

Hva ende-til-ende-forsinkelse består av

Før vi snakker om hvor mye forsinkelse VoIP tåler, er det nyttig å bryte ned hva ende-til-ende-forsinkelsen faktisk består av. En VoIP-pakkes reise fra mikrofon til høyttaler er en sum av flere komponenter:

  • Pakketiseringsforsinkelse: tiden senderen bruker på å samle nok lyddata til en pakke (typisk 20 ms i VoIP — det er en hard nedre grense satt av kodingen).
  • Transmisjonsforsinkelse: tiden å klokke pakken ut på senderens link (pakke-størrelse / link-rate).
  • Propageringsforsinkelse: tiden signalet bruker over fysiske medier — dominert av geografisk avstand. Norge til USA er ~70 ms én vei i lyset alene; lengre om det går via undersjøkabler.
  • Køforsinkelse i rutere: hovedkilden til jitter. Varierer per pakke avhengig av trafikken på hvert hopp.
  • Prosesseringsforsinkelse: tid brukt på pakkebehandling i rutere og endenoder (typisk lite, men ikke null).
  • Playout-forsinkelse hos mottaker: tiden mottakeren venter med å spille av pakken — typisk 50–200 ms for å absorbere jitter.

De første fem styres av nettverket og er stort sett utenfor applikasjonens kontroll. Den siste — playout-forsinkelsen — er den eneste applikasjonen kan justere. Hele hemmeligheten ved VoIP-design ligger i å sette den så lavt som mulig uten å miste for mange pakker.

Krav til forsinkelse

Ende-til-ende-forsinkelse

< 150 ms: bra — samtalen føles naturlig.
150–400 ms: merkbar forsinkelse, men brukbart.
> 400 ms: uakseptabelt — samtalen blir umulig.
Forsinkelsen inkluderer alt: pakketisering, nettverksforsinkelse, playout-forsinkelse hos mottaker.

Pakketap og forsinkelsestap

VoIP må takle to typer tap:

Nettverkstap

  • IP-datagram går tapt pga. metning i nettet (ruterbuffer-overflyt)
  • Den vanlige formen for tap vi kjenner fra TCP-verdenen

Forsinkelsestap

  • Pakken kommer frem, men for sent til å spilles av
  • Effektivt det samme som tap — biten er ubrukelig
  • Typisk maks tolerert forsinkelse: 400 ms

Et viktig poeng: VoIP tåler noe tap. Avhengig av lydkoding og error concealment-teknikker, kan man tolerere 1–20% pakketap uten at samtalen blir uforståelig. Det er en dramatisk forskjell fra f.eks. filoverføring, der ethvert tapt byte er katastrofalt.

Feilretting ved mottaker (error concealment)

Når en pakke er tapt eller ankommer for sent, må mottakeren produsere noe lyd for de 20 ms som mangler. I kapittelutdraget beskrives to mottakerbaserte teknikker:

  • Pakkegjentakelse (packet repetition): erstatt tapte pakker med en kopi av pakken som kom rett før tapet. Lav beregningskostnad og fungerer bra ved små tap.
  • Interpolering (interpolation): bruk lyden før og etter tapet til å konstruere en erstatningspakke. Bedre kvalitet, men tyngre beregning.

Dette er komplementært til FEC og interleaving (neste seksjon): FEC og interleaving prøver å unngå tap; disse teknikkene tar over når pakken likevel mangler. Sammen med adaptiv playout gjør det at VoIP kan tåle en del pakketap.

06 · Jitter

Jitter og playout-forsinkelse

Konstant sende-rate inn i nettet, variabel forsinkelse gjennom det — og en buffer som retter opp igjen.

VoIP-senderen sender pakker med jevne mellomrom (hver 20. ms under en snakkefase). Men nettverket leverer dem med variabel forsinkelse — akkurat som med video-streaming. Denne variasjonen i forsinkelse er jitter, og den må kompenseres av mottakeren. Løsningen er, igjen, en buffer — men nå handler avveiningen om millisekunder, ikke sekunder.

Fast playout-forsinkelse

Den enkleste strategien: mottakeren bestemmer seg for en fast forsinkelse q, og spiller av hver lydbit nøyaktig q millisekunder etter at den ble generert av senderen.

  • Hvis en lydbit har tidsstempel t, spilles den av ved tid t + q.
  • Hvis biten ankommer etter t + q → den er tapt (for sen).
  • Stor q: færre pakker «for sene» → lavere tap, men lengre forsinkelse i samtalen.
  • Liten q: bedre interaktivitet, men flere pakker rekker ikke frem i tide.
tid Generert Mottatt Playout p Playout p' tapt! r p p'
To playout-skjemaer: p (lang forsinkelse, ingen tap) og p' (kort forsinkelse, men siste pakke ble «for sen» og er tapt). Trade-off mellom forsinkelse og tap.

Adaptiv playout-forsinkelse

I stedet for å velge en fast q kan vi gjøre den adaptiv: vi estimerer nettverksforsinkelsen fortløpende og justerer playout-forsinkelsen ved starten av hver ny snakkefase. Stille perioder komprimeres eller forlenges litt for å ta igjen endringen — lytteren merker ikke dette.

Estimeringen bruker glidende gjennomsnitt av observerte forsinkelser (utdraget bruker en liten vekt α på nyeste måling), på samme måte som når TCP estimerer rundturtid i kapittel 3:

di = (1 - α) · di-1 + α · (ri - ti)

Her er di det estimerte nettverksforsinkelsen etter den i-te pakken, α er en liten konstant (typisk 0,1), ri er tidspunktet pakken ble mottatt, og ti er tidsstempelet (når den ble sendt). Uttrykket (ri - ti) er den faktisk målte forsinkelsen for pakke i.

Men gjennomsnittlig forsinkelse alene er ikke nok — vi trenger også et mål på variasjonen. Vi estimerer avviket på samme måte:

vi = (1 - β) · vi-1 + β · |ri - ti - di|

Playout-tidspunktet for den første pakken j i en ny snakkefase settes da til:

playoutj = tj + dj + K · vj

Her er K en konstant (typisk 4). Strukturen ligner på hvordan TCP setter utløpstid ut fra estimert RTT og variasjon i kapittel 3: et glidende gjennomsnitt av forsinkelse pluss et ledd proporsjonalt med avvik. Alle etterfølgende pakker i samme snakkefase spilles av med faste 20 ms mellomrom fra dette utgangspunktet.

Steg 1 av 5
1 / 5

Detektere start av ny snakkefase

Mottakeren må vite når en ny snakkefase starter, for det er da playout-forsinkelsen kan justeres. I kapittelutdraget beskrives at mottakeren kan undersøke signalenergien i hver mottatt pakke: lav energi tyder på stillhet, høy energi på tale.

07 · Tapshåndtering

FEC og interleaving

Tre teknikker for å gjenopprette tapt lyd uten å vente på retransmisjon.

I VoIP har vi ikke tid til den vanlige TCP-metoden med å be om retransmisjon — en retransmisjon tar minst én RTT, og det kan fort overstige forsinkelsesbudsjettet vårt. Vi trenger teknikker som lar mottakeren gjenopprette tapte pakker uten hjelp fra senderen.

1. Enkel FEC (XOR)

For hver gruppe av n lydbiter lager senderen én ekstra redundant bit ved å XOR-e alle de n originale sammen. Senderen sender altså n+1 pakker i stedet for n, noe som øker båndbredden med en faktor 1/n.

Eksempel

Med n = 4 sender vi 5 pakker per gruppe. Hvis én av de 5 pakkene går tapt, kan mottakeren rekonstruere den fra de 4 andre (XOR er reversibel). Hvis to eller flere går tapt, gir ikke denne metoden nok informasjon. Prisen: 25% ekstra båndbredde og økt playout-forsinkelse (vi må vente på hele gruppen).

2. Piggyback med lavkvalitetsstrøm

En mer elegant variant: senderen legger ved en lavoppløselig kopi av en tidligere lydbit i hver pakke. For eksempel kan den nominelle strømmen bruke PCM med 64 kbps, mens den redundante strømmen bruker GSM med 13 kbps.

Pkt 1: chunk 1 64 kbps PCM Pkt 2: chunk 2 64 kbps PCM + chunk 1 @ 13 kbps Pkt 3: chunk 3 64 kbps PCM + chunk 2 @ 13 kbps Pkt 4: chunk 4 64 kbps PCM + chunk 3 @ 13 kbps Pkt 3 tapt → chunk 2 gjenopprettes fra pkt 4 (lavere kvalitet, men hørbart)
Piggyback FEC: hver pakke bærer en lav-kvalitets kopi av forrige chunk. Ikke-sammenhengende tap kan skjules med litt lavere lydkvalitet.

Hvis pakke 3 går tapt, mister vi chunk 3 i full kvalitet, men chunk 2 kan gjenopprettes fra den lave kopien i pakke 4. Resultatet er at bare sammenhengende tap gir hørbare hull. Overhead-en er beskjeden (13 kbps ekstra i dette eksempelet).

3. Interleaving

En tredje teknikk som ikke krever ekstra båndbredde i det hele tatt. Idéen: hver 20 ms lydbit deles opp i fire 5 ms enheter. Enhetene fra forskjellige biter blandes sammen i pakkene. Hvis én pakke går tapt, mister vi bare én liten 5 ms enhet fra fire forskjellige biter — i stedet for en hel sammenhengende 20 ms bit. Hvert hull er så kort at det nesten ikke høres.

Trade-off

Interleaving gir ingen redundans-overhead, men krever at mottakeren venter på nok pakker til å sette sammen de originale bitene igjen. Det betyr økt playout-forsinkelse — det koster alltid noe.

Hva er hovedfordelen med piggyback FEC (der man sender en lavkvalitetskopi av forrige lydbit sammen med nåværende) sammenlignet med enkel XOR-FEC?

08 · Skype

Skype: P2P VoIP i praksis

Et tidlig eksempel på storskala VoIP — med super peers, overlay-nettverk og NAT-traversering.

Skype var i mange år det dominerende eksempelet på VoIP over Internett. Det brukte en proprietær, kryptert protokoll som ble reverseengineered av forskere. Arkitekturen er interessant fordi den kombinerer P2P-elementer med distribuert indeksering.

Arkitekturen

  • Skype-klienter: vanlige brukere som kjører Skype-applikasjonen. Under en samtale kobler to klienter seg gjerne direkte til hverandre for selve tale-/videostrømmen.
  • Super peers: utvalgte Skype-peers med spesielle funksjoner — de hjelper til med å lokalisere andre brukere og med relay gjennom et overlay-nettverk.
  • Overlay-nettverk: super peers danner et overliggende nett seg imellom; en distribuert indeks mapper Skype-brukernavn til gjeldende IP-adresser (og portnumre).

Oppkobling av en samtale

  1. Klienten kobler seg til en super peer (forbindelsen er initiert innenfra NAT der det trengs).
  2. Klienten søker i den distribuerte indeksen for å finne IP-adressen til den som skal ringes.
  3. Vanlig toveis samtale går peer-to-peer; ved NAT-problemer brukes relay via en ikke-NATet super peer, som beskrevet nedenfor.

NAT-problemet og relay-løsningen

Det interessante problemet oppstår når begge samtalepartene sitter bak NAT. En NAT lar ikke utenforstående initiere en forbindelse inn til en enhet på innsiden — det er jo hele poenget med NAT. Så hvordan kobler to «innelåste» klienter seg til hverandre?

Alice NAT SP-A SP-B NAT Bob 1. TCP 2. SP–SP 3. TCP VoIP-data relayes via super peers
Begge parter bak NAT: Alice og Bob holder åpne forbindelser til hver sin super peer (typisk TCP for kontroll). Super peers relayer taletrafikk mellom dem når direkte peer-forbindelse ikke lar seg gjøre.

Løsningen i utdraget: når begge har NAT, velger to super peers en tredje, ikke-NATet relay peer som mellomledd. Alice og Bob initierer hver sin sesjon til relayen (fra innsiden av NAT), og relayen videresender pakker. Tale går da over to hopp via relay — tyngre enn direkte P2P, men det fungerer når direkte forbindelse blokkes.

✻ ✻ ✻
09 · RTP

RTP — Real-Time Protocol

En tynn protokoll som gir multimedia-pakker det de trenger: type-identifikasjon, sekvensnummer og tidsstempler.

RTP (RFC 3550) er protokollen som gir struktur til multimedia-pakker. Den er ikke en transportprotokoll i tradisjonell forstand — den kjører oppå UDP og gir et sett med felter som applikasjoner trenger for å håndtere sanntidsdata, men som UDP ikke tilbyr: informasjon om hva slags data pakken inneholder, i hvilken rekkefølge den hører hjemme, og nøyaktig når den ble generert.

Hvor passer RTP inn?

I kapittelutdraget 9.4 introduseres RTP (Real-Time Transport Protocol) for sanntidsmediedata, og SIP for samtale-oppsett. Pensum dekker RTP; SIP kan utelates.

RTP brukes i mange kommersielle VoIP- og videosystemer sammen med UDP. Protokollen standardiserer hvordan mediechunks innkapsles slik at ulike applikasjoner kan samhandle.

Hva RTP gir oss

RTP transporterer, men garanterer ikke

RTP gir payload-type-identifikasjon, sekvensnummerering og tidsstempling. Men det gir ingen garanti for rettidig levering, ingen garanti mot tap, og ingen garanti for rekkefølge. Det er bare et rammeverk som applikasjonen kan bruke for å gjøre sitt eget beste — for eksempel adaptiv playout-forsinkelse basert på tidsstemplene.

RTP oppå UDP

RTP-biblioteker tilbyr et transportgrensesnitt som utvider UDP med de feltene multimedia trenger. En RTP-pakke består av en RTP-header etterfulgt av lyddata (payload), og hele denne pakken pakkes inn i et UDP-segment. Fra nettverkets synspunkt er det bare en vanlig UDP-pakke — rutere underveis ser aldri RTP-headeren og behandler pakken med vanlig best-effort.

Eksempel: 64 kbps PCM over RTP

En VoIP-applikasjon som sender 64 kbps PCM-kodet tale over RTP gjør følgende:

  1. Samler inn 160 bytes lyddata hvert 20. millisekund (= 8000 bytes/s = 64 kbps).
  2. Legger til en RTP-header med payload-type, sekvensnummer og tidsstempel.
  3. Pakker alt inn i et UDP-segment og sender det.
  4. Senderen kan endre kodingstype midt i samtalen — RTP-headeren forteller mottakeren om endringen via payload-type-feltet.

RTP-headeren i detalj

Payload type 7 bits Sequence number 16 bits Timestamp 32 bits SSRC 32 bits Øvrige små felter i RTP-headeren (bl.a. versjon) Payload (lyddata / videodata)
RTP-headeren: fire hovedfelter gir mottakeren alt den trenger for å plassere pakkene riktig i tid og oppdage tap.
FeltStørrelseFunksjon
Payload type 7 bits Identifiserer hvilken koding som brukes. Senderen kan bytte koding midt i strømmen (f.eks. fra PCM til GSM), og mottakeren ser endringen her.
Sequence number 16 bits Øker med 1 for hver sendt RTP-pakke. Lar mottakeren oppdage pakketap og sette pakker i riktig rekkefølge.
Timestamp 32 bits Samplingsøyeblikket for første byte i pakken. For 8 kHz audio øker tidsstempelet med 1 per sample (125 μs), altså med 160 per 20 ms pakke. Klokken tikker videre selv under stillhetsperioder.
SSRC 32 bits Synchronization Source — en unik identifikator for denne mediestrømmen i RTP-sesjonen. Tilfeldig valgt, slik at flere strømmer kan skilles fra hverandre.
Payload typeKodingBitrate
0PCM μ-law64 kbps
3GSM13 kbps
7LPC2,4 kbps
26Motion JPEGvariabel
31H.261variabel
33MPEG-2 videovariabel

RTP og QoS

Et viktig poeng til slutt: RTP gir ingen QoS-garantier. RTP-pakker er innkapslet i vanlige UDP-segmenter, og rutere i nettet ser bare et IP-datagram med en UDP-header. De gjør ingen spesiell innsats for å levere RTP-pakker raskere eller mer pålitelig enn andre pakker. All smarthet — adaptiv playout, FEC, jitterbuffer — ligger i endepunktene, ikke i nettverket.

Interoperabilitet

En av de store fordelene med RTP er at to VoIP-applikasjoner fra forskjellige leverandører kan snakke sammen, så lenge begge bruker RTP. Payload-type-feltet og de standardiserte kodingene gjør at mottakeren vet hvordan den skal dekode dataene, uavhengig av hvilken applikasjon som sendte dem.

Hva er den maksimale ende-til-ende-forsinkelsen for at en VoIP-samtale skal føles naturlig?

Hvilken informasjon gir RTP-headeren som UDP-headeren mangler?

Hvorfor bruker streaming i dag nesten alltid HTTP/TCP i stedet for UDP?

I adaptiv playout-forsinkelse, når justeres playout-forsinkelsen?

Hva er «jitter» i konteksten av multimedia-nettverk?

Hva er forskjellen mellom CBR og VBR for videokoding?

10 · Oppsummering

Det du skal sitte igjen med

Multimedia over pakkenett handler om én fundamental spenning: innholdet krever jevn, tidssensitiv levering, mens Internett bare lover «best effort». Resten av kapittelet er en serie teknikker for å brø seg mellom disse to verdenene — i endepunktene, ikke i nettverket.

De fem nøkkelpunktene fra kapittelet:

1 — Tre typer applikasjoner, tre sett krav

Streaming av lagret video tåler sekunder med innledende forsinkelse, men krever jevn playout. Live streaming er lik, men uten spole-mulighet. VoIP/videosamtale er hardest: over 400 ms ende-til-ende-forsinkelse ødelegger samtalen fullstendig. Løsningene er forskjellige fordi kravene er forskjellige.

2 — Klient-side buffering løser jitter

Nettverket leverer pakker med variabel forsinkelse (jitter). Klienten kompenserer ved å bygge opp en buffer og vente med å starte avspillingen. Avveiningen er universal: stor buffer gir robust avspilling, liten buffer gir raskere oppstart. Bufferen tømmes bare hvis gjennomsnittlig nettverksrate x(t) faller under avspillingsraten r over tid.

3 — VoIP: adaptiv playout og tapsskjuling

For interaktiv tale er forsinkelsesbudsjettet knepent (mål: under 150 ms). Adaptiv playout-forsinkelse justerer bufferen ved starten av hver snakkefase med glidende gjennomsnitt av målt forsinkelse og avvik — samme idé som TCPs RTT-estimering i kapittel 3. Tap kan skjules med FEC (XOR eller piggyback med lavkvalitetsstrøm) eller interleaving, som sprer tap utover slik at hvert hull er kortere.

4 — HTTP/TCP vant over UDP for streaming

UDP gir lavere forsinkelse og ingen retransmisjon, men blokkeres ofte av brannmurer og krever egen serverinfrastruktur. HTTP/TCP brukes vanligvis over webkanaler som slipper gjennom brannmurer, fungerer med standard webservere, og gir pålitelig levering. Den høyere playout-bufferen som trengs for å jevne ut TCPs variable sende-rate er akseptabel for lagret video. Moderne tjenester bruker DASH på toppen av HTTP for adaptiv kvalitet.

5 — RTP gir struktur, ikke garantier

RTP kjører oppå UDP og legger til tre felter multimedia trenger men UDP mangler: payload-type (hvilken koding), sekvensnummer (tapsdeteksjon og rekkefølge) og tidsstempel (playout-timing). RTP gir ingen QoS-garantier — rutere ser bare vanlige UDP-pakker. All intelligens — adaptiv playout, FEC, interleaving, error concealment — ligger i endepunktene. Standardiseringen gir interoperabilitet mellom leverandører.

Den røde tråden: alle disse teknikkene — buffering, adaptiv playout, FEC, interleaving, error concealment, RTP — er svar på det samme grunnproblemet: et tidssensitivt medium som skal fungere over et nettverk som ikke gir noen tidsgarantier. Løsningen ligger alltid i endepunktene, aldri i nettverket.