Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pc:laboratoare:02 [2022/03/07 01:28]
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 141: Line 156:
 Un sir de caractere precum ''​char buffer[1024]''​ reprezintă un sir de bytes, astfel putem face operații precum ''​(struct Packet) buffer''​ sau ''​memcpy(buffer,​ &​packet,​ sizeof(struct Packet)''​. Un sir de caractere precum ''​char buffer[1024]''​ reprezintă un sir de bytes, astfel putem face operații precum ''​(struct Packet) buffer''​ sau ''​memcpy(buffer,​ &​packet,​ sizeof(struct Packet)''​.
 </​note>​ </​note>​
-4. (1p) Vrem sa masuram latency-ul pentru a transmite un frame de 100 bytes si unul de 300. Ce observam? (Puteti folosi orice metoda de masurare a timpului precum cele prezente ​in standardul POSIX, de exemplu ​[[https://stackoverflow.com/questions/​361363/​how-to-measure-time-in-milliseconds-using-ansi-c|gettimeofday]]. +4. (1p) Vrem sa masuram latency-ul pentru a transmite un frame de 100 bytes si unul de 300. In sender vom trimite un frame ce contine un timestamp, in receiver vom masura latenta(diferenta de timp intre timestamp si timpul curent). Ce observam? (Puteti folosi orice metoda de masurare a timpului precum cele prezente [[https://levelup.gitconnected.com/8-ways-to-measure-execution-time-in-c-c-48634458d0f9|articolul urmator]].
  
  
 +<​note>​
 +O posibila rezolvare a laboratorului se gaseste [[https://​ocw.cs.pub.ro/​courses/​_media/​pc/​laboratoare/​lab2_sol.zip|aici]].
 +</​note>​
  
pc/laboratoare/02.1646609337.txt.gz · Last modified: 2022/03/07 01:28 by vlad_andrei.badoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0