Differences

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

Link to this comparison view

pc:laboratoare:03 [2022/03/14 14:43]
vlad_andrei.badoiu [Coduri corectoare de erori]
pc:laboratoare:03 [2022/03/23 18:33] (current)
vlad_andrei.badoiu [Exerciții]
Line 18: Line 18:
 ==== Sume de control === ==== Sume de control ===
  
-Deseori când transmitem date peste un canal este necesar să știm dacă au fost repetiționate fără eroare. De exemplu, am putea primi un frame corupt și vrem să știm dacă trebuie sa așteptăm sa fie retransmis. Ca soluție putem folosi algoritmi de checksum, aceștia primesc ca input un sir arbitrar de bytes și calculează o suma finită la output.+Deseori când transmitem date peste un canal este necesar să știm dacă au fost recepționate fără eroare. De exemplu, am putea primi un frame corupt și vrem să știm dacă trebuie sa așteptăm sa fie retransmis. Ca soluție putem folosi algoritmi de checksum, aceștia primesc ca input un sir arbitrar de bytes și calculează o suma finită la output.
  
 Ca exemplu vom lua Internet Checksum, algoritm folosit de protocoalele stivei TCP/IP pentru detectarea erorilor. Acesta descompune un sir de bytes într-un sir de words de 2 bytes. Si calculează suma negării lor pe biți. Dacă un sir este de dimensiune impară, ultimul byte este transformat într-un word prin shiftare la stânga cu 8 biți. Ca exemplu vom lua Internet Checksum, algoritm folosit de protocoalele stivei TCP/IP pentru detectarea erorilor. Acesta descompune un sir de bytes într-un sir de words de 2 bytes. Si calculează suma negării lor pe biți. Dacă un sir este de dimensiune impară, ultimul byte este transformat într-un word prin shiftare la stânga cu 8 biți.
Line 27: Line 27:
   *         ​beginning at location "​addr"​.   *         ​beginning at location "​addr"​.
   */   */
- register long sum = 0; + uint32_t ​sum = 0; 
 + /*  
 +    Move through the buffer two bytes at the time, 
 +    cast the bytes to a number and add them to the sum 
 + */
  ​while( count > 1 )  {  ​while( count > 1 )  {
      /​* ​ This is the inner loop */      /​* ​ This is the inner loop */
-         sum += * (unsigned short) addr++;+         sum += * (uint16_t *addr; 
 +         addr += 2;
          count -= 2;          count -= 2;
  }  }
Line 37: Line 41:
      /​* ​ Add left-over byte, if any */      /​* ​ Add left-over byte, if any */
  if( count > 0 )  if( count > 0 )
-         sum += * (unsigned char *) addr;+         sum += * (uint8_t ​*) addr;
  
      /​* ​ Fold 32-bit sum to 16 bits */      /​* ​ Fold 32-bit sum to 16 bits */
Line 65: Line 69:
     </​code>​     </​code>​
   * Intercalăm biții de paritate cu cei originali: p1, p2, d1, p3, d2, d3, d4   * Intercalăm biții de paritate cu cei originali: p1, p2, d1, p3, d2, d3, d4
-<note warning> 
  
-d1 ar trebui sa fie mereu cel mai nesemnificativ bit (LSB) 
- 
-</​note>​ 
 Pentru a corecta o eroare în biții transmiși, trebuie sa calculam sindromul(z),​ astfel: Pentru a corecta o eroare în biții transmiși, trebuie sa calculam sindromul(z),​ astfel:
    * Pornim de la un sir de 7 biți: r1, r2, r3, r4, r5, r6, r7    * Pornim de la un sir de 7 biți: r1, r2, r3, r4, r5, r6, r7
Line 87: Line 87:
 Pentru laboratorul acesta veți folosi scheletul oferit la adresa: [[https://​gitlab.cs.pub.ro/​protocoale-de-comunicatie/​pcom-laboratoare-public/​-/​tree/​master/​lab3|lab3]] Pentru laboratorul acesta veți folosi scheletul oferit la adresa: [[https://​gitlab.cs.pub.ro/​protocoale-de-comunicatie/​pcom-laboratoare-public/​-/​tree/​master/​lab3|lab3]]
  
-1(5p). In funcția inet_csum din schelet, implementați algoritmul Internet Checksum, asa cum este descris ​aici [[https://​datatracker.ietf.org/​doc/​html/​rfc1071#​section-4|Computing the Internet Checksum]]. Verificați ca au fost transmise corect pachetele. **In scriptul ''​run_experiment.sh''​ avem campurile CORRUPTION care manipuleaza rata de corupere a pachetelor.**+1(5p). In funcția inet_csum din schelet, implementați algoritmul Internet Checksum, asa cum a fost descris ​in laborator. Verificați ca au fost transmise corect pachetele. **In scriptul ''​run_experiment.sh''​ avem campurile CORRUPTION care manipuleaza rata de corupere a pachetelor.**
  
 2(3p). In funcția hamming_4to7 din schelet, implementați codarea Hamming, cum a fost descrisa in laborator. Ca input veti primi un byte ce are ultimii 4 biti setati la nibbleul ce trebuie codat, restul bitilor vor fi 0. La output veti returna un byte cu utlimii 7 biti setati la valoare codata a inputului. 2(3p). In funcția hamming_4to7 din schelet, implementați codarea Hamming, cum a fost descrisa in laborator. Ca input veti primi un byte ce are ultimii 4 biti setati la nibbleul ce trebuie codat, restul bitilor vor fi 0. La output veti returna un byte cu utlimii 7 biti setati la valoare codata a inputului.
Line 95: Line 95:
 </​note>​ </​note>​
  
-3(2p). In funcția hamming_7to4 din schelet, implementati decodarea Hamming, cum a fost descrisa în laborator Inputul și outputul vor fi interschimbate fata de cele de la exercițiul 1. Deocamdată nu este necesara calcularea sindromului sau corectarea erorilor.+3(2p). In funcția hamming_7to4 din schelet ​(in ''​send.c''​), implementati decodarea Hamming, cum a fost descrisa în laborator Inputul și outputul vor fi interschimbate fata de cele de la exercițiul 1. Deocamdată nu este necesara calcularea sindromului sau corectarea erorilor.
  
-4(1p). In funcția hamming_7to4 din schelet, implementați corectarea erorilor folosind sindromul. Adaugați erori la poziții aleatoare în pachete. Tratând atât cazul în care are loc o eroare pe octet, cat și mai multe. Observați daca checksum-ul încă este corect.+4(1p). In funcția hamming_7to4 din schelet ​(in ''​recv.c''​), implementați corectarea erorilor folosind sindromul. Adaugați erori la poziții aleatoare în pachete. Tratând atât cazul în care are loc o eroare pe octet, cat și mai multe. Observați daca checksum-ul încă este corect.
  
 <note warning> <note warning>
 Pentru a depana problemele va recomandam crash course-ul de [[https://​ocw.cs.pub.ro/​courses/​programare/​tutoriale/​debugging|Debugging]]. Pentru a depana problemele va recomandam crash course-ul de [[https://​ocw.cs.pub.ro/​courses/​programare/​tutoriale/​debugging|Debugging]].
 +</​note>​
 +
 +<​note>​
 +O posibila solutie a laboratorului se gaseste [[https://​ocw.cs.pub.ro/​courses/​_media/​pc/​laboratoare/​lab3_sol.zip|aici]]
 </​note>​ </​note>​
pc/laboratoare/03.1647261802.txt.gz · Last modified: 2022/03/14 14:43 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