TCP och UDP

Tillförlitligheten i en TCP-baserad kommunikation utförs av förbindelseorienterade sessioner i vilka det 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 1: TCP header

Bilden 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 med 16 bitar i var och en. Dessa fält anger källans portnummer och destinationens portnummer.

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: förkortas oftast med 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.

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.

De tre stegen är:

  1. Klienten skickar ett segment som identifieras med ett 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 det önskas 100 byte till.
  3. Klienten svarar med en ACK signal satt till 301 och indikerar att 300 byte har tagits emot.
Bild 2: Handskakning – initiering

För att kunna förstå handskakningen behöver vi åtminstone kortfattat definiera 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 3: Handskakning – avslutning

Flaggan PSH styr hur buffert-minne används av avsändare och mottagare. Det står för “push” och det säger sig 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 så skickas det till servern 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 nå destinationen.

Bild 4: Buffert för segment

Under en session ställs det in ett initialt 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 är 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 5: 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 olika stora datamängder till mottagare. 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 och 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.

Bild 6: Fönsterstorlek justering
  • I detta exempel så kommer en dataström inte fram till mottagare
  • De två första 1500 byte ankommer till mottagare 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 kommer inte 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 ha 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 upphandlade 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 7: Å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 initierar avsändaren en återsändning av icke kvitterade leveranser.

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äknar tiden ner tills den blir noll. Om ingen kvittens tas emot sänds kopiorna en gång till annars tas de bort från bufferten.

Diskontinuerlig kvittensen kan accepteras om funktionen “Selective Acknowledgements” stöds. 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 saknas säkerhetsmekanismer för återsändning, flödeskontroll osv. Detta betyder inte att program som använder UDP är alltid otillförlitliga. Säkerhetsmekanismer kan tillhandahållas av andra protokoll.

Bild 8: UDP header

Ä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 ett förbindelselöst protokoll föregås inte några uppkopplingar innan någon dataöverföring sker och då behöver inte avsändare och mottagare vara ihopkopplade. 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.