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.
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åde | Sampling-rate | Bits/sample | Bitrate |
|---|---|---|---|
| Telefon | 8 000 samples/s | 8 | 64 kbps |
| CD-musikk | 44 100 samples/s | 16 | 1,411 Mbps |
| MP3 | 44 100 samples/s | komp. | 96–160 kbps |
| Internett-telefoni | varierer | komp. | 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:
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.
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.
| Eksempel | Bitrate | Merknad (fra kapittelutdraget) |
|---|---|---|
| Tre versjoner av samme video | 300 kbps, 1 Mbps, 3 Mbps | Brukeren velger etter tilgjengelig båndbredde (f.eks. mobil vs. høyhastighetslinje). |
| MPEG 1 / MPEG 2 (RTP-tabellen) | variabel | Nevnes 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:
| Bruker | Aktivitet | Bitrate | Bytes overført |
|---|---|---|---|
| Facebook-Frank | Bildetung surfing | 160 kbps | 80 MB |
| Martha-Music | Spotify-strømming | 128 kbps | 64 MB |
| Victor-Video | HD-film via streaming | 2 Mbps | 1 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.
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».
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 må 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.
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.
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:
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.
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
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.
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.
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
< 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.
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.
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:
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:
Playout-tidspunktet for den første pakken j i en ny snakkefase settes da til:
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.
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.
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.
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.
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.
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?
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
- Klienten kobler seg til en super peer (forbindelsen er initiert innenfra NAT der det trengs).
- Klienten søker i den distribuerte indeksen for å finne IP-adressen til den som skal ringes.
- 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?
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.
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 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:
- Samler inn 160 bytes lyddata hvert 20. millisekund (= 8000 bytes/s = 64 kbps).
- Legger til en RTP-header med payload-type, sekvensnummer og tidsstempel.
- Pakker alt inn i et UDP-segment og sender det.
- Senderen kan endre kodingstype midt i samtalen — RTP-headeren forteller mottakeren om endringen via payload-type-feltet.
RTP-headeren i detalj
| Felt | Størrelse | Funksjon |
|---|---|---|
| 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 type | Koding | Bitrate |
|---|---|---|
| 0 | PCM μ-law | 64 kbps |
| 3 | GSM | 13 kbps |
| 7 | LPC | 2,4 kbps |
| 26 | Motion JPEG | variabel |
| 31 | H.261 | variabel |
| 33 | MPEG-2 video | variabel |
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.
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?
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:
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.
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.
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.
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.
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.