9. Transportskikt

Bild 1: Transportskiktet

Transportskiktet är det första skikt där det förekommer peer-to-peer kommunikation mellan två kommunicerande system. Transportskiktets viktigaste uppgift är att åstadkomma en förbindelse från ett ändsystem till ett annat. Denna förbindelse ska fungera så att överliggande skikten befrias från alla detaljer som rör datatransporten.
Transportskiktets syfte är därmed:

  • Att datasegmentera och att datarekonstruera.
  • Att förbereda dataöverföringen över nätverket.
  • Att upprätta en till en förbindelse.
  • Att följa upp varje enskild kommunikation genom att behålla aktiva alla kommunikationsströmmar.
  • Att tillhandahålla datasegmentering och styr hur segmenten sätts ihop på destinationen.

Transportskiktets protokoll beskriver tjänster för datainkapsling och dess associationer så att vid destinationen kan varje segment hanteras med rätt applikation. För att skicka dataströmmar till rätt program måste programmet identifieras med hjälp av ett unikt portnummer som specificeras i varje segments header.

Applikationer genererar data och de lägre skikten levererar data till rätt enhet. Just därför kan man säga att transportskiktet är länken mellan applikationsskiktet och lägre skikten som är ansvariga för nätverkstransmissionen. Applikationer har olika krav och därför olika protokoll i transportskiktet.

Kommunikationskontroller

Bild 2: Datasegmentering – multiplexering

Oftast kommunicerar flera applikationer med varandra samtidigt vilket kräver att enskilda dataströmmar identifieras så att de kan multiplexeras genom samma transmissionsmedia. Datasegmentering möjliggör multiplexering så att flera applikationer kan komma åt transmissionsmediet.

Fel kan uppstå och de ska identifieras och korrigeras exempelvis genom att reglera dataflöde (inte för mycket, inte för litet) eller genom att återsända felaktiga leveranser.

Dessa mekanismer möjliggörs när Transportskiktet etablerar först en session mellan kommunicerande applikationer innan data överförs. När avsändare och mottagare sammanbinds genom flera nätverk kan utövas kommunikationskontroller som kan identifiera, åtgärda fel och reglera dataflödet under samma pågående session.

Reglering av dataflödet (flödeskontroll) innebär att ett snabbt system inte överfyller ett långsammare, annars förekommer dataförlust. Denna flödeskontroll reglerar sändarens och mottagarens överföringsresurser som till exempel bandbredden och buffertminnet.

Tillförlitliga tjänster

Normalt erbjuder transportskiktet tillförlitliga tjänster till det överliggande skiktet eftersom det normala är att användarna vill föra data över nätverket på ett säker och korrekt sätt samt i rätt ordning. Tillförlitlighet innebär att data kommer fram till destinationen i ordning och utan deformationer. I princip följer tillförlitliga protokoll varje dataström under dataöverföringen så att felfria leveranser kan garanteras och därmed kvitteras, annars återsänds felaktiga leveranser.

Bild 3: Tillförlitligt eller otillförlitligt transport

För att transportskiktet ska kunna erbjuda en tillförlitlig tjänst måste transportskiktet kunna ta hänsyn till de situationer som kan uppstå i de bindande nätverken mellan avsändaren och destinationen. I vissa situationer betyder hastigheten mer än tillförlitligheten, exempelvis för audio eller video. I dessa situationer kommer eventuella fel endast att uppträda som lite knaster på linjen eller som en liten förvrängning av bilden, medan varierande överföringstider helt ödelägger uppfattningen av mottagna data.

Otillförlitliga transportprotokoll/tjänst föredras om man vill ha en enkel och snabb transport utan “overhead”, utan styrinformation än det nödvändiga. Applikationsutvecklare väljer lämplig transportprotokoll enligt applikationens krav.

TCP vs UDP

Några detaljer mellan TCP och UDP som transportprotokoll:

Bild 4: TCP header Bild 5: UDP header
  • TCP är ett förbindelseorienterat protokoll som garanterar felfria leveranser och därför kallas “tillförlitlig protokoll”
  • UDP är ett enkelt förbindelselös protokoll som är snabbare än TCP men den verifierar inte dataleveranser och därför betraktas som otillförlitlig.
  • Dataströmmarna i kommunikation med TCP kallas segment medan med UDP kallas datagram. 
  • TCP används av webbläsare, e-post, filöverföring, mm.
  • UDP används av DNS, Video Streaming, Voice over IP (VoIP), mm.
  • TCP headern uttrycks i 32-bitars ord (0 till 31), det vill säga 4 byte.
  • Varje rad är då 4 byte lång, räknar man varje rad utan att inkludera “Options” och inte heller data, blir de 5 rader. På varje rad 4 byte multiplicerat med 5 rader är lika med 20 byte. Varje TCP-segment har minst 20 bytes av styrinformation i headern.
  • UDP headern har endast 2 rader (utan att inkludera data) och då 2 x 4 = 8 bytes.

Portadressering

TCP och UDP baserade tjänster identifierar de olika kommunicerande applikationer med hjälp av deras portnummer. Portnummer genereras med 16 bitar (216 = 65536) och administreras av standardiseringsorganisationer som Internet Engineering Task Force (IETF) och Internet Assigned Numbers Authority (IANA)

De 65536 portnummer grupperas i:

  • System Ports: 0 – 1023. De 1 024 lägsta numren kallas för ”wellknown ports” och används av välkända kommunikationsprotokoll. Till exempel:
  • User Ports: 1024 – 49151 (Registered Ports). De används fritt av klientapplikationer, oftast dynamiskt. Det vill säga att applikationer tilldelas ett portnummer helt godtyckligt.
  • Dynamic/Private Ports: 49152 – 65535
Några system portnummer
ECHO FTP-DATA FTP- KONTROLL TELNET SMTP NAME

SERVER

DOMAIN

NAME

DOMAIN
NAME
SERVER
HTTP POP3 IMAP SNMP
TCP 7 20 21 23 25 42 53 80 110 143
UDP 7 42 53 161

Port-tilldelning

TCP lägger även till så kallade portnummer. Men hjälp av dessa kan flera applikationer, som körs i en och samma dator, identifieras. Destinations portnumret talar om vilken applikation (eller program eller process) som ska ta emot datapaketet. Samma server kan därför både vara webbserver (och svara på port 80) och post-server (port 25).

Bild 6: Portnummer tilldelning

Bild 6 beskriver hur tre olika applikationer genererar olika data och därmed används olika protokoll. Dataströmmar som genereras av applikationer och protokoll identifieras med specifika portnummer exempelvis e-post via POP3 och portnummer 110, HTML kodad sida adresseras med portnummer 80 och chat med portnummer 531.

Portnummer tilldelas på olika sätt beroende på meddelandets typ (request/replay).

  • Systemportnummer tilldelas av IETF
  • Användarportnummer och Privata portnummer tilldelas av IANA.
  • Normalt använder servrar systemportnummer (0 – 1023).
  • Klienter däremot använder slumpartade portnummer över 1 023.
  • IP adress kombinerat med portnummer kallas “socket” till exempel 192.168.1.20:80

Normalt flera port är alltid aktiva och lyssnar på datatrafiken. Av säkerhetsskäll bör kontrolleras vilka portar “lyssnar” på datatrafiken i onödan och kompromissar nätverkssäkerheten. Det rekommenderas att stoppa alla protokoll och tjänster som inte behövs eftersom de är en ingång till obehöriga.

Om det finns öppna port i ditt nätverk ökar risken för att kriminella hackare kan ta sig in i nätverket och leta sig fram till de enheter som använder porten. Det går inte att helt undvika öppna port i ett nätverk som stöder varierande datatrafik, men det är alltid bra att känna till så att brandväggen konfigureras rätt.

Bild 7: Netstat -an

Kommandot “netstat –an” kontrollerar och presenterar en tabell med portar som är öppna för kommunikation (135, 445, 554, 5225, 5226 och 8008 etc).

Bilden till höger visar:

  • vilka portar var aktiva när jag körde kommandot
  • adressen 0.0.0.0 innebär att datorn tar emot anrop från vilken annan adress om helst.
  • adress 127.0.0.1 innebär att programmet bara accepterar anrop från den egna maskinen.
  • observera att direkt efter IP adressen anges portnummer med kolon innan.
  • De flesta portar tillhör TCP men längre ner visas portar som adresserar UDP.

Datasegmentering

Bild 8: Datasegmentering

Ett meddelande från användaren i övre skikt är ofta för stort för att rymmas i en PDU. Om så är fallet delar transportskiktet upp meddelandet i flera segment innan det levereras vidare till nätverksskiktet.

Det mottagande transportskiktet ska kunna se på ett segment att den inte utgör ett helt meddelande utan att flera segment ska kombineras ihop i rätt ordning till ett meddelande. Styrinformation i headern hjälper till att dataströmmar sätts ihop i rätt ordning.

Frågan är nu hur stor ett segment/datagram ska vara. Det finns flera parametrar som kan ha betydelse för dataströmmars storlek. Först finns det underliggande näten genom vilken förs dataströmmar över till destinationen. Begränsningar i de mellanliggande nätverkshanterare och eventuella fel under överföringen skulle komplicera transporten av stora datamängder och öka rejält leveranstiden. Just därför kan data segmenteras i lämpliga storlekar så att de kan multiplexeras genom en och samma transmissionsmedia.

Tillförlitlig kommunikation med TCP

Tillförlitligheten i en TCP-baserad kommunikation utförs av förbindelseorienterade sessioner i vilka kan utföras diverse kommunikationskontroller. Det utförs en uppkopplingsprocess först, en process som etablerar en session där sammanbinds avsändaren och mottagaren. Efter en session har etablerats, sänder mottagaren bekräftelser till avsändaren för de segment som har tagits emot. Bild 9 illustrerar TCP header och dess fält där specificeras kommunikationskontrollerna. TCP version 4 (32 bitar) räknas från 0 till 31. Headern representeras som en tabell med flera fält per rad. Varje rad är 32 bitar uppdelade i ett antal på fälten. till exempel första raden delas upp i två fält på 16 bitar var och en. Dessa fält anger källans portnummer och destinations portnummer.

Bild 9: TCP header

Kommunikationskontroller eller säkerhetsmekanismer specificerade i TCP-headern läggs till varje segment. Nedan anges kortfattat varje fält och dess funktionalitet:

  • Source och Destination Port Number: De 4 första byten anger avsändande respektive mottagande portnummer.
  • Sequence Number: 4 byte används för sekvensnummer (drygt fyra miljarder) som vid behov återanvänds. Numret indikerar mängden av data som skickas per gång under en TCP session.
  • Acknowledge Number: Kvittensnumret kvitterar antal mottagna byte. Med andra ord kan man säga att kvittensnummer anger vilken byte som väntas närmast.
  • Header Length: Oftast förkortas HLEN, som namnet antyder, anger längden på TCP-headern som räknas i multiplar av 32 bitar (4 byte). HLEN TCP-header består av 4 bitar som ger 16 kombinationer (24 = 16, räknat från 0 till 15 ) och därför blir maximal längd på headern 60 byte (4 x 15) eller (1111=15×32=480/8). Detta fält kallas också DATA OFFSETT
    • 0000 = 0; 0001 = 1; 0010 = 2; 0011 = 3; 0100 = 4; 0101 = 5; 0110 = 6; 0111 = 7; 1000 = 8; 1001 = 9; 1010 = 10; 1011 = 11; 1100 = 12; 1101 = 13; 1110 = 14; 1111 = 15. Typiskt värde i detta fält är 5 (0101), den motsvarar 20 byte (4×5 eller 32×5=160/8).
  • Reserved: Sedan följer 3 bitar som är reserverade för framtida användning.
  • Flags: CODE bits eller flaggor (9 bitar) används för att hantera handskakning:
    • Urgent – URG
    • Acknowledgement – ACK,
    • Push – PSH
    • Reset – RST
    • Synchronization – SYN,
    • Finish – FIN
    • Reduced 
    • Echo. 
    • RST, SYN och FIN används vid upp- och ned koppling av en förbindelse.
  • Det är TCP som avgör när data ska sändas ut, därför kan TCP samla ihop data innan den skickas iväg. En ovanförliggande applikation kan dock skicka kommandot ”push” vilket meddelar TCP att data ska skickas och inte får buffras (sparas tillfälligt). Då sätts PSH flaggan till 1.
  • Window Size: Window Size används av mottagaren för att underrätta sändaren om hur många utestående byten sändaren får ha. Fönsterstorleken förhandlas i början av kommunikationen, men den kan också ändras dynamiskt under en transmission så att buffert- och flödeskontrollen kan styras bättre i transportskiktet.
  • Urgent Pointer: Urgent data överförs utan flödeskontroll, men fältet ”Urgent Pointer” brukar inte användas.
  • Options: Några av de mest kända tillvalen är specifikationen av större sekvensnummer och liknande alternativ som kan specificeras i detta fält.

En mer detaljerad bild på TCP Header när nedan

TCP-serverprocess

Serverprocesser startar när en klient initierar kommunikationen. Det kan illustreras så här:

  1. Client 1 skickar en HTTP request adresserad till port 80. Klienten själv har portnummer 49152.
  2. Client 2 skickar en SMTP request adresserad till port 25. Klienten själv har portnummer 51152
  1. Server svarar med en HTTP response adresserad till portnummer 49152.
  2. Server svarar med en HTTP response adresserad till portnummer 49152.

TCP-session initiering och terminering

TCP handskakar innan den egentliga dataöverföringen sker, tre paket utväxlas mellan klient och server och på så sätt kan vi vara säkra på att bägge parter är redo att överföra data. En TCP session etableras med hjälp av handskakning i tre steg där kommunikationen startas av klienten och är enkelriktad.

Bild 12: Handskakning – initiering

De tre stegen är:

  1. Klienten skickar ett segment som identifieras med en sekvensnummer (SEQ=100). Här synkroniseras kommunikationen så att avsändare och mottagaren håller samma tak.
  2. Servern svarar med en ACK och SYN signaler. SEQ=300 anger serverns utsända byte. ACK=101 indikerar att 100 byte har tagits emot och önskas 100 byte till.
  3. Klienten svarar med en ACK signal satt till 301 och indikerar att 300 byte har tagits emot.

För att kunna förstå handskakningen behöver vi definiera åtminstone kortfattat varje flagga. Flaggorna PSH och URG

  • SYN – synkroniserar initiering av en session
  • ACK – kvittenser av mottagna segment
  • FIN – avslutar en session
  • RST – avbryter en session på grund av något fel
Bild 13: Handskakning – avslutning

Flaggan PSH styr hur buffert-minne används av avsändare och mottagare. Det står för “push” och det sägs själv att man skyndar en överföring av data. Flaggan URG indikerar segmentets prioritet.

För att avsluta uppkopplingen används en två vägs handskakning där flagor i TCP segments header styr ned kopplingen.

  1. När klienten inte har mer data att sända skickar till server ett segment med flaggan FIN satt till ett.
  2. Servern svarar med ett ACK signal
  3. Server skickar ett segment med flaggan FIN
  4. Klienten svarar med en ACK signal.

TCP segmentering

För att det överförda meddelandet ska kunna förstås av mottagaren, monteras först alla mottagna segment ihop i den ursprungliga ordningen. Detta görs med hjälp av sekvensnummer varje segment har tilldelas för att uppnå destinationen.

Bild 14: Buffert för segment

Under en session ställs in en initial sekvensnummer (ISN). Detta ISN representerar utgångsvärde för varje överförd byte. Eftersom data överförs under sessionen, ökar sekvensnumret motsvarande med det antal byte som har levererats. Denna sekvens av databyten gör att varje segment kan identifieras och monteras i rätt ordning på destinationen. Saknade segment kan identifieras och återsändas.

Den mottagande TCP process placerar data från ett segment i en mottagningsbuffert. Segmenten kan ha tagits emot i olika ankomsttider därmed i olika sekvensordning.

Mottagna segmenten bearbetas i destinationens buffert. Segmenten placeras i rätt ordning innan de skickas till applikationsskiktet. I denna process tidsstämplas alla segment.

TCP flödeskontroll med kvittensnummer

TCP:s uppgift att dela upp dataflödet i lagom stora delar och numrera dem sekventiell. Med hjälp av dessa sekvensnummer kan mottagaren sedan meddela vilka paket som kommit fram och vilka som behöver sändas om.

Bild 15: Windowing

TCP använder kvittensnumret för att verifiera leveransen av bytes och för att välkomna nästa bitgrupp i sessionen (expectational acknowledgement). Avsändaren förväntas sända ett segment identifierat med ett visst sekvensnummer som är lika med kvittensnumret. Sekvensnummer och kvittensnummer utbyts i båda riktningarna.

TCP flödeskontroll med Fönsterstorlek eller Windowing

Förutom kvittensnumret använder TCP metoden fönsterstorlek eller Windowing som går ut på att utnyttja den effektiva bearbetnings kapacitet mottagaren har. Detta kan ställas in vid uppkopplings fas eller ändras dynamiskt under samma session. Att justera dataöverföringen under en session reducerar återsändningar.

Avsändaren dimensionerar mottagarens fönsterstorlek genom att skicka till mottagare olika stora datamängder. När avsändaren verifierar att mottagaren klarar av att ta emot den överförda datamängden inom en viss fönsterstorlek fortsätter dataöverföringen. Detta kallas oftast Windowing.

Window size specificeras i ett fält i TCP-huvudet där anges datamängden som kan överföras innan en bekräftelse tas emot. Den ursprungliga fönsterstorleken bestäms vid sessionens handskakning.

Exempel på att justera fönsterstorleken dynamiskt.

  • Avsändare och mottagare avtalar fönsterstorlek på 3000 byte.
  • 3000 byte delas upp i två dataströmmar på 1500 byte
  • första och andra dataström skickas och mottagaren kvitterar dem genom att beställa 3000 byte till.
  •  3000 byte till skickas till mottagare i två dataströmmar på 1500 byte.
  • I detta exempel en dataström kommer inte fram till mottagare
  • De två första 1500 byte ankommer till mottager och det kvitteras med ACK = 3001
  • Avsändaren uppfattar det som att den ska skicka nya 3000 byte uppdelade i två dataströmmar.
  • Den ena inte kommer fram till mottagare, men den andra tas emot av mottagaren.
  • Nu kvitterar avsändaren med samma ACK 3001.
  • Avsändaren uppfattar det som en återsändning.

Långsammare dataöverföringen

Om avsändaren vill långsammare dataöverföringen kräver denna fler kvittenser. Det gör att dataöverföringens takt sänks eftersom avsändaren måste vänta för en kvittens innan en ny överföring sker. Men mottagaren kan också skicka en kvittens på mindre antal byte än den upphandlat mängden. Då uppfattas detta som en signal på mottagarens effektiva buffertkapacitet. Avsändaren sänker då fönsterstorleken enligt mottagarens kvittens. Sedan när det inte verifieras någon dataförlust kan avsändaren öka fönsterstorlek successivt tills det uppstår dataförlust och då justeras överföringen igen.

TCP återsändning

Bild 18: Återsändning

Dataförlust förekommer oavsett hur väl utformat ett nätverk är. Ett tillförlitligt protokoll som TCP tillhandahåller säkerhetsmekanismer bl. a. kvittenser och återsändning vid dataförlust. Mottagande destinationen kvitterar endast utförda leveranser därmed icke utförda leveranser initierar en återsändning.

En kopia av överförda segment läggs i avsändarens buffert i väntan att kvittenser tas emot. Varje kopia stämplas med en timer som räknas ner tills den blir noll. Om ingen kvittens tas emot sänds kopiorna en gång till annars tas de bort från bufferten.

Diskontinuerliga kvittensen kan accepteras om funktionen “Selective Acknowledgements” stödjas. Denna typ av kvittens kan utföras efter den sista leveransen. Avsändaren läser av kvittensen och kontrollerar efter icke utförda leveranser så att de borttappade segment kan sändas om.

UDP

UDP är ett enkelt transportprotokoll som har mindre styrinformation än TCP. UDP är ett förbindelselöst protokoll och därmed saknar säkerhetsmekanismer för återsändning, flödeskontroll osv. Detta betyder inte att program som använder UDP är alltid opålitliga. Säkerhetsmekanismer kan tillhandahållas av andra protokoll.

Bild 19: UDP datagram hantering

Även om den totala mängden av UDP- trafik är ofta relativt låg finns flera populära nätverkstjänster och applikationer som använder UDP, exempelvis:

  • Domain Name System (DNS)
  • Simple Network Management Protocol (SNMP)
  • Dynamic Host Configuration Protocol (DHCP)
  • Routing Information Protocol (RIP)
  • Trivial File Transfer Protocol ( TFTP )
  • Online-spel

Eftersom UDP är förbindelselös föregås inte några uppkopplingar innan någon dataöverföring sker och därmed behöver inte vara ihopkopplade avsändare och mottagare. Program som använder UDP skickar små mängder data som kan passa i ett segment. Dock kommer vissa program att skicka större mängder data som måste segmenteras, dessa segment kallas datagram.

När flera datagram skickas till en destination, kan de ta olika vägar och komma fram i fel ordning. UDP har ingen kontroll som håller ordningen även om alla datagram får en sekvensnummer. UDP slår samman alla mottagna datagram och vidarebefordrar alla uppsamlade datagram till högre skikt i kommunikationsmodellen.

UDP server- och klientprocess

Liksom TCP-baserade applikationer tilldelas UDP-baserade serverprogram ett antal välkända eller Registrerade portnummer. När dessa program eller processer körs kommer de att acceptera data som matchar med den tilldelade portnummer. Mottagna datagram samlas upp och vidarebefordras de till rätt applikation.

  1. Client 1 skickar en DNS request adresserad till port 53. Klienten själv har portnummer 49152.
  2. Client 2 skickar en RADIUS  request adresserad till port 1812. Klienten själv har portnummer 51152
  1. Server svarar med en DNS response adresserad till portnummer 49152.
  2. Server svarar med en RADIUS response adresserad till portnummer 49152.

UDP klientprocessen väljer slumpmässigt ett portnummer från de dynamiska portnummer. Randomiserade portnummer ökar säkerheten. Annars kan inkräktaren förutse vilka portnummer använder klienten och förfalska sitt identitet.

 

TCP ochUDP funktioner

Bild 2: TCP portnummer

IP protokollet i nätverksskiktet ser till att paketen kommer fram till mottagaren, och protokollet ICMP (Internet Control Message Protocol) hjälper till om problem uppstår. IP är förbindelselöst protokoll vilket gör att data skickas till mottagaren utan att kontrollera om mottagaren är redo att ta emot data eller om den överhuvudtaget går att nå just nu. Om vi vill ha en förbindelseorienterad överföring får vi lägga till TCP (Transmission Control Protocol).

TCP handskakar innan dataöverföringen sker, tre paket utväxlas mellan klient och server så så att bägge parter är redo att överföra data. Det är TCP:s uppgift att dela upp dataflödet i lagom stora delar och numrera dem. Med hjälp av dessa sekvensnummer kan mottagaren sedan meddela vilka paket som kommit fram och vilka som behöver sändas om.

TCP lägger även till så kallade portnummer. Men hjälp av dessa kan flera applikationer i ett och samma system identifieras och skickas i omgångar genom nätverket. Portnumret talar om vilken applikation (eller program eller process) som genererar data inkapslade senare i paket. När dessa paket tas emot av mottagaren identifieras applikationen som ska levereras till.

Bild 3: UDP portnummer

Ibland behöver vi inte all denna funktionalitet. Då använder vi istället UDP (User Datagram Protocol). UDP är förbindelselöst och använder inga sekvens- eller kvittensnummer. UDP:s främsta uppgift blir bara att lägga till portnummer för att adressera rätt applikation utan vidare säkerhetsmekanismer. Flera applikationer eller tjänster föredrar snabba överföringar och då UDP är lämpligt att användas.

DNS är ett sånt exempel. Varje dator behöver DNS tjänster för att kunna surfa på internet vilket betyder att DNS hjälper till att hitta resurser utsprida i hela Internet. Resursernas namn associeras till IP adresser och dessa associationer hanteras av DNS servrar. DNS använder UDP som transport-protokoll därmed gör det inte så mycket om en DNS fråga försvinner. Datorn kommer ändå märka själv att den inte får något svar på sin DNS fråga, och när detta händer frågar datorn en gång till. Det enda som händer är att det blir en viss fördröjning i kommunikationsprocessen.

Ett annat exempel där det är vanligt att UDP används är IP-telefoni, det vill säga att man ringer samtal över datornätverket i stället för att ringa över telefonnätet. När man pratar med någon så förvandlar IP-telefonen ljudet till datapaket som skickas över nätverket till personen som man pratar med.

Människor har inga större problem att förstå vad någon säger även om det skulle försvinna några millisekunder tal här och där. Så även om ett datapaket försvinner då och då så kan vi alltså förstå vad den andra personen säger, och det gör inte så mycket mer än att det stör lite grann.