Nuove figure e revisione completa dei primi due capitoli sulle reti.
[gapil.git] / network.tex
1 %% network.tex
2 %%
3 %% Copyright (C) 2000-2002 Simone Piccardi.  Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
9 %% License".
10 %%
11 \part{Programmazione di rete}
12 \label{part:progr-di-rete}
13
14 \chapter{Introduzione alla programmazione di rete}
15 \label{cha:network}
16
17 In questo capitolo sarà fatta un'introduzione ai concetti generali che servono
18 come prerequisiti per capire la programmazione di rete, non tratteremo quindi
19 aspetti specifici ma faremo una breve introduzione al modello più comune usato
20 nella programmazione di rete, per poi passare ad un esame a grandi linee dei
21 protocolli di rete e di come questi sono organizzati e interagiscono. 
22
23 In particolare, avendo assunto l'ottica di un'introduzione mirata alla
24 programmazione, ci concentreremo sul protocollo più diffuso, il TCP/IP, che è
25 quello che sta alla base di internet, avendo cura di sottolineare i concetti
26 più importanti da conoscere per la scrittura dei programmi.
27
28
29
30 \section{Modelli di programmazione}
31 \label{sec:net_prog_model}
32
33
34 La differenza principale fra un'applicazione di rete e un programma normale è
35 che quest'ultima per definizione concerne la comunicazione fra processi
36 diversi, che in generale non girano neanche sulla stessa macchina. Questo già
37 prefigura un cambiamento completo rispetto all'ottica del programma monolitico
38 all'interno del quale vengono eseguite tutte le istruzioni, e chiaramente
39 presuppone un sistema operativo multitasking in grado di eseguire più processi
40 contemporaneamente.
41
42 In questa prima sezione esamineremo brevemente i principali modelli di
43 programmazione in uso. Ne daremo una descrizione assolutamente generica e
44 superficiale, che ne illustri le caratteristiche principali, non essendo fra
45 gli scopi del testo approfondire questi argomenti.
46
47 \subsection{Il modello \textit{client-server}}
48 \label{sec:net_cliserv}
49
50 L'architettura fondamentale su cui si basa gran parte della programmazione di
51 rete sotto Linux (e sotto Unix in generale) è il modello
52 \textit{client-server} caratterizzato dalla presenza di due categorie di
53 soggetti, i programmi di servizio, chiamati \textit{server}, che ricevono le
54 richieste e forniscono le risposte, ed i programmi di utilizzo, detti
55 \textit{client}.
56
57 In generale un server può (di norma deve) essere in grado di rispondere a più
58 di un client, per cui è possibile che molti programmi possano interagire
59 contemporaneamente, quello che contraddistingue il modello però è che
60 l'architettura dell'interazione è sempre nei termini di molti verso uno, il
61 server, che viene ad assumere un ruolo privilegiato.
62
63 Seguono questo modello tutti i servizi fondamentali di internet, come le
64 pagine web, la posta elettronica, ftp, telnet, ssh e praticamente ogni
65 servizio che viene fornito tramite la rete, anche se, come abbiamo visto, il
66 modello è utilizzato in generale anche per programmi che, come gli esempi che
67 abbiamo usato in \capref{cha:IPC} a proposito della comunicazione fra processi
68 nello stesso sistema, non fanno necessariamente uso della rete.
69
70 Normalmente si dividono i server in due categorie principali, e vengono detti
71 \textsl{concorrenti} o \textsl{iterativi}, sulla base del loro comportamento.
72 Un \textsl{server iterativo} risponde alla richiesta inviando i dati e resta
73 occupato e non rispondendo ad ulteriori richieste fintanto che non ha fornito
74 una risposta alla richiesta. Una volta completata la risposta il server
75 diventa di nuovo disponibile.
76
77 Un \textsl{server concorrente} al momento di trattare la richiesta crea un
78 processo figlio (o un thread) incaricato di fornire i servizi richiesti, per
79 porsi immediatamente in attesa di ulteriori richieste. In questo modo, con
80 sistemi multitasking, più richieste possono essere soddisfatte
81 contemporaneamente. Una volta che il processo figlio ha concluso il suo lavoro
82 esso di norma viene terminato, mentre il server originale resta sempre attivo.
83
84
85 \subsection{Il modello \textit{peer-to-peer}}
86 \label{sec:net_peertopeer}
87
88 Come abbiamo visto il tratto saliente dell'architettura \textit{client-server}
89 è quello della preminenza del server rispetto ai client, le architetture
90 \textit{peer-to-peer} si basano su un approccio completamente opposto che è
91 quello di non avere nessun programma che svolga un ruolo preminente.
92
93 Questo vuol dire che in generale ciascun programma viene ad agire come un nodo
94 in una rete potenzialmente paritetica; ciascun programma si trova pertanto a
95 ricevere ed inviare richieste ed a ricevere ed inviare risposte, e non c'è più
96 la separazione netta dei compiti che si ritrova nelle architetture
97 \textit{client-server}.
98
99 Le architetture \textit{peer-to-peer} sono salite alla ribalta con
100 l'esplosione del fenomeno Napster, ma gli stessi protocolli di routing sono un
101 buon esempio di architetture \textit{peer-to-peer}, in cui ciascun nodo,
102 tramite il demone che gestisce il routing, richiede ed invia informazioni ad
103 altri nodi.
104
105 In realtà in molti casi di architetture classificate come \textit{peer-to-peer}
106 non è detto che la struttura sia totalmente paritetica e ci sono parecchi
107 esempi in cui alcuni servizi vengono centralizzati o distribuiti
108 gerarchicamente, come per lo stesso Napster, in cui le ricerche venivano
109 effettuate su un server centrale.
110
111
112
113 \subsection{Il modello \textit{three-tier}}
114 \label{sec:net_three_tier}
115
116 Benché qui sia trattato a parte, il modello \textit{three-tier} in realtà è
117 una estensione del modello \textit{client-server}. Con il crescere della
118 quantità dei servizi forniti in rete (in particolare su internet) ed al numero
119 di accessi richiesto. Si è così assistito anche ad una notevole crescita di
120 complessità, in cui diversi servizi venivano ad essere integrati fra di loro.
121
122 In particolare sempre più spesso si assiste ad una integrazione di servizi di
123 database con servizi di web, in cui le pagine vengono costruite dinamicamente
124 sulla base dei dati contenuti nel database. In tutti questi casi il problema
125 fondamentale di una architettura \textit{client-server} è che la richiesta di
126 un servizio da parte di un gran numero di client si scontra con il collo di
127 bottiglia dell'accesso diretto ad un unico server, con gravi problemi di
128 scalabilità.
129
130 Rispondere a queste esigenze di scalabilità il modello più semplice (chiamato
131 talvolta \textit{two-tier}) da adottare è stata quello di distribuire il
132 carico delle richieste su più server identici, mantenendo quindi
133 sostanzialmente inalterata l'architettura \textit{client-server} originale.
134
135 Nel far questo ci si scontra però con gravi problemi di manutenibilità dei
136 servizi, in particolare per quanto riguarda la sincronizzazione dei dati, e di
137 inefficienza dell'uso delle risorse. Il problema è particolarmente grave ad
138 esempio per i database che non possono essere replicati e sincronizzati
139 facilmente, e che sono molto onerosi, la loro replicazione è costosa e
140 complessa.
141
142 È a partire da queste problematiche che nasce il modello \textit{three-tier},
143 che si struttura, come dice il nome, su tre livelli. Il primo livello, quello
144 dei client che eseguono le richieste e gestiscono l'interfaccia con l'utente,
145 resta sostanzialmente lo stesso del modello \textit{client-server}, ma la
146 parte server viene suddivisa in due livelli, introducendo un
147 \textit{middle-tier}, su cui deve appoggiarsi tutta la logica di analisi delle
148 richieste dei client per ottimizzare l'accesso al terzo livello, che è quello
149 che si limita a fornire i dati dinamici che verranno usati dalla logica
150 implementata nel \textit{middle-tier} per eseguire le operazioni richieste dai
151 client.
152
153 In questo modo si può disaccoppiare la logica dai dati, replicando la prima,
154 che è molto meno soggetta a cambiamenti ed evoluzione, e non soffre di
155 problemi di sincronizzazione, e centralizzando opportunamente i secondi. In
156 questo modo si può distribuire il carico ed accedere in maniera efficiente i
157 dati.
158
159
160 \section{I protocolli di rete}
161 \label{sec:net_protocols}
162
163 Parlando di reti di computer si parla in genere di un insieme molto vasto ed
164 eterogeneo di mezzi di comunicazione che vanno dal cavo telefonico, alla fibra
165 ottica, alle comunicazioni via satellite o via radio; per rendere possibile la
166 comunicazione attraverso un così variegato insieme di mezzi sono stati
167 adottati una serie di protocolli, il più famoso dei quali, quello alla base
168 del funzionamento di internet, è il protocollo TCP/IP.
169
170 \subsection{Il modello ISO/OSI}
171 \label{sec:net_iso_osi}
172
173 Una caratteristica comune dei protocolli di rete è il loro essere strutturati
174 in livelli sovrapposti; in questo modo ogni protocollo di un certo livello
175 realizza le sue funzionalità basandosi su un protocollo del livello
176 sottostante.  Questo modello di funzionamento è stato stato standardizzato
177 dalla \textit{International Standards Organization} (ISO) che ha preparato fin
178 dal 1984 il Modello di Riferimento \textit{Open Systems Interconnection}
179 (OSI), strutturato in sette livelli, secondo quanto riportato in
180 \tabref{tab:net_osilayers}.
181
182 \begin{table}[htb]
183   \centering
184   \begin{tabular}{|l|c|c|} 
185     \hline
186     \textbf{Livello} & \multicolumn{2}{|c|}{\textbf{Nome}} \\
187     \hline
188     \hline
189     Livello 7&\textit{Application}  &\textsl{Applicazione}\\ 
190     Livello 6&\textit{Presentation} &\textsl{Presentazione} \\ 
191     Livello 5&\textit{Session}      &\textsl{Sessione} \\ 
192     Livello 4&\textit{Transport}    &\textsl{Trasporto} \\ 
193     Livello 3&\textit{Network}      &\textsl{Rete}\\ 
194     Livello 2&\textit{DataLink}     &\textsl{Collegamento Dati} \\
195     Livello 1&\textit{Connection}   &\textsl{Connessione Fisica} \\
196     \hline
197 \end{tabular}
198 \caption{I sette livelli del protocollo ISO/OSI.}
199 \label{tab:net_osilayers}
200 \end{table}
201
202 Il modello ISO/OSI è stato sviluppato in corrispondenza alla definizione della
203 serie di protocolli X.25 per la commutazione di pacchetto. Ma nonostante il
204 lavoro dettagliato di standardizzazione il modello si è rivelato
205 sostanzialmente troppo complesso e poco flessibile rispetto a quello
206 precedente, il TCP/IP, su cui si basa internet, che è diventato uno standard
207 de facto.  Il modello di quest'ultimo viene chiamato anche modello DoD (sigla
208 che sta per \textit{Department of Defense}), dato che fu sviluppato
209 dall'agenzia ARPA per il Dipartimento della Difesa Americano.
210
211
212 \subsection{Il modello TCP/IP (o DoD)}
213 \label{sec:net_tcpip_overview}
214
215 Così come ISO/OSI anche il modello del TCP/IP è stato strutturato in livelli
216 (riassunti in \tabref{tab:net_layers}); un confronto fra i due è riportato in
217 \figref{fig:net_osi_tcpip_comp} dove viene evidenziata anche la corrispondenza
218 fra i rispettivi livelli (che comunque è approssimativa) e su come essi vanno
219 ad inserirsi all'interno di un sistema rispetto alla divisione fra user space
220 e kernel space spiegata in \secref{sec:intro_unix_struct}.\footnote{in realtà
221   è possibile accedere, attraverso una opportuna interfaccia (come vedremo in
222   \secref{sec:sock_sa_packet}), anche ai livelli inferiori.}
223
224 \begin{table}[htb]
225   \centering
226   \begin{tabular}{|l|c|c|l|} 
227     \hline
228     \textbf{Livello} & \multicolumn{2}{|c|}{\textbf{Nome}} & \textbf{Esempi} \\
229     \hline
230     \hline
231     Livello 4&\textit{Application} &\textsl{Applicazione}& 
232     Telnet, FTP, etc. \\ 
233     Livello 3&\textit{Transport} &\textsl{Trasporto}& TCP, UDP \\ 
234     Livello 2&\textit{Network} &\textsl{Rete}& IP, (ICMP, IGMP)  \\ 
235     Livello 1&\textit{Link} &\textsl{Connessione}& 
236     device driver \& scheda di interfaccia  \\
237     \hline
238 \end{tabular}
239 \caption{I quattro livelli del protocollo TCP/IP.}
240 \label{tab:net_layers}
241 \end{table}
242
243 Come si può notare come il modello TCP/IP è più semplice del modello ISO/OSI
244 ed è strutturato in soli quattro livelli. Il suo nome deriva dai due
245 principali protocolli che lo compongono, il TCP (\textit{Trasmission Control
246   Protocol}) che copre il livello 3 e l'IP (\textit{Internet Protocol}) che
247 copre il livello 2. Le funzioni dei vari livelli sono le seguenti:
248
249 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
250 \item[\textbf{Applicazione}] É relativo ai programmi di interfaccia con la
251   rete, in genere questi vengono realizzati secondo il modello client-server
252   (vedi \secref{sec:net_cliserv}), realizzando una comunicazione secondo un
253   protocollo che è specifico di ciascuna applicazione.
254 \item[\textbf{Trasporto}] Fornisce la comunicazione tra le due stazioni
255   terminali su cui girano gli applicativi, regola il flusso delle
256   informazioni, può fornire un trasporto affidabile, cioè con recupero degli
257   errori o inaffidabile. I protocolli principali di questo livello sono il TCP
258   e l'UDP.
259 \item[\textbf{Rete}] Si occupa dello smistamento dei singoli pacchetti su una
260   rete complessa e interconnessa, a questo stesso livello operano i protocolli
261   per il reperimento delle informazioni necessarie allo smistamento, per lo
262   scambio di messaggi di controllo e per il monitoraggio della rete. Il
263   protocollo su cui si basa questo livello è IP (sia nella attuale versione,
264   IPv4, che nella nuova versione, IPv6).
265 \item[\textbf{Connessione}] È responsabile per l'interfacciamento al
266   dispositivo elettronico che effettua la comunicazione fisica, gestendo
267   l'invio e la ricezione dei pacchetti da e verso l'hardware.
268 \end{basedescript}
269
270 \begin{figure}[!htb]
271   \centering
272   \includegraphics[width=13cm]{img/iso_tcp_comp}
273   \caption{Struttura a livelli dei protocolli OSI e TCP/IP, con la  
274     relative corrispondenze e la divisione fra kernel e user space.}
275   \label{fig:net_osi_tcpip_comp}
276 \end{figure}
277
278 La comunicazione fra due stazioni remote avviene secondo le modalità
279 illustrate in \figref{fig:net_tcpip_data_flux}, dove si è riportato il flusso
280 dei dati reali e i protocolli usati per lo scambio di informazione su ciascun
281 livello. Si è genericamente indicato \textit{ethernet} per il livello 1, anche
282 se in realtà i protocolli di trasmissione usati possono essere molti altri.
283
284 \begin{figure}[!htb]
285   \centering \includegraphics[width=12cm]{img/tcp_data_flux}
286   \caption{Strutturazione del flusso dei dati nella comunicazione fra due
287     applicazioni attraverso i protocolli della suite TCP/IP.}
288   \label{fig:net_tcpip_data_flux}
289 \end{figure}
290
291 Per chiarire meglio la struttura della comunicazione attraverso i vari
292 protocolli mostrata in \figref{fig:net_tcpip_data_flux}, conviene prendere in
293 esame i singoli passaggi fatti per passare da un livello al sottostante,
294 la procedura si può riassumere nei seguenti passi:
295 \begin{itemize}
296 \item Le singole applicazioni comunicano scambiandosi i dati ciascuna secondo
297   un suo specifico formato. Per applicazioni generiche, come la posta o le
298   pagine web, viene di solito definito ed implementato quello che viene
299   chiamato un protocollo di applicazione (esempi possono essere HTTP, POP,
300   SMTP, ecc.), ciascuno dei quali è descritto in un opportuno standard (di
301   solito attraverso un RFC\footnote{L'acronimo RFC sta per \textit{Request For
302       Comment} ed è la procedura attraverso la quale vengono proposti gli
303     standard per Internet.}).
304 \item I dati delle applicazioni vengono inviati al livello di trasporto usando
305   un'interfaccia opportuna (i \textit{socket}\index{socket}, che esamineremo
306   in dettaglio in \capref{cha:socket_intro}). Qui verranno spezzati in
307   pacchetti di dimensione opportuna e incapsulati nel protocollo di trasporto,
308   aggiungendo ad ogni pacchetto le informazioni necessarie per la sua
309   gestione. Questo processo viene svolto direttamente nel kernel, ad esempio
310   dallo stack TCP, nel caso il protocollo di trasporto usato sia questo.
311 \item Una volta composto il pacchetto nel formato adatto al protocollo di
312   trasporto usato questo sarà passato al successivo livello, quello di rete,
313   che si occupa di inserire le opportune informazioni per poter effettuare
314   l'instradamento nella rete ed il recapito alla destinazione finale. In
315   genere questo è il livello di IP (Internet Protocol), a cui vengono inseriti
316   i numeri IP che identificano i computer su internet.
317 \item L'ultimo passo è il trasferimento del pacchetto al driver della
318   interfaccia di trasmissione, che si incarica di incapsularlo nel relativo
319   protocollo di trasmissione. Questo può avvenire sia in maniera diretta, come
320   nel caso di ethernet, in cui i pacchetti vengono inviati sulla linea
321   attraverso le schede di rete, che in maniera indiretta con protocolli come
322   PPP o SLIP, che vengono usati come interfaccia per far passare i dati su
323   altri dispositivi di comunicazione (come la seriale o la parallela).
324 \end{itemize}
325
326
327 \subsection{Criteri generali dell'architettura del TCP/IP}
328 \label{sec:net_tcpip_design}
329
330 La filosofia architetturale del TCP/IP è semplice: costruire una rete che
331 possa sopportare il carico in transito, ma permettere ai singoli nodi di
332 scartare pacchetti se il carico è temporaneamente eccessivo, o se risultano
333 errati o non recapitabili.
334
335 L'incarico di rendere il recapito pacchetti affidabile non spetta allo livello
336 di collegamento, ma ai livelli superiori. Pertanto il protocollo IP è per sua
337 natura inaffidabile, in quanto non è assicurata né una percentuale di
338 successo né un limite sui tempi di consegna dei pacchetti.
339
340 È il livello di trasporto che si deve occupare (qualora necessiti) del
341 controllo del flusso dei dati e del recupero degli errori; questo è realizzato
342 dal protocollo TCP. La sede principale di "intelligenza" della rete è pertanto
343 al livello di trasporto o ai livelli superiori.
344
345 Infine le singole stazioni collegate alla rete non fungono soltanto da punti
346 terminali di comunicazione, ma possono anche assumere il ruolo di
347 \textit{router} (\textsl{instradatori}), per l'interscambio di pacchetti da
348 una rete ad un'altra. Questo rende possibile la flessibilità della rete che è
349 in grado di adattarsi ai mutamenti delle interconnessioni.
350
351 La caratteristica essenziale che rende tutto ciò possibile è la strutturazione
352 a livelli tramite l'incapsulamento. Ogni pacchetto di dati viene incapsulato
353 nel formato del livello successivo, fino al livello della connessione fisica.
354 In questo modo il pacchetto ricevuto ad un livello \textit{n} dalla stazione
355 di destinazione è esattamente lo stesso spedito dal livello \textit{n} dalla
356 sorgente.  Questo rende facile il progettare il software facendo riferimento
357 unicamente a quanto necessario ad un singolo livello, con la confidenza che
358 questo poi sarà trattato uniformemente da tutti i nodi della rete.
359
360
361 \section{Il protocollo TCP/IP}
362 \label{sec:net_tpcip}
363
364 Come accennato in \secref{sec:net_protocols} il protocollo TCP/IP è un insieme
365 di protocolli diversi, che operano su 4 livelli diversi. Per gli interessi
366 della programmazione di rete però sono importanti principalmente i due livelli
367 centrali, e soprattutto quello di trasporto.
368
369 La principale interfaccia usata nella programmazione di rete, quella dei
370 socket\index{socket}, è infatti un'interfaccia nei confronti di quest'ultimo.
371 Questo avviene perché al di sopra del livello di trasporto i programmi hanno a
372 che fare solo con dettagli specifici delle applicazioni, mentre al di sotto
373 vengono curati tutti i dettagli relativi alla comunicazione. È pertanto
374 naturale definire una interfaccia di programmazione su questo confine, tanto
375 più che è proprio lì (come evidenziato in \figref{fig:net_osi_tcpip_comp}) che
376 nei sistemi Unix (e non solo) viene inserita la divisione fra kernel space e
377 user space.
378
379 In realtà in un sistema Unix è possibile accedere anche agli altri livelli
380 inferiori (e non solo a quello di trasporto) con opportune interfacce di
381 programmazione (vedi \secref{sec:sock_sa_packet}), ma queste vengono usate
382 solo quando si debbano fare applicazioni di sistema per il controllo della
383 rete a basso livello, di uso quindi molto specialistico.
384
385 In questa sezione daremo una descrizione sommaria dei vari protocolli del
386 TCP/IP, concentrandoci, per le ragioni appena esposte, sul livello di
387 trasporto.  All'interno di quest'ultimo privilegeremo poi il protocollo TCP,
388 per il ruolo centrale che svolge nella maggior parte delle applicazioni.
389
390
391 \subsection{Il quadro generale}
392 \label{sec:net_tcpip_general}
393
394 Benché si parli di TCP/IP questa famiglia di protocolli è composta anche da
395 molti membri. In \figref{fig:net_tcpip_overview} si è riportato uno schema che
396 mostra un panorama sui vari protocolli della famiglia, e delle loro relazioni
397 reciproche e con alcune dalle principali applicazioni che li usano.
398
399 \begin{figure}[!htbp]
400   \centering
401   \includegraphics[width=13cm]{img/tcpip_overview}  
402   \caption{Panoramica sui vari protocolli che compongono la suite TCP/IP.}
403   \label{fig:net_tcpip_overview}
404 \end{figure}
405
406 I vari protocolli riportati in \figref{fig:net_tcpip_overview} sono i
407 seguenti:
408
409 \begin{basedescript}{\desclabelwidth{1.7cm}\desclabelstyle{\nextlinelabel}}
410 \item[\textsl{IPv4}] \textit{Internet Protocol version 4}. È quello che
411   comunemente si chiama IP. Ha origine negli anni '80 e da allora è la base su
412   cui è costruita internet. Usa indirizzi a 32 bit, e mantiene tutte le
413   informazioni di instradamento e controllo per la trasmissione dei pacchetti
414   sulla rete; tutti gli altri protocolli della suite (eccetto ARP e RARP, e
415   quelli specifici di IPv6) vengono trasmessi attraverso di esso.
416 \item[\textsl{IPv6}] \textit{Internet Protocol version 6}. È stato progettato
417   a metà degli anni '90 per rimpiazzare IPv4. Ha uno spazio di indirizzi
418   ampliato 128 bit che consente più gerarchie di indirizzi,
419   l'autoconfigurazione, ed un nuovo tipo di indirizzi, gli \textit{anycast},
420   che consentono di inviare un pacchetto ad una stazione su un certo gruppo.
421   Effettua lo stesso servizio di trasmissione dei pacchetti di IPv4 di cui
422   vuole essere un sostituto.
423 \item[\textsl{TCP}] \textit{Trasmission Control Protocol}. È un protocollo
424   orientato alla connessione che provvede un trasporto affidabile per un
425   flusso di dati bidirezionale fra due stazioni remote. Il protocollo ha cura
426   di tutti gli aspetti del trasporto, come l'acknoweledgment, i timeout, la
427   ritrasmissione, etc. È usato dalla maggior parte delle applicazioni.
428 \item[\textsl{UDP}] \textit{User Datagram Protocol}. È un protocollo senza
429   connessione, per l'invio di dati a pacchetti. Contrariamente al TCP il
430   protocollo non è affidabile e non c'è garanzia che i pacchetti raggiungano
431   la loro destinazione, si perdano, vengano duplicati, o abbiano un
432   particolare ordine di arrivo.
433 \item[\textsl{ICMP}] \textit{Internet Control Message Protocol}. È il
434   protocollo usato a livello 2 per gestire gli errori e trasportare le
435   informazioni di controllo fra stazioni remote e instradatori (cioè fra
436   \textit{host} e \textit{router}). I messaggi sono normalmente generati dal
437   software del kernel che gestisce la comunicazione TCP/IP, anche se ICMP può
438   venire usato direttamente da alcuni programmi come \cmd{ping}. A volte ci
439   si riferisce ad esso come ICPMv4 per distinguerlo da ICMPv6.
440 \item[\textsl{IGMP}] \textit{Internet Group Management Protocol}. É un
441   protocollo di livello 2 usato per il \textit{multicasting} (vedi
442   \secref{sec:xxx_multicast}).  Permette alle stazioni remote di notificare ai
443   router che supportano questa comunicazione a quale gruppo esse appartengono.
444   Come ICMP viene implementato direttamente sopra IP.
445 \item[\textsl{ARP}] \textit{Address Resolution Protocol}. È il protocollo che
446   mappa un indirizzo IP in un indirizzo hardware sulla rete locale. È usato in
447   reti di tipo broadcast come Ethernet, Token Ring o FDDI che hanno associato
448   un indirizzo fisico (il \textit{MAC address}) alla interfaccia, ma non serve
449   in connessioni punto-punto.
450 \item[\textsl{RARP}] \textit{Reverse Address Resolution Protocol}. È il
451   protocollo che esegue l'operazione inversa rispetto ad ARP (da cui il nome)
452   mappando un indirizzo hardware in un indirizzo IP. Viene usato a volte per
453   durante l'avvio per assegnare un indirizzo IP ad una macchina.
454 \item[\textsl{ICMPv6}] \textit{Internet Control Message Protocol, version 6}.
455   Combina per IPv6 le funzionalità di ICMPv4, IGMP e ARP.
456 \item[\textsl{EGP}] \textit{Exterior Gateway Protocol}. È un protocollo di
457   routing usato per comunicare lo stato fra gateway vicini a livello di
458   \textsl{sistemi autonomi}\footnote{vengono chiamati \textit{autonomous
459       systems} i raggruppamenti al livello più alto della rete.}, con
460   meccanismi che permettono di identificare i vicini, controllarne la
461   raggiungibilità e scambiare informazioni sullo stato della rete. Viene
462   implementato direttamente sopra IP. 
463 \item[\textsl{OSPF}] \textit{Open Shortest Path First}. È in protocollo di
464   routing per router su reti interne, che permette a questi ultimi di
465   scambiarsi informazioni sullo stato delle connessioni e dei legami che
466   ciascuno ha con gli altri. Viene implementato direttamente sopra IP.
467 \item[\textsl{GRE}] \textit{Generic Routing Encapsulation}. È un protocollo
468   generico di incapsulamento che permette di incapsulare un qualunque altro
469   protocollo all'interno di IP. 
470 \item[\textsl{AH}] \textit{Authentication Header}. Provvede l'autenticazione
471   dell'integrità e dell'origine di un pacchetto. È una opzione nativa in IPv6
472   e viene implementato come protocollo a sé su IPv4. Fa parte della suite di
473   IPSEC che provvede la trasmissione cifrata ed autenticata a livello IP.
474 \item[\textsl{ESP}] \textit{Encapsulating Security Payload}. Provvede la
475   cifratura insieme all'autenticazione dell'integrità e dell'origine di un
476   pacchetto. Come per AH è opzione nativa in IPv6 e viene implementato come
477   protocollo a sé su IPv4.
478 \item[\textsl{PPP}] \textit{Point-to-Point Protocol}. È un protocollo a
479   livello 1 progettato per lo scambio di pacchetti su connessioni punto punto.
480   Viene usato per configurare i collegamenti, definire i protocolli di rete
481   usati ed incapsulare i pacchetti di dati. È un protocollo complesso con
482   varie componenti.
483 \item[\textsl{SLIP}] \textit{Serial Line over IP}. È un protocollo di livello
484   1 che permette di trasmettere un pacchetto IP attraverso una linea seriale.
485 \end{basedescript}
486
487 Gran parte delle applicazioni comunicano usando TCP o UDP, solo alcune, e per
488 scopi particolari si rifanno direttamente ad IP (ed i suoi correlati ICMP e
489 IGMP); benché sia TCP che UDP siano basati su IP e sia possibile intervenire a
490 questo livello con i \textit{raw socket} questa tecnica è molto meno diffusa e
491 a parte applicazioni particolari si preferisce sempre usare i servizi messi a
492 disposizione dai due protocolli precedenti.  Per questo motivo a parte alcuni
493 brevi accenni su IP in questa sezione ci concentreremo sul livello di
494 trasporto.
495
496 \subsection{Internet Protocol (IP)}
497 \label{sec:net_ip}
498
499 Quando si parla di IP ci si riferisce in genere alla versione attualmente in
500 uso che è la versione 4 (e viene pertanto chiamato IPv4). Questa versione
501 venne standardizzata nel 1981 dall'RFC~719.
502
503 Internet Protocol nasce per disaccoppiare le applicazioni della struttura
504 hardware delle reti di trasmissione, e creare una interfaccia di trasmissione
505 dei dati indipendente dal sottostante substrato di rete, che può essere
506 realizzato con le tecnologie più disparate (Ethernet, Token Ring, FDDI, etc.).
507 Il compito di IP è pertanto quello di trasmettere i pacchetti da un computer
508 all'altro della rete; le caratteristiche essenziali con cui questo viene
509 realizzato in IPv4 sono due:
510
511 \begin{itemize}
512 \item \textit{Universal addressing} la comunicazione avviene fra due stazioni
513   remote identificate univocamente con un indirizzo a 32 bit che può
514   appartenere ad una sola interfaccia di rete.
515 \item \textit{Best effort} viene assicurato il massimo impegno nella
516   trasmissione, ma non c'è nessuna garanzia per i livelli superiori né sulla
517   percentuale di successo né sul tempo di consegna dei pacchetti di dati.
518 \end{itemize}
519
520 Negli anni '90 la crescita vertiginosa del numero di macchine connesse a
521 internet ha iniziato a far emergere i vari limiti di IPv4, per risolverne i
522 problemi si è perciò definita una nuova versione del protocollo, che (saltando
523 un numero) è diventata la versione 6. IPv6 nasce quindi come evoluzione di
524 IPv4, mantendone inalterate le funzioni che si sono dimostrate valide,
525 eliminando quelle inutili e aggiungendone poche altre per mantenere il
526 protocollo il più snello e veloce possibile.
527
528 I cambiamenti apportati sono comunque notevoli e si possono essere riassunti a
529 grandi linee nei seguenti punti:
530 \begin{itemize}
531 \item l'espansione delle capacità di indirizzamento e instradamento, per
532   supportare una gerarchia con più livelli di indirizzamento, un numero di
533   nodi indirizzabili molto maggiore e una autoconfigurazione degli indirizzi.
534 \item l'introduzione un nuovo tipo di indirizzamento, l'\textit{anycast} che
535   si aggiunge agli usuali \textit{unycast} e \textit{multicast}.
536 \item la semplificazione del formato dell'intestazione (\textit{header}) dei
537   pacchetti, eliminando o rendendo opzionali alcuni dei campi di IPv4, per
538   eliminare la necessità di riprocessamento della stessa da parte dei router e
539   contenere l'aumento di dimensione dovuto all'ampliamento degli indirizzi.
540 \item un supporto per le opzioni migliorato, per garantire una trasmissione
541   più efficiente del traffico normale, limiti meno stringenti sulle dimensioni
542   delle opzioni, e la flessibilità necessaria per introdurne di nuove in
543   futuro.
544 \item il supporto per delle capacità di \textsl{qualità di servizio} (QoS) che
545   permettano di identificare gruppi di dati per i quali si può provvedere un
546   trattamento speciale (in vista dell'uso di internet per applicazioni
547   multimediali e/o ``real-time'').
548 \end{itemize}
549
550 Maggiori dettagli riguardo a caratteristiche, notazioni e funzionamento del
551 protocollo IP sono forniti nell'appendice \capref{cha:ip_protocol}.
552
553  
554 \subsection{User Datagram Protocol (UDP)}
555 \label{sec:net_udp}
556
557 UDP è un protocollo di trasporto molto semplice, la sua descrizione completa è
558 contenuta dell'RFC~768, ma in sostanza esso è una semplice interfaccia a IP
559 dal livello di trasporto. Quando un'applicazione usa UDP essa scrive un
560 pacchetto di dati (il cosiddetto \textit{datagram} che da il nome al
561 protocollo) su un socket\index{socket}, al pacchetto viene aggiunto un header
562 molto semplice (per una descrizione più accurata vedi \secref{sec:xxx_udp}), e
563 poi viene passato al livello superiore (IPv4 o IPv6 che sia) che lo spedisce
564 verso la destinazione.  Dato che né IPv4 né IPv6 garantiscono l'affidabilità
565 niente assicura che il pacchetto arrivi a destinazione, né che più pacchetti
566 arrivino nello stesso ordine in cui sono stati spediti.
567
568 Pertanto il problema principale che si affronta quando si usa UDP è la
569 mancanza di affidabilità, se si vuole essere sicuri che i pacchetti arrivino a
570 destinazione occorrerà provvedere con l'applicazione, all'interno della quale
571 si dovrà inserire tutto quanto necessario a gestire la notifica di
572 ricevimento, la ritrasmissione, il timeout. 
573
574 Si tenga conto poi che in UDP niente garantisce che i pacchetti arrivino nello
575 stesso ordine in cui sono stati trasmessi, e può anche accadere che i
576 pacchetti vengano duplicati nella trasmissione, e non solo perduti. Di tutto
577 questo di nuovo deve tenere conto l'applicazione.
578
579 Un'altro aspetto di UDP è che se un pacchetto raggiunge correttamente la
580 destinazione esso viene passato all'applicazione ricevente in tutta la sua
581 lunghezza, la trasmissione avviene perciò per \textit{record} la cui lunghezza
582 viene anche essa trasmessa all'applicazione all'atto del ricevimento.
583
584 Infine UDP è un protocollo che opera senza connessione
585 (\textit{connectionless}) in quanto non è necessario stabilire nessun tipo di
586 relazione tra origine e destinazione dei pacchetti. Si hanno così situazioni
587 in cui un client può scrivere su uno stesso socket\index{socket} pacchetti
588 destinati a server diversi, o un server ricevere su un socket\index{socket}
589 pacchetti provenienti da client diversi.  Il modo più semplice di immaginarsi
590 il funzionamento di UDP è quello della radio, in cui si può
591 ``\textsl{trasmettere a}'' e ``\textsl{ricevere da}'' più stazioni usando la
592 stessa frequenza.
593
594 Nonostante gli evidenti svantaggi comportati dall'inaffidabilità UDP ha il
595 grande pregio della velocità che in certi casi è essenziale; inoltre si presta
596 bene per le applicazioni in cui la connessione non è necessaria e
597 costituirebbe solo un peso in termini di prestazioni mentre una perdita di
598 pacchetti può essere tollerata, ad esempio le applicazioni di streaming e
599 quelle che usano il multicasting.
600
601 \subsection{Transport Control Protocol (TCP)}
602 \label{sec:net_tcp}
603
604 Il TCP è un protocollo molto complesso, definito nell'RFC~739 e completamente
605 diverso da UDP; alla base della sua progettazione infatti non stanno
606 semplicità e velocità, ma la ricerca della massima affidabilità possibile
607 nella trasmissione dei dati.
608
609 La prima differenza con UDP è che TCP provvede sempre una connessione diretta
610 fra un client e un server, attraverso la quale essi possono comunicare; per
611 questo il paragone più appropriato per questo protocollo è quello del
612 collegamento telefonico, in quanto prima viene stabilita una connessione fra
613 due i due capi della comunicazione su cui poi viene quest'ultima viene
614 effettuata.
615
616 Caratteristica fondamentale di TCP è l'affidabilità; quando i dati vengono
617 inviati attraverso una connessione ne viene richiesto un ``\textsl{ricevuto}''
618 (il cosiddetto \textit{acknowlegment}), se questo non arriva essi verranno
619 ritrasmessi per un determinato numero di tentativi, intervallati da un periodo
620 di tempo crescente, fino a che sarà considerata fallita o caduta la
621 connessione (e sarà generato un errore di \textit{timeout}); il periodo di
622 tempo dipende dall'implementazione e può variare far i quattro e i dieci
623 minuti.
624
625 Inoltre, per tenere conto delle diverse condizioni in cui può trovarsi la
626 linea di comunicazione, TCP comprende anche un algoritmo di calcolo dinamico
627 del tempo di andata e ritorno dei pacchetti fra un client e un server (il
628 cosiddetto RTT, \textit{round-trip time}), che lo rende in grado di adattarsi
629 alle condizioni della rete per non generare inutili ritrasmissioni o cadere
630 facilmente in timeout.
631
632 Inoltre TCP è in grado di preservare l'ordine dei dati assegnando un numero di
633 sequenza ad ogni byte che trasmette. Ad esempio se un'applicazione scrive 3000
634 byte su un socket\index{socket} TCP, questi potranno essere spezzati dal
635 protocollo in due segmenti (le unità di dati passate da TCP a IP vengono
636 chiamate \textit{segment}) di 1500 byte, di cui il primo conterrà il numero di
637 sequenza $1-1500$ e il secondo il numero $1501-3000$. In questo modo anche se
638 i segmenti arrivano a destinazione in un ordine diverso, o se alcuni arrivano
639 più volte a causa di ritrasmissioni dovute alla perdita degli
640 \textit{acknowlegment}, all'arrivo sarà comunque possibile riordinare i dati e
641 scartare i duplicati.
642
643 Il protocollo provvede anche un controllo di flusso (\textit{flow control}),
644 cioè specifica sempre all'altro capo della trasmissione quanti dati può
645 ricevere tramite una \textit{advertised window} (letteralmente
646 \textsl{finestra annunciata)}, che indica lo spazio disponibile nel buffer di
647 ricezione, cosicché nella trasmissione non vengano inviati più dati di quelli
648 che possono essere ricevuti.
649
650 Questa finestra cambia dinamicamente diminuendo con la ricezione dei dati dal
651 socket\index{socket} ed aumentando con la lettura di quest'ultimo da parte
652 dell'applicazione, se diventa nulla il buffer di ricezione è pieno e non
653 verranno accettati altri dati.  Si noti che UDP non provvede niente di tutto
654 ciò per cui nulla impedisce che vengano trasmessi pacchetti ad un ritmo che il
655 ricevente non può sostenere.
656
657 Infine attraverso TCP la trasmissione è sempre bidirezionale (in inglese si
658 dice che è \textit{full-duplex}). È cioè possibile sia trasmettere che
659 ricevere allo stesso tempo, il che comporta che quanto dicevamo a proposito
660 del controllo di flusso e della gestione della sequenzialità dei dati viene
661 effettuato per entrambe le direzioni di comunicazione.
662
663 %% Una descrizione più accurata del protocollo è fornita in appendice
664 %% \capref{cha:tcp_protocol}.
665
666 \subsection{Limiti e dimensioni riguardanti la trasmissione dei dati}
667 \label{sec:net_lim_dim}
668
669 Un aspetto di cui bisogna tenere conto nella programmazione di rete, e che
670 ritornerà anche più avanti, è che ci sono una serie di limiti a cui la
671 trasmissione dei dati attraverso i vari livelli del protocollo deve
672 sottostare, limiti che è opportuno tenere presente perché in certi casi si
673 possono avere delle conseguenze sul comportamento delle applicazioni.
674
675 Un elenco di questi limiti, insieme ad un breve accenno alle loro origini ed
676 alle eventuali implicazioni che possono avere, è il seguente:
677 \begin{itemize}
678 \item La dimensione massima di un pacchetto IP è di 65535 byte, compresa
679   l'intestazione. Questo è dovuto al fatto che la dimensione è indicata da un
680   campo apposito nell'header di IP che è lungo 16 bit (vedi
681   \figref{fig:IP_ipv4_head}).
682 \item La dimensione massima di un pacchetto normale di IPv6 è di 65575 byte,
683   il campo apposito nell'header infatti è sempre a 16 bit, ma la dimensione
684   dell'header è fissa e di 40 byte e non è compresa nel valore indicato dal
685   suddetto campo. Inoltre IPv6 ha la possibilità di estendere la dimensione di
686   un pacchetto usando la \textit{jumbo payload option}.
687 \item Molte reti fisiche hanno un MTU (\textit{maximum transfer unit}) che
688   dipende dal protocollo specifico usato al livello di connessione fisica. Il
689   più comune è quello di ethernet che è pari a 1500 byte, una serie di altri
690   valori possibili sono riportati in \tabref{tab:net_mtu_values}.
691 \end{itemize}
692
693 Quando un pacchetto IP viene inviato su una interfaccia di rete e le sue
694 dimensioni eccedono la MTU viene eseguita la cosiddetta
695 \textit{frammentazione}, i pacchetti cioè vengono suddivisi\footnote{questo
696   accade sia per IPv4 che per IPv6, anche se i pacchetti frammentati sono
697   gestiti con modalità diverse, IPv4 usa un flag nell'header, IPv6 una
698   opportuna opzione, si veda \secref{cha:ip_protocol}.}) in blocchi più
699 piccoli che possono essere trasmessi attraverso l'interfaccia.
700
701 \begin{table}[!htb]
702   \centering
703   \begin{tabular}[c]{|l|c|}
704     \hline
705     \textbf{Rete} & \textbf{MTU} \\
706     \hline
707     \hline
708     Hyperlink & 65535 \\
709     Token Ring IBM (16 Mbit/sec) & 17914 \\
710     Token Ring IEEE 802.5 (4 Mbit/sec) & 4464 \\
711     FDDI & 4532 \\
712     Ethernet & 1500 \\
713     X.25 & 576 \\
714     \hline
715   \end{tabular}
716   \caption{Valori della MTU (\textit{maximum transfer unit}) per una serie di
717     reti diverse.}
718   \label{tab:net_mtu_values}
719 \end{table}
720
721 La MTU più piccola fra due stazioni viene in genere chiamata \textit{path
722   MTU}, che dice qual'è la lunghezza massima oltre la quale un pacchetto
723 inviato da una stazione ad un'altra verrebbe senz'altro frammentato. Si tenga
724 conto che non è affatto detto che la \textit{path MTU} sia la stessa in
725 entrambe le direzioni, perché l'instradamento può essere diverso nei due
726 sensi, con diverse tipologie di rete coinvolte.
727
728 Una delle differenze fra IPv4 e IPv6 é che per IPv6 la frammentazione può
729 essere eseguita solo alla sorgente, questo vuol dire che i router IPv6 non
730 frammentano i pacchetti che ritrasmettono (anche se possono frammentare i
731 pacchetti che generano loro stessi), mentre i router IPv4 si. In ogni caso una
732 volta frammentati i pacchetti possono essere riassemblati solo alla
733 destinazione.
734
735 Nell'header di IPv4 è previsto il flag \texttt{DF} che specifica che il
736 pacchetto non deve essere frammentato; un router che riceva un pacchetto le
737 cui dimensioni eccedano quelle dell'MTU della rete di destinazione genererà un
738 messaggio di errore ICMPv4 di tipo \textit{destination unreachable,
739   fragmentation needed but DF bit set}.  Dato che i router IPv6 non possono
740 effettuare la frammentazione la ricezione di un pacchetto di dimensione
741 eccessiva per la ritrasmissione genererà sempre un messaggio di errore ICMPv6
742 di tipo \textit{packet too big}.
743
744 Dato che il meccanismo di frammentazione e riassemblaggio dei pacchetti
745 comporta inefficienza, normalmente viene utilizzato un procedimento, detto
746 \textit{path MTU discovery} che permette di determinare il \textit{path MTU}
747 fra due stazioni; per la realizzazione del procedimento si usa il flag DF di
748 IPv4 e il comportamento normale di IPv6 inviando delle opportune serie di
749 pacchetti (per i dettagli vedere l'RFC~1191 per IPv4 e l'RFC~1981 per IPv6)
750 fintanto che non si hanno più errori.
751
752 Il TCP usa sempre questo meccanismo, che per le implementazioni di IPv4 è
753 opzionale, mentre diventa obbligatorio per IPv6.  Per IPv6 infatti, non
754 potendo i router frammentare i pacchetti, è necessario, per poter comunicare,
755 conoscere da subito il \textit{path MTU}.
756
757 Infine TCP definisce una \textit{maximum segment size} MSS che annuncia
758 all'altro capo della connessione la dimensione massima dimensione del segmento
759 di dati che può essere ricevuto, così da evitare la frammentazione. Di norma
760 viene impostato alla dimensione della MTU dell'interfaccia meno la lunghezza
761 delle intestazioni di IP e TCP, in Linux il default, mantenuto nella costante
762 \const{TCP\_MSS} è 512.
763
764
765 %\subsection{Il passaggio dei dati in TCP}
766 %\label{sec:net_tcp_pass}
767
768 %\subsection{Il passaggio dei dati in UDP}
769 %\label{sec:net_udp_pass}
770
771 %%% Local Variables: 
772 %%% mode: latex
773 %%% TeX-master: "gapil"
774 %%% End: