De citit înainte de laborator:
Lectură optională:
Materiale video opționale:
Astăzi vom lucra la nivelul legăturii de date sau datalink. Vom folosi terminologia sender/receiver pentru a ne referi la cele două dispozitive care sunt conectate. Am văzut la curs faptul că nivelul physical ne pune la dispoziție un serviciu pentru a trimite un flux de biți între două dispozitive direct conectate. Prin urmare, ne putem imagina un nivel data-link naiv, care presupune că toate perechile de dispozitive sunt conectate direct. De ex, o rețea de telefonie fără centrală. Dar, ce ne facem dacă vrem să conectăm 1000 de dispozitive(e.g. WiFi)? Dar 1000000?. O optimizarea ar fi adăugarea unor cabluri partajate de mai multe semnale. Astfel, apare conceptul de frame, o unitate de transmisie delimitată în timp pe un mediu fizic.
Cum nivelul fizic ne permite transmisia de date la nivel de bit, ne punem problem de a trimite cantități mai mari de date deodată.
Soluția acestei probleme o reprezinta bit stuffing. Mai exact, folosim 01111110
ca și delimitator intre frame-urile de biți pe care vrem sa le trimitem.
De exemplu, dacă vrem sa trimitem 0100
atunci o sa îl codam ca și 01111110|0100|01111110
.
Cum vom proceda daca vrem sa trimitem 01111110
?
Legătura de Date si Retea sunt procese independente ce comunica prin schimburi de mesaje. Procesele ce țin de nivelul Fizic și de sub-layerul Media Access Control din Data Link rulează pe hardware dedicat (de exemplu, Network Interface Card (NIC)). Restul proceselor executate de Data Link și de Network se executa pe CPU, prin sistemul de operare. În figură, putem observa o implementare.
Ne interesează sa definim următoarele metrici:
Cum in software ne este mult mai ușor sa lucram la nivel de byte decât bit, nivelul fizic ne oferă și un serviciu de trimitere de fluxuri de bytes. În mod similar cu bit stuffing, vom folosi mai multe caractere speciale pentru a ne delimita frame-ul. ASCII table
A B C ⇒ DLE STX A B C DLE ETX
A B C DLE STX D ⇒ DLE STX A B C DLE DLE STX D DLE ETX
Mai jos avem o diagrama care surprinde transmisia de date folosind framing. Vedem cum la nivelul DataLink folosind protocolul nostru simplu cu bytes de separare putem oferi un serviciu de trimitere de frames.
Următorul exemplu prezintă o posibila implementare de character stuffing folosind DEL
,STX
si ETX
. Presupunem că am cumpărat o placa de rețea (NIC) care are în firmware doua funcții send_byte
si recv_byte
.
1. (3p) Calculați bandwidth-ul și latency-ul pentru următoarele medii de transmisie:
2. (4p) Vrem sa implementam un mic protocol de nivel datalink care folosește tehnica byte stuffing pentru a trimite mesaje de tip string. Laboratorul poate fi implementat atât in C cat si C++. Mediul de transmisie este ideal, nu exista pierderi sau coruperi de mesaje. Scheletul laboratorului se găsește aici, tot acolo se găsește și un README.md cu funcționalitatea disponibila. Avem la dispoziție următorul API expus de către nivelul Physical
/* Trimite un caracter celuilalt capăt prin nivelul fizic */ int send_byte(char c); /* Primește un caracter de la celalalt capăt, dacă nu a fost nimic transmis, returnează un caracter aleator */ char recv_byte();
3. (2p) Acum ca am reușit sa trimitem primele noastre frame-uri care conțin șiruri de caractere, vrem sa extindem funcționalitatea pentru a trimite data in format binar. Vrem să trimitem următoarea structura de date.
struct Packet { int size; /* size inainte lui payload pentru a sti dinainte dimensiunea */ char payload[30]; int sum; };
char buffer[1024]
reprezintă un sir de bytes, astfel putem face operații precum (struct Packet) buffer
sau memcpy(buffer, &packet, sizeof(struct Packet)
.