This shows you the differences between two versions of the page.
rl:teme:tema1_sw [2024/10/24 21:58] vlad_andrei.badoiu [Cerinte] |
rl:teme:tema1_sw [2024/11/02 13:52] (current) vlad_andrei.badoiu |
||
---|---|---|---|
Line 3: | Line 3: | ||
=== Lectura recomandata === | === Lectura recomandata === | ||
- | * **Cursul si laboratorul de VLAN & STP** | + | * Tema ar trebui facuta doar dupa ce ati parcurs **Cursul si laboratorul de VLAN & STP** |
* [[https://beta.computer-networking.info/syllabus/default/protocols/lan.html?highlight=spanning%20tree%20protocol#ethernet-switches|Ethernet Switches]] | * [[https://beta.computer-networking.info/syllabus/default/protocols/lan.html?highlight=spanning%20tree%20protocol#ethernet-switches|Ethernet Switches]] | ||
Line 83: | Line 83: | ||
Protocolul [[https://www.ietf.org/rfc/rfc2674.txt|IEEE 802.1Q]] este folosit pentru a introduce sistemul de marcare VLAN (VLAN tagging) în Ethernet, sub forma unei extensii a antetului (header-ului) Ethernet. În imaginea de mai jos putem observa că au fost introduși 4 octeți (bytes). De interes pentru noi este câmpul VID pe 12 biți, ce reprezintă identificatorul VLAN-ului din care cadrul face parte. | Protocolul [[https://www.ietf.org/rfc/rfc2674.txt|IEEE 802.1Q]] este folosit pentru a introduce sistemul de marcare VLAN (VLAN tagging) în Ethernet, sub forma unei extensii a antetului (header-ului) Ethernet. În imaginea de mai jos putem observa că au fost introduși 4 octeți (bytes). De interes pentru noi este câmpul VID pe 12 biți, ce reprezintă identificatorul VLAN-ului din care cadrul face parte. | ||
- | De acum, cand ne vom referi la un pachet cu header-ul 802.1q, inseamna ca include acesti 4 bytes. | + | De acum înainte, când ne vom referi la un pachet cu header-ul 802.1Q, vom înțelege că este vorba despre un cadru Ethernet plus acești 4 byți. |
{{ :rl:teme:ethernet_802.png?600 |}} | {{ :rl:teme:ethernet_802.png?600 |}} | ||
Line 89: | Line 89: | ||
{{ :rl:teme:tag_format.png?400 | }} | {{ :rl:teme:tag_format.png?400 | }} | ||
- | Switch-ul cand **primeste** un cadru de pe o interfata de tip **access** (dinspre host) va comuta cadrul mai departe astfel: | + | Switch-ul cand **primeste** un cadru de pe orice interfata va comuta cadrul mai departe astfel: |
- | * cu header-ul 802.1q daca se duce pe o interfata de tip trunk (catre un switch) | + | |
- | * fara header-ul 802.1q daca se duce pe o interfata de tip access si VLAN ID egal cu cel al interfetei de pe care a venit (catre un host direct conectat la switch, pare a aceluiasi VLAN) | + | |
- | Switch-ul de fiecare data cand **primeste** un cadru de pe o interfata de tip **trunk** va comuta cadrul mai departe astfel: | + | * cu header-ul 802.1Q dacă se transmite pe un port de tip trunk (către un switch). De notat că, în funcție de portul sursă, cadrul primit poate fi sau nu în format 802.1Q. De exemplu, dacă este un cadru primit pe un port trunk, atunci acesta va fi în format 802.1Q. În schimb, dacă este un cadru primit de pe o interfață de tip access, acesta nu va avea header 802.1Q, iar implementarea noastră de switch va trebui să îl adauge. |
+ | * fără header-ul 802.1Q dacă se transmite pe o interfață de tip access și VLAN ID-ul este egal cu cel al interfeței de pe care a venit (către un host direct conectat la switch, parte a aceluiași VLAN) | ||
- | * cu header-ul de 802.1q daca se duce pe o interfata de tip trunk | + | Nu vom comuta cadrele atunci când VLAN ID port destinație != VLAN ID cadru. |
- | * fara header-ul de 802.1q daca se duce pe o interfata de tip access si VLAN ID egal cu cel al cadrului primit | + | |
- | + | ||
- | Nu vom comuta cadrele atunci cand VLAN ID port destinatie != VLAN ID cadru. | + | |
Stațiile din simulare rulează Linux, iar stiva de networking din Linux face VLAN filtering, pentru a nu pierde eticheta VLAN (VLAN tag), vom folosi pentru TPID valoarea **0x8200** în loc de **0x8100**. Practic vom avea o implementare custom de 802.1q. Câmpurile PCP și DEI vor fi setate la valoarea 0. | Stațiile din simulare rulează Linux, iar stiva de networking din Linux face VLAN filtering, pentru a nu pierde eticheta VLAN (VLAN tag), vom folosi pentru TPID valoarea **0x8200** în loc de **0x8100**. Practic vom avea o implementare custom de 802.1q. Câmpurile PCP și DEI vor fi setate la valoarea 0. | ||
Line 307: | Line 303: | ||
Pentru rezolvarea temei, trebuie să implementați funcționalitatea unui switch. Va recomandăm să folosiți cel puțin ping pentru a testa implementarea și **Wireshark** pentru depanare și analiză corectitudinii. Punctajul este împărțit în mai multe componente, după cum urmează: | Pentru rezolvarea temei, trebuie să implementați funcționalitatea unui switch. Va recomandăm să folosiți cel puțin ping pentru a testa implementarea și **Wireshark** pentru depanare și analiză corectitudinii. Punctajul este împărțit în mai multe componente, după cum urmează: | ||
- | * **Procesul de comutare (30p)**. Va trebui sa implementați funcționalitatea descrisă in secțiunea **Procesul de Comutare**. Pentru acest exercițiu nu este nevoie sa implementați funcționalitatea referitoare la VLAN sau STP. Pentru a evita buclele, vom porni doar switch-urile 0 si 1. | + | * **Procesul de comutare (30p)**. Va trebui să implementați funcționalitatea descrisă în secțiunea **Procesul de Comutare**. Pentru acest exercițiu nu este nevoie să implementați funcționalitatea referitoare la VLAN sau STP. Pentru a evita buclele, vom porni doar switch-urile 0 și 1. |
- | * **VLAN (30p)**. Vom implementa funcționalitatea de Virtual Local Area Networks (VLANs). Fișierele de configurație ale switch-urilor se găsesc in directorul **configs**. Pentru a evita buclele, vom porni doar switch-urile 0 si 1. | + | * **VLAN (30p)**. Vom implementa funcționalitatea de Virtual Local Area Networks (VLANs). Fișierele de configurație ale switch-urilor se găsesc în directorul **configs**. Pentru a evita buclele, vom porni doar switch-urile 0 si 1. |
* ** STP (40p)**. In acest exercițiu vom introduce si switch-ul 2, care va determina apariția unei bucle. Se cere implementarea protocolului STP simplificat, descris in enunț, pentru a evita trimiterea pachetelor la infinit. | * ** STP (40p)**. In acest exercițiu vom introduce si switch-ul 2, care va determina apariția unei bucle. Se cere implementarea protocolului STP simplificat, descris in enunț, pentru a evita trimiterea pachetelor la infinit. | ||
Line 316: | Line 312: | ||
</note> | </note> | ||
+ | <note> | ||
Puteți scrie implementarea în Python sau C/C++. Daca lucrati in C/C++ va trebui sa schimbati regula de rulare a switch-ului din **Makefile**. | Puteți scrie implementarea în Python sau C/C++. Daca lucrati in C/C++ va trebui sa schimbati regula de rulare a switch-ului din **Makefile**. | ||
</note> | </note> | ||
Line 362: | Line 359: | ||
==== Trimitere ==== | ==== Trimitere ==== | ||
- | Pentru a fi notată în catalog, tema va fi trimisă pe Moodle, unde checker-ul va fi rulat automat și va pune la feedback nota și output-ul rulării. Arhiva (zip) trebuia să includă un fisier numit **README** în care să detaliați implementarea, și fișierul python switch.py în care ați făcut rezolvarea. **În fișierul README va trebui să specificați pe prima linie ce cerințe ați făcut în format '1 2 3' (toate), `1 2` sau `1`.** | + | Pentru a fi notată în catalog, tema va fi trimisă pe Moodle, unde checker-ul va fi rulat automat și va pune la feedback nota și output-ul rulării. Arhiva (zip) trebuia să includă un fisier numit **README** în care să detaliați implementarea, și fișierul python switch.py în care ați făcut rezolvarea. În fișierul README va trebui să specificați pe prima linie cerințele rezolvate în format **1 2 3** (toate), **1 2** sau **1**. |
O rulare completă durează cam 9 minute. Vă rugăm să trimiteți tema pe Moodle doar după ce ați verificat că aceasta rulează bine pe local. | O rulare completă durează cam 9 minute. Vă rugăm să trimiteți tema pe Moodle doar după ce ați verificat că aceasta rulează bine pe local. | ||
Line 378: | Line 375: | ||
</note> | </note> | ||
==== FAQ ==== | ==== FAQ ==== | ||
+ | |||
+ | **Q:** Ce versiune de python ruleaza checker-ul de pe Moodle? | ||
+ | |||
+ | **A:** | ||
+ | Python 3.8.10 (Atentie la ce functionalitati folositi) | ||
+ | |||
+ | **Q:** Pe Moodle primesc punctaj 0, pe local 100. | ||
+ | **A:** Cele mai intalnite probleme sunt faptul ca arhiva trimita nu contine in root-ul ei fisierul switch.py (acesta e intr-un subdirector) sau de la versiune de python rulata pe checker | ||
+ | |||
+ | **Q:** Cum știu ce fișier de config sa citesc? | ||
+ | |||
+ | **A:** Primul argument pe care îl primește switch-ul la rulare este identificatorul (switch_id = sys.argv[1]) | ||
+ | |||
+ | **A:** Nu se aplica depunctări pentru coding style | ||
**Q:** Pe local am mai multe puncte decât pe checkerul online | **Q:** Pe local am mai multe puncte decât pe checkerul online | ||
Line 421: | Line 432: | ||
**A:** Atentie la conceptul de stare. De exemplu, testul `ICMP_0_3_NOT_ARRIVES_2` este rulat in contextul in care si celelalte teste au fost rulate, astfel au fost trimise mai multe ping-uri pana la rularea acestui test. | **A:** Atentie la conceptul de stare. De exemplu, testul `ICMP_0_3_NOT_ARRIVES_2` este rulat in contextul in care si celelalte teste au fost rulate, astfel au fost trimise mai multe ping-uri pana la rularea acestui test. | ||
+ | |||
+ | In fisierul Dockerfile gasiti imaginea docker folosita pe vmchecker. | ||
+ | |||
+ | <code Bash> | ||
+ | docker build -f Dockerfile -t tema1 . | ||
+ | |||
+ | docker run --privileged -v .:/data/ -it tema1 /bin/bash | ||
+ | |||
+ | # Din bash-ul deschis in container rulati vom rula asa: | ||
+ | |||
+ | cd /data/ | ||
+ | ulimit -c 1024 | ||
+ | /bin/bash -c "ulimit -c 1024 ; python3 checker/topo.py tests" | ||
+ | |||
+ | # inspectati switch_0_err dupa ce a picat testul cu probleme | ||
+ | </code> |