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