\chapter{Introduzione alla rete}

In questo capitolo sarà fatta un'introduzione ai contetti generali che
servono come prerequisiti per capire ed
esamineremo a grandi linee i protocolli di rete e come questi sono organizzati
e interagiscono.


\section{I protocolli di rete}
\label{sec:layer}

Parlando di reti di computer si parla in genere di un insieme molto vasto ed
eterogeneo di mezzi di comunicazione che vanno dal cavo telefonico, alla
fibra ottica, alle comunicazioni via satellite; per rendere possibile la
comunicazione attraverso un così variegato insieme di mezzi sono stati
adottati una serie di protocolli, il più famoso dei quali, quello alla base
del funzionamento di internet, é il cosiddetto TCP/IP.

\subsection{Il modello ISO/OSI}
\label{sec:iso_osi}

Una caratteristica comune dei protocolli di rete è il loro essere strutturati
in livelli sovrapposti; in questo modo un livello superiore esegue richieste
al livello sottostante e da questo riceve responsi, mentre livelli uguali su
macchine diverse conversano tramite lo stesso protocollo. Questo modello di
funzionamento è stato stato standardizzato dalla International Standards
Organization (ISO) che ha preparato fin dal 1984 il Modello di Riferimento
Open Systems Interconnection (OSI), strutturato in a sette livelli, secondo la
tabella in \ntab.

\begin{table}[htb]
  \centering
  \begin{tabular}{l c c l} 
    \textbf{Livello} & \multicolumn{2}{c}{\textbf{Nome}} & \\
    \hline
    Livello 7&\textit{Application} &\textsl{Applicazione}& \\ 
    Livello 6&\textit{Presentation} &\textsl{Presentazione}& \\ 
    Livello 5&\textit{Session} &\textsl{Sessione}& \\ 
    Livello 4&\textit{Transport} &\textsl{Trasporto}& \\ 
    Livello 3&\textit{Network} &\textsl{Rete}&   \\ 
    Livello 2&\textit{DataLink} &\textsl{Collegamento Dati}& \\
    Livello 1&\textit{Connection} &\textsl{Connessione Fisica}& \\
    \hline
\end{tabular}
\caption{I sette livelli del protocollo ISO/OSI.}
\label{tab:osilayers}
\end{table}

Il modello ISO/OSI è stato sviluppato corrispondentemente alla definizione
della serie di protocolli X.25 per la commutazione di pacchetto. Ma nonostante
il lavoro dettagliato di standardizzazione il modello si è rivelato
sostanzialmente troppo complesso e poco flessibile rispetto a quello,
precedente, su cui si basa TCP/IP che è diventato uno standard de facto;
quest'ultimo viene comunemente chiamato modello DoD (Department of Defense),
dato che fu sviluppato dall'agenzia ARPA per il Dipartimento della Difesa
Americano.

\subsection{Il protocollo TCP/IP}
\label{sec:tcpip_overview}

Così come ISO/OSI anche TCP/IP è stato strutturato in livelli (riassunti in
\ntab); un confronto fra i due è riportato in \nfig dove viene evidenziata
anche la corrispondenza fra i rispettivi livelli (che comunque è
approssimativa) e come essi vanno ad inserirsi all'interno del sistema
operativo, riguardo alla divisione fra user space e kernel space spiegata in
\ref{sec:unix_struct}.

% L'attuale Internent Protocol (IPv4) viene standardizzato nel 1981
% dall'RFC~719; esso nasce per disaccoppiare le applicazioni della struttura
% hardware delle reti di trasmissione, e creare una interfaccia di trasmissione
% dei dati indipendente dal sottostante substrato di rete, che può essere
% realizzato con le tecnologie più disparate (Ethernet, Token Ring, FDDI,
% etc.).

% In realtà IP realizza solo una parte di tutto questo, e fa parte di un
% sistema che va sotto il nome di TCP/IP che è, 
% uno di
% questi, quello responsabile del trasporto dei pacchetti fra le varie reti che
% compongono Internet, è appunto IP.

\begin{table}[htb]
  \centering
  \begin{tabular}{l c c l} 
    \textbf{Livello} & \multicolumn{2}{c}{\textbf{Nome}} & \textbf{Esempi} \\
    \hline
    Livello 1&\textit{Application} &\textsl{Applicazione}& 
    Telnet, FTP, etc. \\ 
    Livello 2&\textit{Transport} &\textsl{Trasporto}& TCP, UDP \\ 
    Livello 3&\textit{Network} &\textsl{Rete}& IP, (ICMP, IGMP)  \\ 
    Livello 4&\textit{Link} &\textsl{Connessione}& 
    device driver \& scheda di interfaccia  \\
    \hline
\end{tabular}
\caption{I quattro livelli del protocollo TPC/IP.}
\label{tab:layers}
\end{table}


Come si può notare TCP/IP è più semplice del modello ISO/OSI e strutturato in
soli quattro livelli. Il suo nome deriva dai due principali protocolli che lo
compongono, il TCP \textit{Trasmission Control Protocol} e l'IP
\textit{Internet Protocol}. Le funzioni dei vari livelli sono le seguenti:

\begin{description}
\item \textbf{Applicazione} É relativo ai programmi di interfaccia utente, in
  genere questi vengono realizzati secondo il modello Client-Server (vedi
  \ref{sec:cliserv}.
\item \textbf{Trasporto} Fornisce la comunicazione tra le due stazioni
  terminali su cui girano gli applicativi, regola il flusso delle
  informazioni, e può fornire un trasporto affidabile, cioè con recupero
  errori. Il protocollo principale di questo livello è il TCP.
\item \textbf{Rete} Si occupa dello smistamento dei singoli pacchetti su una
  rete complessa e interconnessa, a questo stesso livello operano i protocolli
  per il reperimento delle informazioni necessarie allo smistamento, per lo
  scambio di messaggi di controllo e per il monitoraggio della rete. Il
  protocollo su cui si basa questo livello è IP (sia nella attuale versione,
  IPv4 che nella nuova IPv6).
\item \textbf{Connessione} È responsabile per l'interfacciamento al
  dispositivo elettronico che effettua la comunicazione fisica, gestendo
  l'invio e la ricezione dall'hardware dei pacchetti.
\end{description}


La comunicazione fra due stazioni avviene pertanto secondo le modalità
illustrate in \nfig. 

Le singole applicazioni si scambieranno i dati secondo un loro formato
specifico, implementando un protocollo di applicazione (esempi possono essere
HTTP, POP, telnet, SMTP, etc). 

Questi dati vengono inviati al livello di trasporto usando un'interfaccia
opportuna (i \textit{socket}, che esamineremo in dettaglio in seguito), i
quali li spezzerà in pacchetti di dimensione opportuna e li incapsulerà
all'interno del suo protocollo di trasporto aggiungendo ad ogni pacchetto le
informazioni necessarie alla gestione di quest'ultimo. Questo processo viene
svolto dirattamente nel kernel ad esempio dallo stack TCP nel caso il
protocollo di trasporto sia questo.

Una volta composto il pacchetto nel formato adatto al protocollo di trasporto
usato questo sarà passato al successivo livello, quello del collegamento che
si occupa di inserire le opportune informazioni per poter effettuare
l'instradamento nella rete ed il recapito alla destinazione finale. In genere
questo è il livello di IP (Internet Protocol), a cui vengono inseriti i numeri
IP che identificano i computer su internet.

L'ultimo passo è il trasferimento del pacchetto al driver della interfaccia di
trasmissione che si incarica di incapsularlo nel relativo protocollo di
trasmissione fisica usato dall'hardware usato per la comunicazione (ad esempio
ethernet per una scheda di rete).


\subsection{Criteri generali del design di TCP/IP}


La filosofia architetturale di TCP/IP è semplice: costruire una rete che
possa sopportare il carico in transito, ma permettere ai singoli nodi di
scartare pacchetti se il carico è temporaneamente eccessivo, o se risultano
errati o non recapitabili.

L'incarico di rendere il recapito pacchetti affidabile non spetta allo livello
di collegamento, ma ai livelli superiori. Pertanto il protocollo IP è per sua
natura inaffidabile, in quanto non è assicurata né una percentuale di
successo né un limite sui tempi di consegna dei pacchetti.

È il livello di trasporto che si deve occupare (qualora necessiti) del
controllo del flusso dei dati e del recupero degli errori; questo è realizzato
dal protocollo TCP. La sede principale di "intelligenza" della rete è pertanto
al livello di trasporto o superiore.

Infine le singole stazioni collegate alla rete non fungono soltanto da punti
terminali di comunicazione, ma possono anche assumere il ruolo di router, per
l'interscambio di pacchetti da una rete ad un'altra. Questo rende possibile la
flessibilità della rete che è in grado di adattarsi ai mutamenti delle
interconnessioni.

La caratteristica essenziale che rende tutto ciò possibile è la strutturazione
a livelli tramite l'incapsulamento. Ogni pacchetto di dati viene incapsulato
nel formato del livello successivo, fino al livello della connessione fisica.
In questo modo il pacchetto ricevuto ad un livello $n$ dalla stazione di
destinazione è esattamente lo stesso spedito dal livello $n$ dalla sorgente.
Questo rende facile il progettare il software facendo riferimento unicamente a
quanto necessario ad un singolo livello, con la confidenza che questo poi sarà
trattato uniformemente da tutti i nodi della rete.



\section{Il modello client-server}
\label{sec:cliserv}.

La differenza principale fra un'applicazione di rete e un programma normale
è che quest'ultima per definizione concerne la comunicazione fra
``processi'' diversi (che in generale non girano neanche sulla stessa
macchina). Questo già prefigura un cambiamento completo rispetto all'ottica
del ``programma'' monolitico all'interno del quale vengono eseguite tutte le
istruzioni, e presuppone un sistema operativo ``multitasking'' in grado di
eseguire processi diversi.

Il concetto fondamentale si basa la programmazione di rete sotto Linux (e
sotto Unix in generale) è il modello \textit{client-server} in cui un
programma di servizio, il \textit{server} riceve un connessione e risponde a
un programma di utilizzo, il \textit{client}, provvedendo a quest'ultimo un
definito insieme di servizi.

Esempi di questo modello sono il WEB, ftp, telnet, ssh e praticamente ogni
servizio che viene fornito tramite la rete, ma il modello è utilizzato in
generale anche per programmi di uso locale.

Normalmente si dividono i server in due categorie principali,
\textit{concorrenti} e \textit{iterativi}, sulla base del loro comportamento.

Un server iterativo risponde alla richiesta inviando i dati e resta occupato
(non rispondendo ad ulteriori richieste) fintanto che non ha concluso la
richiesta. Una volta completata la richiesta il server diventa di nuovo
disponibile.

Un server concorrente al momento di trattare la richiesta crea un processo
figlio incaricato di fornire i servizi richiesti, per poi porsi in attesa di
ulteriori richieste. In questo modo più richieste possono essere soddisfatte
contemporaneamente, una volta che il processo figlio ha concluso il suo lavoro
viene terminato, mentre il server originale resta sempre attivo.

