Iniziato a scrivere su UDP
[gapil.git] / network.tex
index 9206c50451d0c0653c9907516c8cf30c602c0c20..20c49142339b965ba9283990c561ff3a0fa574eb 100644 (file)
@@ -1,32 +1,37 @@
 \chapter{Introduzione alla rete}
+\label{cha:network}
 
-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.
+In questo capitolo sarà fatta un'introduzione ai contetti generali che servono
+come prerequisiti per capire la programmazione di rete ed esamineremo a grandi
+linee i protocolli di rete e come questi sono organizzati e interagiscono.
+
+In particolare, avendo assunto l'ottica di un'introduzione mirata alla
+programmazione di rete, ci concentreremo sul protocollo più diffuso che è
+quello che sta alla base di internet, ed in particolare sulle parti più
+importanti ai fini della programmazione.  
 
 
 \section{I protocolli di rete}
-\label{sec:layer}
+\label{sec:net_protocols}
 
 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
+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.
+del funzionamento di internet, è il cosiddetto TCP/IP.
 
 \subsection{Il modello ISO/OSI}
-\label{sec:iso_osi}
+\label{sec:net_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.
+funzionamento è stato stato standardizzato dalla \textit{International
+  Standards Organization} (ISO) che ha preparato fin dal 1984 il Modello di
+Riferimento \textit{Open Systems Interconnection} (OSI), strutturato in sette
+livelli, secondo la tabella in \ntab.
 
 \begin{table}[htb]
   \centering
@@ -43,7 +48,7 @@ tabella in \ntab.
     \hline
 \end{tabular}
 \caption{I sette livelli del protocollo ISO/OSI.}
-\label{tab:osilayers}
+\label{tab:net_osilayers}
 \end{table}
 
 Il modello ISO/OSI è stato sviluppato corrispondentemente alla definizione
@@ -51,32 +56,19 @@ 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.
+quest'ultimo viene comunemente chiamato modello DoD (\textit{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}
+\subsection{Il modello DoD (TCP/IP)}
+\label{sec:net_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.
+approssimativa) e su come essi vanno ad inserirsi all'interno del sistema
+operativo rispetto alla divisione fra user space e kernel space spiegata in
+\ref{sec:intro_unix_struct}.
 
 \begin{table}[htb]
   \centering
@@ -92,7 +84,7 @@ operativo, riguardo alla divisione fra user space e kernel space spiegata in
     \hline
 \end{tabular}
 \caption{I quattro livelli del protocollo TPC/IP.}
-\label{tab:layers}
+\label{tab:net_layers}
 \end{table}
 
 
@@ -104,7 +96,7 @@ compongono, il TCP \textit{Trasmission Control Protocol} e l'IP
 \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}.
+  \ref{sec:net_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
@@ -150,7 +142,7 @@ ethernet per una scheda di rete).
 
 
 \subsection{Criteri generali del design di TCP/IP}
-
+\label{sec:net_tcpip_design}
 
 La filosofia architetturale di TCP/IP è semplice: costruire una rete che
 possa sopportare il carico in transito, ma permettere ai singoli nodi di
@@ -183,9 +175,165 @@ quanto necessario ad un singolo livello, con la confidenza che questo poi sar
 trattato uniformemente da tutti i nodi della rete.
 
 
+\section{Il protocollo TCP/IP}
+\label{sec:net_tpcip}
+
+Come già affermato il protocollo TCP/IP è un insieme di protocolli diversi,
+che operano su 4 livelli diversi. Per gli interessi della programmazione di
+rete però sono importanti principalmente i due livelli centrali, e soprattutto
+quello di trasporto, su cui è innestata l'interfaccia fra kernel space e user
+space. 
+
+Il livello 4 infatti è normalmente gestito dal kernel, e si accede ad esso
+solo quando si vogliono fare applicazioni di sistema per il controllo della
+rete (locale) a basso livello, un uso quindi molto specialistico. Il livello 1
+invece dipende dalle singole applicazioni ed è di nuovo troppo specifico per
+essere affrontato qui.
+
+\subsection{Il quadro generale}
+
+Benché si parli di TCP/IP questa famiglia di protocolli è composta anche da
+altri membri. In \nfig si è riportato una figura di quadro che mostra un
+panorama sull'intera famiglia, e di come i vari protocolli vengano usati dalle
+applicazioni.
+
+La figura è da fare  ...
+
+I vari protocolli mostrati in figura sono i seguenti:
+
+\begin{list}{}{}
+\item \textsl{IPv4} \textit{Internet Protocol version 4}. È quello che
+  comunemente si chiama IP. Ha origine negli anni '80 e da allora è la base su
+  cui è cotriuta internet. Usa indirizzi a 32 bit e provvede la trasmissione
+  dei pacchetti TCP, UDP, ICMP e IGMP.
+\item \textsl{IPv6} \textit{Internet Protocol version 6}. È stato progettato a
+  metà degli anni '90 per rimpiazzare IPv4. Ha indirizzi a 128 bit e effettua
+  lo stesso servizio di trasporto di IPv4 per i pacchetti TCP, UDP e ICPMv6.
+\item \textsl{TCP} \textit{Trasmission Control Protocol}. È un protocollo
+  orientato alla connessione che provvede un trasporto affidabile e
+  bidirezionale di un flusso di dati. I socket TCP sono esempi di
+  \textit{stream socket}. Il protocollo ha cura di tutti gli aspetti del
+  trasporto, come l'acknoweledgment, i timout, la ritrasmissione, etc. È usato
+  dalla maggior parte delle applicazioni. Può essere usato sia con IPv4 che
+  con IPv6.
+\item \textsl{UDP} \textit{User Datagram Protocol}. È un protocollo senza
+  connessione a pacchetti. I socket UDP sono esempi di \textit{datagram
+    socket}. Contrariamente al TCP in protocollo non è affidabile e non c'è
+  garanzia che i pacchetti raggiungano la loro destinazione, né sull'eventuale
+  ordine di arrivo. Può essere usato sia con IPv4 che con IPv6.
+\item \textsl{ICMP} \textit{Internet Control Message Protocol}. Gestisce gli
+  errori e trasporta l'informazione di controllo fra stazioni remote e
+  instradatori (\textit{router} e \textit{host}). I messaggi sono normalmente
+  generati dal software del kernel che gestisce la comunicazione TCP/IP, anche
+  se può venire usato direttamente da alcuni programmi come \texttt{ping}. A
+  volte ci si riferisce ad esso come ICPMv4 per distinguerlo da ICMPv6.
+\item \textsl{ICMP} \textit{Internet Group Management Protocol}. É un
+  protocollo usato per il \textit{multicasting} (vedi
+  \ref{sec:xxx_multicast}), che è opzionale in IPv4.
+\item \textsl{ARP} \textit{Address Resolution Protocol}. È il protocollo che
+  mappa un indirizzo IP in un indirizzo hardware (come un indirizzo
+  internet). È usato in reti di tipo broadcast come ethernet, token ring o
+  FDDI ma non serve in connessioni punto-punto.
+\item \textsl{RARP} \textit{Reverse Address Resolution Protocol}. È il
+  protocollo che mappa un indirizzo hardware in un indirizzo IP. Viene usato a
+  volte per durante il boot per assegnare un indirizzo IP ad una macchina.
+\item \textsl{ICMPv6} \textit{Internet Control Message Protocol, version 6}.
+  Combina per IPv6 le funzionalità di ICMPv4, IGMP e ARP.
+\item \textsl{NETLINK} \textit{Netlink}.
+  Provvede l'interfaccia di accesso alla comunicazione a basso livello.
+\end{list}
+
+Gran parte delle applicazioni comunicano usando TCP o UDP, ed alcune si
+rifanno ad IP (ed i suoi correlati ICMP e IGMP); benché sia TCP che UDP siano
+basati su IP e sia possibile intervenire a questo livello con i \textit{raw
+  socket} questa tecnica è molto meno diffusa e a parte applicazioni
+particolari si preferisce sempre usare i servizi messi a disposizione dai due
+protocolli precedenti.  Per questo motivo a parte alcuni brevi accenni su IP
+in questa sezione ci concentreremo sul livello di trasporto.
+
+\subsection{Internet Protocol (IP)}
+\label{sec:net_ip}
+
+Quando si parla di IP ci si riferisce in genere alla versione attualmente in
+uso che è la versione 4 (e viene pertanto chiamato IPv4). Questa versione
+venne standardizzata nel 1981 dall'RFC~719.
+
+Internet protocol 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.).
+Il compito di IP è pertanto quello di trasmettere i pacchetti da un computer
+all'altro della rete; le caratteristiche essenziali con cui questo viene
+realizzato in IPv4 sono due:
+
+\begin{itemize}
+\item \textit{Universal addressing} la comunicazione avviene fra due host
+  identificati univocamente con un indirizzo a 32 bit che può appartenere ad
+  una sola interfaccia di rete.
+\item \textit{Best effort} viene assicurato il massimo impegno nella
+  trasmissione, ma non c'è nessuna garanzia per i livelli superiori né sulla
+  percentuale di successo né sul tempo di consegna dei pacchetti di dati.
+\end{itemize}
+
+Negli anni '90 la crescita vertiginosa del numero di macchine connesse a
+internet ha iniziato a far emergere i vari limiti di IPv4, per risolverne i
+problemi si è perciò definita una nuova versione del protocollo, che (saltando
+un numero) è diventata la versione 6. IPv6 nasce quindi come evoluzione di
+IPv4, mantendone inalterate le funzioni che si sono dimostrate valide,
+eliminando quelle inutili e aggiungendone poche altre ponendo al contempo una
+grande attenzione a mantenere il protocollo il più snello e veloce possibile.
+
+I cambiamenti apportati sono comunque notevoli e si possono essere riassunti a
+grandi linee nei seguenti punti:
+\begin{itemize}
+\item l'espansione delle capacità di indirizzamento e instradamento, per
+  supportare una gerarchia con più livelli di indirizzamento, un numero di
+  nodi indirizzabili molto maggiore e una autoconfigurazione degli indirizzi
+\item l'introduzione un nuovo tipo di indirizzamento, l'\textit{anycast} che
+  si aggiungono agli usuali \textit{unycast} e \textit{multicast}
+\item la semplificazione del formato della testata, eliminando o rendendo
+  opzionali alcuni dei campi di IPv4, per eliminare la necessità di
+  riprocessamento della stessa da parte dei router e contenere l'aumento di
+  dimensione dovuto ai nuovi indirizzi
+\item un supporto per le opzioni migliorato, per garantire una trasmissione
+  più efficiente del traffico normale, limiti meno stringenti sulle dimensioni
+  delle opzioni, e la flessibilità necessaria per introdurne di nuove in
+  futuro
+\item il supporto per delle capacità di qualità di servizio (QoS) che permetta
+  di identificare gruppi di dati per i quali si può provvedere un trattamento
+  speciale (in vista dell'uso di internet per applicazioni multimediali e/o
+  ``real-time'')
+\end{itemize}
+
+Per maggiori dettagli riguardo al protocollo si può consultare
+\ref{sec:appA_ip}.
+
+\subsection{UDP: User Datagram Protocol)}
+\label{sec:net_udp}
+
+UDP è un protocollo di trasporto molto semplice, la sua descizione completa è
+contenuta dell'RFC768, ma in sostanza esso è una semplice interfaccia a IP dal
+livello di trasporto. Quando un'applicazione usa UDP essa scrive un pacchetto
+di dati (il cosiddetto \textit{datagram} che da il nome al protocollo) su un
+socket, al pacchetto viene aggiunto un header molto semplice
+(\ref{sec:appA_udp}, e poi viene passato al livello superiore (IPv4 o IPv^
+che sia) che lo spedisce verso la destinazione.  Dato che né IPv4 né IPv6
+garantiscono l'affidabilità niente assicura che il pacchetto arrivi a
+destinazione, né che più pacchetti arrivino nello stesso ordine in cui sono
+stati spediti.
+
+Pertanto il problema principale che si affronta quando si usa UDP è la
+mancanza di affidabilità, se si vuole essere sicuri che i pacchetti arrivino 
+
+
+\subsection{TCP: Transport Control Protocol)}
+\label{sec:net_tcp}
+
+
 
 \section{Il modello client-server}
-\label{sec:cliserv}.
+\label{sec:net_cliserv}.
 
 La differenza principale fra un'applicazione di rete e un programma normale
 è che quest'ultima per definizione concerne la comunicazione fra