En kort introduktion till TCP/IP-trafik

Lite förenklat fungerar TCP/IP-baserad trafik på följande sätt:

När två program på två olika datorer kommunicerar med varandra använder de sig av någon form av applikationsprotokoll, som är kommandon som de skickar. Det kan liknas vid att två personer som samtalar där den ena frågar efter någonting och den andra svarar.
Person A: - Hur mycket är klockan?
Person B: - 12:23
Det är ett kommando (en fråga) och svar på kommandot (svar på frågan).

Själva talandet motsvarar en del av nätverket. Talandet kan ske över olika media, i luften om man befinner sig nära varandra, via telefonledning etc. På samma sätt kan nätverkstrafik mellan två datorer ske över olika media, kopparkapel, fiber, radiovågor etc.


När någon vill komma komma åt en tjänst beger han sig till den adress där denna tjänst finns. Denna gatuadress motsvarar IP-adressen för datorerna. I huset kan det finnas många olika tjänster, en restaurang, en frisör, en kiosk etc. Alla har de olika ingångar från gatan, olika portar.

Bild på ett hus med flera ingångar

I nätverkssammanhang är tjänsterna istället en e-postserver, en webbserver etc. För att det ska gå att hitta servertjänsterna finns de alltid på samma portar i alla datorer. E-postservern finns bakom port 25, webbservern bakom port 80 etc.

När kontakt ska etableras mellan en klientapplikation och en server finns klienten på en adress och servern på en annan adress. Klienten kliver ut genom en port på sin adress, där porten har ett nummer mellan 1024 och 65535, och beger sig till rätt adress och rätt port för att komma åt servertjänsten. Om två klienter från samma adress vill komma åt samma server går det att skilja dem åt genom att de kommer ut genom olika portar.

Bild på två hus med två förbindelser mellan husen

Lite mer detaljerat kan det här beskrivas som:

För att upprätta kontakten mellan programmen på de två datorerna används ett protokoll, TCP eller UDP. TCP är ett förbindelseorienterat protokoll vilket fungerar på samma sätt som ett telefonsamtal där man uprättar en förbindelse när den svarande parten lyfter på luren. Denna förbindelse hålles vid liv tills dess att någon part lägger på luren, dvs bestämmer sig för att det är dags att avsluta förbindelsen. UDP är förbindelselöst vilket kan liknas vid att skicka vykort. Alla data skrivs på varsit numrerat vykort och skickas iväg till den andra parten. Den andra parten tar vykorten och sorterar dem i rätt ordning. Här upprättas ingen förbindelse.

Nästa nivå, IP, kan liknas vid en gatuadress vilken talar om vart trafiken ska skickas. Nivåerna under sköter om den mer hårdvarunära nivån, dvs själva nätverkshårdvaran.
 -------------------------                -------------------------
 !  Applikationsprogram  !                !  Applikationsprogram  !
 -------------------------                -------------------------
 ! Applikationsprotokoll !                ! Applikationsprotokoll !
 -------------------------                -------------------------
 !  TCP !  UDP !  ICMP   !                !  TCP !  UDP !  ICMP   !
 -------------------------                -------------------------
 !          IP           !                !          IP           !
 -------------------------                -------------------------
 ! Ethernet ! Token Ring !                ! Ethernet ! Token Ring !
 -------------------------                -------------------------
 !  Fysiska nätverket    !                !  Fysiska nätverket    !
 -------------------------                -------------------------
           !-------------------------------------------!
För att identifiera kontakten, förbindelsen, mellan två applikationer används dels någonting man kallar för portar och dels datorernas adress, IP-adress (se den förenklade beskrivningen ovan). Det finns ett antal standardiserade portar för olika tjänster, t.ex. port 80 för WWW-servrar. Portar med nummer under 1024 kan endast öppnas av användaren root. Vanliga användare kan endast använda portar från och med 1024 och uppåt. Därför måste servertjänster som WWW-servern köras som användaren root.

När du tittar på denna WWW-sida binder din WWW-klient, t.ex. Netscape, en lokal port över 1023 (hög port) på din dator och upprättar en förbindelse till port 80 på servern (den här datorn).

Om din dator har IP-adress 1.2.3.4 och servern IP-adress 10.11.12.13 och din dator binder en hög lokal port på din dator och upprättar en TCP-förbindelse till port 80 (WWW-servern) på serverdatorn ser det ut enligt bilden nedan.

Nätmask

En IP-adress skrivs som fyra tal där varje tal kan vara mellan 0 och 255. Binärt innebär det att 8 bitar används för varje tal, totalt 32 bitar för hela IP-adressen.
    8 bitar    8 bitar    8 bitar    8 bitar
 ---------------------------------------------
 ! xxxxxxxx ! xxxxxxxx ! xxxxxxxx ! xxxxxxxx !
 !          !          !          !          !
 ---------------------------------------------
        Hela adressen är 32 bitar lång
Ett exempel för IP-adressen 192.168.17.42 (som binärt blir 11000000 . 10101000 . 00010001 . 00101010 )
    8 bitar    8 bitar    8 bitar    8 bitar
 ---------------------------------------------
 !    192   !    168   !    17    !    42    !
 !          !          !          !          !
 ! 11000000 ! 10101000 ! 00010001 ! 00101010 !
 ---------------------------------------------
        Hela adressen är 32 bitar lång
En nätmask talar om hur stor del av IP-adressen som utgör nätadress där resten av IP-adressen används för de enskilda datorerna på det aktuella nätet.

En nätmask kan skrivas antingen som ett tal som talar om hur många bitar som utgör nätadressen eller på formen 255.255.255.0 där i det här fallet de första tre talen i IP-adressen utgör nätadressen och den sista används för datoradresser. 255.255.255.0 och 24-bitars mask är två olika skrivsätt för att beskriva samma nätmask.


     255        255        255         0
 ---------------------------------------------
 ! 11111111 ! 11111111 ! 11111111 ! xxxxxxxx !
 !          !          !          !          !
 ---------------------------------------------
          24-ettställda bitar

För IP-adressen 172.22.1.x med en 24-bitars nätmask är 172.22.1 nätets adress där de sista 8 bitarna kan användas för datorer och nätverksutrustning på nätet.

En nätmask kan vara mellan 0 och 32 bitar stor. På ett nät med t.ex. IP-adressen 172.22.17.0 och en 25-bitars nätmask (255.255.255.128) kan man använda 0 till 127 för utrustning*.


     255        255        255         128
 ---------------------------------------------
 ! 11111111 ! 11111111 ! 11111111 ! 1xxxxxxx !
 !          !          !          !          !
 ---------------------------------------------
          25-ettställda bitar

För IP-adressen 172.22.1.236 med en 30-bitars nätmask återstår två bitar för datorer. Två bitar ger totalt 4 kombinationer (00, 01, 10, 11). 4 olika adresser med start på 236 ger 236 - 239. 172.22.1.236 med nätmasken /30 eller skrivet som 255.255.255.252 ger därmed nätet 172.22.1.236 och intervallet 172.22.1.236 - 172.22.1.239. 172.22.1.236 utgör nätadressen och 172.22.1.239 broadcastadressen.

I samband med brandväggsreglerna kan du använda en IP-adress i kombination med en mask, som fungerar på ungefär samma sätt som en nätmask, för att på så sätt ange ett intervall av IP-adresser.
10.10.0.0/16 ger intervallet 10.10.0.0 till 10.10.255.255
192.165.122.0/24 ger intervallet 192.165.122.0 till 192.165.122.255
172.22.42.0/25 ger intervallet 172.22.42.0 till 172.22.42.127.
172.22.42.128/25 ger intervallet 172.22.42.128 till 172.22.42.255.
172.22.17.0/25 ger intervallet 172.22.17.0 - 172.22.17.127
172.22.17.128/25 ger intervallet 172.22.17.128 - 172.22.17.255
172.22.42.42/32 ger adressen 172.22.42.42.

(*) inte riktigt sant för den första adressen används alltid för att adressera själva nätverket och den sista adressen används för broadcast, där broadcast används för att skicka trafik till alla datorer istället för en på det aktuella nätverket. På ett nät med en 24-bitars nätmask blir .0 nätadress och .255 broadcastadress. I exemplet ovan med 172.22.17.0/25 blir 172.22.17.0 nätadress och 172.22.17.127 broadcastadress.

Paket och routing

När data skickas mellan två datorer över nätverket kan inte data skickas i en stor klump utan delas först upp i mindre delar, vilka kallas paket, där delarna skickas i tur och ordning ett efter ett över nätverket. Det är på samma sätt som om man t.ex. vill transportera en mycket stor mängd datorer från en plats till en annan. För att kunna göra det behövs det flera långtradare som kör en efter en med varsin del av lasten. Dessa långtradare kan sedan ute på vägarna varvas med andra långtradare som åker med annan last och som åker mellan två andra platser (kan även vara samma platser men med annan last). Vägarna förgrenar sig och i varje vägkorsning väljer fordonen vilken väg de ska fortsätta på.

På samma sätt fungerar det med nätverk. Paketen skickas mellan två punkter över ett nätverk och i korsningarna i nätverket avgörs vart paketet ska skickas vidare. De som sköter om vägvalet i nätverkskorsningarna kallas routrar.

Nedan visas ett lite större nätverk där 10 st nätverk är ihopkopplade med 4 nätverkskorsningar/routrar. Notera att mellan routrarna finns också nätverk över vilka paketen färdas. I bilden kommunicerar datorn 1.2.3.4, som sitter på NÄT 1, med datorn 7.8.9.10, på NÄT 7. Datorn 40.50.60.70, som sitter på NÄT 40, kommunicerar med datorn 120.110.100.42, på NÄT 120. Routrarna är i bilden markerade med gråa åttkanter.

Routrarna dirigerar trafiken så att paket skickas vidare i rätt riktning.

Ett exempel på routing (vägval)

I alla datorer finns en tabell som kallas routingtabellen. Denna tabell talar om åt vilket håll datorn ska skicka nätverkstrafiken för att den ska komma fram. Om någon på datorn vill kunna nå en annan dator på det lokala nätverket ska denna trafik skickas ut direkt ut på kabeln till vilken nätverkskortet är ansluten. För att nå ett annat nätverk, t.ex. en annan del av Internet behöver trafiken oftast skickas via en router. Denna router får sedan ansvara för att paket skickas iväg i rätt riktning (troligen via en annan router som skickar vidare till nästa router som skickar vidare till nästa router som...).

Dator A med IP-adressen 172.22.17.42 är ansluten till nätet 172.22.0.0/16 (d.v.s. 172.22.0.0 - 172.22.255.255).

För att kunna nå andra datorer på det egna nätet behöver dator A en rad i sin routingtabell som talar om att det lokala nätverket finns nåbart direkt på kabeln till vilken nätverkskortet (eth0) är ansluten. Denna rad består av nätets IP-adress 172.22.0.0 och nätmasken 255.255.0.0 och paketen ska skickas ut via eth0 och de ska inte gå via någon router för att komma fram. Exempel på hur en sådan rad kan se ut i Linux:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.22.0.0      0.0.0.0        255.255.0.0      U     0      0        0  eth0

Det lokala nätverket är anslutet till Internet via router 1 som har fått IP-adressen 172.22.1.1 på det lokala nätverket och IP-adressen 1.2.3.4 ut mot Internet. För att nå ut på Internet kan dator A ha en default gateway som säger att allt som den inte vet vart den ska skicka ska skickas till denna router (default gateway). Eftersom Internet kan nås via 172.22.1.1 ska denna vara default gateway för dator A. Raden i routingtabellen kan se ut så här i Linux:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.22.1.1      0.0.0.0         UG    0      0        0  eth0

Denna rad säger att nätet 0.0.0.0 med mask 0.0.0.0 (d.v.s. allt övrigt) ska skickas via 172.22.1.1 där 172.22.1.1 finns att nå via det lokala nätet som eth0 är ansluten till (därav Iface eth0).

Om ett till nät skapas, 10.10.2.0/24 (d.v.s. 10.10.2.0 - 10.10.2.255) och de två näten 10.10.2.0/24 och 17.22.0.0/16 kopplas ihop med en router, router 2, behöver dator A känna till hur den kan nå datorer på nätet 10.10.2.0/24. Router 2 ges IP-adressen 10.10.2.253 på ena sidan och 172.22.255.254 på andra sidan. Dator A kan nu nå 10.10.2.0/24 via 172.22.255.254. För detta behövs en extra rad i dator A:s routingtabell som säger att nätet 10.10.2.0/24 (10.10.2.0 med nätmask 255.255.255.0) är nåbart via routern som har IP-adress 172.22.255.254.

En sådan rad i routingtabell i Linux kan se ut på följande sätt:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.10.2.0       172.22.255.254  255.255.255.0   UG    0      0        0  eth0

Datorerna på nätet 10.10.2.0/24 behöver en rad för sitt lokala nätverk och en default gateway för allt övrigt (172.22.0.0/16 och Internet). Deras router mot övriga nätverk är 10.10.2.253. Dator B ska således ha 10.10.2.253 som default gateway.

För att paketförmedlingen ska fungera genom routrar måste olika IP-adressintervall finnas på de olika fysiska nätverken som ansluts till routern. Det fungerar inte (inte bra i alla fall) att sätta samma IP-nät på två olika fysiska nätverk. Undvik därmed att koppla som i bilden nedan.

Däremot går det utmärkt att ha olika IP-nät på samma fysiska nätverk. T.ex. kan man ha 172.22.0.0/16 på samma fysiska nätverk som 192.168.7.0/24.

En brandvägg fungerar oftast som en router med det extra att den begränsar vilken typ av trafik som ska få passera mellan de olika nätverken. En brandvägg kan även ha annan extra funktionalitet som t.ex. stöd för Virtuella Privata Nätverk (VPN), antivirusskydd etc.

TCP-förbindelse

För TCP upprättas en förbindelse mellan de två parterna. Det går till på följande vis.

Klienten skickar en uppkopplingsbegäran till servern, ett SYN-paket. Servern skickar en uppkopplingsbegäran till klienten, ett SYN-paket, och samtidigt en bekräftan på klientens uppkopplingsbegäran, ack (skickas i samma datapaket som SYN). I klientens första datapaket till servern skickar klienten en bekräftelse på serverns uppkopplingsbegäran, ack.

Nu är dataförbindelsen från klienten till servern och dataförbindelsen från servern till klienten upprättade.

Klienten skickar data till servern i "sin" datakanal och bekräftar samtidigt att den har tagit emot data från servern, ack. Servern skickar data till klienten i "sin" datakanal och bekräftar samtidigt att den har tagit emot data från klienten, ack.

Om den ena parten inte har några data att skicka skickar den tomma datapaket med endast bekräftelser, ack, att den tagit emot den andra partens data.

När parterna är färdiga skickar den ena av dem ett FIN-paket för att tala om att nu bryter jag förbindelsen till dig. Den andra parten svarar med en bekräftelse, ack, att den tagit emot nedkopplingsbegäran. Nu är förbindelsen i ena riktningen bruten. På samma sätt gör sedan den andra parten för att bryta även " sin" förbindelse.

Genom att vi kan se varifrån det första SYN-paketet kom från vet vi vem som startade förbindelsen (klienten ovan). Brandväggsskyddet i Linux (de gamla systemen och det nuvarande) har stöd för att skilja på det första SYN-paketet (utan ack) och de övriga paketen.



Reset

I en TCP-förbindelse kan en ena parten skicka en RESET för att bryta hela den dubbelriktade kommunikationen. I bilden nedan bryter servern all kontakt.



Tillståndsdiagram för TCP

Tillståndsdiagrammet för TCP:s alla tillstånd ser ut så här (se RFC 793):
                                           Transmission Control Protocol
                                                Functional Specification

                              +---------+ ---------\      active OPEN  
                              |  CLOSED |            \    -----------  
                              +---------+<---------\   \   create TCB  
                                |     ^              \   \  snd SYN    
                   passive OPEN |     |   CLOSE        \   \           
                   ------------ |     | ----------       \   \         
                    create TCB  |     | delete TCB         \   \       
                                V     |                      \   \     
                              +---------+            CLOSE    |    \   
                              |  LISTEN |          ---------- |     |  
                              +---------+          delete TCB |     |  
                   rcv SYN      |     |     SEND              |     |  
                  -----------   |     |    -------            |     V  
 +---------+      snd SYN,ACK  /       \   snd SYN          +---------+
 |         |<-----------------           ------------------>|         |
 |   SYN   |                    rcv SYN                     |   SYN   |
 |   RCVD  |<-----------------------------------------------|   SENT  |
 |         |                    snd ACK                     |         |
 |         |------------------           -------------------|         |
 +---------+   rcv ACK of SYN  \       /  rcv SYN,ACK       +---------+
   |           --------------   |     |   -----------                  
   |                  x         |     |     snd ACK                    
   |                            V     V                                
   |  CLOSE                   +---------+                              
   | -------                  |  ESTAB  |                              
   | snd FIN                  +---------+                              
   |                   CLOSE    |     |    rcv FIN                     
   V                  -------   |     |    -------                     
 +---------+          snd FIN  /       \   snd ACK          +---------+
 |  FIN    |<-----------------           ------------------>|  CLOSE  |
 | WAIT-1  |------------------                              |   WAIT  |
 +---------+          rcv FIN  \                            +---------+
   | rcv ACK of FIN   -------   |                            CLOSE  |  
   | --------------   snd ACK   |                           ------- |  
   V        x                   V                           snd FIN V  
 +---------+                  +---------+                   +---------+
 |FINWAIT-2|                  | CLOSING |                   | LAST-ACK|
 +---------+                  +---------+                   +---------+
   |                rcv ACK of FIN |                 rcv ACK of FIN |  
   |  rcv FIN       -------------- |    Timeout=2MSL -------------- |  
   |  -------              x       V    ------------        x       V  
    \ snd ACK                 +---------+delete TCB         +---------+
     ------------------------>|TIME WAIT|------------------>| CLOSED  |
                              +---------+                   +---------+

                      TCP Connection State Diagram
                               Figure 6.

En snyggare version av tillståndsdiagrammet finns i Stevens TCP/IP Illustrated Volume 1 och Volume 2. Detta diagram finns även på bland annat: http://gmckinney.info/resources/TCPIP_State_Transition_Diagram.pdf.

UDP

Med UDP upprättas ingen förbindelse. Parterna skickar data till den andra och hoppas på att det kommer fram. Det är upp till applikationerna som använder UDP att sköta om eventuell kontroll av att data kommit fram. UDP används främst till för att förmedla små datamängder och för att skicka dataströmmar med till exempel ljud- eller bildinformation.



ICMP

ICMP använder sig inte av portar. ICMP är på samma sätt som UDP förbindelselös. ICMP används främst för att skicka felmeddelanden, meddelanden med en not om att nätverkstrafiken ska skickas en annan väg i fortsättningen och för att se om en dator är uppe och lever. Programmet ping använder ICMP. Vid användandet av traceroute används även där ICMP. För beskrivningar av ping och traceroute se avsnittet som beskriver de vanligaste nätverkstjänsterna. Istället för portar har ICMP en typ och kod. Exempel: typ 8 kod 0, echo, och typ 0 kod 0, echo reply.



Copyright © 2010 Kjell Enblom.
This document is covered by the GNU Free Documentation License, Version 1.1