This shows you the differences between two versions of the page.
pc:laboratoare:02 [2022/03/07 01:46] vlad_andrei.badoiu [Exercitii] |
pc:laboratoare:02 [2022/03/23 16:43] (current) vlad_andrei.badoiu [Exercitii] |
||
---|---|---|---|
Line 38: | Line 38: | ||
Ne interesează sa definim următoarele metrici: | Ne interesează sa definim următoarele metrici: | ||
* **Bandwidth** - se măsoară în biți / secunda și reprezinta cantitatea de informație care poate fi transmisa într-o unitate de timp pe legătura de date | * **Bandwidth** - se măsoară în biți / secunda și reprezinta cantitatea de informație care poate fi transmisa într-o unitate de timp pe legătura de date | ||
- | * **Latency** - se măsoară în secunde și reprezinta timpul pe care îl ia unor date trimise printr-un mediu să ajungă la destinație | + | * **Latency** - se măsoară în secunde și reprezinta timpul care le ia unor date trimise printr-un mediu să ajungă la destinație |
- | * **Round Time Trip (RTT) ** - reprezinta timpul scurs din momentul în care un cadru este trimis pana în momentul în care este primită confirmarea. | + | * **Round Trip Time (RTT) ** - reprezinta timpul scurs din momentul în care un cadru este trimis pana în momentul în care este primită confirmarea. |
<note> | <note> | ||
Line 66: | Line 66: | ||
{ | { | ||
/* Am primit începutul de frame? */ | /* Am primit începutul de frame? */ | ||
- | if (!((recv_byte() == DLE) && (recv_byte() == STX))) | + | char c1, c2; |
- | return -1; | + | |
| | ||
- | for (int i = 0; i < max_byte; i++) { | + | c1 = recv_byte(); |
+ | c2 = recv_byte(); | ||
+ | |||
+ | while((c1 != DLE) && (c2 != STX)) { | ||
+ | c1 = c2; | ||
+ | c2 = recv_byte(); | ||
+ | } | ||
+ | |||
+ | for (int i = 0; i < max_size; i++) { | ||
char byte = recv_byte(); | char byte = recv_byte(); | ||
| | ||
Line 93: | Line 100: | ||
void send_frame(char *frame, int frame_size) | void send_frame(char *frame, int frame_size) | ||
{ | { | ||
+ | /* Trimite delimitator */ | ||
send_byte(DLE); | send_byte(DLE); | ||
send_byte(STX); | send_byte(STX); | ||
+ | /* Trimite bytes din frame */ | ||
for (int i = 0; i < frame_size; i++) { | for (int i = 0; i < frame_size; i++) { | ||
- | if (frame[1] == DLE) | + | /* Facem escape la escape */ |
+ | if (frame[i] == DLE) | ||
send_byte(DLE); | send_byte(DLE); | ||
| | ||
Line 103: | Line 113: | ||
} | } | ||
+ | /* Trimite delimitator final */ | ||
send_byte(DLE); | send_byte(DLE); | ||
send_byte(ETX); | send_byte(ETX); | ||
Line 121: | Line 132: | ||
* Mesagerie pe baza de porumbei. În trecut, porumbeii erau folosiți pentru a transporta mesaje intre doua locații. Presupunem că vrem să trimitem un USB de 16 GB din București pana la Cluj (400 km). Calculați bandwidth și latency pentru un porumbel care zboară cu 80 km/h | * Mesagerie pe baza de porumbei. În trecut, porumbeii erau folosiți pentru a transporta mesaje intre doua locații. Presupunem că vrem să trimitem un USB de 16 GB din București pana la Cluj (400 km). Calculați bandwidth și latency pentru un porumbel care zboară cu 80 km/h | ||
* [[https://en.wikipedia.org/wiki/Pneumatic_tube|Tub pneumatic]]. Introduse in secolul 19, tuburile pneumatice au fost folosite pentru a transmite mesaje urgente intre clădiri sau chiar orașe. Capsula atinge o viteză de 8 m/s în tranzit. Presupunând că trimitem un HDD de 2 TB din clădirea automaticii către rectorat(200m), calculați bandwidth-ul și latency-ul. | * [[https://en.wikipedia.org/wiki/Pneumatic_tube|Tub pneumatic]]. Introduse in secolul 19, tuburile pneumatice au fost folosite pentru a transmite mesaje urgente intre clădiri sau chiar orașe. Capsula atinge o viteză de 8 m/s în tranzit. Presupunând că trimitem un HDD de 2 TB din clădirea automaticii către rectorat(200m), calculați bandwidth-ul și latency-ul. | ||
- | 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++. **Scheletul laboratorului se găsește [[https://gitlab.cs.pub.ro/protocoale-de-comunicatie/pcom-laboratoare-public/-/tree/master/lab2|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 <code C> | + | 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 [[https://gitlab.cs.pub.ro/protocoale-de-comunicatie/pcom-laboratoare-public/-/tree/master/lab2|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 <code C> |
/* Trimite un caracter celuilalt capăt prin nivelul fizic */ | /* Trimite un caracter celuilalt capăt prin nivelul fizic */ | ||
int send_byte(char c); | int send_byte(char c); | ||
Line 129: | Line 140: | ||
<note important> | <note important> | ||
Executați scriptul ./run_experiment.sh pentru a observa un demo al funcționalitaților disponibile. Îl puteți folosi în testarea codului, acesta pornind simulatorul de data link, rulând ./recv si ./send. | Executați scriptul ./run_experiment.sh pentru a observa un demo al funcționalitaților disponibile. Îl puteți folosi în testarea codului, acesta pornind simulatorul de data link, rulând ./recv si ./send. | ||
+ | </note> | ||
+ | |||
+ | <note> | ||
+ | Daca vreti sa contribuiti la scheletul laboratoarelor, o puteti face prin intermediul unui pull request. | ||
</note> | </note> | ||
Line 134: | Line 149: | ||
struct Packet { | struct Packet { | ||
int size; /* size inainte lui payload pentru a sti dinainte dimensiunea */ | int size; /* size inainte lui payload pentru a sti dinainte dimensiunea */ | ||
- | char payload[100]; | + | char payload[30]; |
int sum; | int sum; | ||
}; </code> | }; </code> | ||
Line 144: | Line 159: | ||
+ | <note> | ||
+ | O posibila rezolvare a laboratorului se gaseste [[https://ocw.cs.pub.ro/courses/_media/pc/laboratoare/lab2_sol.zip|aici]]. | ||
+ | </note> | ||