Corretti errori per la compilazione, aggiunto Makefile (iniziale, per
[gapil.git] / network.tex
1 \chapter{Introduzione alla rete}
2 \label{cha:network}
3
4 In questo capitolo sarà fatta un'introduzione ai contetti generali che servono
5 come prerequisiti per capire la programmazione di rete ed esamineremo a grandi
6 linee i protocolli di rete e come questi sono organizzati e interagiscono.
7
8 In particolare, avendo assunto l'ottica di un'introduzione mirata alla
9 programmazione di rete, ci concentreremo sul protocollo più diffuso che è
10 quello che sta alla base di internet, ed in particolare sulle parti più
11 importanti ai fini della programmazione.  
12
13
14 \section{I protocolli di rete}
15 \label{sec:net_protocols}
16
17 Parlando di reti di computer si parla in genere di un insieme molto vasto ed
18 eterogeneo di mezzi di comunicazione che vanno dal cavo telefonico, alla fibra
19 ottica, alle comunicazioni via satellite; per rendere possibile la
20 comunicazione attraverso un così variegato insieme di mezzi sono stati
21 adottati una serie di protocolli, il più famoso dei quali, quello alla base
22 del funzionamento di internet, è il cosiddetto TCP/IP.
23
24 \subsection{Il modello ISO/OSI}
25 \label{sec:net_iso_osi}
26
27 Una caratteristica comune dei protocolli di rete è il loro essere strutturati
28 in livelli sovrapposti; in questo modo un livello superiore esegue richieste
29 al livello sottostante e da questo riceve responsi, mentre livelli uguali su
30 macchine diverse conversano tramite lo stesso protocollo. Questo modello di
31 funzionamento è stato stato standardizzato dalla \textit{International
32   Standards Organization} (ISO) che ha preparato fin dal 1984 il Modello di
33 Riferimento \textit{Open Systems Interconnection} (OSI), strutturato in sette
34 livelli, secondo la tabella in \ntab.
35
36 \begin{table}[htb]
37   \centering
38   \begin{tabular}{l c c l} 
39     \textbf{Livello} & \multicolumn{2}{c}{\textbf{Nome}} & \\
40     \hline
41     Livello 7&\textit{Application} &\textsl{Applicazione}& \\ 
42     Livello 6&\textit{Presentation} &\textsl{Presentazione}& \\ 
43     Livello 5&\textit{Session} &\textsl{Sessione}& \\ 
44     Livello 4&\textit{Transport} &\textsl{Trasporto}& \\ 
45     Livello 3&\textit{Network} &\textsl{Rete}&   \\ 
46     Livello 2&\textit{DataLink} &\textsl{Collegamento Dati}& \\
47     Livello 1&\textit{Connection} &\textsl{Connessione Fisica}& \\
48     \hline
49 \end{tabular}
50 \caption{I sette livelli del protocollo ISO/OSI.}
51 \label{tab:net_osilayers}
52 \end{table}
53
54 Il modello ISO/OSI è stato sviluppato corrispondentemente alla definizione
55 della serie di protocolli X.25 per la commutazione di pacchetto. Ma nonostante
56 il lavoro dettagliato di standardizzazione il modello si è rivelato
57 sostanzialmente troppo complesso e poco flessibile rispetto a quello,
58 precedente, su cui si basa TCP/IP che è diventato uno standard de facto;
59 quest'ultimo viene comunemente chiamato modello DoD (\textit{Department of
60   Defense}), dato che fu sviluppato dall'agenzia ARPA per il Dipartimento
61 della Difesa Americano.
62
63 \subsection{Il modello DoD (TCP/IP)}
64 \label{sec:net_tcpip_overview}
65
66 Così come ISO/OSI anche TCP/IP è stato strutturato in livelli (riassunti in
67 \ntab); un confronto fra i due è riportato in \nfig dove viene evidenziata
68 anche la corrispondenza fra i rispettivi livelli (che comunque è
69 approssimativa) e su come essi vanno ad inserirsi all'interno del sistema
70 operativo rispetto alla divisione fra user space e kernel space spiegata in
71 \ref{sec:intro_unix_struct}.
72
73 \begin{table}[htb]
74   \centering
75   \begin{tabular}{l c c l} 
76     \textbf{Livello} & \multicolumn{2}{c}{\textbf{Nome}} & \textbf{Esempi} \\
77     \hline
78     Livello 1&\textit{Application} &\textsl{Applicazione}& 
79     Telnet, FTP, etc. \\ 
80     Livello 2&\textit{Transport} &\textsl{Trasporto}& TCP, UDP \\ 
81     Livello 3&\textit{Network} &\textsl{Rete}& IP, (ICMP, IGMP)  \\ 
82     Livello 4&\textit{Link} &\textsl{Connessione}& 
83     device driver \& scheda di interfaccia  \\
84     \hline
85 \end{tabular}
86 \caption{I quattro livelli del protocollo TPC/IP.}
87 \label{tab:net_layers}
88 \end{table}
89
90
91 Come si può notare TCP/IP è più semplice del modello ISO/OSI e strutturato in
92 soli quattro livelli. Il suo nome deriva dai due principali protocolli che lo
93 compongono, il TCP \textit{Trasmission Control Protocol} e l'IP
94 \textit{Internet Protocol}. Le funzioni dei vari livelli sono le seguenti:
95
96 \begin{description}
97 \item \textbf{Applicazione} É relativo ai programmi di interfaccia utente, in
98   genere questi vengono realizzati secondo il modello Client-Server (vedi
99   \ref{sec:net_cliserv}.
100 \item \textbf{Trasporto} Fornisce la comunicazione tra le due stazioni
101   terminali su cui girano gli applicativi, regola il flusso delle
102   informazioni, e può fornire un trasporto affidabile, cioè con recupero
103   errori. Il protocollo principale di questo livello è il TCP.
104 \item \textbf{Rete} Si occupa dello smistamento dei singoli pacchetti su una
105   rete complessa e interconnessa, a questo stesso livello operano i protocolli
106   per il reperimento delle informazioni necessarie allo smistamento, per lo
107   scambio di messaggi di controllo e per il monitoraggio della rete. Il
108   protocollo su cui si basa questo livello è IP (sia nella attuale versione,
109   IPv4 che nella nuova IPv6).
110 \item \textbf{Connessione} È responsabile per l'interfacciamento al
111   dispositivo elettronico che effettua la comunicazione fisica, gestendo
112   l'invio e la ricezione dall'hardware dei pacchetti.
113 \end{description}
114
115
116 La comunicazione fra due stazioni avviene pertanto secondo le modalità
117 illustrate in \nfig. 
118
119 Le singole applicazioni si scambieranno i dati secondo un loro formato
120 specifico, implementando un protocollo di applicazione (esempi possono essere
121 HTTP, POP, telnet, SMTP, etc). 
122
123 Questi dati vengono inviati al livello di trasporto usando un'interfaccia
124 opportuna (i \textit{socket}, che esamineremo in dettaglio in seguito), i
125 quali li spezzerà in pacchetti di dimensione opportuna e li incapsulerà
126 all'interno del suo protocollo di trasporto aggiungendo ad ogni pacchetto le
127 informazioni necessarie alla gestione di quest'ultimo. Questo processo viene
128 svolto dirattamente nel kernel ad esempio dallo stack TCP nel caso il
129 protocollo di trasporto sia questo.
130
131 Una volta composto il pacchetto nel formato adatto al protocollo di trasporto
132 usato questo sarà passato al successivo livello, quello del collegamento che
133 si occupa di inserire le opportune informazioni per poter effettuare
134 l'instradamento nella rete ed il recapito alla destinazione finale. In genere
135 questo è il livello di IP (Internet Protocol), a cui vengono inseriti i numeri
136 IP che identificano i computer su internet.
137
138 L'ultimo passo è il trasferimento del pacchetto al driver della interfaccia di
139 trasmissione che si incarica di incapsularlo nel relativo protocollo di
140 trasmissione fisica usato dall'hardware usato per la comunicazione (ad esempio
141 ethernet per una scheda di rete).
142
143
144 \subsection{Criteri generali del design di TCP/IP}
145 \label{sec:net_tcpip_design}
146
147 La filosofia architetturale di TCP/IP è semplice: costruire una rete che
148 possa sopportare il carico in transito, ma permettere ai singoli nodi di
149 scartare pacchetti se il carico è temporaneamente eccessivo, o se risultano
150 errati o non recapitabili.
151
152 L'incarico di rendere il recapito pacchetti affidabile non spetta allo livello
153 di collegamento, ma ai livelli superiori. Pertanto il protocollo IP è per sua
154 natura inaffidabile, in quanto non è assicurata né una percentuale di
155 successo né un limite sui tempi di consegna dei pacchetti.
156
157 È il livello di trasporto che si deve occupare (qualora necessiti) del
158 controllo del flusso dei dati e del recupero degli errori; questo è realizzato
159 dal protocollo TCP. La sede principale di "intelligenza" della rete è pertanto
160 al livello di trasporto o superiore.
161
162 Infine le singole stazioni collegate alla rete non fungono soltanto da punti
163 terminali di comunicazione, ma possono anche assumere il ruolo di router, per
164 l'interscambio di pacchetti da una rete ad un'altra. Questo rende possibile la
165 flessibilità della rete che è in grado di adattarsi ai mutamenti delle
166 interconnessioni.
167
168 La caratteristica essenziale che rende tutto ciò possibile è la strutturazione
169 a livelli tramite l'incapsulamento. Ogni pacchetto di dati viene incapsulato
170 nel formato del livello successivo, fino al livello della connessione fisica.
171 In questo modo il pacchetto ricevuto ad un livello $n$ dalla stazione di
172 destinazione è esattamente lo stesso spedito dal livello $n$ dalla sorgente.
173 Questo rende facile il progettare il software facendo riferimento unicamente a
174 quanto necessario ad un singolo livello, con la confidenza che questo poi sarà
175 trattato uniformemente da tutti i nodi della rete.
176
177
178 \section{Il protocollo TCP/IP}
179 \label{sec:net_tpcip}
180
181 Come già affermato il protocollo TCP/IP è un insieme di protocolli diversi,
182 che operano su 4 livelli diversi. Per gli interessi della programmazione di
183 rete però sono importanti principalmente i due livelli centrali, e soprattutto
184 quello di trasporto, su cui è innestata l'interfaccia fra kernel space e user
185 space. 
186
187 Il livello 4 infatti è normalmente gestito dal kernel, e si accede ad esso
188 solo quando si vogliono fare applicazioni di sistema per il controllo della
189 rete (locale) a basso livello, un uso quindi molto specialistico. Il livello 1
190 invece dipende dalle singole applicazioni ed è di nuovo troppo specifico per
191 essere affrontato qui.
192
193 \subsection{Il quadro generale}
194
195 Benché si parli di TCP/IP questa famiglia di protocolli è composta anche da
196 altri membri. In \nfig si è riportato una figura di quadro che mostra un
197 panorama sull'intera famiglia, e di come i vari protocolli vengano usati dalle
198 applicazioni.
199
200 La figura è da fare  ...
201
202 I vari protocolli mostrati in figura sono i seguenti:
203
204 \begin{list}{}{}
205 \item \textsl{IPv4} \textit{Internet Protocol version 4}. È quello che
206   comunemente si chiama IP. Ha origine negli anni '80 e da allora è la base su
207   cui è cotriuta internet. Usa indirizzi a 32 bit e provvede la trasmissione
208   dei pacchetti TCP, UDP, ICMP e IGMP.
209 \item \textsl{IPv6} \textit{Internet Protocol version 6}. È stato progettato a
210   metà degli anni '90 per rimpiazzare IPv4. Ha indirizzi a 128 bit e effettua
211   lo stesso servizio di trasporto di IPv4 per i pacchetti TCP, UDP e ICPMv6.
212 \item \textsl{TCP} \textit{Trasmission Control Protocol}. È un protocollo
213   orientato alla connessione che provvede un trasporto affidabile e
214   bidirezionale di un flusso di dati. I socket TCP sono esempi di
215   \textit{stream socket}. Il protocollo ha cura di tutti gli aspetti del
216   trasporto, come l'acknoweledgment, i timout, la ritrasmissione, etc. È usato
217   dalla maggior parte delle applicazioni. Può essere usato sia con IPv4 che
218   con IPv6.
219 \item \textsl{UDP} \textit{User Datagram Protocol}. È un protocollo senza
220   connessione a pacchetti. I socket UDP sono esempi di \textit{datagram
221     socket}. Contrariamente al TCP in protocollo non è affidabile e non c'è
222   garanzia che i pacchetti raggiungano la loro destinazione, né sull'eventuale
223   ordine di arrivo. Può essere usato sia con IPv4 che con IPv6.
224 \item \textsl{ICMP} \textit{Internet Control Message Protocol}. Gestisce gli
225   errori e trasporta l'informazione di controllo fra stazioni remote e
226   instradatori (\textit{router} e \textit{host}). I messaggi sono normalmente
227   generati dal software del kernel che gestisce la comunicazione TCP/IP, anche
228   se può venire usato direttamente da alcuni programmi come \texttt{ping}. A
229   volte ci si riferisce ad esso come ICPMv4 per distinguerlo da ICMPv6.
230 \item \textsl{ICMP} \textit{Internet Group Management Protocol}. É un
231   protocollo usato per il \textit{multicasting} (vedi
232   \ref{sec:xxx_multicast}), che è opzionale in IPv4.
233 \item \textsl{ARP} \textit{Address Resolution Protocol}. È il protocollo che
234   mappa un indirizzo IP in un indirizzo hardware (come un indirizzo
235   internet). È usato in reti di tipo broadcast come ethernet, token ring o
236   FDDI ma non serve in connessioni punto-punto.
237 \item \textsl{RARP} \textit{Reverse Address Resolution Protocol}. È il
238   protocollo che mappa un indirizzo hardware in un indirizzo IP. Viene usato a
239   volte per durante il boot per assegnare un indirizzo IP ad una macchina.
240 \item \textsl{ICMPv6} \textit{Internet Control Message Protocol, version 6}.
241   Combina per IPv6 le funzionalità di ICMPv4, IGMP e ARP.
242 \item \textsl{NETLINK} \textit{Netlink}.
243   Provvede l'interfaccia di accesso alla comunicazione a basso livello.
244 \end{list}
245
246 Gran parte delle applicazioni comunicano usando TCP o UDP, ed alcune si
247 rifanno ad IP (ed i suoi correlati ICMP e IGMP); benché sia TCP che UDP siano
248 basati su IP e sia possibile intervenire a questo livello con i \textit{raw
249   socket} questa tecnica è molto meno diffusa e a parte applicazioni
250 particolari si preferisce sempre usare i servizi messi a disposizione dai due
251 protocolli precedenti.  Per questo motivo a parte alcuni brevi accenni su IP
252 in questa sezione ci concentreremo sul livello di trasporto.
253
254 \subsection{Internet Protocol (IP)}
255 \label{sec:net_ip}
256
257 Quando si parla di IP ci si riferisce in genere alla versione attualmente in
258 uso che è la versione 4 (e viene pertanto chiamato IPv4). Questa versione
259 venne standardizzata nel 1981 dall'RFC~719.
260
261 Internet protocol nasce per disaccoppiare le applicazioni della struttura
262 hardware delle reti di trasmissione, e creare una interfaccia di trasmissione
263 dei dati indipendente dal sottostante substrato di rete, che può essere
264 realizzato con le tecnologie più disparate (Ethernet, Token Ring, FDDI, etc.).
265 Il compito di IP è pertanto quello di trasmettere i pacchetti da un computer
266 all'altro della rete; le caratteristiche essenziali con cui questo viene
267 realizzato in IPv4 sono due:
268
269 \begin{itemize}
270 \item \textit{Universal addressing} la comunicazione avviene fra due host
271   identificati univocamente con un indirizzo a 32 bit che può appartenere ad
272   una sola interfaccia di rete.
273 \item \textit{Best effort} viene assicurato il massimo impegno nella
274   trasmissione, ma non c'è nessuna garanzia per i livelli superiori né sulla
275   percentuale di successo né sul tempo di consegna dei pacchetti di dati.
276 \end{itemize}
277
278 Negli anni '90 la crescita vertiginosa del numero di macchine connesse a
279 internet ha iniziato a far emergere i vari limiti di IPv4, per risolverne i
280 problemi si è perciò definita una nuova versione del protocollo, che (saltando
281 un numero) è diventata la versione 6. IPv6 nasce quindi come evoluzione di
282 IPv4, mantendone inalterate le funzioni che si sono dimostrate valide,
283 eliminando quelle inutili e aggiungendone poche altre ponendo al contempo una
284 grande attenzione a mantenere il protocollo il più snello e veloce possibile.
285
286 I cambiamenti apportati sono comunque notevoli e si possono essere riassunti a
287 grandi linee nei seguenti punti:
288 \begin{itemize}
289 \item l'espansione delle capacità di indirizzamento e instradamento, per
290   supportare una gerarchia con più livelli di indirizzamento, un numero di
291   nodi indirizzabili molto maggiore e una autoconfigurazione degli indirizzi
292 \item l'introduzione un nuovo tipo di indirizzamento, l'\textit{anycast} che
293   si aggiungono agli usuali \textit{unycast} e \textit{multicast}
294 \item la semplificazione del formato della testata, eliminando o rendendo
295   opzionali alcuni dei campi di IPv4, per eliminare la necessità di
296   riprocessamento della stessa da parte dei router e contenere l'aumento di
297   dimensione dovuto ai nuovi indirizzi
298 \item un supporto per le opzioni migliorato, per garantire una trasmissione
299   più efficiente del traffico normale, limiti meno stringenti sulle dimensioni
300   delle opzioni, e la flessibilità necessaria per introdurne di nuove in
301   futuro
302 \item il supporto per delle capacità di qualità di servizio (QoS) che permetta
303   di identificare gruppi di dati per i quali si può provvedere un trattamento
304   speciale (in vista dell'uso di internet per applicazioni multimediali e/o
305   ``real-time'')
306 \end{itemize}
307
308 Per maggiori dettagli riguardo al protocollo si può consultare
309 \ref{sec:appA_ip}.
310
311  
312 \subsection{UDP: User Datagram Protocol)}
313 \label{sec:net_udp}
314
315 UDP è un protocollo di trasporto molto semplice, la sua descizione completa è
316 contenuta dell'RFC768, ma in sostanza esso è una semplice interfaccia a IP dal
317 livello di trasporto. Quando un'applicazione usa UDP essa scrive un pacchetto
318 di dati (il cosiddetto \textit{datagram} che da il nome al protocollo) su un
319 socket, al pacchetto viene aggiunto un header molto semplice
320 (\ref{sec:appA_udp}, e poi viene passato al livello superiore (IPv4 o IPv6
321 che sia) che lo spedisce verso la destinazione.  Dato che né IPv4 né IPv6
322 garantiscono l'affidabilità niente assicura che il pacchetto arrivi a
323 destinazione, né che più pacchetti arrivino nello stesso ordine in cui sono
324 stati spediti.
325
326 Pertanto il problema principale che si affronta quando si usa UDP è la
327 mancanza di affidabilità, se si vuole essere sicuri che i pacchetti arrivino 
328
329
330 \subsection{TCP: Transport Control Protocol)}
331 \label{sec:net_tcp}
332
333
334
335 \section{Il modello client-server}
336 \label{sec:net_cliserv}.
337
338 La differenza principale fra un'applicazione di rete e un programma normale
339 è che quest'ultima per definizione concerne la comunicazione fra
340 ``processi'' diversi (che in generale non girano neanche sulla stessa
341 macchina). Questo già prefigura un cambiamento completo rispetto all'ottica
342 del ``programma'' monolitico all'interno del quale vengono eseguite tutte le
343 istruzioni, e presuppone un sistema operativo ``multitasking'' in grado di
344 eseguire processi diversi.
345
346 Il concetto fondamentale si basa la programmazione di rete sotto Linux (e
347 sotto Unix in generale) è il modello \textit{client-server} in cui un
348 programma di servizio, il \textit{server} riceve un connessione e risponde a
349 un programma di utilizzo, il \textit{client}, provvedendo a quest'ultimo un
350 definito insieme di servizi.
351
352 Esempi di questo modello sono il WEB, ftp, telnet, ssh e praticamente ogni
353 servizio che viene fornito tramite la rete, ma il modello è utilizzato in
354 generale anche per programmi di uso locale.
355
356 Normalmente si dividono i server in due categorie principali,
357 \textit{concorrenti} e \textit{iterativi}, sulla base del loro comportamento.
358
359 Un server iterativo risponde alla richiesta inviando i dati e resta occupato
360 (non rispondendo ad ulteriori richieste) fintanto che non ha concluso la
361 richiesta. Una volta completata la richiesta il server diventa di nuovo
362 disponibile.
363
364 Un server concorrente al momento di trattare la richiesta crea un processo
365 figlio incaricato di fornire i servizi richiesti, per poi porsi in attesa di
366 ulteriori richieste. In questo modo più richieste possono essere soddisfatte
367 contemporaneamente, una volta che il processo figlio ha concluso il suo lavoro
368 viene terminato, mentre il server originale resta sempre attivo.
369