Nuovo overview dei protocolli. Scritto qualcosa su peer-to-peer e three-tier
[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 archietetture
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 archietetture \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 archietture 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 disribuiti
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'archiettettura \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 per i
138 database che non possono essere replicati e sincronizzati facilemente, e che
139 sono molto onerosi sia in termini di richiesta risorse.
140
141 È a partire da queste problematiche che nasce il modello \textit{three-tier},
142 che si struttura, come dice il nome, su tre livelli. Il primo, quello dei
143 client, che eseguono le richieste e gestiscono l'interfaccia con l'utente,
144 resta sostanzialmente lo stesso del modello \textit{client-server}, ma la
145 parte server viene suddivisa in due livelli, introducendo un
146 \textit{middle-tier}, su cui deve appoggiarsi tutta la logica di analisi delle
147 richieste dei client per ottimizzare l'accesso al terzo livello, quello dei
148 server che invece si limita a fornire dei dati che verranno usati dal
149 \textit{middle-tier} per eseguire le operazioni.
150
151
152
153 \section{I protocolli di rete}
154 \label{sec:net_protocols}
155
156 Parlando di reti di computer si parla in genere di un insieme molto vasto ed
157 eterogeneo di mezzi di comunicazione che vanno dal cavo telefonico, alla fibra
158 ottica, alle comunicazioni via satellite o via radio; per rendere possibile la
159 comunicazione attraverso un così variegato insieme di mezzi sono stati
160 adottati una serie di protocolli, il più famoso dei quali, quello alla base
161 del funzionamento di internet, è il protocollo TCP/IP.
162
163 \subsection{Il modello ISO/OSI}
164 \label{sec:net_iso_osi}
165
166 Una caratteristica comune dei protocolli di rete è il loro essere strutturati
167 in livelli sovrapposti; in questo modo ogni protocollo di un certo livello
168 realizza le sue funzionalità basandosi su un protocollo del livello
169 sottostante.  Questo modello di funzionamento è stato stato standardizzato
170 dalla \textit{International Standards Organization} (ISO) che ha preparato fin
171 dal 1984 il Modello di Riferimento \textit{Open Systems Interconnection}
172 (OSI), strutturato in sette livelli, secondo quanto riportato in
173 \tabref{tab:net_osilayers}.
174
175 \begin{table}[htb]
176   \centering
177   \begin{tabular}{|l|c|c|} 
178     \hline
179     \textbf{Livello} & \multicolumn{2}{|c|}{\textbf{Nome}} \\
180     \hline
181     \hline
182     Livello 7&\textit{Application}  &\textsl{Applicazione}\\ 
183     Livello 6&\textit{Presentation} &\textsl{Presentazione} \\ 
184     Livello 5&\textit{Session}      &\textsl{Sessione} \\ 
185     Livello 4&\textit{Transport}    &\textsl{Trasporto} \\ 
186     Livello 3&\textit{Network}      &\textsl{Rete}\\ 
187     Livello 2&\textit{DataLink}     &\textsl{Collegamento Dati} \\
188     Livello 1&\textit{Connection}   &\textsl{Connessione Fisica} \\
189     \hline
190 \end{tabular}
191 \caption{I sette livelli del protocollo ISO/OSI.}
192 \label{tab:net_osilayers}
193 \end{table}
194
195 Il modello ISO/OSI è stato sviluppato in corrispondenza alla definizione della
196 serie di protocolli X.25 per la commutazione di pacchetto. Ma nonostante il
197 lavoro dettagliato di standardizzazione il modello si è rivelato
198 sostanzialmente troppo complesso e poco flessibile rispetto a quello
199 precedente, il TCP/IP, su cui si basa internet, che è diventato uno standard
200 de facto.  Il modello di quest'ultimo viene chiamato anche modello DoD (sigla
201 che sta per \textit{Department of Defense}), dato che fu sviluppato
202 dall'agenzia ARPA per il Dipartimento della Difesa Americano.
203
204 \begin{figure}[!htbp]
205   \centering
206   \includegraphics[width=12cm]{img/iso_tcp_comp}
207   \caption{Struttura a livelli dei protocolli OSI e TCP/IP, con la  
208     relative corrispondenze e la divisione fra kernel e user space.}
209   \label{fig:net_osi_tcpip_comp}
210 \end{figure}
211
212
213 \subsection{Il modello TCP/IP (o DoD)}
214 \label{sec:net_tcpip_overview}
215
216 Così come ISO/OSI anche il modello del TCP/IP è stato strutturato in livelli
217 (riassunti in \tabref{tab:net_layers}); un confronto fra i due è riportato in
218 \figref{fig:net_osi_tcpip_comp} dove viene evidenziata anche la corrispondenza
219 fra i rispettivi livelli (che comunque è approssimativa) e su come essi vanno
220 ad inserirsi all'interno di un sistema rispetto alla divisione fra user space
221 e kernel space spiegata in \secref{sec:intro_unix_struct}.
222
223 \begin{table}[htb]
224   \centering
225   \begin{tabular}{|l|c|c|l|} 
226     \hline
227     \textbf{Livello} & \multicolumn{2}{|c|}{\textbf{Nome}} & \textbf{Esempi} \\
228     \hline
229     \hline
230     Livello 4&\textit{Application} &\textsl{Applicazione}& 
231     Telnet, FTP, etc. \\ 
232     Livello 3&\textit{Transport} &\textsl{Trasporto}& TCP, UDP \\ 
233     Livello 2&\textit{Network} &\textsl{Rete}& IP, (ICMP, IGMP)  \\ 
234     Livello 1&\textit{Link} &\textsl{Connessione}& 
235     device driver \& scheda di interfaccia  \\
236     \hline
237 \end{tabular}
238 \caption{I quattro livelli del protocollo TCP/IP.}
239 \label{tab:net_layers}
240 \end{table}
241
242 Come si può notare come il modello TCP/IP è più semplice del modello ISO/OSI
243 ed è strutturato in soli quattro livelli. Il suo nome deriva dai due
244 principali protocolli che lo compongono, il TCP (\textit{Trasmission Control
245   Protocol}) che copre il livello 3 e l'IP (\textit{Internet Protocol}) che
246 copre il livello 2. Le funzioni dei vari livelli sono le seguenti:
247
248 \begin{description}
249 \item \textbf{Applicazione} É relativo ai programmi di interfaccia con la
250   rete, in genere questi vengono realizzati secondo il modello client-server
251   (vedi \secref{sec:net_cliserv}), realizzando una comunicazione secondo un
252   protocollo che è specifico di ciascuna applicazione.
253 \item \textbf{Trasporto} Fornisce la comunicazione tra le due stazioni
254   terminali su cui girano gli applicativi, regola il flusso delle
255   informazioni, può fornire un trasporto affidabile, cioè con recupero degli
256   errori o inaffidabile. I protocolli principali di questo livello sono il TCP
257   e l'UDP.
258 \item \textbf{Rete} Si occupa dello smistamento dei singoli pacchetti su una
259   rete complessa e interconnessa, a questo stesso livello operano i protocolli
260   per il reperimento delle informazioni necessarie allo smistamento, per lo
261   scambio di messaggi di controllo e per il monitoraggio della rete. Il
262   protocollo su cui si basa questo livello è IP (sia nella attuale versione,
263   IPv4 che nella nuova IPv6).
264 \item \textbf{Connessione} È responsabile per l'interfacciamento al
265   dispositivo elettronico che effettua la comunicazione fisica, gestendo
266   l'invio e la ricezione dall'hardware dei pacchetti.
267 \end{description}
268
269
270 La comunicazione fra due stazioni remote avviene secondo le modalità
271 illustrate in \figref{fig:net_tcpip_data_flux}, dove si è riportato il flusso
272 dei dati reali e i protocolli usati per lo scambio di informazione su ciascun
273 livello. Si è genericamente indicato \textit{ethernet} per il livello 1, anche
274 se in realtà i protocolli di trasmissione usati possono essere molti altri.
275
276 \begin{figure}[!htb]
277   \centering \includegraphics[width=10cm]{img/tcp_data_flux}
278   \caption{Strutturazione del flusso dei dati nella comunicazione fra due
279     applicazioni attraverso i protocolli della suite TCP/IP.}
280   \label{fig:net_tcpip_data_flux}
281 \end{figure}
282
283 La struttura della comunicazione attraverso il TCP/IP si può pertanto
284 riassumere nei seguenti passi:
285 \begin{itemize}
286 \item Le singole applicazioni si scambieranno i dati secondo un loro formato
287   specifico, implementando un protocollo di applicazione (esempi possono
288   essere HTTP, POP, telnet, SMTP, etc).
289 \item Questi dati vengono inviati al livello di trasporto usando
290   un'interfaccia opportuna (i \textit{socket}\index{socket}, che esamineremo
291   in dettaglio in seguito). Qui verranno spezzati in pacchetti di dimensione
292   opportuna e incapsulati nel protocollo di trasporto, aggiungendo ad ogni
293   pacchetto le informazioni necessarie per la sua gestione. Questo processo
294   viene svolto direttamente nel kernel ad esempio dallo stack TCP nel caso il
295   protocollo di trasporto sia questo.
296 \item Una volta composto il pacchetto nel formato adatto al protocollo di
297   trasporto usato questo sarà passato al successivo livello, quello di rete,
298   che si occupa di inserire le opportune informazioni per poter effettuare
299   l'instradamento nella rete ed il recapito alla destinazione finale. In
300   genere questo è il livello di IP (Internet Protocol), a cui vengono inseriti
301   i numeri IP che identificano i computer su internet.
302 \item L'ultimo passo è il trasferimento del pacchetto al driver della
303   interfaccia di trasmissione che si incarica di incapsularlo nel relativo
304   protocollo di trasmissione fisica usato dall'hardware usato per la
305   comunicazione (ad esempio \textit{ethernet} per una scheda di rete).
306 \end{itemize}
307
308
309 \subsection{Criteri generali dell'architettura del TCP/IP}
310 \label{sec:net_tcpip_design}
311
312 La filosofia architetturale del TCP/IP è semplice: costruire una rete che
313 possa sopportare il carico in transito, ma permettere ai singoli nodi di
314 scartare pacchetti se il carico è temporaneamente eccessivo, o se risultano
315 errati o non recapitabili.
316
317 L'incarico di rendere il recapito pacchetti affidabile non spetta allo livello
318 di collegamento, ma ai livelli superiori. Pertanto il protocollo IP è per sua
319 natura inaffidabile, in quanto non è assicurata né una percentuale di
320 successo né un limite sui tempi di consegna dei pacchetti.
321
322 È il livello di trasporto che si deve occupare (qualora necessiti) del
323 controllo del flusso dei dati e del recupero degli errori; questo è realizzato
324 dal protocollo TCP. La sede principale di "intelligenza" della rete è pertanto
325 al livello di trasporto o superiore.
326
327 Infine le singole stazioni collegate alla rete non fungono soltanto da punti
328 terminali di comunicazione, ma possono anche assumere il ruolo di router, per
329 l'interscambio di pacchetti da una rete ad un'altra. Questo rende possibile la
330 flessibilità della rete che è in grado di adattarsi ai mutamenti delle
331 interconnessioni.
332
333 La caratteristica essenziale che rende tutto ciò possibile è la strutturazione
334 a livelli tramite l'incapsulamento. Ogni pacchetto di dati viene incapsulato
335 nel formato del livello successivo, fino al livello della connessione fisica.
336 In questo modo il pacchetto ricevuto ad un livello \textit{n} dalla stazione
337 di destinazione è esattamente lo stesso spedito dal livello \textit{n} dalla
338 sorgente.  Questo rende facile il progettare il software facendo riferimento
339 unicamente a quanto necessario ad un singolo livello, con la confidenza che
340 questo poi sarà trattato uniformemente da tutti i nodi della rete.
341
342
343 \section{Il protocollo TCP/IP}
344 \label{sec:net_tpcip}
345
346 Come appena mostrato il protocollo TCP/IP è un insieme di protocolli diversi,
347 che operano su 4 livelli diversi. Per gli interessi della programmazione di
348 rete però sono importanti principalmente i due livelli centrali, e soprattutto
349 quello di trasporto. 
350
351 La principale interfaccia di programmazione di rete, quella dei
352 socket\index{socket}, è infatti un'interfaccia nei confronti di quest'ultimo.
353 Questo avviene perché al di sopra del livello di trasporto i programmi hanno a
354 che fare solo con dettagli specifici delle applicazioni, mentre al di sotto
355 vengono curati tutti i dettagli relativi alla comunicazione. È pertanto
356 naturale definire una interfaccia di programmazione su questo confine tanto
357 più che è proprio lì (come evidenziato in \figref{fig:net_osi_tcpip_comp}) che
358 nei sistemi Unix (e non solo) viene inserita la divisione fra kernel space e
359 user space.
360
361 In realtà in un sistema Unix è possibile accedere anche agli altri livelli
362 inferiori (e non solo a quello di trasporto) con opportune interfacce (la cosa
363 è indicata in \figref{fig:net_osi_tcpip_comp} lasciando uno spazio fra UDP e
364 TCP), ma queste vengono usate solo quando si vogliono fare applicazioni di
365 sistema per il controllo della rete a basso livello, un uso quindi molto
366 specialistico, e che non rientra in quanto trattato qui.
367
368 In questa sezione daremo una breve descrizione dei vari protocolli del TCP/IP,
369 concentrandoci, per le ragioni esposte sul livello di trasporto. All'interno
370 di questo privilegeremo poi il protocollo TCP, per il ruolo centrale che
371 svolge nella maggior parte delle applicazioni.
372
373
374 \subsection{Il quadro generale}
375 \label{sec:net_tcpip_general}
376
377 Benché si parli di TCP/IP questa famiglia di protocolli è composta anche da
378 altri membri. In \figref{fig:net_tcpip_overview} si è riportato uno schema che
379 mostra un panorama sui vari protocolli della famiglia, e delle loro relazioni
380 reciproche e con alcune dalle principali applicazioni che li usano.
381
382 \begin{figure}[!htbp]
383   \centering
384   \includegraphics[width=13cm]{img/tcpip_overview}  
385   \caption{Panoramica sui vari protocolli che compongono la suite TCP/IP.}
386   \label{fig:net_tcpip_overview}
387 \end{figure}
388
389 I vari protocolli mostrati in figura sono i seguenti:
390
391 \begin{list}{}{}
392 \item \textsl{IPv4} \textit{Internet Protocol version 4}. È quello che
393   comunemente si chiama IP. Ha origine negli anni '80 e da allora è la base su
394   cui è costruita internet. Usa indirizzi a 32 bit e provvede la trasmissione
395   dei pacchetti TCP, UDP, ICMP e IGMP.
396 \item \textsl{IPv6} \textit{Internet Protocol version 6}. È stato progettato a
397   metà degli anni '90 per rimpiazzare IPv4. Ha indirizzi a 128 bit e effettua
398   lo stesso servizio di trasporto di IPv4 per i pacchetti TCP, UDP e ICPMv6.
399 \item \textsl{TCP} \textit{Trasmission Control Protocol}. È un protocollo
400   orientato alla connessione che provvede un trasporto affidabile e
401   bidirezionale di un flusso di dati. I socket\index{socket} TCP sono esempi
402   di \textit{stream socket}. Il protocollo ha cura di tutti gli aspetti del
403   trasporto, come l'acknoweledgment, i timeout, la ritrasmissione, etc. È
404   usato dalla maggior parte delle applicazioni. Può essere usato sia con IPv4
405   che con IPv6.
406 \item \textsl{UDP} \textit{User Datagram Protocol}. È un protocollo senza
407   connessione, a pacchetti. I socket\index{socket} UDP sono esempi di
408   \textit{datagram socket}. Contrariamente al TCP il protocollo non è
409   affidabile e non c'è garanzia che i pacchetti raggiungano la loro
410   destinazione, si perdano o vengano duplicati, o abbiano un particolare
411   ordine di arrivo. Può essere usato sia con IPv4 che con IPv6.
412 \item \textsl{ICMP} \textit{Internet Control Message Protocol}. Gestisce gli
413   errori e trasporta l'informazione di controllo fra stazioni remote e
414   instradatori (\textit{host} e \textit{router}). I messaggi sono normalmente
415   generati dal software del kernel che gestisce la comunicazione TCP/IP, anche
416   se ICMP può venire usato direttamente da alcuni programmi come
417   \texttt{ping}. A volte ci si riferisce ad esso come ICPMv4 per distinguerlo
418   da ICMPv6.
419 \item \textsl{IGMP} \textit{Internet Group Management Protocol}. É un
420   protocollo usato per il \textit{multicasting} (vedi
421   \secref{sec:xxx_multicast}), che è opzionale in IPv4.
422 \item \textsl{ARP} \textit{Address Resolution Protocol}. È il protocollo che
423   mappa un indirizzo IP in un indirizzo hardware (come un indirizzo
424   internet). È usato in reti di tipo broadcast come Ethernet, Token Ring o
425   FDDI ma non serve in connessioni punto-punto.
426 \item \textsl{RARP} \textit{Reverse Address Resolution Protocol}. È il
427   protocollo che mappa un indirizzo hardware in un indirizzo IP. Viene usato a
428   volte per durante il boot per assegnare un indirizzo IP ad una macchina.
429 \item \textsl{ICMPv6} \textit{Internet Control Message Protocol, version 6}.
430   Combina per IPv6 le funzionalità di ICMPv4, IGMP e ARP.
431 \item \textsl{NETLINK} \textit{Netlink}.  Provvede, in Linux, l'interfaccia di
432   accesso alla comunicazione a basso livello.
433 \end{list}
434
435 Gran parte delle applicazioni comunicano usando TCP o UDP, solo alcune, e per
436 scopi particolari si rifanno dirattamente ad IP (ed i suoi correlati ICMP e
437 IGMP); benché sia TCP che UDP siano basati su IP e sia possibile intervenire a
438 questo livello con i \textit{raw socket} questa tecnica è molto meno diffusa e
439 a parte applicazioni particolari si preferisce sempre usare i servizi messi a
440 disposizione dai due protocolli precedenti.  Per questo motivo a parte alcuni
441 brevi accenni su IP in questa sezione ci concentreremo sul livello di
442 trasporto.
443
444 \subsection{Internet Protocol (IP)}
445 \label{sec:net_ip}
446
447 Quando si parla di IP ci si riferisce in genere alla versione attualmente in
448 uso che è la versione 4 (e viene pertanto chiamato IPv4). Questa versione
449 venne standardizzata nel 1981 dall'RFC~719.
450
451 Internet Protocol nasce per disaccoppiare le applicazioni della struttura
452 hardware delle reti di trasmissione, e creare una interfaccia di trasmissione
453 dei dati indipendente dal sottostante substrato di rete, che può essere
454 realizzato con le tecnologie più disparate (Ethernet, Token Ring, FDDI, etc.).
455 Il compito di IP è pertanto quello di trasmettere i pacchetti da un computer
456 all'altro della rete; le caratteristiche essenziali con cui questo viene
457 realizzato in IPv4 sono due:
458
459 \begin{itemize}
460 \item \textit{Universal addressing} la comunicazione avviene fra due stazioni
461   remote identificate univocamente con un indirizzo a 32 bit che può
462   appartenere ad una sola interfaccia di rete.
463 \item \textit{Best effort} viene assicurato il massimo impegno nella
464   trasmissione, ma non c'è nessuna garanzia per i livelli superiori né sulla
465   percentuale di successo né sul tempo di consegna dei pacchetti di dati.
466 \end{itemize}
467
468 Negli anni '90 la crescita vertiginosa del numero di macchine connesse a
469 internet ha iniziato a far emergere i vari limiti di IPv4, per risolverne i
470 problemi si è perciò definita una nuova versione del protocollo, che (saltando
471 un numero) è diventata la versione 6. IPv6 nasce quindi come evoluzione di
472 IPv4, mantendone inalterate le funzioni che si sono dimostrate valide,
473 eliminando quelle inutili e aggiungendone poche altre per mantenere il
474 protocollo il più snello e veloce possibile.
475
476 I cambiamenti apportati sono comunque notevoli e si possono essere riassunti a
477 grandi linee nei seguenti punti:
478 \begin{itemize}
479 \item l'espansione delle capacità di indirizzamento e instradamento, per
480   supportare una gerarchia con più livelli di indirizzamento, un numero di
481   nodi indirizzabili molto maggiore e una autoconfigurazione degli indirizzi.
482 \item l'introduzione un nuovo tipo di indirizzamento, l'\textit{anycast} che
483   si aggiunge agli usuali \textit{unycast} e \textit{multicast}.
484 \item la semplificazione del formato dell'intestazione (\textit{header}) dei
485   pacchetti, eliminando o rendendo opzionali alcuni dei campi di IPv4, per
486   eliminare la necessità di riprocessamento della stessa da parte dei router e
487   contenere l'aumento di dimensione dovuto all'ampliamento degli indirizzi.
488 \item un supporto per le opzioni migliorato, per garantire una trasmissione
489   più efficiente del traffico normale, limiti meno stringenti sulle dimensioni
490   delle opzioni, e la flessibilità necessaria per introdurne di nuove in
491   futuro.
492 \item il supporto per delle capacità di \textsl{qualità di servizio} (QoS) che
493   permettano di identificare gruppi di dati per i quali si può provvedere un
494   trattamento speciale (in vista dell'uso di internet per applicazioni
495   multimediali e/o ``real-time'').
496 \end{itemize}
497
498 Maggiori dettagli riguardo a caratteristiche, notazioni e funzionamento del
499 protocollo IP sono forniti nell'appendice \capref{cha:ip_protocol}.
500
501  
502 \subsection{User Datagram Protocol (UDP)}
503 \label{sec:net_udp}
504
505 UDP è un protocollo di trasporto molto semplice, la sua descrizione completa è
506 contenuta dell'RFC~768, ma in sostanza esso è una semplice interfaccia a IP
507 dal livello di trasporto. Quando un'applicazione usa UDP essa scrive un
508 pacchetto di dati (il cosiddetto \textit{datagram} che da il nome al
509 protocollo) su un socket\index{socket}, al pacchetto viene aggiunto un header
510 molto semplice (per una descrizione più accurata vedi \secref{sec:xxx_udp}), e
511 poi viene passato al livello superiore (IPv4 o IPv6 che sia) che lo spedisce
512 verso la destinazione.  Dato che né IPv4 né IPv6 garantiscono l'affidabilità
513 niente assicura che il pacchetto arrivi a destinazione, né che più pacchetti
514 arrivino nello stesso ordine in cui sono stati spediti.
515
516 Pertanto il problema principale che si affronta quando si usa UDP è la
517 mancanza di affidabilità, se si vuole essere sicuri che i pacchetti arrivino a
518 destinazione occorrerà provvedere con l'applicazione, all'interno della quale
519 si dovrà inserire tutto quanto necessario a gestire la notifica di
520 ricevimento, la ritrasmissione, il timeout. 
521
522 Si tenga conto poi che in UDP niente garantisce che i pacchetti arrivino nello
523 stesso ordine in cui sono stati trasmessi, e può anche accadere che i
524 pacchetti vengano duplicati nella trasmissione, e non solo perduti. Di tutto
525 questo di nuovo deve tenere conto l'applicazione.
526
527 Un'altro aspetto di UDP è che se un pacchetto raggiunge correttamente la
528 destinazione esso viene passato all'applicazione ricevente in tutta la sua
529 lunghezza, la trasmissione avviene perciò per \textit{record} la cui lunghezza
530 viene anche essa trasmessa all'applicazione all'atto del ricevimento.
531
532 Infine UDP è un protocollo che opera senza connessione
533 (\textit{connectionless}) in quanto non è necessario stabilire nessun tipo di
534 relazione tra origine e destinazione dei pacchetti. Si hanno così situazioni
535 in cui un client può scrivere su uno stesso socket\index{socket} pacchetti
536 destinati a server diversi, o un server ricevere su un socket\index{socket}
537 pacchetti provenienti da client diversi.  Il modo più semplice di immaginarsi
538 il funzionamento di UDP è quello della radio, in cui si può
539 ``\textsl{trasmettere a}'' e ``\textsl{ricevere da}'' più stazioni usando la
540 stessa frequenza.
541
542 Nonostante gli evidenti svantaggi comportati dall'inaffidabilità UDP ha il
543 grande pregio della velocità che in certi casi è essenziale; inoltre si presta
544 bene per le applicazioni in cui la connessione non è necessaria e
545 costituirebbe solo un peso in termini di prestazioni mentre una perdita di
546 pacchetti può essere tollerata, ad esempio le applicazioni di streaming e
547 quelle che usano il multicasting.
548
549 \subsection{Transport Control Protocol (TCP)}
550 \label{sec:net_tcp}
551
552 Il TCP è un protocollo molto complesso, definito nell'RFC~739 e completamente
553 diverso da UDP; alla base del suo design infatti non stanno semplicità e
554 velocità, ma la ricerca della massima affidabilità possibile nella
555 trasmissione dei dati.
556
557 La prima differenza con UDP è che TCP provvede sempre una connessione diretta
558 fra un client e un server, attraverso la quale essi possono comunicare; per
559 questo il paragone più appropriato per questo protocollo è quello del
560 collegamento telefonico, in quanto prima viene stabilita una connessione fra
561 due i due capi della comunicazione su cui poi viene quest'ultima viene
562 effettuata.
563
564 Caratteristica fondamentale di TCP è l'affidabilità; quando i dati vengono
565 inviati attraverso una connessione ne viene richiesto un ``\textsl{ricevuto}''
566 (il cosiddetto \textit{acknowlegment}), se questo non arriva essi verranno
567 ritrasmessi per un determinato numero di tentativi, intervallati da un periodo
568 di tempo crescente, fino a che sarà considerata fallita o caduta la
569 connessione (e generato un errore di \textit{time-out}), dopo un periodo di
570 tempo che dipende dall'implementazione e che può variare far i quattro e i
571 dieci minuti.
572
573 Inoltre per tenere conto delle diverse condizioni in cui può trovarsi la linea
574 di comunicazione TCP comprende anche un algoritmo di calcolo dinamico del
575 tempo di andata e ritorno dei pacchetti (il cosiddetto RTT, 
576 \textit{round-trip time}) fra un client e un server che lo rende in grado di
577 adattarsi alle condizioni della rete per non generare inutili ritrasmissioni o
578 cadere facilmente in timeout.
579
580 Inoltre TCP è in grado di preservare l'ordine dei dati assegnando un numero di
581 sequenza ad ogni byte che trasmette. Ad esempio se un'applicazione scrive 3000
582 byte su un socket\index{socket} TCP, questi potranno essere spezzati dal
583 protocollo in due segmenti (le unità di dati passate da TCP a IP vengono
584 chiamate \textit{segment}) di 1500 byte, di cui il primo conterrà il numero di
585 sequenza $1-1500$ e il secondo il numero $1501-3000$. In questo modo anche se
586 i segmenti arrivano a destinazione in un ordine diverso, o se alcuni arrivano
587 più volte a causa di ritrasmissioni dovute alla perdita dei ricevuto,
588 all'arrivo sarà comunque possibile riordinare i dati e scartare i duplicati.
589
590 Il protocollo provvede anche un controllo di flusso (\textit{flow control}),
591 cioè specifica sempre all'altro capo della trasmissione quanti dati può
592 ricevere tramite una \textit{advertised window} (letteralmente
593 \textsl{finestra annunciata)}, che indica lo spazio disponibile nel buffer di
594 ricezione, cosicché nella trasmissione non vengano inviati più dati di quelli
595 che possono essere ricevuti.
596
597 Questa finestra cambia dinamicamente diminuendo con la ricezione dei dati dal
598 socket\index{socket} ed aumentando con la lettura di quest'ultimo da parte
599 dell'applicazione, se diventa nulla il buffer di ricezione è pieno e non
600 verranno accettati altri dati.  Si noti che UDP non provvede niente di tutto
601 ciò per cui nulla impedisce che vengano trasmessi pacchetti ad un rate che il
602 ricevente non può sostenere.
603
604 Infine attraverso TCP la trasmissione è sempre bidirezionale (in inglese
605 \textit{full-duplex}), è cioè possibile sia trasmettere che ricevere allo
606 stesso tempo, il che poi comporta che quanto dicevamo a proposito del
607 controllo di flusso e della gestione della sequenzialità dei dati viene
608 effettuato per entrambe le direzioni di comunicazione.
609
610 Una descrizione più accurata del protocollo è fornita in appendice
611 \capref{cha:tcp_protocol}.
612
613 \subsection{Limiti e dimensioni riguardanti la trasmissione dei dati}
614 \label{sec:net_lim_dim}
615
616 Un aspetto di cui bisogna tenere conto nella programmazione di rete, e che
617 ritornerà anche più avanti, è che ci sono una serie di limiti a cui la
618 trasmissione dei dati attraverso i vari livelli del protocollo deve
619 sottostare, limiti che è opportuno tenere presente perché in certi casi si
620 possono avere delle conseguenze sul comportamento delle applicazioni.
621
622 Un elenco di questi limiti, insieme ad un breve accenno alle loro origini ed
623 alle eventuali implicazioni che possono avere, è il seguente:
624 \begin{itemize}
625 \item La dimensione massima di un pacchetto IP è di 65535 byte, compreso
626   l'header. Questo è dovuto al fatto che la dimensione è indicata da un campo
627   apposito nell'header di IP che è lungo 16 bit (vedi
628   \figref{fig:IP_ipv4_head}).
629 \item La dimensione massima di un pacchetto normale di IPv6 è di 65575 byte,
630   il campo apposito nell'header infatti è sempre a 16 bit, ma la dimensione
631   dell'header è fissa e di 40 byte e non è compresa nel valore indicato dal
632   suddetto campo. Inoltre IPv6 ha la possibilità di estendere la dimensione di
633   un pacchetto usando la \textit{jumbo payload option}.
634 \item Molte reti fisiche hanno un MTU (\textit{maximum transfer unit}) che
635   dipende dal protocollo specifico usato al livello di link. Il più comune è
636   quello dell'Ethernet che è pari a 1500 byte, una serie di valori possibili
637   sono riportati in \tabref{tab:net_mtu_values}.
638 \end{itemize}
639
640 Quando un pacchetto IP viene inviato su una interfaccia di rete e le sue
641 dimensioni eccedono la MTU viene eseguita la cosiddetta
642 \textit{frammentazione}, i pacchetti cioè vengono spezzati (sia da IPv4 che da
643 IPv6, anche se i pacchetti frammentati sono gestiti con modalità
644 diverse,\footnote{il primo usa un flag nell'header, il secondo una opportuna
645   opzione, si veda \secref{cha:ip_protocol}.}) in blocchi più piccoli che
646 possono essere trasmessi attraverso l'interfaccia.
647
648 \begin{table}[!htb]
649   \centering
650   \begin{tabular}[c]{|l|c|}
651     \hline
652     \textbf{Rete} & \textbf{MTU} \\
653     \hline
654     \hline
655     Hyperlink & 65535 \\
656     Token Ring IBM (16 Mbit/sec) & 17914 \\
657     Token Ring IEEE 802.5 (4 Mbit/sec) & 4464 \\
658     FDDI & 4532 \\
659     Ethernet & 1500 \\
660     X.25 & 576 \\
661     \hline
662   \end{tabular}
663   \caption{Valori della MTU (\textit{maximum transfer unit}) per una serie di
664     reti diverse.}
665   \label{tab:net_mtu_values}
666 \end{table}
667
668 La MTU più piccola fra due stazioni viene in genere chiamata \textit{path
669   MTU}, che dice qual'è la lunghezza massima oltre la quale un pacchetto
670 inviato da una stazione ad un'altra verrebbe senz'altro frammentato. Si tenga
671 conto che non è affatto detto che la \textit{path MTU} sia la stessa in
672 entrambe le direzioni, perché l'instradamento può essere diverso nei due
673 sensi, con diverse tipologie di rete coinvolte.
674
675 Una delle differenze fra IPv4 e IPv6 é che per IPv6 la frammentazione può
676 essere eseguita solo alla sorgente, questo vuol dire che i router IPv6 non
677 frammentano i pacchetti che trasmettono (anche se possono frammentare i
678 pacchetti che generano loro stessi), mentre i router IPv4 si. In ogni caso una
679 volta frammentati i pacchetti possono essere riassemblati solo alla
680 destinazione.
681
682 Nell'header di IPv4 è previsto il flag \texttt{DF} che specifica che il
683 pacchetto non deve essere frammentato; un router che riceva un pacchetto le
684 cui dimensioni eccedano quelle dell'MTU della rete di destinazione genererà un
685 messaggio di errore ICMPv4 di tipo \textit{destination unreachable,
686   fragmentation needed but DF bit set}.
687
688 Dato che i router IPv6 non possono effettuare la frammentazione la ricezione
689 di un pacchetto di dimensione eccessiva per la ritrasmissione genererà sempre
690 un messaggio di errore ICMPv6 di tipo \textit{packet too big}.
691
692 Dato che il meccanismo di frammentazione e riassemblaggio comporta
693 inefficienza, normalmente viene utilizzato il procedimento della \textit{path
694   MTU discover} (vedi RFC~1191 per IPv4 e RFC~1981 per IPv6) che permette di
695 trovare il \textit{path MTU} fra due stazioni; per la realizzazione del
696 procedimento si usa il flag DF di IPv4 e il comportamento normale di IPv6
697 inviando delle opportune serie di pacchetti (per i dettagli vedere l'RFC~1191
698 per IPv4 e l'RFC~1981 per IPv6) fintanto che non si hanno più errori. 
699
700 Il TCP usa sempre questo meccanismo, che per le implementazioni di IPv4 è
701 opzionale, mentre diventa obbligatorio per IPv6.  Per IPv6 infatti, non
702 potendo i router frammentare i pacchetti, è necessario, per poter comunicare,
703 conoscere il \textit{path MTU}.
704
705
706 Infine TCP definisce una \textit{maximum segment size} MSS che annuncia
707 all'altro capo la dimensione massima del segmento di dati.
708
709
710 %\subsection{Il passaggio dei dati in TCP}
711 %\label{sec:net_tcp_pass}
712
713 %\subsection{Il passaggio dei dati in UDP}
714 %\label{sec:net_udp_pass}
715
716 %%% Local Variables: 
717 %%% mode: latex
718 %%% TeX-master: "gapil"
719 %%% End: