Datalänklagret Datalänklagret ska: Erbjuda tjänster till det överliggande lagret (nätverkslagret) Paketera data (framing) Hantera fel i överföringen Hantera flödeskontroll
Tjänster som datalänklagret erbjuder nätverkslagret Olika typer av tjänster Obekräftad "connectionless service, skickar data utan att veta om mottagaren finns eller lyssnar, dessutom förväntar man sig ingen bekräftelse på att paket kommer fram. Används vid korta avstånd med liten risk för fel, t ex LAN (jämför med brev på posten) Bekräftad "connectionless service. Mottagaren skickar kvittens om paketet kommer fram. (jämför med rekommenderat brev) Bekräftad "connection-oriented service, etablerar först kontakt, sen skickar data. Skickar uppkopplingsbegäran Mottagaren svarar med ett klartecken att den är redo att ta emot data Data skickas Nerkopplingsbegäran skickas
Paketering av data Det finns två (tre) principer för att paketera data: Teckenorienterad överföring Ett tecken består av ett antal bitar, exempelvis 7 (ASCII-tecken) eller 8 bitar. Bitorienterad överföring Ett paket av data kan bestå av ett godtyckligt antal bitar. (Ett tredje sätt är att signalera på en särskild kanal när start och stopp ska ske, sk hårdvarumässig signalering.)
Teckenorienterad överföring Vid teckenorienterad överföring paketerar man ett antal tecken i ett datablock. För att mottagaren ska veta var ett datablock börjar och var det slutar finns det två sätt att ange längden på datablocket. 1. Ett speciellt tecken anger längden på varje datablock. 7 tecken 5 tecken 8 tecken 7 datablock 5 datablock 8 datablock 2 Speciellt tecken som anger datalängden för varje block Nackdel: Vi får synkroniseringsproblem (dvs problem att avgöra var kommande block börjar och slutar) om vi får fel i överföringen av något tecken som anger datalängden.
Teckenorienterad överföring Ett annat sätt är att ha: 2. Speciella tecken för start och stopp för ett datablock. STX datablock ETX Starttecken (Start of text) Stopptecken (End of text) Problem: Vi får problem om STX- eller ETX-tecknen ingår i datablocket. Åtgärd: Vi stoppar in specialtecken framför STX/ETX som anger att dessa tecken ingår i datablocket och inte anger start eller stopp. Det kallar vi character stuffing. datablock STX DLE ETX ETX Specialtecken som anger att ETX ingår i datablocket = stuffat tecken ETX ingår i datablocket
Bitorienterad överföring Vid bitorienterad överföring kan data bestå av ett godtyckligt antal bitar. För att mottagaren ska veta var data börjar och var de slutar kan man använda: Ett speciellt bitmönster som anger start/stopp, t ex 01111110. Problem: Bitmönstret för start/stopp kan förekomma i dataströmmen. Åtgärd: Bitstuffing. Om fler än 5 ettor i följd uppträder i datat så stoppas en 0 in. originaldata stuffad data på kanalen avstuffad data hos mottagaren
Hantering av fel i överföringen Varje kanal kan ge bitfel i överföringen. Hur man vill hantera dessa fel beror på hur stor sannolikheten för fel är och hur känslig vår applikation är för bitfel. Vi kan välja på tre olika sätt att hantera fel: Ingen felhantering (risken för bitfel kanske är så liten att vår applikation inte påverkas) Felupptäckt. Vi kan begränsa oss till att upptäcka att vi har bitfel i överföringen. Vi kan sen välja på att: Be sändaren att sända om felaktigt paket. Jämför med TCPprotokollet. (kanske inte möjligt i en realtidstillämpning) Kasta felaktiga paket. Felaktig data är ofta sämre än inget data. Jämför med UDP-protokollet. Felrättning. Man försöker rätta felaktig data. Förekommer t ex i mobiltelefonnäten där kravet på realtidstillämpningar är stort och felsannolikheten hög.
Hantering av fel i överföringen Totala antalet överförda bitar (n) = antalet databitar (m) + antalet kontrollbitar (r) Felupptäckt och felrättning kräver redundans, dvs att vi adderar kontrollbitar till vårt data (r >0) databitar kontrollbitar m r Antalet bitar som skiljer två ord åt kallas Hamming distance (d) Om r=0, så är d=1 => ickeredundant. Man kan inte ändra något utan att det ändrar betydelse, alltså: d = 1 000 001 010 011 100 101 110 111
Felupptäckande kod För att upptäcka e fel krävs d = e + 1. Det finns olika metoder att upptäcka fel, t ex: Paritetsbitar. Blockkod CRC (Cyclic Redundance Check).
Paritetsbit En väldigt enkel metod att upptäcka enkelfel (dvs då det bara är fel i enda bit i paketet) är att lägga till en paritetsbit. Mottagaren kan då räkna antalet 1 :or och avgöra om det föreligger bitfel. Det finns två olika sätt att välja paritetsbit: Jämn paritet = sändaren lägger till en extra bit så att summan av alla 1 :or blir jämnt Udda paritet = sändaren lägger till en extrabit så att summan av alla 1 :or blir udda. Med en paritetsbit (jämn paritet) får man d = 2 000 0 001 1 010 1 011 0 100 1 101 0 110 0 111 1
Blockkod Vi kan utveckla metoden med paritetsbitar genom att lägga till ytterligare kontrollbitar och på så sätt kunna upptäcka fler fel i överfört data. Vi använder oss av en matematisk funktion som bestämmer kontrollbitarna som funktion av databitarna: r = f(m) Mottagaren kan göra motsvarande operation och kan konstatera om den får samma resultat. Därigenom kan mottagaren avgöra om det finns fel i överföringen eller inte. databitar m kontrollbitar r
CRC (Cyclic Redundancy Check) CRC bygger på polynomdivision. Vi börjar med att uttrycka vårt data i polynomform: Ex) Data =101 i polynomform blir 1*X 2 + 0*X 1 + 1*X 0 =X 2 + 1 Sändare och mottagare har också kommit överens om ett gemensamt polynom som man ska använda vid divisionen. Sändaren fyller ut sitt data med CRC-bitar tills polynomdivisionen går jämnt ut (data i polynomform) + CRC Överenskommet polynom = ska gå jämnt ut Ex) Data 101 ger polynomen X 2 + 1. Överenskommet polynom =X Sändaren fyller ut sitt data med CRC-bit tills divisionen går jämnt ut. I detta fall adderar den en 0 i slutet och får (data+crc) =1010, dvs X 3 +X (data i polynomform) + CRC Överenskommet polynom X 3 +X = = X 2 +1 (vilket går jämnt ut) X Mottagaren gör samma operation och kan avgöra om data är korrekt eller inte.
Felrättande kod Vill vi också rätt felaktiga bitfel måste vi addera ytterligare kontrollbitar. För att rätta till e bitar krävs det att d = 2e + 1 Med d = 3 kan man alltså rätta ett fel, Ex) 00 kodas som 000000 01 kodas som 000111 10 kodas som 111000 11 kodas som 111111 Om vi får fel i överföringen så att 000000 tolkas som 0000001 kan vi slutas oss till att det förmodligen var 000000 som sänts. Men om det ursprungliga datat var 000000 och det som mottagaren ser är 000011 så kommer mottagaren att tolka det som 000111. Dvs vi kan bara rätta enkelfel med d=3
Flödesreglering (grundläggande datalänkprotokoll) 1. Simplex, ingen flödeskontroll, felfri kanal 2. Halv duplex, flödeskontroll, felfri kanal 3. Halv duplex, flödeskontroll, ej felfri kanal 4. Full duplex, flödeskontroll, ej felfri kanal (Sliding window)
Simplex, ingen flödeskontroll, felfri kanal Sändaren sänder data när det finns något att sända och utgår från att det kommer fram till mottagaren som inte kvitterar. S 1 2 3 4 5 D D D D D R S=Sändare R=Mottagare D=Data 1 2 3 4 5 tid
Halv duplex, flödeskontroll, felfri kanal Stop-and-wait Sändaren sänder data när det finns något att sända och väntar på bekräftelse att data kommit fram (Ack) innan den sänder nästa data. S 1 2 3 D Ack R 1 2 3 S=Sändare R=Mottagare D=Data Ack=Bekräftelse Problem: Vad händer om vi får fel i överföringen? Då stannar kommunikationen av.
Halv duplex, flödeskontroll, ej felfri kanal Sändaren sänder data när det finns något att sända och väntar på bekräftelse att data kommit fram (Ack) innan den sänder nästa data. Men eftersom det kan bli fel i överföringen finns en timeout som startar varje gång data sänds och om den löper ut indikerar det att det uppträtt fel i överföringen. Då sänder sändaren om sitt data. timeout S 1 D 1 Ack 2 D 2 fel 2 D 2 R 1 2 Problem: Hur vet mottagaren att det har blivit fel i överföringen och att sändaren sänder D 2 igen och inte D 3?
Halv duplex, flödeskontroll, ej felfri kanal Sändaren numrerar paketen löpande med 0 och 1 timeout S R D 1 (0) Ack D 2 (1) fel D 2 (1) Ack D 3 (0) Problem: Protokollen inte särskilt effektiva eftersom man måste vänta på bekräftelse innan man sänder nytt data.
Sliding window Full duplex, flödeskontroll, ej felfri kanal Kräver full duplex. Sändare och mottagaren kan sända bekräftelse och data samtidigt (piggy backing) Sändaren väntar inte på bekräftelse innan nästa data skickas. Sändaren håller reda på hur många obekräftade data som sänds och när bekräftelser kommer noteras det. Datapaketen måste dock numreras. Det finns två varianter. Med eller utan buffert. Utan buffert. Om t ex time-out:en löper ut för Data 2 så sänder sändaren om allt från och med Data 2 (se figur nästa bild) Med buffert. Om t ex time-out:en löper ut för Data 2 så sänder sändaren bara om det som mottagaren inte fått bekräftelse på, dvs bara Data 2 och fortsätter sedan skicka data från där sändaren senast sände data. (se figur nästa bild)
Sliding window Full duplex, flödeskontroll, ej felfri kanal Utan buffert Med buffert