unito differenti repository

This commit is contained in:
dado
2025-05-17 16:24:25 +02:00
parent cc54398c02
commit b0b40c1e7b
70 changed files with 3723 additions and 0 deletions

View File

@ -0,0 +1,122 @@
# Internet
Internet é una serie di dispositivi (host o nodi) interconnessi tra loro grazie ad altri dispositivi, come switch e router.
Per dimensioni, l'architettura di rete si puo' suddividere in:
- `LAN` (local area network)
- `WAN` (wide area network)
## Stack protocollari
- Modello teorico `ISO/OSI`
- Modello pratico `TCP/IP`
![modello iso/osi - tcp/ip](asset/img/model-tcp-ip-iso-osi.png)
Per creare una comunicazione standard tra i vari host é stato creato il modello teorico ISO/OSI, implementato nel modello TCP/IP.
Si tratta di una struttura di dati che contiene un insieme di protocolli (regole), divisi, in base al loro scopo, tra i vari layer.
- `Physical layer` o `Layer 1`: livello piú basso, che si occupa dell'effettiva trasmissione fisica dei dati, mediante un mezzo trasmissivo (es. cavo in rame, fibra ottica, onde radio, ecc.). Le informazioni inviate sono codificate come `bit` (0 e 1).
- `Data-Link` o `Layer 2`: una serie di standard che si occupano di comunicazioni tra dispositivi locali (LAN), con eventuali meccanismi di correzione degli errori. I pacchetti di informazioni sono chiamati `frame`, che contengono anche i vari mac-address sorgente e destinazione.
- `Network Layer` o `Layer 3`: i `protocolli di routing` (instradamento dei pacchetti) permettono l'indirizzamento degli host a livello globale (WAN).
- `Transport Layer` o `Layer 4`: crea un vero e proprio canale di comunicazione tra i singoli processi, associati ad una porta, di due o piú host (TPC/UDP).
- `Session Layer` o `Layer 5`: gestione della sessione della comunicazione.
- `Presentation Layer` o `Layer 6`: a questo livello l'informazione viene elaborata e trasformata in modo da presentarla all'`Application Layer` (e quindi per essere comprensibile a noi umani).
- `Application Layer` o `Layer 7`: a stretto contatto coi software che utilizziamo.
In ogni layer, il pacchetto di informazioni ha varie nomenclature. Inoltre, ogni layer ha un suo determinato *meccanismo di indirizzamento* delle informazioni, che garantisce un flusso bidirezionale (come e da chi verso chi). Ad esempio, a livello data-link sarà il mac sorgente e destinatario.
- `Application`: payload o messaggio
- `Transport`: segmento TCP (indirizzamento tramite porte)
- `Network`: pacchetto IP (indirizzamento tramite indirizzo IP)
- `Data-Link`: frame (indirizzamento tramite mac-address)
- `Physical`: bit (mezzo trasmissivo che collega due o piú host)
### Interazione tra i layer
I layer sono modulari e indipendenti: qualche aggiunta o modifica ad un certo layer, non distrugge la struttura generale. Tuttavia, questi interagiscono tra di loro in diversi modi:
- Interazione adiacente (`adjacent layer interaction`): si verifica quando un layer richiede un servizio da quello immediatamente sottostante, oppure quando un layer offre un servizio a quello immediatamente soprastante. Offrire un servizio, in questo contesto, significa mettere a disposizione un protocollo specifico.
Ad esempio, l'utilizzo del protocollo HTTPS implica la necessità di una trasmissione dati affidabile. Ciò comporta che il livello applicativo, che gestisce HTTPS, debba appoggiarsi al livello di trasporto per garantire la consegna affidabile dei dati. In altre parole, il livello applicativo "richiede" al livello di trasporto l'uso di un protocollo affidabile come il TCP, per assicurare che le informazioni vengano trasmesse correttamente.
- `Same layer interaction`: indica l'interazione tra stessi livelli di due stack protocollari di host differenti (come se l'application layer dell'host A comunicasse direttamente con l'application layer dell'host B). Questo collegamento logico prevede un meccanismo chiamato incapsulamento/deincapsulamento.
1. **Incapsulamento**:
- Al momento dellinvio, i dati generati dallapplicazione vengono passati attraverso i vari layer dello stack dellhost A
- Ogni layer *aggiunge al payload informazioni* necessarie per la gestione della comunicazione, sotto forma di header e/o trailer
2. **Trasmissione**:
- I dati, incapsulati in vari *strati*, viaggiano quindi attraverso la rete
3. **Deincapsulamento**:
- Allarrivo dellinformazione sullhost B, i dati vengono elaborati seguendo lordine inverso rispetto a quello dellincapsulamento
- Ogni layer *rimuove (o "spacchetta") le informazioni* (header/trailer) che erano state aggiunte dal corrispondente layer dellhost A
- In questo modo, lhost B riesce a recuperare i dati originali generati dallapplicazione
Larchitettura a strati facilita linteroperabilità tra differenti sistemi e protocolli, poiché ogni layer opera in modo indipendente.
Non tutti gli host implementano tutto lo stack protocollare. Ad esempio, un dispositivo embedded potrebbe avere solo le funzionalità base per comunicare via rete (come il livello di rete e di trasporto) senza implementare un layer applicativo complesso.
### Esempio pratico di incapsulamento e deincapsulamento
Vediamo un esempio pratico di incapsulamento e decapsulamento in una richiesta DNS per il caricamento di una pagina web.
Il pacchetto in uscita dal client é composto da vari strati:
![dns-request](/asset/img/dns-request.png)
A *livello applicativo*, il client genera una richiesta DNS (*DNS query*) per risolvere l'indirizzo IP del sito web.
![dns-query](/asset/img/dns-query.png)
Dopo aver generato la query DNS a livello applicativo, il *payload* viene incapsulato in un segmento UDP nel *livello di trasporto* (transport layer). Durante questo processo, viene aggiunto un header, che contiene informazioni fondamentali quali:
- la porta sorgente (determinata dal client)
- la porta di destinazione (la *well-known port 53*, utilizzata dal protocollo DNS)
![udp-header](/asset/img/udp-header.png)
Il segmento UDP così formato diventa, nel *network layer*, il payload del *pacchetto IP*. In questo livello, viene aggiunto l'header IP che include:
- l'indirizzo IP sorgente, ovvero quello del client che ha inoltrato la richiesta
- l'indirizzo IP di destinazione, corrispondente al server DNS
- altre informazioni di gestione come la versione del protocollo (IPv4 o IPv6), la lunghezza totale del pacchetto, il TTL (Time To Live), ecc.
![network-header](/asset/img/network-header.png)
Al livello 2, il *data link layer*, avviene l'indirizzamento tramite MAC address:
- il pacchetto IP (contenente il segmento UDP con la query DNS) viene incapsulato in un *frame*. Qui interviene il *protocollo ARP* (Address Resolution Protocol), che permette di mappare l'indirizzo IP del server di destinazione all'indirizzo MAC fisico del dispositivo di destinazione
- il frame, ora completo di header del livello 2 che include il MAC address sorgente e quello di destinazione, viene inviato allo switch
![packet-to-switch](/asset/img/packet-to-switch.png)
Lo switch riceve un frame in input
![frame-ethernet](/asset/img/frame-ethernet.png)
Lo switch, grazie alla sua MAC address table, sa quale porta utilizzare per inviare il frame al dispositivo corretto (in questo caso il DNS server). Le informazioni vengono quindi trasferite tramite il cavo
![deincapsulamento-switch](/asset/img/deincapsulamento-switch.png)
Lo switch, per poter svolgere il proprio compito, deve analizzare le informazioni fino al livello 2, in particolare il MAC address di destinazione, per poter effettuare l'instradamento corretto.
*Analisi del frame*:
- Lo switch riceve il frame e lo *deincapsula* parzialmente: ne esamina l'header per recuperare il MAC address di destinazione, in modo da capire su quale porta inoltrare il pacchetto
*Instradamento del frame*:
- Se il MAC address di destinazione è già presente nella MAC address table dello switch e associato a una porta, il frame viene *reincapsulato* e inviato attraverso il cavo (porta) corrispondente, garantendo così la consegna al dispositivo di destinazione
*Ricezione dal server DNS*:
- Il server DNS riceve il pacchetto e procede con il completo deincapsulamento: viene rimosso l'header del livello Data Link, lasciando il pacchetto IP. A sua volta, si rimuove l'header del livello di rete e quindi quello del livello trasporto (UDP), fino a ricostruire la query DNS originale
- Dall'informazione contenuta nella query, il server DNS elabora la richiesta e incapsula la relativa risposta:
- Nella risposta, il server DNS diventa il mittente e il client il destinatario
- Lo stesso processo di incapsulamento viene applicato in senso inverso, in modo che il pacchetto risalga fino al client di origine
![dns-response](/asset/img/dns-response.png)
Adesso il processo di incapsulamento si ripete per la generazione di una richiesta HTTP verso il sito web, di cui ora si conosce l'indirizzo IP.

View File

@ -0,0 +1,59 @@
# Standard Ethernet
Ethernet è uno standard che definisce le regole per l'invio e la ricezione dei dati tra dispositivi all'interno di una rete LAN (Local Area Network). Esso opera a due livelli del modello OSI:
1. **Livello 1 Fisico (Physical Layer)**
- Specifica le caratteristiche fisiche dei componenti, come cavi, connettori, interfacce, moduli di trasmissione, ecc.
- Nel contesto delle reti cablate (*wired*) la norma IEEE 802.3 definisce tutti gli aspetti relativi alla trasmissione dei segnali su cavi (reti cablate).
- Nel contesto delle reti *wireless* la norma IEEE 802.11 si occupa delle caratteristiche della trasmissione senza fili, garantendo la compatibilità e le modalità comunicative delle reti wireless.
2. **Livello 2 Data Link Layer**
- Definisce la struttura dei pacchetti (*frame*) che viaggiano in rete.
- Stabilisce i metodi di indirizzamento attraverso luso dei MAC-address
## Cavi fisici
Esistono vari tipi di cavi, caratterizzati da differenti lunghezze e capacità di trasmissione, che dipendono dalla tecnologia impiegata.
Possiamo classificarli in base alla velocità supportata:
- Ethernet: fino a 10 Mbps
- Fast Ethernet: fino a 100 Mbps
- Gigabit Ethernet: fino a 1000 Mbps (1 Gbps)
- 10 Gigabit Ethernet: fino a 10 Gbps
Inoltre, i cavi si distinguono anche per la loro composizione: possono essere realizzati in rame oppure in fibra ottica.
![cavo-ethernet](/asset/img/cavo-ethernet.png)
Il cavo in figura è un cavo `UTP` (*Unshielded Twisted Pair*), ovvero non schermato, con coppie di cavi intrecciati. Questa particolare struttura serve a ridurre le interferenze elettromagnetiche e a prevenire il fenomeno del *crosstalk*, cioè l'interferenza tra i segnali che viaggiano su cavi adiacenti. Alle estremità, il cavo è dotato di connettori; il più comune è l'`RJ-45`.
Il cavo UTP è composto da 8 fili di rame, progettati per collegarsi ai pin della porta in cui viene inserito il connettore.
![rj45](/asset/img/rj45.png)
I pin di contatto dei dispositivi devono avere funzionalità opposte affinché la comunicazione possa avvenire correttamente. Ad esempio, i pin 1 e 2 di un dispositivo A devono inviare, mentre i pin 1 e 2 del dispositivo B devono ricevere, e viceversa per gli altri pin.
### Cable pinout Ethernet e Fast Ethernet
Vengono utilizzati solo 4 pin. Per quanto riguarda le connessioni Ethernet e Fast Ethernet, esistono due tipologie di pinout:
- `Straight Through Pinout` (cavo dritto): in questo tipo di cablaggio i cavi vengono collegati in modo diretto: il pin 1 di A va al pin 1 di B, il 2 di A al 2 di B, e così via. I dispositivi hanno funzionalità opposte sui rispettivi pin (trasmettitore e ricevitore), per cui la comunicazione avviene correttamente.
![straight-through-pinout](/asset/img/straight-through-pinout.png)
Un cavo con all'estremità un straight-through cable pinout é utile per mettere in comunicazione due dispositivi che, sugli stessi pin di contatto, hanno funzionalità opposte (sul pin 1 l'host A invia e sul pin 1 l'host B riceve).
- `Crossover Pinout`: in questo schema la disposizione dei pin alle estremità è *incrociata* (1A-3B, 2A-6B, 3A-1B, 6A-2B), permettendo così una comunicazione bidirezionale tra i dispositivi.
Il crossover pinout serve per collegare due dispositivi che, sugli stessi pin di contatto, assegnano la medesima funzionalità. Senza l'incrocio dei cavi non è quindi possibile instaurare una comunicazione bidirezionale.
![crossover-pinout](/asset/img/crossover-pinout.png)
Di solito, dispositivi identici (ad esempio, switch collegati tra loro) assegnano la medesima funzionalità agli stessi pin. Pertanto, per stabilire una comunicazione diretta tra di essi, viene utilizzato un cavo con pinout crossover. Nel caso di dispositivi differenti, come ad esempio un computer e uno switch, le funzionalità dei pin non coincidono: il computer trasmette su un set di pin mentre lo switch riceve su quelli corrispondenti. Pertanto, per collegare dispositivi differenti si utilizza tipicamente un cavo con pinout straight-through.
![device-connection](/asset/img/device-connection.png)
### Cable pinout Gigabit Ethernet
Vengono utilizzati tutti gli 8 pin, con le medesime tipologie di pinout. I pin lavorano sempre a coppie: ad esempio, i ping 1-2A inviano e i pin 1-2B ricevono, ecc. (nel caso del cablaggio straight-through)

View File

@ -0,0 +1,10 @@
# MAC-Address
L'indirizzo MAC, noto anche come *Physical Address* o *indirizzo layer 2* o *data-link address*, è l'identificativo univoco utilizzato per il trasferimento di dati all'interno di una rete locale (LAN). Esso viene utilizzato per indirizzare i pacchetti all'interno della rete, assicurando che vengano trasmessi all'host corretto.
## Caratteristiche principali
- Il MAC address è composto da 48 bit (6 byte). Ogni byte è rappresentato in formato esadecimale e i byte possono essere separati da trattini (`-`), punti (`.`) oppure due punti (`:`), a seconda della notazione adottata
- I primi 3 byte costituiscono l'**OUI** (Organizationally Unique Identifier), un codice standard che identifica il produttore della scheda di rete
- Gli ultimi 3 byte sono assegnati dal produttore e garantiti univoci per ogni dispositivo
- L'indirizzo MAC è fisso e direttamente integrato nella scheda di rete (NIC - network interface card)

View File

@ -0,0 +1,30 @@
# Ethernet Frame
L'Ethernet Frame è definito dallo standard `IEEE 802.3` ed opera a livello data-link nelle reti cablate. Di seguito si descrive la struttura tipica di un frame Ethernet:
![frame-structure](/asset/img/frame-structure.png)
## Struttura del Frame
L'ethernet frame è composto da tre parti principali: header, payload e trailer. La dimensione totale di un frame Ethernet standard varia da un minimo di 64 byte a un massimo di 1518 byte.
### Header
- L'header include gli indirizzi MAC di origine e destinazione, che identificano rispettivamente il dispositivo mittente e quello ricevente all'interno della rete locale
- **Type/Length**: questo campo può avere doppia funzione:
- Puó indicare la lunghezza del payload
- Tramite un valore esadecimale, identifica il tipo di protocollo utilizzato per generare il payload (ad esempio, 0x0800 equivale a IPv4).
### Payload
Il payload (*Data & Padding*) contiene i dati provenienti dal livello di rete (network layer).
- Il payload ha una dimensione massima di 1500 byte, nota come `MTU` (Maximum Transfer Unit)
- Se il payload non raggiunge la dimensione minima di 46 byte, viene applicato un padding per garantire la corretta dimensione minima del frame
- Nel caso in cui il payload del livello di rete superi lMTU, esso viene frammentato in più pacchetti per poter essere correttamente incapsulato nei frame Ethernet.
### Trailer
- **FCS** (Frame Check Sequence): il trailer termina il frame con un campo di 4 byte, il cui scopo è la verifica dellintegrità dei dati trasmessi.
![frame-structure-example](/asset/img/frame-structure-example.png)

View File

@ -0,0 +1,60 @@
# Architettura wireless
L'architettura wireless è dominata dallo standard `IEEE 802.11`, che consente la comunicazione senza fili tra dispositivi. In un contesto di rete locale (LAN), è comune che una componente cablata venga estesa attraverso l'uso di `Access Point` (AP), permettendo così ai dispositivi di connettersi in modalità wireless. Le informazioni vengono trasmesse tramite onde radio, consentendo una maggiore flessibilità e mobilità.
Esistono due principali tipologie di infrastruttura wireless:
- `Ad Hoc (IBSS - Independent Basic Service Set)`: questa configurazione consiste in un insieme di dispositivi opportunamente configurati per comunicare direttamente tra loro tramite le loro schede wireless. Si tratta di una rete peer-to-peer, in cui ogni nodo funge sia da server che da client, permettendo una comunicazione diretta senza la necessità di un punto di accesso centrale.
- `Wireless LAN con Infrastruttura`: in questo modello, l'Access Point funge da punto di coordinamento centrale. L'AP consente la comunicazione tra più dispositivi wireless, noti anche come stazioni o terminali wireless.
![Architettura Wireless](/asset/img/wireless%20architecture.png)
## Concetti chiave
- Il `BSS` (Basic Service Set) rappresenta il gruppo di dispositivi che comunicano tra loro all'interno di una rete wireless. Ogni BSS è identificato da un `BSSID` (Basic Service Set Identifier), che è l'indirizzo MAC dell'Access Point nel caso di un BSS con infrastruttura, o l'indirizzo MAC di uno dei dispositivi nel caso di un BSS Ad Hoc.
- `SSID` (Service Set Identifier): è un identificativo logico della rete, facile da ricordare, che consente agli utenti di riconoscere e connettersi alla rete wireless desiderata.
- `ESSID` (Extended Service Set Identifier) è un'estensione del SSID, utilizzata per identificare reti wireless più ampie che possono includere più Access Point, garantendo una connessione continua e senza interruzioni per gli utenti in movimento.
- `Roaming`: è una funzionalità fondamentale delle reti wireless che consente ai dispositivi di spostarsi automaticamente da un Access Point (AP) a un altro senza interruzioni nella connessione. Quando un dispositivo wireless si allontana dall'AP a cui è attualmente connesso e entra nella copertura di un altro AP, il processo di roaming avviene in modo fluido e automatico. Questo implica la deautenticazione dal primo AP e l'autenticazione sul secondo AP, garantendo così una continuità del servizio.
- `DS` (Distributed System): consente la comunicazione tra dispositivi, sia wireless che cablati, al di fuori del singolo Basic Service Set (BSS). In un sistema distribuito, gli Access Point possono comunicare tra loro e con altri dispositivi (anche non wireless), consentendo una rete più ampia e complessa.
Gli *Access Point* svolgono un ruolo cruciale nella traduzione dei frame di rete. Sono in grado di convertire gli header degli ethernet frame in wireless frame e viceversa. Questo processo di traduzione è fondamentale per garantire che i dati possano essere trasmessi correttamente tra dispositivi cablati e wireless.
## Anatomia del Wireless Frame
![Wireless Frame](/asset/img/wireless-frame.png)
É composto da diversi campi, ognuno con funzioni specifiche. Di seguito sono descritti i principali componenti di un wireless frame:
### Frame Control
Il campo `Frame Control` occupa due byte e contiene numerosi sottocampi, tra cui:
- **Version**: indica la versione dello standard IEEE 802.11 utilizzato per il frame
- **Type e Subtype**: questi campi specificano il tipo e il sottotipo del frame. Esistono tre categorie principali di frame:
- **Gestione** (Type 00): Utilizzato per le comunicazioni iniziali tra l'Access Point (AP) e i dispositivi wireless
- **Controllo** (Type 01): Questo tipo si suddivide ulteriormente in:
- **Frame RTS** (Request to Send): Sottotipo 1011
- **Frame CTS** (Clear to Send): Sottotipo 1100
- **Frame ACK** (Acknowledgment): Sottotipo 1101
- **Dati** (Type 02): Questo tipo di frame trasporta i dati effettivi
- **ToDS/FromDS**: i bit ToDS e FromDS indicano la direzione del frame rispetto al Distribution System (DS). Le varie combinazioni sono le seguenti:
- **ToDS = 0** e **FromDS = 0**: il frame non è destinato a un DS e non proviene da esso. Ci troviamo dunque all'interno dello stesso BSS (Basic Service Set) e il frame viene scambiato direttamente tra stazioni wireless dello stesso BSS
- **ToDS = 0** e **FromDS = 1**: il frame proviene da un DS. Questo scenario si verifica ad esempio quando un frame viene inoltrato dal DS fino a una stazione finale.
- **ToDS = 1** e **FromDS = 0**: il frame è destinato al DS, il che significa che la stazione sorgente si trova all'interno del BSS e il frame deve essere trasmesso verso il DS per raggiungere una stazione esterna al BSS
- **ToDS = 1** e **FromDS = 1**: ciò accade quando un frame viene trasmesso tra stazioni appartenenti a BSS differenti. La comunicazione, in questo caso, sfrutta il DS come ponte fra i due BSS
### Sequence Control
Contiene due sottocampi:
- `Fragment Number`: indica il numero di frammento del frame corrente. Quando un pacchetto di dati è troppo grande per essere trasmesso in un'unica volta, viene frammentato, e ogni frammento è identificato dal suo numero. Questo è essenziale per il destinatario, che utilizza il fragment number per ricostruire il pacchetto originale.
- `Sequence Number`: indica il numero di sequenza del frame corrente. Questo campo è fondamentale per garantire che i frame vengano trasmessi e ricevuti nell'ordine corretto.
### Data
Il campo **Data** rappresenta il payload incapsulato dal livello di rete.
### Trailer
**FCS** (Frame Check Sequence): il trailer termina il frame con un campo di 4 byte, il cui scopo è la verifica dellintegrità dei dati trasmessi.

36
networking/006-csmaca.md Normal file
View File

@ -0,0 +1,36 @@
# CSMA/CA
`CSMA/CA` (*Carrier Sense Multiple Access with Collision Avoidance* ovvero accesso multiplo tramite rilevamento della portante con prevenzione delle collisioni) è un meccanismo che, mediante il rilevamento della portante (o mezzo trasmissivo), previene le collisioni nelle trasmissioni wireless.
Nelle reti wireless, i dati vengono trasmessi tramite onde radio che viaggiano nell'aria. Poiché l'aria è un mezzo condiviso da più stazioni, le trasmissioni simultanee possono causare collisioni e perdita di informazioni. Il meccanismo di Collision Avoidance (prevenzione delle collisioni) cerca di ridurre tale rischio. Infatti, le stazioni wireless utilizzano la tecnica del Carrier Sense per ascoltare il canale trasmissivo - verificare quindi se ci sono attività sulla portante - prima di trasmettere i dati.
Uno dei problemi intrinseci nelle reti wireless è l'effetto dell'*hidden terminal*. Questo fenomeno si verifica quando un host può rilevare l'attività solo nel proprio raggio d'azione, ignorando le trasmissioni di altri host situati fuori dalla sua portata.
## Componenti e Tempi di Attesa
Nel meccanismo CSMA/CA intervengono alcuni intervalli temporali fondamentali:
- **DIFS** (Distributed Interframe Space): in questo intervallo di tempo la stazione attende per assicurarsi che il canale sia libero prima di trasmettere
- **SIFS** (Short Interframe Space): é un intervallo di attesa più breve rispetto al DIFS
Durante questi intervalli, le stazioni effettuano il Carrier Sense per verificare l'assenza di trasmissioni attive prima di iniziare la propria trasmissione.
## Frame di Controllo
Oltre a trasmettere dati, le stazioni utilizzano specifici frame di controllo per coordinare le trasmissioni e ridurre le collisioni:
- **RTS** (Request to Send): il mittente invia questo frame per richiedere l'autorizzazione a trasmettere
- **CTS** (Clear to Send): il destinatario risponde col frame CTS, confermando la ricezione dell'RTS e notificando alle altre stazioni di sospendere le trasmissioni per un periodo definito, evitando così interferenze
- **ACK** (Acknowledge): una volta ricevuti correttamente i dati, il destinatario invia un frame ACK per confermare la ricezione
Questi frame contengono un campo chiamato "duration", che imposta il timer **NAV** (Network Allocation Vector). Il NAV è un ulteriore meccanismo di controllo che indica alle altre stazioni per quanto tempo il canale risulterà occupato.
## Sequenza di Trasmissione
1. La stazione A attende un intervallo DIFS durante il quale ascolta il canale (Carrier Sense) per verificare che non ci siano trasmissioni in corso
2. Se il canale risulta libero, A invia un frame RTS per richiedere la trasmissione
3. La stazione B, destinataria, attende un breve intervallo SIFS e risponde con un frame CTS, confermando la disponibilità a ricevere e notificando agli altri dispositivi di non interferire per un tempo prestabilito (impostato dal NAV)
4. Dopo un ulteriore intervallo SIFS, la stazione A procede con l'invio dei dati
5. Al termine della trasmissione, B attende ancora un tempo SIFS e invia un frame ACK a tutte le stazioni per segnalare la corretta ricezione dei dati e la fine della trasmissione
Questa procedura consente di ridurre al minimo le collisioni, garantendo una trasmissione più ordinata ed efficiente nel mezzo condiviso.

View File

@ -0,0 +1,35 @@
# Hub e Switch
## Hub
L'hub è uno dei primi dispositivi utilizzati per consentire la comunicazione a livello di LAN tra gli host. É noto anche con il termine *ripetitore*, poiché opera in maniera non intelligente: non tiene traccia degli indirizzi MAC degli host connessi e quindi inoltra ogni frame in arrivo a tutte le porte, ad eccezione di quella da cui proviene il frame. In altre parole, il traffico viene trasmesso in broadcast, indipendentemente dal destinatario.
![hub](asset/img/hub.png)
É molto inefficiente e tende a sovraccaricare inutilmente la rete, inondandola di pacchetti.
## Half-Duplex e Full-Duplex Logic
Nella modalità `half-duplex` un dispositivo può o trasmettere o ricevere informazioni in un determinato istante. Ciò significa che la comunicazione avviene in un'unica direzione alla volta, rendendo necessario alternare le modalità di invio e ricezione.
Con la modalità `full-duplex`, il dispositivo è in grado di inviare e ricevere informazioni contemporaneamente. Ció consente una comunicazione bidirezionale continua, aumentando l'efficienza e riducendo la possibilità di collisioni.
Gli hub supportano solo la modalità half-duplex, il che significa che in ogni istante possono trasmettere o ricevere dati, ma non entrambe le operazioni contemporaneamente.
## Switch
Lo switch è un dispositivo molto potente grazie alla sua MAC Address Table, che consente di associare ogni indirizzo MAC a una specifica porta fisica alla quale è collegato il cavo di rete.
![mac-address-table](asset/img/mac-address-table.png)
Il funzionamento dello switch è basato su un meccanismo di learning: quando riceve un pacchetto, lo switch analizza il MAC address sorgente e aggiorna la sua tabella, associandolo alla porta di ingresso. In questo modo, lo switch *impara* quali dispositivi sono collegati a quale porta e può inoltrare i frame in modo mirato.
Nel caso in cui il MAC address di destinazione non sia presente nella tabella, lo switch invia il frame a tutte le porte in broadcast, comportandosi come un hub, fino a quando non avrà appreso la corretta associazione.
Lo switch supporta sia la modalità half-duplex che full-duplex, offrendo così una comunicazione più efficiente.
## Indirizzamento
- **Unicast**: comunicazione diretta e precisa tra due dispositivi. Ad esempio, il dispositivo A invia un messaggio specifico al dispositivo B
- **Multicast**: comunicazione indirizzata a un gruppo selezionato di dispositivi. Il dispositivo A trasmette informazioni solo ai membri di un determinato gruppo di destinazione
- **Broadcast**: comunicazione che raggiunge tutti i dispositivi all'interno della stessa LAN

15
networking/008-arp.md Normal file
View File

@ -0,0 +1,15 @@
# Il protocollo ARP
Il protocollo `Address Resolution Protocol` (`ARP`) opera a livello di rete (layer 3) e ha il compito di associare un indirizzo IP a un indirizzo MAC. Conoscendo il MAC di destinazione, un host può infatti costruire il frame appropriato (layer 2) per inoltrare i dati sulla rete.
Ogni computer mantiene una ARP cache table, ovvero una memoria temporanea che memorizza le associazioni già note. Quando un host deve comunicare con un altro dispositivo, verifica innanzitutto se l'associazione IP-MAC è presente nella propria ARP cache; in caso contrario, viene utilizzato il protocollo ARP per determinare l'indirizzo MAC corrispondente all'IP di destinazione. L'ARP request viene inoltrata in broadcast a tutti i dispositivi raggiungibili nella LAN. Gli host che non sono associati all'IP target ignorano la richiesta, mentre il computer in possesso dell'indirizzo IP richiesto risponde inviando un ARP response in modalità unicast, indirizzata direttamente all'host che ha originato la richiesta.
In Linux, il comando per vedere la ARP cache table é `ip neighbour` o `ip n`:
```bash
ip neighbour
192.168.0.1 dev wlp4s0 lladdr 10:3c:59:c3:ec:73 REACHABLE
192.168.0.200 dev wlp4s0 lladdr 6a:f8:b0:92:ea:94 STALE
192.168.0.42 dev wlp4s0 lladdr 84:2a:fd:f2:d7:12 STALE
192.168.0.97 dev wlp4s0 lladdr 4e:a0:f9:eb:c5:63 STALE
```

View File

@ -0,0 +1,66 @@
# Network Address
## Netmask (Wildcard)
La `netmask`, o maschera di rete, è un modo alternativo di rappresentare il CIDR (Classless Inter-Domain Routing) ed è comunemente utilizzata nella configurazione degli apparati di rete. Essa serve a indicare, dato un indirizzo IPv4, quanti bit sono destinati al prefisso (identificazione della rete) e quanti al suffisso (identificazione di un host all'interno della rete). La netmask è un indirizzo IPv4 a 32 bit in cui i primi n bit (dove n viene indicato nel CIDR, ad esempio /24) sono impostati a 1.
Esempio di netmask per /24:
```txt
11111111.11111111.11111111.00000000
255.255.255.0
```
La `wildcard` è il complemento della netmask. Per una netmask di /24, la wildcard corrispondente è:
```txt
/24
255.255.255.0
0.0.0.255
```
L'indirizzo di rete (`Network Address`) è l'indirizzo che identifica una rete o una subnet, fungendo da identificatore rappresentativo. Il primo indirizzo IP di un range è il network address.
## Broadcast Address
L'ultimo indirizzo del range è il broadcast address, anch'esso non assegnabile a un host. Questo indirizzo speciale consente di inviare pacchetti a tutti gli host della rete contemporaneamente.
## Default Gateway
Il default gateway è l'indirizzo che consente agli host all'interno di una rete di comunicare con router e inviare pacchetti verso altre reti. Esso funge da punto di accesso per l'instradamento del traffico.
## Esempio di Indirizzo di Rete
Consideriamo l'indirizzo IP 192.168.13.122/27. In questo caso, i primi 27 bit sono fissi, mentre i rimanenti 5 bit sono variabili. Solo 30 indirizzi sono utilizzabili per gli host.
```txt
# Rappresentazione binaria dell'indirizzo
11000000.10101000.00001101.01111010
```
- I primi 27 bit (11000000.10101000.00001101.011) sono fissi.
- Gli ultimi 5 bit (11010) sono variabili.
Per ottenere il network address, impostiamo gli ultimi 5 bit a 0:
```txt
11000000.10101000.00001101.01100000 (192.168.13.96)
```
Per ottenere il broadcast address, impostiamo gli ultimi 5 bit a 1:
```txt
11000000.10101000.00001101.01111111 (192.168.13.127)
```
La netmask per /27 ha i primi 27 bit impostati a 1 e i restanti a 0:
```txt
255.255.255.224
```
Il complemento della netmask, ovvero la wildcard, è:
```txt
0.0.0.31
```

29
networking/010-nat.md Normal file
View File

@ -0,0 +1,29 @@
# IPv4 e NAT/PAT
## Differenza tra IP Pubblici e Privati
Gli indirizzi IP pubblici e privati hanno ruoli distinti nella comunicazione di rete. Un IP pubblico consente a un dispositivo di uscire da una rete locale (LAN) e comunicare con altre reti globali. Al contrario, un IP privato non è univoco a livello globale e viene utilizzato all'interno di una LAN. Gli indirizzi IP privati sono riservati per l'uso interno e non possono essere instradati su Internet.
## Limitazioni di IPv4
Il protocollo IPv4 consente un massimo di 2^32 indirizzi, che corrisponde a circa 4 miliardi di possibili combinazioni. Questo numero, sebbene sembri elevato, è limitato a livello globale e ha portato a preoccupazioni riguardo l'esaurimento degli indirizzi IPv4. La soluzione definitiva a questo problema è la transizione a IPv6, che offre un numero praticamente illimitato di indirizzi (2^128). Tuttavia, la transizione a IPv6 è lenta e complessa.
Una soluzione temporanea, che non risolve definitivamente il problema ma ne attenua gli effetti, è la distinzione tra indirizzi IPv4 pubblici e privati. Gli indirizzi IP privati consentono la comunicazione all'interno di reti locali, mentre il Network Address Translation (NAT) è il meccanismo che consente di associare indirizzi IP privati a un indirizzo IP pubblico. Questo approccio consente di risparmiare sull'uso degli indirizzi IP, poiché diverse reti possono utilizzare gli stessi indirizzi IP privati, ma solo un singolo indirizzo IP pubblico per comunicare con l'esterno.
## Tipi di NAT
Il NAT classico è un processo gestito dai router e consiste nella traduzione degli indirizzi IP privati in pubblii (e viceversa). Esistono due principali varianti di NAT:
- **NAT Statico**: In questo caso, l'amministratore di rete configura manualmente il router per associare un determinato indirizzo IP privato a un indirizzo IP pubblico specifico
- **NAT Dinamico**: Questa variante offre un maggiore automatismo, utilizzando un pool di indirizzi IP pubblici. Quando un dispositivo interno richiede accesso a Internet, il router assegna dinamicamente un indirizzo IP pubblico disponibile dal pool
Con il NAT classico, un host deve attendere il proprio turno per comunicare. Quando un dispositivo all'interno della LAN invia un pacchetto verso Internet, il router traduce l'indirizzo IP privato del dispositivo in un indirizzo IP pubblico. Tuttavia, se più dispositivi tentano di comunicare contemporaneamente utilizzando lo stesso indirizzo IP pubblico, il router deve tenere traccia di quale pacchetto appartiene a quale dispositivo.
Nel NAT classico, non esiste un meccanismo per identificare univocamente i pacchetti provenienti da diversi dispositivi che utilizzano lo stesso indirizzo IP pubblico. Senza un sistema di identificazione univoca, il router potrebbe confondersi nel determinare quale pacchetto di risposta inviare a quale dispositivo.
## NAT/PAT
Per migliorare l'efficienza del NAT, si utilizza il Port Address Translation (PAT). L'associazione tra indirizzo IP e porta consente di identificare univocamente ciascun dispositivo, evitando la necessità di turni per l'uso dell'indirizzo IP pubblico.
Il PAT viene sempre implementato a livello del router, che mantiene una tabella di NAT contenente ogni associazione univoca. Quando un pacchetto di risposta ritorna, il router utilizza questa tabella per inviare il pacchetto al dispositivo corretto, effettuando la traduzione inversa dell'indirizzo.

30
networking/011-vlan.md Normal file
View File

@ -0,0 +1,30 @@
# VLAN
Gli host all'interno della stessa rete locale possono comunicare tra loro grazie a dispositivi di rete di livello 2, come switch, hub e AP.
Le VLAN (Virtual Local Area Network) sono utilizzate per partizionare e segmentare una rete locale, creando diverse sottoreti logiche. Questo approccio offre numerosi vantaggi, principalmente in termini di sicurezza: separando le reti, si isolano le comunicazioni tra i vari dispositivi, creando ambienti distinti.
Inoltre, le VLAN permettono di implementare politiche di sicurezza più granulari e specifiche attraverso l'uso di firewall, che possono applicare regole di traffico diverse tra le varie VLAN.
Sebbene sia possibile ottenere una segmentazione simile senza l'uso delle VLAN, utilizzando più dispositivi fisici come switch, l'adozione delle VLAN consente di raggiungere gli stessi obiettivi a livello software, riducendo i costi e semplificando la gestione della rete.
Per assegnare i membri a una VLAN, si configurano le porte dello switch. Assegnando le porte a specifiche VLAN, si realizza la segmentazione desiderata.
## Configurazione VLAN Switch CISCO
Ad esempio, per configurare le interfacce 1 e 2 di uno switch nella VLAN 10
```txt
switch> ena
switch# conf t
switch(config)# interface range fastEthernet0/1-2
switch(if-range)# switchport mode access
switch(if-range)# switchport access vlan 10
switch(if-range)# end
switch# show vlan brief # Visualizza un riepilogo della configurazione VLAN
switch# write
```
È importante notare che esiste sempre una VLAN nativa, la VLAN 1, che per impostazione predefinita include tutte le interfacce dello switch.
Dopo aver creato le VLAN, è necessario procedere con la segmentazione delle reti, ovvero il subnetting. Per consentire la comunicazione tra due o più reti distinte, è necessario utilizzare dispositivi di livello 3, come i router. Questi dispositivi sono responsabili dell'instradamento del traffico tra le VLAN, garantendo che i pacchetti possano viaggiare tra le diverse sottoreti.

View File

@ -0,0 +1,16 @@
# Loop Layer 2
Il protocollo Spanning Tree (STP) è fondamentale per prevenire i loop a livello rete. La necessità di STP nasce dall'esigenza di garantire la ridondanza all'interno delle reti. La ridondanza si riferisce alla presenza di più copie o istanze di un elemento, il che è cruciale per assicurare la disponibilità (availability) dei servizi. In altre parole, avere più percorsi per raggiungere lo stesso obiettivo significa che, se uno di questi percorsi si guasta, la rete può continuare a funzionare senza interruzioni.
Tuttavia, la ridondanza può anche introdurre problemi, come i *broadcast storm*. Questi problemi si verificano a causa del modo in cui gli switch gestiscono il traffico. Quando uno switch riceve un pacchetto destinato a un MAC address che non conosce, non avendo una corrispondenza nella MAC address table, lo inoltra in broadcast su tutte le sue interfaccie, tranne quella da cui è arrivato.
Se ci sono loop nella rete, il pacchetto di broadcast può circolare indefinitamente tra gli switch.
1. **Inoltro del pacchetto**: supponiamo che uno switch A riceva un pacchetto destinato a un MAC address sconosciuto. Inoltra il pacchetto a tutti gli switch collegati, inclusi switch B e C
2. **Ritorno del pacchetto**: switch B riceve il pacchetto e, non conoscendo il MAC address di destinazione, lo inoltra a tutti gli switch, incluso switch A. Allo stesso modo, switch C riceve il pacchetto e lo inoltra a switch A e B
3. **Circolazione continua**: questo processo continua, con il pacchetto che rimbalza tra gli switch senza mai raggiungere una destinazione finale. Ogni switch continua a inoltrare il pacchetto a tutte le porte, generando così copie multiple dello stesso pacchetto
4. **Saturazione della rete**: man mano che il pacchetto circola, il numero di copie aumenta esponenzialmente. Ogni switch genera ulteriori copie del pacchetto, saturando la rete
Per prevenire questo tipo di situazione, il protocollo Spanning Tree (STP) viene utilizzato per identificare e disabilitare i percorsi ridondanti che possono causare loop. STP crea una topologia di rete logica priva di loop, mantenendo attivi solo i percorsi necessari per la comunicazione e garantendo così la stabilità e l'affidabilità della rete.
Negli switch moderni, STP è abilitato di default, offrendo una protezione automatica contro i loop e contribuendo a mantenere la stabilità e l'affidabilità della rete.

17
networking/013-stp.md Normal file
View File

@ -0,0 +1,17 @@
# Spanning Tree Protocol (STP)
Lo Spanning Tree Protocol (STP) è un protocollo di livello 2 progettato per creare una topologia virtuale priva di loop, mantenendo invariata la topologia fisica della rete.
In un grafo connesso, i nodi sono interconnessi tramite il massimo numero di archi, garantendo che tutti i nodi siano correttamente collegati tra loro. Con l'implementazione dello spanning tree, gli archi vengono ridotti al numero minimo necessario per mantenere la connettività tra i nodi, creando così una struttura loop-free.
## Standard IEEE 802.1D
Il protocollo STP è definito dallo standard IEEE 802.1D e opera secondo i seguenti passaggi:
1. **Elezione del Root Bridge**: tra gli switch interconnessi, viene eletto un *root bridge*, che funge da punto centrale di riferimento per la rete. Ogni switch ha un Bridge ID (BID) di 8 byte, composto da 2 byte per il campo di priorità (priority field) e 6 byte per l'indirizzo MAC. Il root bridge è scelto in base al valore più basso del campo di priorità; in caso di parità, viene selezionato lo switch con l'indirizzo MAC più basso
2. Ogni switch non root bridge calcola il percorso a minor costo per raggiungere il root bridge, garantendo che i dati seguano il percorso più efficiente.
3. **Blocco dei Link Inutilizzati**: STP identifica e disabilita i link non necessari, mantenendo attivi solo quelli essenziali per la comunicazione. I link bloccati rimangono in uno stato di standby e possono essere attivati automaticamente in caso di guasto di un link attivo, garantendo così la ridondanza e la resilienza della rete.
Grazie a questi meccanismi, STP previene la formazione di loop e assicura una comunicazione stabile e affidabile all'interno della rete.
Il comando `show spanning-tree` è utilizzato sugli switch Cisco per visualizzare informazioni dettagliate sulla configurazione e lo stato del protocollo Spanning Tree (STP) attivo. Questo comando fornisce una panoramica della topologia STP, inclusi dettagli sul root bridge, i costi dei percorsi, le porte e il loro stato (ad esempio, forwarding o blocking).

View File

@ -0,0 +1,70 @@
# Router
Il livello 2 del modello ISO/OSI, noto come livello di collegamento dati, consente la comunicazione all'interno di una rete locale (LAN). Tuttavia, per comunicare tra segmenti di rete diversi, è necessario utilizzare dispositivi di rete operanti al livello 3, come i router o i multi-layer switch. Questi dispositivi sono in grado di instradare i pacchetti di dati tra reti diverse, gestendo indirizzi IP e determinando il percorso migliore per il trasferimento delle informazioni.
## Routing dei pacchetti
Un pacchetto può seguire diversi percorsi per raggiungere una destinazione esterna. Questo implica un processo di selezione e instradamento dei pacchetti, noto come `routing`, che consiste nel determinare il percorso più appropriato, passo dopo passo, per arrivare a destinazione.
Le rotte sono necessarie quando ci sono più router coinvolti, poiché in tal caso esistono differenti percorsi che i pacchetti possono seguire per raggiungere la loro destinazione.
Esistono algoritmi di routing che gestiscono l'instradamento dinamico dei pacchetti, adattandosi alle variazioni della rete in tempo reale. In alternativa, è possibile configurare rotte statiche, che rimangono fisse e non si adattano automaticamente alle condizioni della rete.
### Rotte statiche
#### Linux
Per visualizzare le rotte attive:
```bash
ip route
```
Per aggiungere una rotta statica:
```bash
ip route add destination_network/cidr via gateway
ip route add 10.10.1.0/24 via 192.168.0.195
```
#### Windows
Per visualizzare le rotte attive:
```cmd
route print
```
Per aggiungere una rotta statica:
```cmd
route add destination_network MASK subnet_mask gateway
route add 192.168.35.0 MASK 255.255.255.0 192.168.0.2
```
Per eliminare una rotta statica:
```cmd
route delete destination_network
```
#### Switch Layer 3
Per assegnare un indirizzo IP ad un'interfaccia:
```txt
switch> ena
switch# conf t
switch(config)# interface g0/1
switch(config-if)# ip address 192.168.2.1 255.255.255.0
switch(config-if)# no shut
```
Per aggiungere una rotta statica:
```txt
ip route destination_network subnet_mask next_hop
switch(config-if)# ip route 192.168.3.0 255.255.255.0 192.168.2.1
```

View File

@ -0,0 +1,18 @@
# Transport Layer
Al livello 4 del modello ISO/OSI, detto ``Transport Layer``, troviamo diversi protocolli, tra cui `UDP`, `TCP` e `QUIC`, che rappresenta un ibrido tra i primi due.
Nel livello 4, si crea un vero e proprio ponte tra due host che desiderano comunicare. Tuttavia, il canale di comunicazione non è direttamente tra l'host A e l'host B, ma piuttosto tra un processo specifico dell'host A e un processo remoto dell'host B.
Per identificare in modo univoco un processo, si utilizza l'associazione tra indirizzi IP e porte, che vanno da 0 a 65.535 (2^16-1). In questo contesto, si parla di `socket`, che permettono l'uso dello stack protocollare e l'inizio della comunicazione. Possono essere definiti come una coppia di indirizzo IP e numero di porta.
Esistono due tipi di socket:
- **locali**: utilizzati all'interno di un singolo host
- **remoti**: utilizzati per comunicare con processi su host diversi
La IANA (Internet Assigned Numbers Authority) ha definito una suddivisione delle 65.535 porte:
- **Well-known ports** (0-1023): porte associate a servizi noti, ad esempio la porta 80 per HTTP
- **Registered ports** (1024-49151): porte associate a servizi registrati, come la porta 3389 per RDP o la porta 1194 per OpenVPN
- **Free ports** (49152-65535): porte rimanenti, non associate a servizi specifici, utilizzate per comunicazioni temporanee o dinamiche

33
networking/016-ipv4.md Normal file
View File

@ -0,0 +1,33 @@
# IPv4
IPv4 è uno dei protocolli del network layer e definisce il formato degli indirizzi per la comunicazione tra host. In sostanza, l'IP serve come meccanismo di indirizzamento dei pacchetti, permettendo di identificare univocamente ogni host all'interno di una rete.
## Anatomia del pacchetto IPv4
![ipv4](asset/img/ipv4.png)
Il datagramma o pacchetto IPv4 è composto da due parti principali:
- L'*header*, che contiene le informazioni di controllo e indirizzamento
- Il payload, ossia i dati che vengono incapsulati all'interno del pacchetto
L'header ha una dimensione minima di 20 byte e può estendersi fino a 60 byte, includendo diversi campi importanti, quali:
- `Version`: specifica la versione del protocollo IP
- `Source Address`: l'indirizzo IP del mittente, lungo 32 bit
- `Destination Address`: l'indirizzo IP del destinatario, anch'esso lungo 32 bit
- `Time to Live (TTL)`: campo di 8 bit che rappresenta il *tempo di vita* del pacchetto. Ad ogni passaggio (hop) tra router, il valore del TTL viene decrementato di uno. Quando il TTL raggiunge zero, il pacchetto viene scartato, evitando così che rimanga indefinitamente nella rete in caso di un errore di instradamento. Nel momento in cui un router scarta il pacchetto, ciò può generare un ICMP error message per informare il mittente
- `Protocol`: un codice che indica il protocollo utilizzato per la parte dati incapsulata. Alcuni esempi:
- ICMP: codice 1
- TCP: codice 6
- UDP: codice 17
- EIGMP: codice 88
- L2TP: codice 115
## IPv4 Fragmentation
Il livello di data link ha un limite dimensionale noto come `MTU` (`Maximum Transmission Unit`), che di norma è fissato a 1500 byte. Questo significa che il payload che deve essere incapsulato nel livello data link non può superare i 1500 byte. È importante notare che il valore della MTU può essere configurato a livello di switch o router.
Quando si devono inviare dati che superano il limite della MTU, entra in gioco il processo di *frammentazione*. Durante questo processo, i dati vengono suddivisi in pacchetti più piccoli, noti come frammenti, ciascuno dei quali include header IP originario, che contengono informazioni cruciali per l'instradamento e la ricostruzione dei pacchetti.
Ogni frammento è identificato da un campo `Identifier`, che consente di raggruppare i frammenti appartenenti allo stesso datagramma originale. Inoltre, il campo `Fragment Offset` indica la posizione di ciascun frammento all'interno del datagramma originale, permettendo al destinatario di ricostruire correttamente l'ordine dei dati.

2
networking/README.md Normal file
View File

@ -0,0 +1,2 @@
# networking

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB