TCP og UDP

Bilde av Thomas Jensen fra Unsplash

Bilde av Thomas Jensen fra Unsplash

Mange får sin første introduksjon til TCP og UDP når de skal gjøre endringer på brannmuren sin i forbindelse med gaming eller BitTorrents. Men det mange ikke vet er hvor utrolig viktig disse protokollene er for at internett skal fungere så bra som det gjør.

I denne artikkelen skal jeg gi en kort introduksjon til hva TCP og UDP er og hva det brukes til i datanettverk. Til slutt vil jeg forklare litt om hvordan TCP kan misbrukes til DoS (Denial of Service) angrep.

TCP

Transport Control Protocol

TCP er like viktig som IP adresser og MAC adresser for at filer og nøyaktig informasjon skal bli overført fra en datamaskin til en annen over ett nettverk.

Hvis vi tar utgangspunkt i at et bilde skal lastes ned fra en nettside er oppgaven til TCP å dele opp bildet i små biter som blir kaldt segmenter som nummereres. Hvert TCP segment blir pakket inn i en IP pakke og sendt av sted til mottakeren.

Mottakeren av IP pakkene åpner pakkene med TCP segmenter og setter de sammen i riktig rekkefølge. Grunnen til at man nummererer TCP segmentene er at selv om de blir sendt i riktig avsender fra avsender, er det ikke sikkert at alle IP pakkene tar samme vei over internett til mottaker. Derfor er det ganske sikkert at de kommer frem i en annen rekkefølge enn de ble sendt. Siden segmentene er nummerert kan de dermed lett sette sammen i riktig rekkefølge slik at bildet blir helt likt hos mottaker som det var før det ble sendt fra avsender.

TCP sørger for at alle segmentene kommer frem ved å holde oversikt over hvilke segment som har blitt mottatt. Avhengig av hvor ofte avsender og mottaker blir enig om at mottaker skal gi tilbakemelding, vil mottaker sende beskjed tilbake til avsender om hvilke segmenter som er mottatt, og hvilke segmenter som den forventer å motta i neste forsendelse. Mangler det et segment vil den helt enkelt be om å få det sendt på nytt.

Hvor ofte mottaker gir tilbake melding på hvilke segment som er mottatt og hvilke den vil ha sendt neste gange, eller hvilke segment som må bli sendt på nytt kalles ett "Window". Jo større Window, jo sjeldnere må mottaker sende tilbakemelding, og jo større overføringshastighet vil vi få. I starten når to datamaskiner kommuniserer er Window'et relativt lite, så øker man størrelsen på Window'et helt at sender eller mottaker ikke klarer å sende eller motta raskere. På grunn av dette vil man normalt se at når man starter å laste ned ett bilde vil det gå litt trengt helt i starten før det gradvis går raskere, helt til det når maksimal overføringshastighet og holder seg der helt til filen er lastet ned med mindre eller noe annet gjør at hastigheten reduseres.

UDP

User Datagram Protocol

UDP er veldig likt TCP ved at det deler informasjon opp i segmenter. Men i motsetning til TCP er det ikke noe noen connection som må etableres før sender starter å sende. Mottaker kan ikke gi tilbakemelding på hvilke segmenter som ble mottatt.

UDP brukes derfor ikke til normale filoverføringer eller av data som må være helt likt når det kommer frem som det var når det ble send. Typisk bruksområder for UDP er video streaming, voice chat og spill informasjon hvor det er selve applikasjonen som tar seg av feilhåndteringen. Med UDP vil ikke pakker som kom frem i rett rekkefølge bli brukt til noe. For streaming og andre applikasjoner som velger å bruke UDP er dette ikke så kritisk.

Fordelen med UDP fremfor TCP er at det er mindre prosessering av segmentene som kommer over nettverket, dette gjør at man kan få raskere overføring av informasjon.

Sockets

Etablering av en dialog

Som det så vidt ble nevnt i kapitelene over er TCP en såkalt connection orientert protokoll. Det vil si at før to datamaskiner kan starte å kommunisere må det etablerers en connection. I praksis vil en connection si at sender og mottaker synkroniserer seg, og er klare til å sende eller motta TCP segmenter før overføringen skjer. Etter at alle segmentene er mottatt vil connectionen avbrytes.

Man kan se på det litt som når man pratet i telefon på en formell måte. Man startet samtalen med å løfte av rører og presentere seg selv. Når samtalen er over avsluttet man med å si farvel, før man legger på røret. TCP gjør dette ned to typer handshakes. Ett SYN/ACK handshake og ett FIN/ACK handshake.

Når ett SYN/ACK handshake har blitt utført vil en connection bli etablert. Denne vil vare helt til connectionen blir avsluttet med ett FIN/ACK handshake.

Hver connection blir husket av en datamaskin som en såkalt socket. En socket er en connection som blir husket som en kombinasjonen IP adresse, port nummer og kommunikasjon protokoll.

I de aller fleste tilfeller vil dette være TCP som er kommunikasjons protokollen. En datamaskin kan ha forskjellige nettleser vindu oppe samtidig. Disse kan samtidig laster data fra samme webserver. For at rett data skal komme frem til rett nettleser vindu bruker de forskjellige porter.

For alle datamaskiner/servere er det begrenset hvor mange sockets man kan ha. Derfor er det viktig for både server og klient å avslutte en socket når en en overføring er fullført.

DoS med TCP

Slow loris angrep

En ganke enkel og irriterende måte å utføre DoS (Denial of Service) angrep på, å sprenge antall sockets som er kan etableres på en server. Dette gjøres ved å starte å etablerere en connection, men at man er veldig treg med å fullføre den.

Socketen blir etablert i minnet på serveren allerede ved første kontakt helt i starten av SYN/ACK handshaken. Så ved å be om å få opprette en connection, men aldri fullføre SYN/ACK handshaken vil serveren gå tom for ledige sockets i minnet. På den måten kan den ikke serve legitime brukere av websiden.

Det samme resultatet kan oppnås ved å være treg med å avslutte FIN/ACK handshaken, etter at en fil er overført. Men det er litt mindre diskret for en angriper, og er lettere å håndtere som forsvarer.

Denne typen DoS angrep blir kaldt for slow loris angrep, og kan være ganske slitsomme. Heldigvis er det mange brannmurer som kan fange opp denne typen angrep når de starter og stoppe de før antall sockets blir oppbrukt på serveren. En annen måte å begrense virkningen på et slik angrep på er å ha en kort time-out tid for hvor lenge serveren skal vente på tilbakemelding før den avslutter socketen.