# 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)

![osi-protocol](asset/img/osi-protocol.png)

### 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 dell’invio, i dati generati dall’applicazione vengono passati attraverso i vari layer dello stack dell’host 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**:  
   - All’arrivo dell’informazione sull’host B, i dati vengono elaborati seguendo l’ordine inverso rispetto a quello dell’incapsulamento
   - Ogni layer *rimuove (o "spacchetta") le informazioni* (header/trailer) che erano state aggiunte dal corrispondente layer dell’host A
   - In questo modo, l’host B riesce a recuperare i dati originali generati dall’applicazione

L’architettura a strati facilita l’interoperabilità 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.

![osi-parallel](asset/img/osi-parallel.png)
