Differences

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

Link to this comparison view

pc:laboratoare:04 [2022/03/22 00:06]
vlad_andrei.badoiu [Cerinte laborator:]
pc:laboratoare:04 [2022/03/27 23:32] (current)
vlad_andrei.badoiu [Resurse Utile]
Line 13: Line 13:
   * [[https://​www.youtube.com/​watch?​v=_y36fG2Oba0|The Day The Routers Died...]]   * [[https://​www.youtube.com/​watch?​v=_y36fG2Oba0|The Day The Routers Died...]]
 ==== Inainte de laborator ==== ==== Inainte de laborator ====
- 
- 
- 
  
 Pentru a simula o retea virtuala vom folosi [[http://​mininet.org/​ | Mininet]]. Vom avea nevoie de pachetele **mininet** si **openvswitch-testcontroller** pentru a simula reteaua si **python-click** si **python-scapy** pentru checker. Pentru a simula o retea virtuala vom folosi [[http://​mininet.org/​ | Mininet]]. Vom avea nevoie de pachetele **mininet** si **openvswitch-testcontroller** pentru a simula reteaua si **python-click** si **python-scapy** pentru checker.
  
- <code bash>+<code bash>
  sudo apt update  sudo apt update
- sudo apt install mininet openvswitch-testcontroller tshark ​python-click ​python-scapy xterm+ sudo apt install mininet openvswitch-testcontroller tshark ​python3-click ​python3-scapy xterm 
 + sudo pip3 install mininet
 </​code> ​ </​code> ​
  
 +<note warning>
 +Pe unele versiuni mai vechi de ubuntu este posibil sa fie nevoie sa instalati ''​python-click''​ si ''​python-scapy''​ fiind folosit Python 2.
 +</​note>​
 <note warning> Din incercarile noastre, Mininet nu functioneaza pe Windows Subsystem for Linux. Este recomandat sa folositi Linux nativ sau intr-un mediu virtualizat. La adresa https://​ocw.cs.pub.ro/​courses/​pc/​res/​mv puteti gasi o masina virtuala cu Ubuntu 18.04. <note warning> Din incercarile noastre, Mininet nu functioneaza pe Windows Subsystem for Linux. Este recomandat sa folositi Linux nativ sau intr-un mediu virtualizat. La adresa https://​ocw.cs.pub.ro/​courses/​pc/​res/​mv puteti gasi o masina virtuala cu Ubuntu 18.04.
 </​note>​ </​note>​
Line 29: Line 30:
 ==== Prezentare generala ==== ==== Prezentare generala ====
  
-In primele laboratoare am implementat protocoale de nivel DataLink pentru a comunica ​intre doua dispozitive. ​Astazi ​vom face o implementare priliminara a protocolului IP de nivel Network pentru a permite comunicarea la distanta ​folosind dispozitive de rutare. ​In cadrul laboratorului vom implementa ​data plane-ul unui **router** simplu. ​Daca data plane-ul se ocupa cu procesarea pachetelor, control plane-ul se refera ​la procesul de populare al tabelelor de rutare. Un router are mai multe interfete si poate receptiona ​datagrame pe oricare dintre acestea. Routerul trebuie ​sa transmita ​pachetul mai departe ​in functie ​de multimea ​de reguli din **tabela de rutare**In general, tabela de rutare ​contine urmatoarele informatii:+În primele laboratoare am implementat protocoale de nivel DataLink pentru a comunica ​între două dispozitive. ​Astăzi ​vom face o implementare priliminara a protocolului IP de nivel Network pentru a permite comunicarea la distanță ​folosind dispozitive de rutare. ​În cadrul laboratorului vom implementa ​dată plane-ul unui router simplu. ​Dacă dată plane-ul se ocupă ​cu procesarea pachetelor, control plane-ul se referă ​la procesul de populare al tabelelor de rutare. Un router are mai multe interfețe și poate recepționa ​datagrame pe oricare dintre acestea. Routerul trebuie ​să transmită ​pachetul mai departe ​în funcție ​de mulțimea ​de reguli din tabela de rutare. ​În general, tabela de rutare ​conține următoarele informații:
   * Interfata pe care trebuie sa trimita pachetul   * Interfata pe care trebuie sa trimita pachetul
   * Adresa IPv4 sau IPv6 a urmatorului hop   * Adresa IPv4 sau IPv6 a urmatorului hop
   * Prioritatea rutei(metric)   * Prioritatea rutei(metric)
  
-Se cere implementarea procesului de rutare ​pe baza unei tabele statice. ​(Nu trebuie sa implmentati algoritmii de populare a tabelei de rutare ​e.g. RIP, OSPF, BGP)+Se cere implementarea procesului de forward ​pe baza unei tabele statice. Nu trebuie sa implmentati algoritmii de populare a tabelei de rutare ​precum ​RIP, OSPF, BGP.
  
 ==== Procesul de forward ==== ==== Procesul de forward ====
Line 251: Line 252:
  
   - Routerul primeste un pachet apeland functia get_packet.   - Routerul primeste un pachet apeland functia get_packet.
-  - Routerul face LPM pentru a gasi urmatorul ​HOP.+  - Routerul face LPM pentru a gasi urmatorul ​hop.
   - In cazul in care nici o intrare din tabela nu face match, ruterul arunca datagrama.   - In cazul in care nici o intrare din tabela nu face match, ruterul arunca datagrama.
   - Pentru IPv4, este verificat checksum-ul. Daca acesta este incorect, pachetul este aruncat.   - Pentru IPv4, este verificat checksum-ul. Daca acesta este incorect, pachetul este aruncat.
Line 268: Line 269:
 1. Scheletul laboratorului se regaseste [[https://​gitlab.cs.pub.ro/​protocoale-de-comunicatie/​pcom-laboratoare-public/​-/​tree/​master/​lab4|aici]]. Comanda de mai jos va creea topologia retelei, va lansa routerul, va rula testele pentru verificarea conectivitatii si va prezenta un prompt prin care se poate interactiona cu topologia si hostii. 1. Scheletul laboratorului se regaseste [[https://​gitlab.cs.pub.ro/​protocoale-de-comunicatie/​pcom-laboratoare-public/​-/​tree/​master/​lab4|aici]]. Comanda de mai jos va creea topologia retelei, va lansa routerul, va rula testele pentru verificarea conectivitatii si va prezenta un prompt prin care se poate interactiona cu topologia si hostii.
  
-<code bash> sudo python topo.py </​code> ​+<code bash> ​ 
 +sudo pkill ovs-test 
 +sudo python topo.py 
 +</​code> ​
  
-Se poate interactiona cu hostii prin intermediul promptului mininet. Unde se pot rula comenzi precum **ping**, **wget**, **nc** etc. Comenzile trebuie prefixate cu numele hostului. De exemplu, pentru a lansa comanda **ping 192.168.3.2** pe **host1** vom folosi **host1 ping 192.168.3.2**.+Se poate interactiona cu hostii prin intermediul promptului mininet. Unde se pot rula comenzi precum **ping**, **wget**, **nc** etc. Comenzile trebuie prefixate cu numele hostului. De exemplu, pentru a lansa comanda **ping 192.168.3.2** pe **host1** vom folosi **host1 ping 192.168.3.2**. Mai multe detalii gasiti in sectiunea ''​Testare''​.
  
 Pe router va fi rulat programul rezultat in urma rularii comenzii **make**. In cadrul laboratorului vom lucra in fisierul **router.c**. ​ Pe router va fi rulat programul rezultat in urma rularii comenzii **make**. In cadrul laboratorului vom lucra in fisierul **router.c**. ​
Line 276: Line 280:
 <​note>​ In cazul in care apar probleme, consultati sectiunea FAQ.</​note>​ <​note>​ In cazul in care apar probleme, consultati sectiunea FAQ.</​note>​
  
-<​note>​ Routerul este pornit automat la rularea comenzii python topo.py si output-ul este afisat in /​tmp/​debug.txt. In cazul in care vreti sa il porniti manual, astati comanda **router pkill router && ./router &>/​tmp/​debug.txt &** in promptul mininet. </​note>​+<​note>​ Routerul este pornit automat la rularea comenzii ​''​python topo.py'' ​si output-ul este afisat in /​tmp/​debug.txt. In cazul in care vreti sa il porniti manual, astati comanda **router pkill router && ./router &>/​tmp/​debug.txt &** in promptul mininet. </​note>​
  
 2.1. Implementati procesul de forward pentru IPv4. Tabela de rutare este reprezentata printr-un array si poate fi accesata la un index prin variabila rtable[i]. rtable_size este dimensiunea tabelei. Nu trebuie implementata parsarea fisierului **rtable.txt**. Structura de date utilizate pentru o intrare din tabela este **rtable_entry** din **skel.h**. 2.1. Implementati procesul de forward pentru IPv4. Tabela de rutare este reprezentata printr-un array si poate fi accesata la un index prin variabila rtable[i]. rtable_size este dimensiunea tabelei. Nu trebuie implementata parsarea fisierului **rtable.txt**. Structura de date utilizate pentru o intrare din tabela este **rtable_entry** din **skel.h**.
Line 282: Line 286:
 <​note>​ <​note>​
 Pentru structurile care au legatura cu IPv6 (e.g. proto) vom putea pune orice valoare deoarece nu le folosim la acest exercitiu. Pentru structurile care au legatura cu IPv6 (e.g. proto) vom putea pune orice valoare deoarece nu le folosim la acest exercitiu.
 +</​note>​
 +
 +<​note>​
 +Structura ''​struct in_addr''​ are un singur membru, s_addr de tip unsigned long (uint32_t)
 </​note>​ </​note>​
  
Line 297: Line 305:
 <​note>​ Puteti folosi inet_pton a parsa adresele IPv4 sau IPv6 in binar. Pentru a parsa MAC-ul in binar puteti folosi functia hwaddr_aton pusa la dispozitie in **skel.h**. </​note>​ <​note>​ Puteti folosi inet_pton a parsa adresele IPv4 sau IPv6 in binar. Pentru a parsa MAC-ul in binar puteti folosi functia hwaddr_aton pusa la dispozitie in **skel.h**. </​note>​
  
-<​note>​ Functia int get_interface_mac(int interface, uint8_t *mac) intoarce adresa MAC a interfetei router-ului. </​note>​+<​note>​ Functia int ''​get_interface_mac(int interface, uint8_t *mac)'' ​intoarce adresa MAC a interfetei router-ului. </​note>​
  
 Pentru testare puteti folosi comanda **ping** sau **nc** din terminalele pentru orice host, generand trafic catre alt host. De exemplu, in promptul mininet puteti executa: ​ Pentru testare puteti folosi comanda **ping** sau **nc** din terminalele pentru orice host, generand trafic catre alt host. De exemplu, in promptul mininet puteti executa: ​
Line 354: Line 362:
 Din terminal vom putea rula terminale pentru fiecare host: Din terminal vom putea rula terminale pentru fiecare host:
  
-<​code>​+<​code ​Bash>
 mininet> host1 xterm& mininet> host1 xterm&
 </​code>​ </​code>​
Line 360: Line 368:
 Din terminalul deschis de pe host1 vom putea rula ''​wireshark''​ Din terminalul deschis de pe host1 vom putea rula ''​wireshark''​
  
-<​code>​+<​code ​Bash>
 sudo wireshark&​ sudo wireshark&​
 </​code>​ </​code>​
Line 371: Line 379:
  
 Din terminalul deschis Din terminalul deschis
-<​code>​+<​code ​Bash>
 killall router killall router
 make make
 +# Vom putea vedea output-ul de la printf
 ./router ./router
 </​code>​ </​code>​
Line 398: Line 407:
   * Ce face daca se trimit multe pachete duplicate? **make distclean** din Linux si  **make distclean && make** din cadrul terminalului deschis pentru router.   * Ce face daca se trimit multe pachete duplicate? **make distclean** din Linux si  **make distclean && make** din cadrul terminalului deschis pentru router.
   * Cum folosesc ip_checksum?​ <code C> ip_checksum(ip_hdr,​ sizeof(struct iphdr)); /* initial header checksum = 0 */</​code>​   * Cum folosesc ip_checksum?​ <code C> ip_checksum(ip_hdr,​ sizeof(struct iphdr)); /* initial header checksum = 0 */</​code>​
-==== Resurse ​Utile ====+==== Resurse ​Extra ====
    * [[https://​github.com/​mininet/​mininet/​wiki/​Introduction-to-Mininet | Introducere in Mininet]]    * [[https://​github.com/​mininet/​mininet/​wiki/​Introduction-to-Mininet | Introducere in Mininet]]
    * [[https://​lagunita.stanford.edu/​c4x/​Engineering/​Networking-SP/​asset/​ps_switching.pdf | Packet Switching]]    * [[https://​lagunita.stanford.edu/​c4x/​Engineering/​Networking-SP/​asset/​ps_switching.pdf | Packet Switching]]
    * [[https://​people.eecs.berkeley.edu/​~istoica/​classes/​cs268/​05/​notes/​Lecture10.pdf | Router Design and Packet Lookup]]    * [[https://​people.eecs.berkeley.edu/​~istoica/​classes/​cs268/​05/​notes/​Lecture10.pdf | Router Design and Packet Lookup]]
    * [[https://​tools.ietf.org/​html/​rfc791 | RFC 791 - Internet Protocol]]    * [[https://​tools.ietf.org/​html/​rfc791 | RFC 791 - Internet Protocol]]
 +
 +
 +<​note>​
 +O posibila solutie a laboratorului se gaseste [[https://​ocw.cs.pub.ro/​courses/​_media/​pc/​laboratoare/​lab4-rezolvare.zip|aici]]
 +</​note>​
pc/laboratoare/04.1647900376.txt.gz · Last modified: 2022/03/22 00:06 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