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