Ripulitura dei nomi e ristrutturazione dei capitoli. Tolto simpltcp che
[gapil.git] / elemtcp.tex
1 %% elemtcp.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{Socket TCP}
12 \label{cha:elem_TCP_sock}
13
14 In questo capitolo iniziamo ad approfondire la conoscenza dei socket TCP,
15 iniziando con una descrizione delle principali caratteristiche del
16 funzionamento di una connessione TCP.  Tratteremo poi le varie funzioni che
17 servono alla creazione di una connessione fra un server elementare ed il suo
18 client, fornendo poi alcuni esempi di applicazione elementare.
19
20
21
22 \section{Il funzionamento di una connessione TCP}
23 \label{sec:TCP_connession}
24
25 Prima di entrare nei dettagli delle singole funzioni usate nelle applicazioni
26 che utilizzano i socket TCP, è fondamentale spiegare alcune delle basi del
27 funzionamento del protocollo, poiché questa conoscenza è essenziale per
28 comprendere il comportamento di dette funzioni per questo tipo di socket, ed
29 il relativo modello di programmazione.
30
31 Si ricordi che il protocollo TCP serve a creare degli \textit{stream socket},
32 cioè una forma di canale di comunicazione che stabilisce una connessione
33 stabile fra due stazioni, in modo che queste possano scambiarsi dei dati. In
34 questa sezione ci concentreremo sulle modalità con le quali il protocollo dà
35 inizio e conclude una connessione e faremo inoltre un breve accenno al
36 significato di alcuni dei vari \textsl{stati} ad essa associati.
37
38 \subsection{La creazione della connessione: il \textit{three way handshake}}
39 \label{sec:TCP_conn_cre}
40
41 Il processo che porta a creare una connessione TCP è chiamato \textit{three
42   way handshake}; la successione tipica degli eventi (e dei
43 \textsl{segmenti}\footnote{Si ricordi che il segmento è l'unità elementare di
44   dati trasmessa dal protocollo TCP al livello successivo; tutti i segmenti
45   hanno un header che contiene le informazioni che servono allo \textit{stack
46     TCP} (così viene di solito chiamata la parte del kernel che implementa il
47   protocollo) per realizzare la comunicazione, fra questi dati ci sono una
48   serie di flag usati per gestire la connessione, come SYN, ACK, URG, FIN,
49   alcuni di essi, come SYN (che sta per \textit{syncronize}) corrispondono a
50   funzioni particolari del protocollo e danno il nome al segmento, (per
51   maggiori dettagli vedere \secref{sec:tcp_protocol}).}  di dati che vengono
52 scambiati) che porta alla creazione di una connessione è la seguente:
53  
54 \begin{enumerate}
55 \item Il server deve essere preparato per accettare le connessioni in arrivo;
56   il procedimento si chiama \textsl{apertura passiva} del socket (in inglese
57   \textit{passive open}). Questo viene fatto chiamando la sequenza di funzioni
58   \func{socket}, \func{bind} e \func{listen}. Completata l'apertura passiva il
59   server chiama la funzione \func{accept} e il processo si blocca in attesa di
60   connessioni.
61   
62 \item Il client richiede l'inizio della connessione usando la funzione
63   \func{connect}, attraverso un procedimento che viene chiamato
64   \textsl{apertura attiva}, dall'inglese \textit{active open}. La chiamata di
65   \func{connect} blocca il processo e causa l'invio da parte del client di un
66   segmento SYN, in sostanza viene inviato al server un pacchetto IP che
67   contiene solo gli header IP e TCP (con il numero di sequenza iniziale e il
68   flag SYN) e le opzioni di TCP.
69   
70 \item il server deve dare ricevuto (l'\textit{acknowledge}) del SYN del
71   client, inoltre anche il server deve inviare il suo SYN al client (e
72   trasmettere il suo numero di sequenza iniziale) questo viene fatto
73   ritrasmettendo un singolo segmento in cui sono impostati entrambi i flag SYN
74   ACK.
75   
76 \item una volta che il client ha ricevuto l'acknowledge dal server la funzione
77   \func{connect} ritorna, l'ultimo passo è dare dare il ricevuto del SYN del
78   server inviando un ACK. Alla ricezione di quest'ultimo la funzione
79   \func{accept} del server ritorna e la connessione è stabilita.
80 \end{enumerate} 
81
82 Il procedimento viene chiamato \textit{three way handshake} dato che per
83 realizzarlo devono essere scambiati tre segmenti.  In \figref{fig:TCP_TWH}
84 si è rappresentata graficamente la sequenza di scambio dei segmenti che
85 stabilisce la connessione.
86
87 % Una analogia citata da R. Stevens per la connessione TCP è quella con il
88 % sistema del telefono. La funzione \texttt{socket} può essere considerata
89 % l'equivalente di avere un telefono. La funzione \texttt{bind} è analoga al
90 % dire alle altre persone qual'è il proprio numero di telefono perché possano
91 % chiamare. La funzione \texttt{listen} è accendere il campanello del telefono
92 % per sentire le chiamate in arrivo.  La funzione \texttt{connect} richiede di
93 % conoscere il numero di chi si vuole chiamare. La funzione \texttt{accept} è
94 % quando si risponde al telefono.
95
96 \begin{figure}[htb]
97   \centering
98   \includegraphics[width=10cm]{img/three_way_handshake}  
99   \caption{Il \textit{three way handshake} del TCP.}
100   \label{fig:TCP_TWH}
101 \end{figure}
102
103 Si è accennato in precedenza ai \textsl{numeri di sequenza} (che sono anche
104 riportati in \figref{fig:TCP_TWH}); per gestire una connessione affidabile
105 infatti il protocollo TCP prevede nell'header la presenza di un numero a 32
106 bit (chiamato appunto \textit{sequence number}) che identifica a quale byte
107 nella sequenza del flusso corrisponde il primo byte della sezione dati
108 contenuta nel segmento.
109
110 Il numero di sequenza di ciascun segmento viene calcolato a partire da un
111 \textsl{numero di sequenza iniziale} generato in maniera casuale del kernel
112 all'inizio della connessione e trasmesso con il SYN; l'acknowledgement di
113 ciascun segmento viene effettuato dall'altro capo della connessione impostando
114 il flag ACK e restituendo nell'apposito campo dell'header un
115 \textit{acknowledge number}) pari al numero di sequenza che il ricevente si
116 aspetta di ricevere con il pacchetto successivo; dato che il primo pacchetto
117 SYN consuma un byte, nel \textit{three way handshake} il numero di acknowledge
118 è sempre pari al numero di sequenza iniziale incrementato di uno; lo stesso
119 varrà anche (vedi \figref{fig:TCP_close}) per l'acknowledgement di un FIN.
120
121 \subsection{Le opzioni TCP.}
122 \label{sec:TCP_TCP_opt}
123
124 Ciascun segmento SYN contiene in genere delle opzioni per il protocollo TCP
125 (le cosiddette \textit{TCP options}, che vengono inserite fra l'header e i
126 dati) che servono a comunicare all'altro capo una serie di parametri utili a
127 regolare la connessione. Normalmente vengono usate le seguenti opzioni:
128
129 \begin{itemize}
130 \item \textit{MSS option}, dove MMS sta per \textit{maximum segment size}, con
131   questa opzione ciascun capo della connessione annuncia all'altro il massimo
132   ammontare di dati che vorrebbe accettare per ciascun segmento nella
133   connessione corrente. È possibile leggere e scrivere questo valore
134   attraverso l'opzione del socket \const{TCP\_MAXSEG}.
135   
136 \item \textit{window scale option}, %come spiegato in \secref{sec:tcp_protocol}
137   il protocollo TCP implementa il controllo di flusso attraverso una
138   \textsl{finestra annunciata} (\textit{advertized window}) con la quale
139   ciascun capo della comunicazione dichiara quanto spazio disponibile ha in
140   memoria per i dati. Questo è un numero a 16 bit dell'header, che così può
141   indicare un massimo di 65535 byte;\footnote{ Linux usa come massimo 32767
142     per evitare problemi con alcune implementazioni che usano l'aritmetica con
143     segno per implementare lo stack TCP.} ma alcuni tipi di connessione come
144   quelle ad alta velocità (sopra i 45Mbit/sec) e quelle che hanno grandi
145   ritardi nel cammino dei pacchetti (come i satelliti) richiedono una finestra
146   più grande per poter ottenere il massimo dalla trasmissione, per questo
147   esiste questa opzione che indica un fattore di scala da applicare al valore
148   della finestra annunciata\footnote{essendo una nuova opzione per garantire
149     la compatibilità con delle vecchie implementazioni del protocollo la
150     procedura che la attiva prevede come negoziazione che l'altro capo della
151     connessione riconosca esplicitamente l'opzione inserendola anche lui nel
152     suo SYN di risposta dell'apertura della connessione.} per la connessione
153   corrente (espresso come numero di bit cui spostare a sinistra il valore
154   della finestra annunciata inserito nel pacchetto).
155
156 \item \textit{timestamp option}, è anche questa una nuova opzione necessaria
157   per le connessioni ad alta velocità per evitare possibili corruzioni di dati
158   dovute a pacchetti perduti che riappaiono; anche questa viene negoziata come
159   la precedente.
160
161 \end{itemize}
162
163 La MSS è generalmente supportata da quasi tutte le implementazioni del
164 protocollo, le ultime due opzioni (trattate
165 nell'\href{http://www.ietf.org/rfc/rfc1323.txt}{RFC~1323}) sono meno comuni;
166 vengono anche dette \textit{long fat pipe options} dato che questo è il nome
167 che viene dato alle connessioni caratterizzate da alta velocità o da ritardi
168 elevati. In ogni caso Linux supporta pienamente entrambe le opzioni.
169
170 \subsection{La terminazione della connessione}
171 \label{sec:TCP_conn_term}
172
173 Mentre per creare una connessione occorre un interscambio di tre segmenti, la
174 procedura di chiusura ne richiede quattro; ancora una volta si può fare
175 riferimento al codice degli esempi \figref{fig:TCP_daytime_client_code} e
176 \figref{fig:TCP_daytime_iter_server_code}, in questo caso la successione degli
177 eventi è la seguente:
178
179 \begin{enumerate}
180 \item Un processo ad uno dei due capi chiama la funzione \func{close}, dando
181   l'avvio a quella che viene chiamata \textsl{chiusura attiva} (o
182   \textit{active close}). Questo comporta l'emissione di un segmento FIN, che
183   significa che si è finito con l'invio dei dati sulla connessione.
184   
185 \item L'altro capo della connessione riceve il FIN ed esegue la
186   \textsl{chiusura passiva} (o \textit{passive close}); al FIN, come ad ogni
187   altro pacchetto, viene risposto con un ACK. Inoltre il ricevimento del FIN
188   viene segnalato al processo che ha aperto il socket (dopo che ogni altro
189   eventuale dato rimasto in coda è stato ricevuto) come un end-of-file sulla
190   lettura, questo perché il ricevimento di un FIN significa che non si
191   riceveranno altri dati sulla connessione.
192
193 \item Dopo un certo tempo anche il secondo processo chiamerà la funzione
194   \func{close} sul proprio socket, causando l'emissione di un altro segmento
195   FIN. 
196
197 \item L'altro capo della connessione riceverà il FIN conclusivo e risponderà
198   con un ACK.
199 \end{enumerate}
200
201 Dato che in questo caso sono richiesti un FIN ed un ACK per ciascuna direzione
202 normalmente i segmenti scambiati sono quattro.  Questo non è vero sempre
203 giacché in alcune situazioni il FIN del passo 1) è inviato insieme a dei dati.
204 Inoltre è possibile che i segmenti inviati nei passi 2 e 3 dal capo che
205 effettua la chiusura passiva, siano accorpati in un singolo segmento. In
206 \figref{fig:TCP_close} si è rappresentato graficamente lo sequenza di
207 scambio dei segmenti che conclude la connessione.
208
209 \begin{figure}[htb]
210   \centering  
211   \includegraphics[width=10cm]{img/tcp_close}  
212   \caption{La chiusura di una connessione TCP.}
213   \label{fig:TCP_close}
214 \end{figure}
215
216 Come per il SYN anche il FIN occupa un byte nel numero di sequenza, per cui
217 l'ACK riporterà un \textit{acknowledge number} incrementato di uno. 
218
219 Si noti che, nella sequenza di chiusura, fra i passi 2 e 3, è in teoria
220 possibile che si mantenga un flusso di dati dal capo della connessione che
221 deve ancora eseguire la chiusura passiva a quello che sta eseguendo la
222 chiusura attiva.  Nella sequenza indicata i dati verrebbero persi, dato che si
223 è chiuso il socket dal lato che esegue la chiusura attiva; esistono tuttavia
224 situazioni in cui si vuole poter sfruttare questa possibilità, usando una
225 procedura che è chiamata \textit{half-close}; torneremo su questo aspetto e su
226 come utilizzarlo in \secref{xxx_shutdown}, quando parleremo della funzione
227 \func{shutdown}.
228
229 La emissione del FIN avviene quando il socket viene chiuso, questo però non
230 avviene solo per la chiamata esplicita della funzione \func{close}, ma anche
231 alla terminazione di un processo, quando tutti i file vengono chiusi.  Questo
232 comporta ad esempio che se un processo viene terminato da un segnale tutte le
233 connessioni aperte verranno chiuse.
234
235 Infine occorre sottolineare che, benché nella figura (e nell'esempio che
236 vedremo più avanti in \secref{sec:TCPsimp_echo}) sia stato il client ad
237 eseguire la chiusura attiva, nella realtà questa può essere eseguita da uno
238 qualunque dei due capi della comunicazione (come nell'esempio di
239 \figref{fig:TCP_daytime_iter_server_code}), e anche se il caso più comune
240 resta quello del client, ci sono alcuni servizi, il principale dei quali è
241 l'HTTP, per i quali è il server ad effettuare la chiusura attiva.
242
243
244 \subsection{Un esempio di connessione}
245 \label{sec:TCP_conn_dia}
246
247 Come abbiamo visto le operazioni del TCP nella creazione e conclusione di una
248 connessione sono piuttosto complesse, ed abbiamo esaminato soltanto quelle
249 relative ad un andamento normale.  In \secref{sec:TCP_states} vedremo con
250 maggiori dettagli che una connessione può assumere vari stati, che ne
251 caratterizzano il funzionamento, e che sono quelli che vengono riportati dal
252 comando \cmd{netstat}, per ciascun socket TCP aperto, nel campo
253 \textit{State}.
254
255 Non possiamo affrontare qui una descrizione completa del funzionamento del
256 protocollo; un approfondimento sugli aspetti principali si trova in
257 \secref{sec:tcp_protocol}, ma per una trattazione completa il miglior
258 riferimento resta \cite{TCPIll1}. Qui ci limiteremo a descrivere brevemente un
259 semplice esempio di connessione e le transizioni che avvengono nei due casi
260 appena citati (creazione e terminazione della connessione).
261
262 In assenza di connessione lo stato del TCP è \texttt{CLOSED}; quando una
263 applicazione esegue una apertura attiva il TCP emette un SYN e lo stato
264 diventa \texttt{SYN\_SENT}; quando il TCP riceve la risposta del SYN$+$ACK
265 emette un ACK e passa allo stato \texttt{ESTABLISHED}; questo è lo stato
266 finale in cui avviene la gran parte del trasferimento dei dati.
267
268 Dal lato server in genere invece il passaggio che si opera con l'apertura
269 passiva è quello di portare il socket dallo stato \texttt{CLOSED} allo
270 stato \texttt{LISTEN} in cui vengono accettate le connessioni.
271
272 Dallo stato \texttt{ESTABLISHED} si può uscire in due modi; se un'applicazione
273 chiama la funzione \texttt{close} prima di aver ricevuto un
274 \textit{end-of-file} (chiusura attiva) la transizione è verso lo stato
275 \texttt{FIN\_WAIT\_1}; se invece l'applicazione riceve un FIN nello stato
276 \texttt{ESTABLISHED} (chiusura passiva) la transizione è verso lo stato
277 \texttt{CLOSE\_WAIT}.
278
279 In \figref{fig:TCP_conn_example} è riportato lo schema dello scambio dei
280 pacchetti che avviene per una un esempio di connessione, insieme ai vari stati
281 che il protocollo viene ad assumere per i due lati, server e client.
282
283 \begin{figure}[htb]
284   \centering
285   \includegraphics[width=9cm]{img/tcp_connection}  
286   \caption{Schema dello scambio di pacchetti per un esempio di connessione.}
287   \label{fig:TCP_conn_example}
288 \end{figure}
289
290 La connessione viene iniziata dal client che annuncia un MSS di 1460, un
291 valore tipico con Linux per IPv4 su Ethernet, il server risponde con lo stesso
292 valore (ma potrebbe essere anche un valore diverso).
293
294 Una volta che la connessione è stabilita il client scrive al server una
295 richiesta (che assumiamo stare in un singolo segmento, cioè essere minore dei
296 1460 byte annunciati dal server), quest'ultimo riceve la richiesta e
297 restituisce una risposta (che di nuovo supponiamo stare in un singolo
298 segmento). Si noti che l'acknowledge della richiesta è mandato insieme alla
299 risposta: questo viene chiamato \textit{piggybacking} ed avviene tutte le
300 volte che che il server è sufficientemente veloce a costruire la risposta; in
301 caso contrario si avrebbe prima l'emissione di un ACK e poi l'invio della
302 risposta.
303
304 Infine si ha lo scambio dei quattro segmenti che terminano la connessione
305 secondo quanto visto in \secref{sec:TCP_conn_term}; si noti che il capo della
306 connessione che esegue la chiusura attiva entra nello stato
307 \texttt{TIME\_WAIT}, sul cui significato torneremo fra poco.
308
309 È da notare come per effettuare uno scambio di due pacchetti (uno di richiesta
310 e uno di risposta) il TCP necessiti di ulteriori otto segmenti, se invece si
311 fosse usato UDP sarebbero stati sufficienti due soli pacchetti. Questo è il
312 costo che occorre pagare per avere l'affidabilità garantita dal TCP, se si
313 fosse usato UDP si sarebbe dovuto trasferire la gestione di tutta una serie di
314 dettagli (come la verifica della ricezione dei pacchetti) dal livello del
315 trasporto all'interno dell'applicazione.
316
317 Quello che è bene sempre tenere presente è allora quali sono le esigenze che
318 si hanno in una applicazione di rete, perché non è detto che TCP sia la
319 miglior scelta in tutti i casi (ad esempio se si devono solo scambiare dati
320 già organizzati in piccoli pacchetti l'overhead aggiunto può essere eccessivo)
321 per questo esistono applicazioni che usano UDP e lo fanno perché nel caso
322 specifico le sue caratteristiche di velocità e compattezza nello scambio dei
323 dati rispondono meglio alle esigenze che devono essere affrontate.
324
325 \subsection{Lo stato \texttt{TIME\_WAIT}}
326 \label{sec:TCP_time_wait}
327
328 Come riportato da Stevens in \cite{UNP1} lo stato \texttt{TIME\_WAIT} è
329 probabilmente uno degli aspetti meno compresi del protocollo TCP, è infatti
330 comune trovare domande su come sia possibile evitare che un'applicazione resti
331 in questo stato lasciando attiva una connessione ormai conclusa; la risposta è
332 che non deve essere fatto, ed il motivo cercheremo di spiegarlo adesso.
333
334 Come si è visto nell'esempio precedente (vedi \figref{fig:TCP_conn_example})
335 \texttt{TIME\_WAIT} è lo stato finale in cui il capo di una connessione che
336 esegue la chiusura attiva resta prima di passare alla chiusura definitiva
337 della connessione. Il tempo in cui l'applicazione resta in questo stato deve
338 essere due volte la MSL (\textit{Maximum Segment Lifetime}).
339
340 La MSL è la stima del massimo periodo di tempo che un pacchetto IP può vivere
341 sulla rete; questo tempo è limitato perché ogni pacchetto IP può essere
342 ritrasmesso dai router un numero massimo di volte (detto \textit{hop limit}).
343 Il numero di ritrasmissioni consentito è indicato dal campo TTL dell'header di
344 IP (per maggiori dettagli vedi \secref{sec:IP_xxx}), e viene decrementato ad
345 ogni passaggio da un router; quando si annulla il pacchetto viene scartato.
346 Siccome il numero è ad 8 bit il numero massimo di ``\textsl{salti}'' è di 255,
347 pertanto anche se il TTL (da \textit{time to live}) non è propriamente un
348 limite sul tempo di vita, si stima che un pacchetto IP non possa restare nella
349 rete per più di MSL secondi.
350
351 Ogni implementazione del TCP deve scegliere un valore per la MSL
352 (l'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} raccomanda 2 minuti,
353 Linux usa 30 secondi), questo comporta una durata dello stato
354 \texttt{TIME\_WAIT} che a seconda delle implementazioni può variare fra 1 a 4
355 minuti.
356
357 Lo stato \texttt{TIME\_WAIT} viene utilizzato dal protocollo per due motivi
358 principali:
359 \begin{enumerate}
360 \item implementare in maniera affidabile la terminazione della connessione
361   in entrambe le direzioni.
362 \item consentire l'eliminazione dei segmenti duplicati dalla rete. 
363 \end{enumerate}
364
365 Il punto è che entrambe le ragioni sono importanti, anche se spesso si fa
366 riferimento solo alla prima; ma è solo se si tiene conto della seconda che si
367 capisce il perché della scelta di un tempo pari al doppio della MSL come
368 durata di questo stato.
369
370 Il primo dei due motivi precedenti si può capire tornando a
371 \figref{fig:TCP_conn_example}: assumendo che l'ultimo ACK della sequenza
372 (quello del capo che ha eseguito la chiusura attiva) vanga perso, chi esegue
373 la chiusura passiva non ricevendo risposta rimanderà un ulteriore FIN, per
374 questo motivo chi esegue la chiusura attiva deve mantenere lo stato della
375 connessione per essere in grado di reinviare l'ACK e chiuderla correttamente.
376 Se non fosse così la risposta sarebbe un RST (un altro tipo si segmento) che
377 verrebbe interpretato come un errore.
378
379 Se il TCP deve poter chiudere in maniera pulita entrambe le direzioni della
380 connessione allora deve essere in grado di affrontare la perdita di uno
381 qualunque dei quattro segmenti che costituiscono la chiusura. Per questo
382 motivo lo stato \texttt{TIME\_WAIT} deve essere mantenuto anche dopo l'invio
383 dell'ultimo ACK per poter essere in grado di poterne gestire l'eventuale
384 ritrasmissione in caso di perdita.
385
386 Il secondo motivo è più complesso da capire, e necessita di una spiegazione
387 degli scenari in cui accade che i pacchetti si possano perdere nella rete o
388 restare intrappolati, per poi riemergere in un secondo tempo.
389
390 Il caso più comune in cui questo avviene è quello di anomalie
391 nell'instradamento; può accadere cioè che un router smetta di funzionare o che
392 una connessione fra due router si interrompa. In questo caso i protocolli di
393 instradamento dei pacchetti possono impiegare diverso tempo (anche dell'ordine
394 dei minuti) prima di trovare e stabilire un percorso alternativo per i
395 pacchetti. Nel frattempo possono accadere casi in cui un router manda i
396 pacchetti verso un'altro e quest'ultimo li rispedisce indietro, o li manda ad
397 un terzo router che li rispedisce al primo, si creano cioè dei circoli (i
398 cosiddetti \textit{routing loop}) in cui restano intrappolati i pacchetti.
399
400 Se uno di questi pacchetti intrappolati è un segmento TCP chi l'ha inviato,
401 non ricevendo un ACK in risposta, provvederà alla ritrasmissione e se nel
402 frattempo sarà stata stabilita una strada alternativa il pacchetto ritrasmesso
403 giungerà a destinazione.
404
405 Ma se dopo un po' di tempo (che non supera il limite dell'MSL, dato che
406 altrimenti verrebbe ecceduto il TTL) l'anomalia viene a cessare il circolo di
407 instradamento viene spezzato i pacchetti intrappolati potranno essere inviati
408 alla destinazione finale, con la conseguenza di avere dei pacchetti duplicati;
409 questo è un caso che il TCP deve essere in grado di gestire.
410
411 Allora per capire la seconda ragione per l'esistenza dello stato
412 \texttt{TIME\_WAIT} si consideri il caso seguente: si supponga di avere una
413 connessione fra l'IP \texttt{195.110.112.236} porta 1550 e l'IP
414 \texttt{192.84.145.100} porta 22, che questa venga chiusa e che poco dopo si
415 ristabilisca la stessa connessione fra gli stessi IP sulle stesse porte
416 (quella che viene detta, essendo gli stessi porte e numeri IP, una nuova
417 \textsl{incarnazione} della connessione precedente); in questo caso ci si
418 potrebbe trovare con dei pacchetti duplicati relativi alla precedente
419 connessione che riappaiono nella nuova.
420
421 Ma fintanto che il socket non è chiuso una nuova incarnazione non può essere
422 creata: per questo un socket TCP resta sempre nello stato \texttt{TIME\_WAIT}
423 per un periodo di 2MSL, in modo da attendere MSL secondi per essere sicuri che
424 tutti i pacchetti duplicati in arrivo siano stati ricevuti (e scartati) o che
425 nel frattempo siano stati eliminati dalla rete, e altri MSL secondi per essere
426 sicuri che lo stesso avvenga per le risposte nella direzione opposta.
427
428 In questo modo, prima che venga creata una nuova connessione, il protocollo
429 TCP si assicura che tutti gli eventuali segmenti residui di una precedente
430 connessione, che potrebbero causare disturbi, siano stati eliminati dalla
431 rete.
432
433
434 \subsection{I numeri di porta}
435 \label{sec:TCP_port_num}
436
437 In un ambiente multitasking in un dato momento più processi devono poter usare
438 sia UDP che TCP, e ci devono poter essere più connessioni in contemporanea.
439 Per poter tenere distinte le diverse connessioni entrambi i protocolli usano i
440 \textsl{numeri di porta}, che fanno parte, come si può vedere in
441 \secref{sec:sock_sa_ipv4} e \secref{sec:sock_sa_ipv6} pure delle strutture
442 degli indirizzi del socket.
443
444 Quando un client contatta un server deve poter identificare con quale dei vari
445 possibili server attivi intende parlare. Sia TCP che UDP definiscono un gruppo
446 di \textsl{porte conosciute} (le cosiddette \textit{well-known port}) che
447 identificano una serie di servizi noti (ad esempio la porta 22 identifica il
448 servizio \texttt{ssh}) effettuati da appositi server che rispondono alle
449 connessioni verso tali porte.
450
451 D'altra parte un client non ha necessità di usare un numero di porta
452 specifico, per cui in genere vengono usate le cosiddette \textsl{porte
453   effimere} (o \textit{ephemeral ports}) cioè porte a cui non è assegnato
454 nessun servizio noto e che vengono assegnate automaticamente dal kernel alla
455 creazione della connessione. Queste sono dette effimere in quanto vengono
456 usate solo per la durata della connessione, e l'unico requisito che deve
457 essere soddisfatto è che ognuna di esse sia assegnata in maniera univoca.
458
459 La lista delle porte conosciute è definita
460 dall'\href{http://www.ietf.org/rfc/rfc1700.txt}{RFC~1700} che contiene
461 l'elenco delle porte assegnate dalla IANA (la \textit{Internet Assigned Number
462   Authority}) ma l'elenco viene costantemente aggiornato e pubblicato su
463 internet (una versione corrente si può trovare all'indirizzo
464 \texttt{ftp://ftp.isi.edu/in-notes/iana/assignements/port-numbers}); inoltre
465 in un sistema unix-like un analogo elenco viene mantenuto nel file
466 \file{/etc/services}, con la corrispondenza fra i vari numeri di porta ed il
467 nome simbolico del servizio.  I numeri sono divisi in tre intervalli:
468
469 \begin{enumerate}
470 \item \textsl{le porte conosciute}. I numeri da 0 a 1023. Queste sono
471   controllate e assegnate dalla IANA. Se è possibile la stessa porta è
472   assegnata allo stesso servizio sia su UDP che su TCP (ad esempio la porta 22
473   è assegnata a ssh su entrambi i protocolli, anche se viene usata solo dal
474   TCP).
475   
476 \item \textsl{le porte registrate}. I numeri da 1024 a 49151. Queste porte non
477   sono controllate dalla IANA, che però registra ed elenca chi usa queste
478   porte come servizio agli utenti. Come per le precedenti si assegna una porta
479   ad un servizio sia per TCP che UDP anche se poi il servizio è implementato
480   solo su TCP. Ad esempio X Window usa le porte TCP e UDP dal 6000 al 6063
481   anche se il protocollo è implementato solo tramite TCP.
482   
483 \item \textsl{le porte private} o \textsl{dinamiche}. I numeri da 49152 a
484   65535. La IANA non dice nulla riguardo a queste porte che pertanto
485   sono i candidati naturali ad essere usate come porte effimere.
486 \end{enumerate}
487
488 In realtà rispetto a quanto indicato
489 nell'\href{http://www.ietf.org/rfc/rfc1700.txt}{RFC~1700} i vari sistemi hanno
490 fatto scelte diverse per le porte effimere, in particolare in
491 \figref{fig:TCP_port_alloc} sono riportate quelle di BSD e Linux.  Nel caso di
492 Linux poi la scelta fra i due intervalli possibili viene fatta dinamicamente a
493 seconda della memoria a disposizione del kernel per gestire le relative
494 tabelle.
495
496 \begin{figure}[!htb]
497   \centering
498   \includegraphics[width=15cm]{img/port_alloc}  
499   \caption{Allocazione dei numeri di porta.}
500   \label{fig:TCP_port_alloc}
501 \end{figure}
502
503 I sistemi Unix hanno inoltre il concetto di \textsl{porte riservate} (che
504 corrispondono alle porte con numero minore di 1024 e coincidono quindi con le
505 porte conosciute). La loro caratteristica è che possono essere assegnate a un
506 socket solo da un processo con i privilegi di root, per far si che solo
507 l'amministratore possa allocare queste porte per far partire i relativi
508 servizi.
509
510 Si tenga conto poi che ci sono alcuni client (in particolare \cmd{rsh} e
511 \cmd{rlogin}) che richiedono una connessione su una porta riservata anche
512 dal lato client come parte dell'autenticazione. Questo viene fatto tramite la
513 funzione \func{rresvport} assegnando al socket una porta libera
514 nell'intervallo fra 512 e 1023.
515
516 Data una connessione TCP si suole chiamare \textit{socket pair}\footnote{da
517   non confondere con la coppia di socket della omonima funzione
518   \func{socketpair} che fanno riferimento ad una coppia di socket sulla stessa
519   macchina, non ai capi di una connessione TCP.} la combinazione dei quattro
520 numeri che definiscono i due capi della connessione e cioè l'indirizzo IP
521 locale e la porta TCP locale, e l'indirizzo IP remoto e la porta TCP remota.
522 Questa combinazione, che scriveremo usando una notazione del tipo
523 (\texttt{195.110.112.152:22}, \texttt{192.84.146.100:20100}), identifica
524 univocamente una connessione su internet.  Questo concetto viene di solito
525 esteso anche a UDP, benché in questo caso non abbia senso parlare di
526 connessione. L'utilizzo del programma \cmd{netstat} permette di visualizzare
527 queste informazioni nei campi \textit{Local Address} e \textit{Foreing
528   Address}.
529
530
531 \subsection{Le porte ed il modello client/server}
532 \label{sec:TCP_port_cliserv}
533
534 Per capire meglio l'uso delle porte e come vengono utilizzate quando si ha a
535 che fare con un'applicazione client/server (come quelle che scriveremo in
536 \secref{sec:TCP_daytime_application} e \secref{sec:TCP_echo_application})
537 esamineremo cosa accade con le connessioni nel caso di un server TCP che deve
538 gestire connessioni multiple.
539
540 Se eseguiamo un \cmd{netstat} su una macchina di prova (il cui indirizzo sia
541 \texttt{195.110.112.152}) potremo avere un risultato del tipo:
542 \begin{verbatim}
543 Active Internet connections (servers and established)
544 Proto Recv-Q Send-Q Local Address           Foreign Address         State      
545 tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
546 tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN
547 tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN
548 \end{verbatim}
549 essendo presenti e attivi un server ssh, un server di posta e un DNS per il
550 caching locale.
551
552 Questo ci mostra ad esempio che il server ssh ha compiuto un'apertura passiva,
553 mettendosi in ascolto sulla porta 22 riservata a questo servizio, e che si è
554 posto in ascolto per connessioni provenienti da uno qualunque degli indirizzi
555 associati alle interfacce locali. La notazione \texttt{0.0.0.0} usata da
556 \cmd{netstat} è equivalente all'asterisco utilizzato per il numero di porta,
557 indica il valore generico, e corrisponde al valore \const{INADDR\_ANY}
558 definito in \file{arpa/inet.h} (vedi \ref{tab:TCP_ipv4_addr}).
559
560 Inoltre si noti come la porta e l'indirizzo di ogni eventuale connessione
561 esterna non sono specificati; in questo caso la \textit{socket pair} associata
562 al socket potrebbe essere indicata come (\texttt{*:22}, \texttt{*:*}), usando
563 anche per gli indirizzi l'asterisco come carattere che indica il valore
564 generico.
565
566 Dato che in genere una macchina è associata ad un solo indirizzo IP, ci si può
567 chiedere che senso abbia l'utilizzo dell'indirizzo generico per specificare
568 l'indirizzo locale; ma a parte il caso di macchine che hanno più di un
569 indirizzo IP (il cosiddetto \textit{multihoming}) esiste sempre anche
570 l'indirizzo di loopback, per cui con l'uso dell'indirizzo generico si possono
571 accettare connessioni indirizzate verso uno qualunque degli indirizzi IP
572 presenti. Ma, come si può vedere nell'esempio con il DNS che è in ascolto
573 sulla porta 53, è possibile anche restringere l'accesso ad uno specifico
574 indirizzo, cosa che nel caso è fatta accettando solo connessioni che arrivino
575 sull'interfaccia di loopback.
576
577 Una volta che ci si vorrà collegare a questa macchina da un'altra, per esempio
578 quella con l'indirizzo \texttt{192.84.146.100}, si dovrà lanciare su
579 quest'ultima un client \cmd{ssh} per creare una connessione, e il kernel gli
580 assocerà una porta effimera (ad esempio la 21100), per cui la connessione sarà
581 espressa dalla socket pair (\texttt{192.84.146.100:21100},
582 \texttt{195.110.112.152:22}).
583
584 Alla ricezione della richiesta dal client il server creerà un processo figlio
585 per gestire la connessione, se a questo punto eseguiamo nuovamente il
586 programma \cmd{netstat} otteniamo come risultato:
587 \begin{verbatim}
588 Active Internet connections (servers and established)
589 Proto Recv-Q Send-Q Local Address           Foreign Address         State      
590 tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
591 tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN
592 tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN
593 tcp        0      0 195.110.112.152:22      192.84.146.100:21100    ESTABLISHED
594 \end{verbatim}
595
596 Come si può notare il server è ancora in ascolto sulla porta 22, però adesso
597 c'è un nuovo socket (con lo stato \texttt{ESTABLISHED}) che utilizza anch'esso
598 la porta 22, ed ha specificato l'indirizzo locale, questo è il socket con cui
599 il processo figlio gestisce la connessione mentre il padre resta in ascolto
600 sul socket originale.
601
602 Se a questo punto lanciamo un'altra volta il client \cmd{ssh} per una seconda
603 connessione quello che otterremo usando \cmd{netstat} sarà qualcosa del
604 genere:
605 \begin{verbatim}
606 Active Internet connections (servers and established)
607 Proto Recv-Q Send-Q Local Address           Foreign Address         State      
608 tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
609 tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN
610 tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN
611 tcp        0      0 195.110.112.152:22      192.84.146.100:21100    ESTABLISHED
612 tcp        0      0 195.110.112.152:22      192.84.146.100:21101    ESTABLISHED
613 \end{verbatim}
614 cioè il client effettuerà la connessione usando un'altra porta effimera: con
615 questa sarà aperta la connessione, ed il server creerà un'altro processo
616 figlio per gestirla.
617
618 Tutto ciò mostra come il TCP, per poter gestire le connessioni con un server
619 concorrente, non può suddividere i pacchetti solo sulla base della porta di
620 destinazione, ma deve usare tutta l'informazione contenuta nella socket pair,
621 compresa la porta dell'indirizzo remoto.  E se andassimo a vedere quali sono i
622 processi\footnote{ad esempio con il comando \cmd{fuser}, o con \cmd{lsof}.} a
623 cui fanno riferimento i vari socket vedremmo che i pacchetti che arrivano
624 dalla porta remota 21100 vanno al primo figlio e quelli che arrivano alla
625 porta 21101 al secondo.
626
627
628 \section{Le funzioni dei socket TCP}
629 \label{sec:TCP_functions}
630
631 In questa sezione descriveremo in dettaglio le varie funzioni necessarie per
632 l'uso dei socket TCP, con l'eccezione della funzione \func{socket} che è già
633 stata esaminata in dettaglio nel capitolo precedente in
634 \secref{sec:sock_socket}. 
635
636
637 \subsection{La funzione \func{bind}}
638 \label{sec:TCP_func_bind}
639
640 La funzione \funcd{bind} assegna un indirizzo locale ad un socket. È usata
641 cioè per specificare la prima parte dalla socket pair. Viene usata sul lato
642 server per specificare la porta (e gli eventuali indirizzi locali) su cui poi
643 ci si porrà in ascolto. Il prototipo della funzione è il seguente:
644 \begin{prototype}{sys/socket.h}
645 {int bind(int sockfd, const struct sockaddr *serv\_addr, socklen\_t addrlen)}
646   
647   Assegna un indirizzo ad un socket.
648   
649   \bodydesc{La funzione restituisce 0 in caso di successo e -1 per un errore;
650     in caso di errore la variabile \var{errno} viene impostata secondo i
651     seguenti codici di errore:
652   \begin{errlist}
653   \item[\errcode{EBADF}] il file descriptor non è valido.
654   \item[\errcode{EINVAL}] il socket ha già un indirizzo assegnato.
655   \item[\errcode{ENOTSOCK}] il file descriptor non è associato ad un socket.
656   \item[\errcode{EACCES}] si è cercato di usare una porta riservata senza
657     sufficienti privilegi.
658   \item[\errcode{EADDRNOTAVAIL}] Il tipo di indirizzo specificato non è
659     disponibile.
660   \item[\errcode{EADDRINUSE}] qualche altro socket sta già usando l'indirizzo.
661   \end{errlist}
662   ed anche \errval{EFAULT} e per i socket di tipo \const{AF\_UNIX},
663   \errval{ENOTDIR}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ELOOP},
664   \errval{ENOSR} e \errval{EROFS}.}
665 \end{prototype}
666
667 Il primo argomento è un file descriptor ottenuto da una precedente chiamata a
668 \func{socket}, mentre il secondo e terzo argomento sono rispettivamente
669 l'indirizzo (locale) del socket e la dimensione della struttura che lo
670 contiene, secondo quanto già trattato in \secref{sec:sock_sockaddr}. 
671
672 Con il TCP la chiamata \func{bind} permette di specificare l'indirizzo, la
673 porta, entrambi o nessuno dei due. In genere i server utilizzano una porta
674 nota che assegnano all'avvio, se questo non viene fatto è il kernel a
675 scegliere una porta effimera quando vengono eseguite la funzioni
676 \func{connect} o \func{listen}, ma se questo è normale per il client non lo è
677 per il server\footnote{un'eccezione a tutto ciò sono i server che usano RPC.
678   In questo caso viene fatta assegnare dal kernel una porta effimera che poi
679   viene registrata presso il \textit{portmapper}; quest'ultimo è un altro
680   demone che deve essere contattato dai client per ottenere la porta effimera
681   su cui si trova il server.} che in genere viene identificato dalla porta su
682 cui risponde (l'elenco di queste porte, e dei relativi servizi, è in
683 \file{/etc/services}).
684
685 Con \func{bind} si può assegnare un IP specifico ad un socket, purché questo
686 appartenga ad una interfaccia della macchina.  Per un client TCP questo
687 diventerà l'indirizzo sorgente usato per i tutti i pacchetti inviati sul
688 socket, mentre per un server TCP questo restringerà l'accesso al socket solo
689 alle connessioni che arrivano verso tale indirizzo.
690
691 Normalmente un client non specifica mai l'indirizzo di un socket, ed il kernel
692 sceglie l'indirizzo di origine quando viene effettuata la connessione, sulla
693 base dell'interfaccia usata per trasmettere i pacchetti, (che dipende dalle
694 regole di instradamento usate per raggiungere il server).  Se un server non
695 specifica il suo indirizzo locale il kernel userà come indirizzo di origine
696 l'indirizzo di destinazione specificato dal SYN del client.
697
698 Per specificare un indirizzo generico, con IPv4 si usa il valore
699 \const{INADDR\_ANY}, il cui valore, come accennato in
700 \secref{sec:sock_sa_ipv4}, è pari a zero; nell'esempio
701 \figref{fig:TCP_daytime_iter_server_code} si è usata un'assegnazione immediata
702 del tipo: \includecodesnip{listati/serv_addr_sin_addr.c}
703
704 Si noti che si è usato \func{htonl} per assegnare il valore
705 \const{INADDR\_ANY}, anche se, essendo questo nullo, il riordinamento è
706 inutile.  Si tenga presente comunque che tutte le costanti \val{INADDR\_}
707 (riportate in \tabref{tab:TCP_ipv4_addr}) sono definite secondo
708 l'\textit{endianess} della macchina, ed anche se esse possono essere
709 invarianti rispetto all'ordinamento dei bit, è comunque buona norma usare
710 sempre la funzione \func{htonl}.
711
712 \begin{table}[htb]
713   \centering
714   \footnotesize
715   \begin{tabular}[c]{|l|l|}
716     \hline
717     \textbf{Costante} & \textbf{Significato} \\
718     \hline
719     \hline
720     \const{INADDR\_ANY}      & Indirizzo generico (\texttt{0.0.0.0})\\
721     \const{INADDR\_BROADCAST}& Indirizzo di \textit{broadcast}.\\
722     \const{INADDR\_LOOPBACK} & Indirizzo di \textit{loopback}
723                                (\texttt{127.0.0.1}).\\ 
724     \const{INADDR\_NONE}     & Indirizzo errato.\\
725     \hline    
726   \end{tabular}
727   \caption{Costanti di definizione di alcuni indirizzi generici per IPv4.}
728   \label{tab:TCP_ipv4_addr}
729 \end{table}
730
731 L'esempio precedente funziona correttamente con IPv4 poiché che l'indirizzo è
732 rappresentabile anche con un intero a 32 bit; non si può usare lo stesso
733 metodo con IPv6, in cui l'indirizzo deve necessariamente essere specificato
734 con una struttura, perché il linguaggio C non consente l'uso di una struttura
735 costante come operando a destra in una assegnazione.
736
737 Per questo motivo nell'header \file{netinet/in.h} è definita una variabile
738 \const{in6addr\_any} (dichiarata come \direct{extern}, ed inizializzata dal
739 sistema al valore \const{IN6ADRR\_ANY\_INIT}) che permette di effettuare una
740 assegnazione del tipo: \includecodesnip{listati/serv_addr_sin6_addr.c} in
741 maniera analoga si può utilizzare la variabile \const{in6addr\_loopback} per
742 indicare l'indirizzo di \textit{loopback}, che a sua volta viene inizializzata
743 staticamente a \const{IN6ADRR\_LOOPBACK\_INIT}.
744
745
746
747 \subsection{La funzione \func{connect}}
748 \label{sec:TCP_func_connect}
749
750 La funzione \funcd{connect} è usata da un client TCP per stabilire la
751 connessione con un server TCP, il prototipo della funzione è il seguente:
752 \begin{prototype}{sys/socket.h}
753 {int connect(int sockfd, const struct sockaddr *servaddr, socklen\_t addrlen)}
754   
755   Stabilisce una connessione fra due socket.
756   
757   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
758     errore, in caso di errore \var{errno} assumerà i valori:
759   \begin{errlist}
760   \item[\errcode{ECONNREFUSED}] non c'è nessuno in ascolto sull'indirizzo
761     remoto.
762   \item[\errcode{ETIMEDOUT}] si è avuto timeout durante il tentativo di
763     connessione.
764   \item[\errcode{ENETUNREACH}] la rete non è raggiungibile.
765   \item[\errcode{EINPROGRESS}] il socket è non bloccante (vedi
766     \secref{sec:file_noblocking}) e la connessione non può essere conclusa
767     immediatamente.
768   \item[\errcode{EALREADY}] il socket è non bloccante (vedi
769     \secref{sec:file_noblocking}) e un tentativo precedente di connessione non
770     si è ancora concluso.
771   \item[\errcode{EAGAIN}] non ci sono più porte locali libere. 
772   \item[\errcode{EAFNOSUPPORT}] l'indirizzo non ha una famiglia di indirizzi
773     corretta nel relativo campo.
774   \item[\errcode{EACCES}, \errcode{EPERM}] si è tentato di eseguire una
775     connessione ad un indirizzo broadcast senza che il socket fosse stato
776     abilitato per il broadcast.
777   \end{errlist}
778   altri errori possibili sono: \errval{EFAULT}, \errval{EBADF},
779   \errval{ENOTSOCK}, \errval{EISCONN} e \errval{EADDRINUSE}.}
780 \end{prototype}
781
782 Il primo argomento è un file descriptor ottenuto da una precedente chiamata a
783 \func{socket}, mentre il secondo e terzo argomento sono rispettivamente
784 l'indirizzo e la dimensione della struttura che contiene l'indirizzo del
785 socket, già descritta in \secref{sec:sock_sockaddr}.
786
787 La struttura dell'indirizzo deve essere inizializzata con l'indirizzo IP e il
788 numero di porta del server a cui ci si vuole connettere, come mostrato
789 nell'esempio \secref{sec:TCP_daytime_client}, usando le funzioni illustrate in
790 \secref{sec:sock_addr_func}.
791
792 Nel caso di socket TCP la funzione \func{connect} avvia il \textit{three way
793   handshake}, e ritorna solo quando la connessione è stabilita o si è
794 verificato un errore. Le possibili cause di errore sono molteplici (ed i
795 relativi codici riportati sopra), quelle che però dipendono dalla situazione
796 della rete e non da errori o problemi nella chiamata della funzione sono le
797 seguenti:
798 \begin{enumerate}
799 \item Il client non riceve risposta al SYN: l'errore restituito è
800   \errcode{ETIMEDOUT}. Stevens riporta che BSD invia un primo SYN alla chiamata
801   di \func{connect}, un'altro dopo 6 secondi, un terzo dopo 24 secondi, se
802   dopo 75 secondi non ha ricevuto risposta viene ritornato l'errore. Linux
803   invece ripete l'emissione del SYN ad intervalli di 30 secondi per un numero
804   di volte che può essere stabilito dall'utente sia con una opportuna
805   \func{sysctl} che attraverso il filesystem \file{/proc} scrivendo il valore
806   voluto in \file{/proc/sys/net/ipv4/tcp\_syn\_retries}. Il valore predefinito
807   per la ripetizione dell'invio è di 5 volte, che comporta un timeout dopo
808   circa 180 secondi.
809 %
810 % Le informazioni su tutte le opzioni impostabili via /proc stanno in
811 % Linux/Documentation/networking/ip-sysctl.txt
812 %
813 \item Il client riceve come risposta al SYN un RST significa che non c'è
814   nessun programma in ascolto per la connessione sulla porta specificata (il
815   che vuol dire probabilmente che o si è sbagliato il numero della porta o che
816   non è stato avviato il server), questo è un errore fatale e la funzione
817   ritorna non appena il RST viene ricevuto riportando un errore
818   \errcode{ECONNREFUSED}.
819   
820   Il flag RST sta per \textit{reset} ed è un segmento inviato direttamente
821   dal TCP quando qualcosa non va. Tre condizioni che generano un RST sono:
822   quando arriva un SYN per una porta che non ha nessun server in ascolto,
823   quando il TCP abortisce una connessione in corso, quando TCP riceve un
824   segmento per una connessione che non esiste.
825   
826 \item Il SYN del client provoca l'emissione di un messaggio ICMP di
827   destinazione non raggiungibile. In questo caso dato che il messaggio può
828   essere dovuto ad una condizione transitoria si ripete l'emissione dei SYN
829   come nel caso precedente, fino al timeout, e solo allora si restituisce il
830   codice di errore dovuto al messaggio ICMP, che da luogo ad un
831   \errcode{ENETUNREACH}.
832    
833 \end{enumerate}
834
835 Se si fa riferimento al diagramma degli stati del TCP riportato in
836 \figref{fig:TCP_state_diag} la funzione \func{connect} porta un socket
837 dallo stato \texttt{CLOSED} (lo stato iniziale in cui si trova un socket
838 appena creato) prima allo stato \texttt{SYN\_SENT} e poi, al ricevimento del
839 ACK, nello stato \texttt{ESTABLISHED}. Se invece la connessione fallisce il
840 socket non è più utilizzabile e deve essere chiuso.
841
842 Si noti infine che con la funzione \func{connect} si è specificato solo
843 indirizzo e porta del server, quindi solo una metà della socket pair; essendo
844 questa funzione usata nei client l'altra metà contenente indirizzo e porta
845 locale viene lasciata all'assegnazione automatica del kernel, e non è
846 necessario effettuare una \func{bind}.
847
848
849 \subsection{La funzione \func{listen}}
850 \label{sec:TCP_func_listen}
851
852 La funzione \funcd{listen} serve ad usare un socket in modalità passiva, cioè,
853 come dice il nome, per metterlo in ascolto di eventuali connessioni; in
854 sostanza l'effetto della funzione è di portare il socket dallo stato
855 \texttt{CLOSED} a quello \texttt{LISTEN}. In genere si chiama la funzione in
856 un server dopo le chiamate a \func{socket} e \func{bind} e prima della
857 chiamata ad \func{accept}. Il prototipo della funzione, come definito dalla
858 pagina di manuale, è:
859 \begin{prototype}{sys/socket.h}{int listen(int sockfd, int backlog)}
860   Pone un socket in attesa di una connessione.
861   
862   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
863     errore. I codici di errore restituiti in \var{errno} sono i seguenti:
864   \begin{errlist}
865   \item[\errcode{EBADF}] l'argomento \param{sockfd} non è un file descriptor
866     valido.
867   \item[\errcode{ENOTSOCK}] l'argomento \param{sockfd} non è un socket.
868   \item[\errcode{EOPNOTSUPP}] il socket è di un tipo che non supporta questa
869     operazione.
870   \end{errlist}}
871 \end{prototype}
872
873 La funzione pone il socket specificato da \param{sockfd} in modalità passiva e
874 predispone una coda per le connessioni in arrivo di lunghezza pari a
875 \param{backlog}. La funzione si può applicare solo a socket di tipo
876 \const{SOCK\_STREAM} o \const{SOCK\_SEQPACKET}.
877
878 L'argomento \param{backlog} indica il numero massimo di connessioni pendenti
879 accettate; se esso viene ecceduto il client al momento della richiesta della
880 connessione riceverà un errore di tipo \errcode{ECONNREFUSED}, o se il
881 protocollo, come accade nel caso del TCP, supporta la ritrasmissione, la
882 richiesta sarà ignorata in modo che la connessione possa venire ritentata.
883
884 Per capire meglio il significato di tutto ciò occorre approfondire la modalità
885 con cui il kernel tratta le connessioni in arrivo. Per ogni socket in ascolto
886 infatti vengono mantenute due code:
887 \begin{enumerate}
888 \item La coda delle connessioni incomplete (\textit{incomplete connection
889     queue} che contiene un riferimento per ciascun socket per il quale è
890   arrivato un SYN ma il \textit{three way handshake} non si è ancora concluso.
891   Questi socket sono tutti nello stato \texttt{SYN\_RECV}.
892 \item La coda delle connessioni complete (\textit{complete connection queue}
893   che contiene un ingresso per ciascun socket per il quale il three way
894   handshake è stato completato ma ancora \func{accept} non è ritornata.
895   Questi socket sono tutti nello stato \texttt{ESTABLISHED}.
896 \end{enumerate}
897
898 Lo schema di funzionamento è descritto in \figref{fig:TCP_listen_backlog}:
899 quando arriva un SYN da un client il server crea una nuova voce nella coda
900 delle connessioni incomplete, e poi risponde con il SYN$+$ACK. La voce resterà
901 nella coda delle connessioni incomplete fino al ricevimento dell'ACK dal
902 client o fino ad un timeout. Nel caso di completamento del three way handshake
903 la voce viene spostata nella coda delle connessioni complete.  Quando il
904 processo chiama la funzione \func{accept} (vedi \secref{sec:TCP_func_accept})
905 la prima voce nella coda delle connessioni complete è passata al programma, o,
906 se la coda è vuota, il processo viene posto in attesa e risvegliato all'arrivo
907 della prima connessione completa.
908
909 \begin{figure}[htb]
910   \centering
911   \includegraphics[width=11cm]{img/tcp_listen_backlog}  
912   \caption{Schema di funzionamento delle code delle connessioni complete ed
913     incomplete.}
914   \label{fig:TCP_listen_backlog}
915 \end{figure}
916
917 Storicamente il valore del parametro \param{backlog} era corrispondente al
918 massimo valore della somma del numero di voci possibili per ciascuna delle due
919 code. Stevens in \cite{UNP1} riporta che BSD ha sempre applicato un fattore di
920 1.5 a detto valore, e fornisce una tabella con i risultati ottenuti con vari
921 kernel, compreso Linux 2.0, che mostrano le differenze fra diverse
922 implementazioni.
923
924 In Linux il significato di questo valore è cambiato a partire dal kernel 2.2
925 per prevenire l'attacco chiamato \textit{syn flood}. Questo si basa
926 sull'emissione da parte dell'attaccante di un grande numero di pacchetti SYN
927 indirizzati verso una porta, forgiati con indirizzo IP fasullo\footnote{con la
928   tecnica che viene detta \textit{ip spoofing}.} così che i SYN$+$ACK vanno
929 perduti e la coda delle connessioni incomplete viene saturata, impedendo di
930 fatto ulteriori connessioni.
931
932 Per ovviare a questo il significato del \param{backlog} è stato cambiato a
933 indicare la lunghezza della coda delle connessioni complete. La lunghezza
934 della coda delle connessioni incomplete può essere ancora controllata usando
935 la funzione \func{sysctl} con il parametro \const{NET\_TCP\_MAX\_SYN\_BACKLOG}
936 o scrivendola direttamente in
937 \file{/proc/sys/net/ipv4/tcp\_max\_syn\_backlog}.  Quando si attiva la
938 protezione dei syncookies però (con l'opzione da compilare nel kernel e da
939 attivare usando \file{/proc/sys/net/ipv4/tcp\_syncookies}) questo valore viene
940 ignorato e non esiste più un valore massimo.  In ogni caso in Linux il valore
941 di \param{backlog} viene troncato ad un massimo di \const{SOMAXCONN} se è
942 superiore a detta costante (che di default vale 128).
943
944 La scelta storica per il valore di questo parametro era di 5, e alcuni vecchi
945 kernel non supportavano neanche valori superiori, ma la situazione corrente è
946 molto cambiata per via della presenza di server web che devono gestire un gran
947 numero di connessioni per cui un tale valore non è più adeguato. Non esiste
948 comunque una risposta univoca per la scelta del valore, per questo non
949 conviene specificarlo con una costante (il cui cambiamento richiederebbe la
950 ricompilazione del server) ma usare piuttosto una variabile di ambiente (vedi
951 \secref{sec:proc_environ}).
952
953 Stevens tratta accuratamente questo argomento in \cite{UNP1}, con esempi presi
954 da casi reali su web server, ed in particolare evidenzia come non sia più vero
955 che il compito principale della coda sia quello di gestire il caso in cui il
956 server è occupato fra chiamate successive alla \func{accept} (per cui la coda
957 più occupata sarebbe quella delle connessioni completate), ma piuttosto quello
958 di gestire la presenza di un gran numero di SYN in attesa di concludere il
959 three way handshake.
960
961 Infine va messo in evidenza che, nel caso di socket TCP, quando un SYN arriva
962 con tutte le code piene, il pacchetto deve essere ignorato. Questo perché la
963 condizione in cui le code sono piene è ovviamente transitoria, per cui se il
964 client ritrasmette il SYN è probabile che passato un po' di tempo possa
965 trovare nella coda lo spazio per una nuova connessione. Se invece si
966 rispondesse con un RST, per indicare l'impossibilità di effettuare la
967 connessione, la chiamata a \func{connect} nel client ritornerebbe con una
968 condizione di errore, costringendo a inserire nell'applicazione la gestione
969 dei tentativi di riconnessione, che invece può essere effettuata in maniera
970 trasparente dal protocollo TCP.
971
972
973 \subsection{La funzione \func{accept}}
974 \label{sec:TCP_func_accept}
975
976 La funzione \funcd{accept} è chiamata da un server per gestire la connessione
977 una volta che sia stato completato il \textit{three way handshake}, la
978 funzione restituisce un nuovo socket descriptor su cui si potrà operare per
979 effettuare la comunicazione. Se non ci sono connessioni completate il processo
980 viene messo in attesa. Il prototipo della funzione è il seguente:
981 \begin{prototype}{sys/socket.h}
982 {int accept(int sockfd, struct sockaddr *addr, socklen\_t *addrlen)} 
983  
984   Accetta una connessione sul socket specificato.
985   
986   \bodydesc{La funzione restituisce un numero di socket descriptor positivo in
987     caso di successo e -1 in caso di errore, nel qual caso \var{errno} viene
988     impostata ai seguenti valori:
989
990   \begin{errlist}
991   \item[\errcode{EBADF}] l'argomento \param{sockfd} non è un file descriptor
992     valido.
993   \item[\errcode{ENOTSOCK}] l'argomento \param{sockfd} non è un socket.
994   \item[\errcode{EOPNOTSUPP}] il socket è di un tipo che non supporta questa
995     operazione.
996   \item[\errcode{EAGAIN} o \errcode{EWOULDBLOCK}] il socket è stato impostato
997     come non bloccante (vedi \secref{sec:file_noblocking}), e non ci sono
998     connessioni in attesa di essere accettate.
999   \item[\errcode{EPERM}] Le regole del firewall non consentono la connessione.
1000   \item[\errcode{ENOBUFS}, \errcode{ENOMEM}] questo spesso significa che
1001     l'allocazione della memoria è limitata dai limiti sui buffer dei socket,
1002     non dalla memoria di sistema.
1003   \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale.
1004   \end{errlist}
1005   Inoltre possono essere restituiti gli errori di rete relativi al nuovo
1006   socket, diversi a secondo del protocollo, come: \errval{EMFILE},
1007   \errval{EINVAL}, \errval{ENOSR}, \errval{ENOBUFS}, \errval{EFAULT},
1008   \errval{EPERM}, \errval{ECONNABORTED}, \errval{ESOCKTNOSUPPORT},
1009   \errval{EPROTONOSUPPORT}, \errval{ETIMEDOUT}, \errval{ERESTARTSYS}.}
1010 \end{prototype}
1011
1012 La funzione estrae la prima connessione relativa al socket \param{sockfd} in
1013 attesa sulla coda delle connessioni complete, che associa ad nuovo socket con
1014 le stesse caratteristiche di \param{sockfd}.  Il socket originale non viene
1015 toccato e resta nello stato di \texttt{LISTEN}, mentre il nuovo socket viene
1016 posto nello stato \texttt{ESTABLISHED}. Nella struttura \param{addr} e nella
1017 variabile \param{addrlen} vengono restituiti indirizzo e relativa lunghezza
1018 del client che si è connesso.
1019
1020 I due argomenti \param{addr} e \param{addrlen} (si noti che quest'ultimo è
1021 passato per indirizzo per avere indietro il valore) sono usati per ottenere
1022 l'indirizzo del client da cui proviene la connessione. Prima della chiamata
1023 \param{addrlen} deve essere inizializzato alle dimensioni della struttura il
1024 cui indirizzo è passato come argomento in \param{addr}; al ritorno della
1025 funzione \param{addrlen} conterrà il numero di byte scritti dentro
1026 \param{addr}. Se questa informazione non interessa basterà inizializzare a
1027 \val{NULL} detti puntatori.
1028
1029 Se la funzione ha successo restituisce il descrittore di un nuovo socket
1030 creato dal kernel (detto \textit{connected socket}) a cui viene associata la
1031 prima connessione completa (estratta dalla relativa coda, vedi
1032 \secref{sec:TCP_func_listen}) che il client ha effettuato verso il socket
1033 \param{sockfd}. Quest'ultimo (detto \textit{listening socket}) è quello creato
1034 all'inizio e messo in ascolto con \func{listen}, e non viene toccato dalla
1035 funzione.  Se non ci sono connessioni pendenti da accettare la funzione mette
1036 in attesa il processo\footnote{a meno che non si sia impostato il socket per
1037   essere non bloccante (vedi \secref{sec:file_noblocking}), nel qual caso
1038   ritorna con l'errore \errcode{EAGAIN}.  Torneremo su questa modalità di
1039   operazione in \secref{sec:xxx_sock_noblock}.}  fintanto che non ne arriva
1040 una.
1041
1042 La funzione può essere usata solo con socket che supportino la connessione
1043 (cioè di tipo \const{SOCK\_STREAM}, \const{SOCK\_SEQPACKET} o
1044 \const{SOCK\_RDM}). Per alcuni protocolli che richiedono una conferma
1045 esplicita della connessione,\footnote{attualmente in Linux solo DECnet ha
1046   questo comportamento.} la funzione opera solo l'estrazione dalla coda delle
1047 connessioni, la conferma della connessione viene eseguita implicitamente dalla
1048 prima chiamata ad una \func{read} o una \func{write}, mentre il rifiuto della
1049 connessione viene eseguito con la funzione \func{close}.
1050
1051 È da chiarire che Linux presenta un comportamento diverso nella gestione degli
1052 errori rispetto ad altre implementazioni dei socket BSD, infatti la funzione
1053 \func{accept} passa gli errori di rete pendenti sul nuovo socket come codici
1054 di errore per \func{accept}, per cui l'applicazione deve tenerne conto ed
1055 eventualmente ripetere la chiamata alla funzione come per l'errore di
1056 \errcode{EAGAIN}. Un'altra differenza con BSD è che la funzione non fa
1057 ereditare al nuovo socket i flag del socket originale, come
1058 \const{O\_NONBLOCK},\footnote{ed in generale tutti quelli che si possono
1059   impostare con \func{fcntl}, vedi \secref{sec:file_fcntl}.} che devono essere
1060 rispecificati ogni volta. Tutto questo deve essere tenuto in conto se si
1061 devono scrivere programmi portabili.
1062
1063 Il meccanismo di funzionamento di \func{accept} è essenziale per capire il
1064 funzionamento di un server: in generale infatti c'è sempre un solo socket in
1065 ascolto, detto per questo \textit{listening socket}, che resta per tutto il
1066 tempo nello stato \texttt{LISTEN}, mentre le connessioni vengono gestite dai
1067 nuovi socket, detti \textit{connected socket}, ritornati da \func{accept}, che
1068 si trovano automaticamente nello stato \texttt{ESTABLISHED}, e vengono
1069 utilizzati per lo scambio dei dati, che avviene su di essi, fino alla chiusura
1070 della connessione.  Si può riconoscere questo schema anche nell'esempio
1071 elementare di \figref{fig:TCP_daytime_iter_server_code}, dove per ogni
1072 connessione il socket creato da \func{accept} viene chiuso dopo l'invio dei
1073 dati.
1074
1075
1076 \subsection{Le funzioni \func{getsockname} e \func{getpeername}}
1077 \label{sec:TCP_get_names}
1078
1079 Oltre a tutte quelle viste finora, dedicate all'utilizzo dei socket, esistono
1080 alcune funzioni ausiliarie che possono essere usate per recuperare alcune
1081 informazioni relative ai socket ed alle connessioni ad essi associate. Le due
1082 funzioni più elementari sono queste, che vengono usate per ottenere i dati
1083 relativi alla socket pair associata ad un certo socket.
1084
1085 La prima funzione è \funcd{getsockname} e serve ad ottenere l'indirizzo locale
1086 associato ad un socket; il suo prototipo è:
1087 \begin{prototype}{sys/socket.h}
1088   {int getsockname(int sockfd, struct sockaddr * name, socklen\_t * namelen)}
1089   Legge l'indirizzo locale di un socket.
1090
1091 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
1092   errore. I codici di errore restituiti in \var{errno} sono i seguenti:
1093   \begin{errlist}
1094   \item[\errcode{EBADF}] l'argomento \param{sockfd} non è un file descriptor
1095     valido.
1096   \item[\errcode{ENOTSOCK}] l'argomento \param{sockfd} non è un socket.
1097   \item[\errcode{ENOBUFS}] non ci sono risorse sufficienti nel sistema per
1098     eseguire l'operazione.
1099   \item[\errcode{EFAULT}] l'indirizzo \param{name} non è valido.
1100   \end{errlist}}
1101 \end{prototype}
1102
1103 La funzione restituisce la struttura degli indirizzi del socket \param{sockfd}
1104 nella struttura indicata dal puntatore \param{name} la cui lunghezza è
1105 specificata tramite l'argomento \param{namlen}. Quest'ultimo viene passato
1106 come indirizzo per avere indietro anche il numero di byte effettivamente
1107 scritti nella struttura puntata da \param{name}. Si tenga presente che se si è
1108 utilizzato un buffer troppo piccolo per \param{name} l'indirizzo risulterà
1109 troncato.
1110
1111
1112 La funzione si usa tutte le volte che si vuole avere l'indirizzo locale di un
1113 socket; ad esempio può essere usata da un client (che usualmente non chiama
1114 \func{bind}) per ottenere numero IP e porta locale associati al socket
1115 restituito da una \func{connect}, o da un server che ha chiamato \func{bind}
1116 su un socket usando 0 come porta locale per ottenere il numero di porta
1117 effimera assegnato dal kernel.
1118
1119 Inoltre quando un server esegue una \func{bind} su un indirizzo generico, se
1120 chiamata dopo il completamento di una connessione sul socket restituito da
1121 \func{accept}, restituisce l'indirizzo locale che il kernel ha assegnato a
1122 quella connessione.
1123
1124 Tutte le volte che si vuole avere l'indirizzo remoto di un socket si usa la
1125 funzione \funcd{getpeername}, il cui prototipo è:
1126 \begin{prototype}{sys/socket.h}
1127   {int getpeername(int sockfd, struct sockaddr * name, socklen\_t * namelen)}
1128   Legge l'indirizzo remoto di un socket.
1129   
1130   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
1131     errore. I codici di errore restituiti in \var{errno} sono i seguenti:
1132   \begin{errlist}
1133   \item[\errcode{EBADF}] l'argomento \param{sockfd} non è un file descriptor
1134     valido.
1135   \item[\errcode{ENOTSOCK}] l'argomento \param{sockfd} non è un socket.
1136   \item[\errcode{ENOTCONN}] il socket non è connesso.
1137   \item[\errcode{ENOBUFS}] non ci sono risorse sufficienti nel sistema per
1138     eseguire l'operazione.
1139   \item[\errcode{EFAULT}] l'argomento \param{name} punta al di fuori dello
1140     spazio di indirizzi del processo.
1141   \end{errlist}}
1142 \end{prototype}
1143
1144 La funzione è identica a \func{getsockname}, ed usa la stessa sintassi, ma
1145 restituisce l'indirizzo remoto del socket, cioè quello associato all'altro
1146 capo della connessione.  Ci si può chiedere a cosa serva questa funzione dato
1147 che dal lato client l'indirizzo remoto è sempre noto quando si esegue la
1148 \func{connect} mentre dal lato server si possono usare, come vedremo in
1149 \figref{fig:TCP_cunc_serv_code}, i valori di ritorno di \func{accept}.
1150
1151 Il fatto è che in generale quest'ultimo caso non è sempre possibile.  In
1152 particolare questo avviene quando il server, invece di gestire la connessione
1153 direttamente in un processo figlio, come vedremo nell'esempio di server
1154 concorrente di \secref{sec:TCP_daytime_cunc_server}, lancia per ciascuna
1155 connessione un altro programma, usando \func{exec}.\footnote{questa ad esempio
1156   è la modalità con cui opera il \textsl{super-server} \cmd{inetd}, che può
1157   gestire tutta una serie di servizi diversi, eseguendo su ogni connessione
1158   ricevuta sulle porte tenute sotto controllo, il relativo server.}
1159
1160 In questo caso benché il processo figlio abbia una immagine della memoria che
1161 è copia di quella del processo padre (e contiene quindi anche la struttura
1162 ritornata da \func{accept}), all'esecuzione di \func{exec} verrà caricata in
1163 memoria l'immagine del programma eseguito, che a questo punto perde ogni
1164 riferimento ai valori tornati da \func{accept}.  Il socket descriptor però
1165 resta aperto, e se si è seguita una opportuna convenzione per rendere noto al
1166 programma eseguito qual'è il socket connesso, \footnote{ad esempio il solito
1167   \cmd{inetd} fa sempre in modo che i file descriptor 0, 1 e 2 corrispondano
1168   al socket connesso.} quest'ultimo potrà usare la funzione \func{getpeername}
1169 per determinare l'indirizzo remoto del client.
1170
1171 Infine è da chiarire (si legga la pagina di manuale) che, come per
1172 \func{accept}, il terzo parametro, che è specificato dallo standard POSIX.1g
1173 come di tipo \code{socklen\_t *} in realtà deve sempre corrispondere ad un
1174 \ctyp{int *} come prima dello standard perché tutte le implementazioni dei
1175 socket BSD fanno questa assunzione.
1176
1177
1178 \subsection{La funzione \func{close}}
1179 \label{sec:TCP_func_close}
1180
1181 La funzione standard Unix \func{close} (vedi \secref{sec:file_close}) che si
1182 usa sui file può essere usata con lo stesso effetto anche sui file descriptor
1183 associati ad un socket.
1184
1185 L'azione di questa funzione quando applicata a socket è di marcarlo come
1186 chiuso e ritornare immediatamente al processo. Una volta chiamata il socket
1187 descriptor non è più utilizzabile dal processo e non può essere usato come
1188 argomento per una \func{write} o una \func{read} (anche se l'altro capo della
1189 connessione non avesse chiuso la sua parte).  Il kernel invierà comunque tutti
1190 i dati che ha in coda prima di iniziare la sequenza di chiusura.
1191
1192 Vedremo più avanti in \secref{sec:TCP_so_linger} come è possibile cambiare
1193 questo comportamento, e cosa deve essere fatto perché il processo possa
1194 assicurarsi che l'altro capo abbia ricevuto tutti i dati.
1195
1196 Come per tutti i file descriptor anche per i socket viene mantenuto un numero
1197 di riferimenti, per cui se più di un processo ha lo stesso socket aperto
1198 l'emissione del FIN e la sequenza di chiusura di TCP non viene innescata
1199 fintanto che il numero di riferimenti non si annulla, questo si applica, come
1200 visto in \secref{sec:file_sharing}, sia ai file descriptor duplicati che a
1201 quelli ereditati dagli eventuali processi figli, ed è il comportamento che ci
1202 si aspetta in una qualunque applicazione client/server.
1203
1204 Per attivare immediatamente l'emissione del FIN e la sequenza di chiusura
1205 descritta in \secref{sec:TCP_conn_term}, si può invece usare la funzione
1206 \func{shutdown} su cui torneremo in seguito (vedi \secref{sec:xxx_shutdown}).
1207
1208
1209
1210 \section{Un esempio elementare: il servizio \textit{daytime}}
1211 \label{sec:TCP_daytime_application}
1212
1213 Avendo introdotto le funzioni di base per la gestione dei socket, potremo
1214 vedere in questa sezione un primo esempio di applicazione elementare che
1215 implementa il servizio \textit{daytime} su TCP, secondo quanto specificato
1216 dall'\href{http://www.ietf.org/rfc/rfc0867.txt}{RFC~867}.  Prima di passare
1217 agli esempi del client e del server, inizieremo riesaminando con maggiori
1218 dettagli una peculiarità delle funzioni di I/O, già accennata in
1219 \secref{sec:file_read} e \secref{sec:file_write}, che nel caso dei socket è
1220 particolarmente rilevante.  Passeremo poi ad illustrare gli esempi
1221 dell'implementazione, sia dal lato client, che dal lato server, che si è
1222 realizzato sia in forma iterativa che concorrente.
1223
1224
1225 \subsection{Il comportamento delle funzioni di I/O}
1226 \label{sec:sock_io_behav}
1227
1228 Una cosa che si tende a dimenticare quando si ha a che fare con i socket è che
1229 le funzioni di input/output non sempre hanno lo stesso comportamento che
1230 avrebbero con i normali file di dati (in particolare questo accade per i
1231 socket di tipo stream).
1232
1233 Infatti con i socket è comune che funzioni come \func{read} o \func{write}
1234 possano restituire in input o scrivere in output un numero di byte minore di
1235 quello richiesto. Come già accennato in \secref{sec:file_read} questo è un
1236 comportamento normale per l'I/O su file, ma con i normali file di dati il
1237 problema si avverte solo quando si incontra la fine del file. In generale non
1238 è così, e con i socket questo è particolarmente evidente.
1239
1240
1241 \begin{figure}[htb]
1242   \footnotesize \centering
1243   \begin{minipage}[c]{15cm}
1244     \includecodesample{listati/FullRead.c}
1245   \end{minipage} 
1246   \normalsize
1247   \caption{La funzione \func{FullRead}, che legge esattamente \var{count} byte
1248     da un file descriptor, iterando opportunamente le letture.}
1249   \label{fig:sock_FullRead_code}
1250 \end{figure}
1251
1252 Quando ci si trova ad affrontare questo comportamento tutto quello che si deve
1253 fare è semplicemente ripetere la lettura (o la scrittura) per la quantità di
1254 byte restanti, tenendo conto che le funzioni si possono bloccare se i dati non
1255 sono disponibili: è lo stesso comportamento che si può avere scrivendo più di
1256 \const{PIPE\_BUF} byte in una pipe (si riveda quanto detto in
1257 \secref{sec:ipc_pipes}).
1258
1259 Per questo motivo, seguendo l'esempio di R. W. Stevens in \cite{UNP1}, si sono
1260 definite due funzioni, \func{FullRead} e \func{FullWrite}, che eseguono
1261 lettura e scrittura tenendo conto di questa caratteristica, ed in grado di
1262 ritornare solo dopo avere letto o scritto esattamente il numero di byte
1263 specificato; il sorgente è riportato rispettivamente in
1264 \figref{fig:sock_FullRead_code} e \figref{fig:sock_FullWrite_code} ed è
1265 disponibile fra i sorgenti allegati alla guida nei file \file{FullRead.c} e
1266 \file{FullWrite.c}.
1267
1268 \begin{figure}[htb]
1269   \centering
1270   \footnotesize \centering
1271   \begin{minipage}[c]{15cm}
1272     \includecodesample{listati/FullWrite.c}
1273   \end{minipage} 
1274   \normalsize
1275   \caption{La funzione \func{FullWrite}, che scrive esattamente \var{count}
1276     byte su un file descriptor, iterando opportunamente le scritture.}
1277   \label{fig:sock_FullWrite_code}
1278 \end{figure}
1279
1280 Come si può notare le due funzioni ripetono la lettura/scrittura in un ciclo
1281 fino all'esaurimento del numero di byte richiesti, in caso di errore viene
1282 controllato se questo è \errcode{EINTR} (cioè un'interruzione della system
1283 call dovuta ad un segnale), nel qual caso l'accesso viene ripetuto, altrimenti
1284 l'errore viene ritornato al programma chiamante, interrompendo il ciclo.
1285
1286 Nel caso della lettura, se il numero di byte letti è zero, significa che si è
1287 arrivati alla fine del file (per i socket questo significa in genere che
1288 l'altro capo è stato chiuso, e quindi non sarà più possibile leggere niente) e
1289 pertanto si ritorna senza aver concluso la lettura di tutti i byte richiesti.
1290
1291
1292 \subsection{Il client \textit{daytime}}
1293 \label{sec:TCP_daytime_client}
1294
1295 Il primo esempio di applicazione delle funzioni di base illustrate in
1296 precedenza è relativo alla creazione di un client elementare per il servizio
1297 \textit{daytime}, un servizio elementare, definito
1298 nell'\href{http://www.ietf.org/rfc/rfc0867.txt}{RFC~867}, che restituisce
1299 l'ora locale della macchina a cui si effettua la richiesta, e che è assegnato
1300 alla porta 13.
1301
1302 In \figref{fig:TCP_cli_code} è riportata la sezione principale del codice del
1303 nostro client. Il sorgente completo del programma (\file{TCP_daytime.c}, che
1304 comprende il trattamento delle opzioni ed una funzione per stampare un
1305 messaggio di aiuto) è allegato alla guida nella sezione dei codici sorgente e
1306 può essere compilato su una qualunque macchina GNU/Linux.
1307
1308 \begin{figure}[!htb]
1309   \footnotesize \centering
1310   \begin{minipage}[c]{15cm}
1311     \includecodesample{listati/TCP_daytime.c}
1312   \end{minipage} 
1313   \normalsize
1314   \caption{Esempio di codice di un client elementare per il servizio
1315     \textit{daytime}.} 
1316   \label{fig:TCP_daytime_client_code}
1317 \end{figure}
1318
1319 Il programma anzitutto (\texttt{\small 1--5}) include gli header necessari;
1320 dopo la dichiarazione delle variabili (\texttt{\small 9--12}) si è omessa
1321 tutta la parte relativa al trattamento degli argomenti passati dalla linea di
1322 comando (effettuata con le apposite funzioni illustrate in
1323 \secref{sec:proc_opt_handling}).
1324
1325 Il primo passo (\texttt{\small 14--18}) è creare un socket TCP (quindi di tipo
1326 \const{SOCK\_STREAM} e di famiglia \const{AF\_INET}). La funzione
1327 \func{socket} ritorna il descrittore che viene usato per identificare il
1328 socket in tutte le chiamate successive. Nel caso la chiamata fallisca si
1329 stampa un errore (\texttt{\small 16}) con la funzione \func{perror} e si esce
1330 (\texttt{\small 16}) con un codice di errore.
1331
1332 Il passo seguente (\texttt{\small 19--27}) è quello di costruire un'apposita
1333 struttura \struct{sockaddr\_in} in cui sarà inserito l'indirizzo del server ed
1334 il numero della porta del servizio. Il primo passo (\texttt{\small 20}) è
1335 inizializzare tutto a zero, per poi inserire il tipo di indirizzo
1336 (\texttt{\small 21}) e la porta (\texttt{\small 22}), usando per quest'ultima
1337 la funzione \func{htons} per convertire il formato dell'intero usato dal
1338 computer a quello usato nella rete, infine \texttt{\small 23--27} si può
1339 utilizzare la funzione \func{inet\_pton} per convertire l'indirizzo numerico
1340 passato dalla linea di comando.
1341
1342 A questo punto (\texttt{\small 28--32}) usando la funzione \func{connect} sul
1343 socket creato in precedenza (\texttt{\small 29}) si può stabilire la
1344 connessione con il server. Per questo si deve utilizzare come secondo
1345 argomento la struttura preparata in precedenza con il relativo indirizzo; si
1346 noti come, esistendo diversi tipi di socket, si sia dovuto effettuare un cast.
1347 Un valore di ritorno della funzione negativo implica il fallimento della
1348 connessione, nel qual caso si stampa un errore (\texttt{\small 30}) e si
1349 ritorna (\texttt{\small 31}).
1350
1351 Completata con successo la connessione il passo successivo (\texttt{\small
1352   34--40}) è leggere la data dal socket; il protocollo prevede che il server
1353 invii sempre una stringa alfanumerica di 26 caratteri, nella forma giorno
1354 della settimana, mese, ora minuto e secondo, anno, seguita dai caratteri di
1355 terminazione \verb|\r\n|, cioè qualcosa del tipo:
1356 \begin{verbatim}
1357 Wed Apr 4 00:53:00 2001\r\n
1358 \end{verbatim}
1359 questa viene letta dal socket (\texttt{\small 34}) con la funzione \func{read}
1360 in un buffer temporaneo; la stringa poi deve essere terminata (\texttt{\small
1361   35}) con il solito carattere nullo per poter essere stampata (\texttt{\small
1362   36}) sullo standard output con l'uso di \func{fputs}.
1363
1364 Come si è già spiegato in \secref{sec:sock_io_behav} la risposta dal socket
1365 potrà arrivare in un unico pacchetto di 26 byte (come avverrà senz'altro nel
1366 caso in questione) ma potrebbe anche arrivare in 26 pacchetti di un byte.  Per
1367 questo nel caso generale non si può mai assumere che tutti i dati arrivino con
1368 una singola lettura, pertanto quest'ultima deve essere effettuata in un ciclo
1369 in cui si continui a leggere fintanto che la funzione \func{read} non ritorni
1370 uno zero (che significa che l'altro capo ha chiuso la connessione) o un numero
1371 minore di zero (che significa un errore nella connessione).
1372
1373 Si noti come in questo caso la fine dei dati sia specificata dal server che
1374 chiude la connessione (anche questo è quanto richiesto dal protocollo); questa
1375 è una delle tecniche possibili (è quella usata pure dal protocollo HTTP), ma
1376 ce ne possono essere altre, ad esempio FTP marca la conclusione di un blocco
1377 di dati con la sequenza ASCII \verb|\r\n| (carriage return e line feed),
1378 mentre il DNS mette la lunghezza in testa ad ogni blocco che trasmette. Il
1379 punto essenziale è che TCP non provvede nessuna indicazione che permetta di
1380 marcare dei blocchi di dati, per cui se questo è necessario deve provvedere il
1381 programma stesso.
1382
1383 Se abilitiamo il servizio \textit{daytime}\footnote{in genere questo viene
1384   fornito direttamente dal \textsl{superdemone} \texttt{inetd}, pertanto basta
1385   assicurarsi che esso sia abilitato nel relativo file di configurazione.}
1386 possiamo verificare il funzionamento del nostro client, avremo allora:
1387 \begin{verbatim}
1388 [piccardi@gont sources]$ ./daytime 127.0.0.1
1389 Mon Apr 21 20:46:11 2003
1390 \end{verbatim}%$
1391 e come si vede tutto funziona regolarmente.
1392
1393
1394 \subsection{Un server \textit{daytime} iterativo}
1395 \label{sec:TCP_daytime_iter_server}
1396
1397 Dopo aver illustrato il client daremo anche un esempio di un server
1398 elementare, che sia anche in grado di rispondere al precedente client. Come
1399 primo esempio realizzeremo un server iterativo, in grado di fornire una sola
1400 risposta alla volta. Il codice del programma è nuovamente mostrato in
1401 \figref{fig:TCP_daytime_iter_server_code}, il sorgente completo
1402 (\file{TCP_iter_daytimed.c}) è allegato insieme agli altri file degli esempi.
1403
1404 \begin{figure}[!htbp]
1405   \footnotesize \centering
1406   \begin{minipage}[c]{15cm}
1407     \includecodesample{listati/TCP_iter_daytimed.c}
1408   \end{minipage} 
1409   \normalsize
1410   \caption{Esempio di codice di un semplice server per il servizio daytime.}
1411   \label{fig:TCP_daytime_iter_server_code}
1412 \end{figure}
1413
1414 Come per il client si includono (\texttt{\small 1--9}) gli header necessari a
1415 cui è aggiunto quello per trattare i tempi, e si definiscono (\texttt{\small
1416   14--18}) alcune costanti e le variabili necessarie in seguito. Come nel caso
1417 precedente si sono omesse le parti relative al trattamento delle opzioni da
1418 riga di comando.
1419
1420 La creazione del socket (\texttt{\small 20--24}) è analoga al caso precedente,
1421 come pure l'inizializzazione (\texttt{\small 25--29}) della struttura
1422 \struct{sockaddr\_in}.  Anche in questo caso (\texttt{\small 28}) si usa la
1423 porta standard del servizio daytime, ma come indirizzo IP si usa
1424 (\texttt{\small 27}) il valore predefinito \const{INET\_ANY}, che corrisponde
1425 all'indirizzo generico.
1426
1427 Si effettua poi (\texttt{\small 30--34}) la chiamata alla funzione \func{bind}
1428 che permette di associare la precedente struttura al socket, in modo che
1429 quest'ultimo possa essere usato per accettare connessioni su una qualunque
1430 delle interfacce di rete locali. In caso di errore si stampa (\texttt{\small
1431   31}) un messaggio, e si termina (\texttt{\small 32}) immediatamente il
1432 programma.
1433
1434 Il passo successivo (\texttt{\small 35--39}) è quello di mettere ``in
1435 ascolto'' il socket; questo viene fatto (\texttt{\small 36}) con la funzione
1436 \func{listen} che dice al kernel di accettare connessioni per il socket che
1437 abbiamo creato; la funzione indica inoltre, con il secondo parametro, il
1438 numero massimo di connessioni che il kernel accetterà di mettere in coda per
1439 il suddetto socket. Di nuovo in caso di errore si stampa (\texttt{\small 37})
1440 un messaggio, e si esce (\texttt{\small 38}) immediatamente.
1441
1442 La chiamata a \func{listen} completa la preparazione del socket per l'ascolto
1443 (che viene chiamato anche \textit{listening descriptor}) a questo punto si può
1444 procedere con il ciclo principale (\texttt{\small 40--53}) che viene eseguito
1445 indefinitamente. Il primo passo (\texttt{\small 42}) è porsi in attesa di
1446 connessioni con la chiamata alla funzione \func{accept}, come in precedenza in
1447 caso di errore si stampa (\texttt{\small 43}) un messaggio, e si esce
1448 (\texttt{\small 44}).
1449
1450 Il processo resterà in stato di \textit{sleep} fin quando non arriva e viene
1451 accettata una connessione da un client; quando questo avviene \func{accept}
1452 ritorna, restituendo un secondo descrittore, che viene chiamato
1453 \textit{connected descriptor}, e che è quello che verrà usato dalla successiva
1454 chiamata alla \func{write} per scrivere la risposta al client.
1455
1456 Il ciclo quindi proseguirà determinando (\texttt{\small 46}) il tempo corrente
1457 con una chiamata a \texttt{time}, con il quale si potrà opportunamente
1458 costruire (\texttt{\small 47}) la stringa con la data da trasmettere
1459 (\texttt{\small 48}) con la chiamata a \func{write}. Completata la
1460 trasmissione il nuovo socket viene chiuso (\texttt{\small 52}).  A questo
1461 punto il ciclo si chiude ricominciando da capo in modo da poter ripetere
1462 l'invio della data in risposta ad una successiva connessione.
1463
1464 È importante notare che questo server è estremamente elementare, infatti, a
1465 parte il fatto di poter essere usato solo con indirizzi IPv4, esso è in grado
1466 di rispondere ad un solo un client alla volta: è cioè, come dicevamo, un
1467 \textsl{server iterativo}. Inoltre è scritto per essere lanciato da linea di
1468 comando, se lo si volesse utilizzare come demone occorrerebbero le opportune
1469 modifiche\footnote{come una chiamata a \func{daemon} prima dell'inizio del
1470   ciclo principale.} per tener conto di quanto illustrato in
1471 \secref{sec:sess_daemon}. Si noti anche che non si è inserita nessuna forma di
1472 gestione della terminazione del processo, dato che tutti i file descriptor
1473 vengono chiusi automaticamente alla sua uscita, e che, non generando figli,
1474 non è necessario preoccuparsi di gestire la loro terminazione.
1475
1476
1477 \subsection{Un server \textit{daytime} concorrente}
1478 \label{sec:TCP_daytime_cunc_server}
1479
1480 Il server \texttt{daytime} dell'esempio in \secref{sec:TCP_daytime_client} è un
1481 tipico esempio di server iterativo, in cui viene servita una richiesta alla
1482 volta; in generale però, specie se il servizio è più complesso e comporta uno
1483 scambio di dati più sostanzioso di quello in questione, non è opportuno
1484 bloccare un server nel servizio di un client per volta; per questo si ricorre
1485 alle capacità di multitasking del sistema.
1486
1487 Come accennato anche in \secref{sec:proc_gen} una delle modalità più comuni di
1488 funzionamento da parte dei server è quella di usare la funzione \func{fork}
1489 per creare, ad ogni richiesta da parte di un client, un processo figlio che si
1490 incarichi della gestione della comunicazione.  Si è allora riscritto il server
1491 \texttt{daytime} dell'esempio precedente in forma concorrente, inserendo anche
1492 una opzione per la stampa degli indirizzi delle connessioni ricevute.
1493
1494 In \figref{fig:TCP_cunc_serv_code} è mostrato un estratto del codice, in cui
1495 si sono tralasciati il trattamento delle opzioni e le parti rimaste invariate
1496 rispetto al precedente esempio (cioè tutta la parte riguardante l'apertura
1497 passiva del socket). Al solito il sorgente completo del server, nel file
1498 \file{ElemDaytimeTCPCuncServ.c}, è allegato insieme ai sorgenti degli altri
1499 esempi.
1500
1501 \begin{figure}[!htb]
1502   \footnotesize \centering
1503   \begin{minipage}[c]{15cm}
1504     \includecodesample{listati/ElemDaytimeTCPCuncServ.c}
1505   \end{minipage} 
1506   \normalsize
1507   \caption{Esempio di codice di un server concorrente elementare per il 
1508     servizio daytime.}
1509   \label{fig:TCP_cunc_serv_code}
1510 \end{figure}
1511
1512 Stavolta (\texttt{\small 21--25}) la funzione \func{accept} è chiamata
1513 fornendo una struttura di indirizzi in cui saranno ritornati l'indirizzo IP e
1514 la porta da cui il client effettua la connessione, che in un secondo tempo,
1515 (\texttt{\small 39--43}), se il logging è abilitato, stamperemo sullo standard
1516 output.
1517
1518 Quando \func{accept} ritorna il server chiama la funzione \func{fork}
1519 (\texttt{\small 26--30}) per creare il processo figlio che effettuerà
1520 (\texttt{\small 31--45}) tutte le operazioni relative a quella connessione,
1521 mentre il padre proseguirà l'esecuzione del ciclo principale in attesa di
1522 ulteriori connessioni.
1523
1524 Si noti come il figlio operi solo sul socket connesso, chiudendo
1525 immediatamente (\texttt{\small 32}) il socket \var{list\_fd}; mentre il padre
1526 continua ad operare solo sul socket in ascolto chiudendo (\texttt{\small 47})
1527 \var{sock\_fd} al ritorno dalla \func{fork}. Per quanto abbiamo detto in
1528 \secref{sec:TCP_func_close} nessuna delle due chiamate a \func{close} causa
1529 l'innesco della sequenza di chiusura perché il numero di riferimenti al file
1530 descriptor non si è annullato.
1531
1532 Infatti subito dopo la creazione del socket \var{list\_fd} ha una referenza, e
1533 lo stesso vale per \var{sock\_fd} dopo il ritorno di \func{accept}, ma dopo la
1534 \func{fork} i descrittori vengono duplicati nel padre e nel figlio per cui
1535 entrambi i socket si trovano con due referenze. Questo fa si che quando il
1536 padre chiude \var{sock\_fd} esso resta con una referenza da parte del figlio,
1537 e sarà definitivamente chiuso solo quando quest'ultimo, dopo aver completato
1538 le sue operazioni, chiamerà (\texttt{\small 44}) la funzione \func{close}.
1539
1540 In realtà per il figlio non sarebbe necessaria nessuna chiamata a
1541 \func{close}, in quanto con la \func{exit} finale (\texttt{\small 45}) tutti i
1542 file descriptor, quindi anche quelli associati ai socket, vengono
1543 automaticamente chiusi.  Tuttavia si è preferito effettuare esplicitamente le
1544 chiusure per avere una maggiore chiarezza del codice, e per evitare eventuali
1545 errori, prevenendo ad esempio un uso involontario del \textit{listening
1546   descriptor}.
1547
1548 Si noti invece come sia essenziale che il padre chiuda ogni volta il socket
1549 connesso dopo la \func{fork}; se così non fosse nessuno di questi socket
1550 sarebbe effettivamente chiuso dato che alla chiusura da parte del figlio
1551 resterebbe ancora un riferimento nel padre. Si avrebbero così due effetti: il
1552 padre potrebbe esaurire i descrittori disponibili (che sono un numero limitato
1553 per ogni processo) e soprattutto nessuna delle connessioni con i client
1554 verrebbe chiusa.
1555
1556 Come per ogni server iterativo il lavoro di risposta viene eseguito
1557 interamente dal processo figlio. Questo si incarica (\texttt{\small 33}) di
1558 chiamare \func{time} per leggere il tempo corrente, e di stamparlo
1559 (\texttt{\small 34}) sulla stringa contenuta in \var{buffer} con l'uso di
1560 \func{snprintf} e \func{ctime}. Poi la stringa viene scritta (\texttt{\small
1561   35--38}) sul socket, controllando che non ci siano errori. Anche in questo
1562 caso si è evitato il ricorso a \func{FullWrite} in quanto la stringa è
1563 estremamente breve e verrà senz'altro scritta in un singolo segmento.
1564
1565 Inoltre nel caso sia stato abilitato il \textit{logging} delle connessioni, si
1566 provvede anche (\texttt{\small 39--42}) a stampare sullo standard output
1567 l'indirizzo e la porta da cui il client ha effettuato la connessione, usando
1568 i valori contenuti nelle strutture restituite da \func{accept}, eseguendo le
1569 opportune conversioni con \func{inet\_ntop} e \func{atohs}.
1570
1571 Ancora una volta l'esempio è estremamente semplificato, si noti come di nuovo
1572 non si sia gestita né la terminazione del processo né il suo uso come demone,
1573 che tra l'altro sarebbe stato incompatibile con l'uso della opzione di logging
1574 che stampa gli indirizzi delle connessioni sullo standard output. Un altro
1575 aspetto tralasciato è la gestione della terminazione dei processi figli,
1576 torneremo su questo più avanti quando tratteremo alcuni esempi di server più
1577 complessi.
1578
1579
1580 \section{Un esempio più completo: il servizio \textit{echo}}
1581 \label{sec:TCP_echo_application}
1582
1583 L'esempio precedente, basato sul servizio \textit{daytime}, è un esempio molto
1584 elementare, in cui il flusso dei dati va solo nella direzione dal server al
1585 client. In questa sezione esamineremo un esempio di applicazione client/server
1586 un po' più complessa, che usi i socket TCP per una comunicazione in entrambe
1587 le direzioni, implementando il servizio standard \textit{echo}, così come
1588 definito dall'\href{http://www.ietf.org/rfc/rfc0862.txt}{RFC~862}.  
1589
1590 Si è scelto di usare questo servizio, seguendo l'esempio di \cite{UNP1},
1591 perché costituisce il prototipo ideale di una generica applicazione di rete in
1592 cui un server risponde alle richieste di un client; nel caso di una
1593 applicazione più complessa si potrà avere in più una elaborazione dell'input
1594 del client da parte del server nel fornire le risposte in uscita.
1595
1596 Ci limiteremo ad un esempio elementare, che usi solo le funzioni di base, ma
1597 prenderemo in esame, oltre al comportamento in condizioni normali, anche tutti
1598 i possibili scenari particolari (errori, sconnessione della rete, crash del
1599 client o del server durante la connessione) che possono avere luogo durante
1600 l'impiego di un'applicazione di rete.  
1601
1602 Partiremo da un'implementazione elementare che dovrà essere rimaneggiata di
1603 volta in volta per poter tenere conto di tutte le evenienze che si possono
1604 manifestare nella vita reale di un'applicazione di rete, fino ad arrivare ad
1605 un'implementazione completa.
1606
1607 \subsection{Il client: prima versione}
1608 \label{sec:TCP_echo_client}
1609
1610 Il codice del client è riportato in \figref{fig:TCPsimpl_client_elem}, anche
1611 esso ricalca la struttura del precedente client per il servizio
1612 \texttt{daytime} (vedi \secref{sec:TCP_daytime_client}) ma, come per il
1613 server, lo si è diviso in due parti, inserendo la parte relativa alle
1614 operazioni specifiche previste per il protocollo \textit{echo} in una funzione
1615 a parte.
1616
1617 \begin{figure}[!htb]
1618   \footnotesize \centering
1619   \begin{minipage}[c]{15.6 cm}
1620     \includecodesample{listati/EchoServerWrong.c}
1621   \end{minipage} 
1622   \normalsize
1623   \caption{Codice della prima versione del client \textit{echo}.}
1624   \label{fig:TCPsimpl_client_elem}
1625 \end{figure}
1626
1627 La funzione \code{main} si occupa della creazione del socket e della
1628 connessione (linee \texttt{\small 10--27}) secondo la stessa modalità spiegata
1629 in \secref{sec:TCP_daytime_client}, il client si connette sulla porta 7
1630 all'indirizzo specificato dalla linea di comando (a cui si è aggiunta una
1631 elementare gestione delle opzioni non riportata in figura).
1632
1633 Completata la connessione, al ritorno di \func{connect}, la funzione
1634 \code{ClientEcho}, riportata in \figref{fig:TCPsimpl_client_echo_sub}, si
1635 preoccupa di gestire la comunicazione, leggendo una riga alla volta dallo
1636 \file{stdin}, scrivendola sul socket e ristampando su \file{stdout} quanto
1637 ricevuto in risposta dal server.
1638
1639 \begin{figure}[!htb]
1640   \footnotesize \centering
1641   \begin{minipage}[c]{15.6cm}
1642     \includecodesample{listati/ClientEcho.c}
1643   \end{minipage} 
1644   \normalsize
1645   \caption{Codice della prima versione della funzione \texttt{ClientEcho} per 
1646     la gestione del servizio \textit{echo}.}
1647   \label{fig:TCPsimpl_client_echo_sub}
1648 \end{figure}
1649
1650 La funzione utilizza due buffer per gestire i dati inviati e letti sul socket
1651 (\texttt{\small 3}).  La comunicazione viene gestita all'interno di un ciclo
1652 (linee \texttt{\small 5--10}), i dati da inviare sulla connessione vengono
1653 presi dallo \file{stdin} usando la funzione \func{fgets} che legge una
1654 linea di testo (terminata da un \texttt{CR} e fino al massimo di
1655 \const{MAXLINE} caratteri) e la salva sul buffer di invio, la funzione
1656 \func{FullWrite} (\texttt{\small 3}) scrive detti dati sul socket (gestendo
1657 l'invio multiplo qualora una singola \func{write} non basti, come spiegato
1658 in \secref{sec:sock_io_behav}).
1659
1660 I dati che vengono riletti indietro con una \func{FullRead} sul buffer di
1661 ricezione e viene inserita la terminazione della stringa (\texttt{\small
1662   7--8}) e per poter usare la funzione \func{fputs} per scriverli su
1663 \file{stdout}. 
1664
1665 Un end of file inviato su \file{stdin} causa il ritorno di \func{fgets}
1666 con un puntatore nullo e l'uscita dal ciclo, al che la subroutine ritorna ed
1667 il client esce.
1668
1669
1670 \subsection{La struttura del server}
1671 \label{sec:TCPsimp_server_main}
1672
1673 Il servizio \textit{echo} è uno dei servizi standard solitamente provvisti
1674 direttamente dal superserver \cmd{inetd}, ed è definito
1675 dall'\href{http://www.ietf.org/rfc/rfc0862.txt}{RFC~862}. Come dice il nome il
1676 servizio deve rimandare indietro sulla connessione i dati che gli vengono
1677 inviati; l'RFC descrive le specifiche sia per TCP che UDP, e per il primo
1678 stabilisce che una volta stabilita la connessione ogni dato in ingresso deve
1679 essere rimandato in uscita, fintanto che il chiamante non ha chiude la
1680 connessione; il servizio opera sulla porta 7.
1681
1682 Nel nostro caso l'esempio sarà costituito da un client che legge una linea di
1683 caratteri dallo standard input e la scrive sul server, il server leggerà la
1684 linea dalla connessione e la riscriverà all'indietro; sarà compito del client
1685 leggere la risposta del server e stamparla sullo standard output.
1686
1687 La prima versione del server, \file{ElemEchoTCPServer.c}, si compone di un
1688 corpo principale, costituito dalla funzione \code{main}.  Questa si incarica
1689 di creare il socket, metterlo in ascolto di connessioni in arrivo e creare un
1690 processo figlio a cui delegare la gestione di ciascuna connessione.  Questa
1691 parte, riportata in \figref{fig:TCPsimpl_serv_code}, è analoga a quella vista
1692 nel precedente esempio esaminato in \secref{sec:TCP_daytime_cunc_server}.
1693
1694 \begin{figure}[!htb]
1695   \footnotesize \centering
1696   \begin{minipage}[c]{15.6cm}
1697     \includecodesample{listati/ElemEchoTCPServer.c}
1698   \end{minipage} 
1699   \normalsize
1700   \caption{Codice della funzione \code{main} della prima versione del server
1701     per il servizio \textit{echo}.}
1702   \label{fig:TCPsimpl_serv_code}
1703 \end{figure}
1704
1705 La struttura di questa prima versione del server è sostanzialmente identica a
1706 quella dell'esempio citato, ed ad esso si applicano le considerazioni fatte in
1707 \secref{sec:TCP_daytime_cunc_server}. Le uniche differenze rispetto
1708 all'esempio in \figref{fig:TCP_daytime_iter_server_code} sono che in questo
1709 caso per il socket in ascolto viene usata la porta 7 e che tutta la gestione
1710 della comunicazione è delegata alla funzione \code{ServEcho}.
1711 %  Per ogni connessione viene creato un
1712 % processo figlio, il quale si incarica di lanciare la funzione
1713 % \texttt{SockEcho}.
1714
1715 Il codice della funzione \code{ServEcho} è invece mostrata in
1716 \figref{fig:TCPsimpl_server_elem_sub}, la comunicazione viene gestita
1717 all'interno del ciclo (linee \texttt{\small 6--8}).  I dati inviati dal client
1718 vengono letti dal socket con una semplice \func{read} (che ritorna solo in
1719 presenza di dati in arrivo), la riscrittura viene invece gestita dalla
1720 funzione \func{FullWrite} (descritta in \figref{fig:sock_FullWrite_code}) che
1721 si incarica di tenere conto automaticamente della possibilità che non tutti i
1722 dati di cui è richiesta la scrittura vengano trasmessi con una singola
1723 \func{write}.
1724
1725 \begin{figure}[!htb]
1726   \footnotesize \centering
1727   \begin{minipage}[c]{15.6cm}
1728     \includecodesample{listati/ServEcho.c}
1729   \end{minipage} 
1730   \normalsize
1731   \caption{Codice della prima versione della funzione \code{ServEcho} per la
1732     gestione del servizio \textit{echo}.}
1733   \label{fig:TCPsimpl_server_elem_sub}
1734 \end{figure}
1735
1736 Quando il client chiude la connessione il ricevimento del FIN fa ritornare la
1737 \func{read} con un numero di byte letti pari a zero, il che causa l'uscita
1738 dal ciclo e il ritorno della funzione, che a sua volta causa la terminazione
1739 del processo figlio.
1740
1741
1742
1743
1744 \subsection{L'avvio e il funzionamento normale}
1745 \label{sec:TCPsimpl_startup}
1746
1747 Benché il codice dell'esempio precedente sia molto ridotto, esso ci permetterà
1748 di considerare in dettaglio tutte le problematiche che si possono incontrare
1749 nello scrivere un'applicazione di rete. Infatti attraverso l'esame delle sue
1750 modalità di funzionamento normali, all'avvio e alla terminazione, e di quello
1751 che avviene nelle varie situazioni limite, da una parte potremo approfondire
1752 la comprensione del protocollo TCP/IP e dall'altra ricavare le indicazioni
1753 necessarie per essere in grado di scrivere applicazioni robuste, in grado di
1754 gestire anche i casi limite.
1755
1756 Il primo passo è compilare e lanciare il server (da root, per poter usare la
1757 porta 7 che è riservata), alla partenza esso eseguirà l'apertura passiva con
1758 la sequenza delle chiamate a \func{socket}, \func{bind}, \func{listen} e poi
1759 si bloccherà nella \func{accept}. A questo punto si potrà controllarne lo
1760 stato con \cmd{netstat}:
1761 \begin{verbatim}
1762 [piccardi@roke piccardi]$ netstat -at
1763 Active Internet connections (servers and established)
1764 Proto Recv-Q Send-Q Local Address           Foreign Address         State 
1765 ...
1766 tcp        0      0 *:echo                  *:*                     LISTEN
1767 ...
1768 \end{verbatim} %$
1769 che ci mostra come il socket sia in ascolto sulla porta richiesta, accettando
1770 connessioni da qualunque indirizzo e da qualunque porta e su qualunque
1771 interfaccia locale.
1772
1773 A questo punto si può lanciare il client, esso chiamerà \func{socket} e
1774 \func{connect}; una volta completato il three way handshake la connessione è
1775 stabilita; la \func{connect} ritornerà nel client\footnote{si noti che è
1776   sempre la \func{connect} del client a ritornare per prima, in quanto
1777   questo avviene alla ricezione del secondo segmento (l'ACK del server) del
1778   three way handshake, la \func{accept} del server ritorna solo dopo
1779   un altro mezzo RTT quando il terzo segmento (l'ACK del client) viene
1780   ricevuto.} e la \func{accept} nel server, ed usando di nuovo
1781 \cmd{netstat} otterremmo che:
1782 \begin{verbatim}
1783 Active Internet connections (servers and established)
1784 Proto Recv-Q Send-Q Local Address           Foreign Address         State
1785 tcp        0      0 *:echo                  *:*                     LISTEN
1786 tcp        0      0 roke:echo               gont:32981              ESTABLISHED
1787 \end{verbatim}
1788 mentre per quanto riguarda l'esecuzione dei programmi avremo che:
1789 \begin{itemize}
1790 \item il client chiama la funzione \code{ClientEcho} che si blocca sulla
1791   \func{fgets} dato che non si è ancora scritto nulla sul terminale.
1792 \item il server eseguirà una \func{fork} facendo chiamare al processo figlio
1793   la funzione \code{ServEcho}, quest'ultima si bloccherà sulla \func{read}
1794   dal socket sul quale ancora non sono presenti dati.
1795 \item il processo padre del server chiamerà di nuovo \func{accept}
1796   bloccandosi fino all'arrivo di un'altra connessione.
1797 \end{itemize}
1798 e se usiamo il comando \cmd{ps} per esaminare lo stato dei processi otterremo
1799 un risultato del tipo:
1800 \begin{verbatim}
1801 [piccardi@roke piccardi]$ ps ax
1802   PID TTY      STAT   TIME COMMAND
1803  ...  ...      ...    ...  ...
1804  2356 pts/0    S      0:00 ./echod
1805  2358 pts/1    S      0:00 ./echo 127.0.0.1
1806  2359 pts/0    S      0:00 ./echod
1807 \end{verbatim} %$
1808 (dove si sono cancellate le righe inutili) da cui si evidenzia la presenza di
1809 tre processi, tutti in stato di \textit{sleep} (vedi
1810 \tabref{tab:proc_proc_states}).
1811
1812 Se a questo punto si inizia a scrivere qualcosa sul client non sarà trasmesso
1813 niente fin tanto che non si prema il tasto di a capo (si ricordi quanto detto
1814 in \secref{sec:file_line_io} a proposito dell'I/O su terminale), solo allora
1815 \func{fgets} ritornerà ed il client scriverà quanto immesso sul socket, per
1816 poi passare a rileggere quanto gli viene inviato all'indietro dal server, che
1817 a sua volta sarà inviato sullo standard output, che nel caso ne provoca
1818 l'immediatamente stampa a video.
1819
1820
1821 \subsection{La conclusione normale}
1822 \label{sec:TCPsimpl_conclusion}
1823
1824 Tutto quello che scriveremo sul client sarà rimandato indietro dal server e
1825 ristampato a video fintanto che non concluderemo l'immissione dei dati; una
1826 sessione tipica sarà allora del tipo: 
1827 \begin{verbatim}
1828 [piccardi@roke sources]$ ./echo 127.0.0.1
1829 Questa e` una prova
1830 Questa e` una prova
1831 Ho finito
1832 Ho finito
1833 \end{verbatim} %$
1834 che termineremo inviando un EOF dal terminale (usando la combinazione di tasti
1835 ctrl-D, che non compare a schermo); se eseguiamo un \cmd{netstat} a questo
1836 punto avremo:
1837 \begin{verbatim}
1838 [piccardi@roke piccardi]$ netstat -at 
1839 tcp        0      0 *:echo                  *:*                     LISTEN
1840 tcp        0      0 localhost:33032         localhost:echo          TIME_WAIT
1841 \end{verbatim} %$
1842 con il client che entra in \texttt{TIME\_WAIT}.
1843
1844 Esaminiamo allora in dettaglio la sequenza di eventi che porta alla
1845 terminazione normale della connessione, che ci servirà poi da riferimento
1846 quando affronteremo il comportamento in caso di conclusioni anomale:
1847
1848 \begin{enumerate}
1849 \item inviando un carattere di EOF da terminale la \func{fgets} ritorna
1850   restituendo un puntatore nullo che causa l'uscita dal ciclo di
1851   \code{while}, così la \code{ClientEcho} ritorna.
1852 \item al ritorno di \code{ClientEcho} ritorna anche la funzione \code{main}, e
1853   come parte del processo terminazione tutti i file descriptor vengono chiusi
1854   (si ricordi quanto detto in \secref{sec:proc_term_conclusion}); questo causa
1855   la chiusura del socket di comunicazione; il client allora invierà un FIN al
1856   server a cui questo risponderà con un ACK.  A questo punto il client verrà a
1857   trovarsi nello stato \texttt{FIN\_WAIT\_2} ed il server nello stato
1858   \texttt{CLOSE\_WAIT} (si riveda quanto spiegato in
1859   \secref{sec:TCP_conn_term}).
1860 \item quando il server riceve il FIN la \func{read} del processo figlio che
1861   gestisce la connessione ritorna restituendo 0 causando così l'uscita dal
1862   ciclo e il ritorno di \code{ServEcho}, a questo punto il processo figlio
1863   termina chiamando \func{exit}.
1864 \item all'uscita del figlio tutti i file descriptor vengono chiusi, la
1865   chiusura del socket connesso fa sì che venga effettuata la sequenza finale
1866   di chiusura della connessione, viene emesso un FIN dal server che riceverà
1867   un ACK dal client, a questo punto la connessione è conclusa e il client
1868   resta nello stato \texttt{TIME\_WAIT}.
1869
1870 \end{enumerate}
1871
1872
1873 \subsection{La gestione dei processi figli}
1874 \label{sec:TCPsimpl_child_hand}
1875
1876 Tutto questo riguarda la connessione, c'è però da tenere conto dell'effetto
1877 del procedimento di chiusura del processo figlio nel server (si veda quanto
1878 esaminato in \secref{sec:proc_termination}). In questo caso avremo l'invio del
1879 segnale \const{SIGCHLD} al padre, ma dato che non si è installato un
1880 gestore e che l'azione predefinita per questo segnale è quella di essere
1881 ignorato, non avendo predisposto la ricezione dello stato di terminazione,
1882 otterremo che il processo figlio entrerà nello stato di zombie\index{zombie}
1883 (si riveda quanto illustrato in \secref{sec:sig_sigchld}), come risulterà
1884 ripetendo il comando \cmd{ps}:
1885 \begin{verbatim}
1886  2356 pts/0    S      0:00 ./echod
1887  2359 pts/0    Z      0:00 [echod <defunct>]
1888 \end{verbatim}
1889
1890 Poiché non è possibile lasciare processi zombie\index{zombie} che pur inattivi
1891 occupano spazio nella tabella dei processi e a lungo andare saturerebbero le
1892 risorse del kernel, occorrerà ricevere opportunamente lo stato di terminazione
1893 del processo (si veda \secref{sec:proc_wait}), cosa che faremo utilizzando
1894 \const{SIGCHLD} secondo quanto illustrato in \secref{sec:sig_sigchld}.
1895
1896 La prima modifica al nostro server è pertanto quella di inserire la gestione
1897 della terminazione dei processi figli attraverso l'uso di un gestore.
1898 Per questo useremo la funzione \code{Signal}, illustrata in
1899 \figref{fig:sig_Signal_code}, per installare il semplice gestore che
1900 riceve i segnali dei processi figli terminati già visto in 
1901 \figref{fig:sig_sigchld_handl}; aggiungendo il seguente codice:
1902 \includecodesnip{listati/sigchildhand.c}
1903 \noindent
1904 all'esempio illustrato in \figref{fig:TCPsimpl_serv_code}, e linkando il tutto
1905 alla funzione \code{sigchld\_hand}, si risolverà completamente il problema
1906 degli zombie\index{zombie}.
1907
1908
1909
1910 %%% Local Variables: 
1911 %%% mode: latex
1912 %%% TeX-master: "gapil"
1913 %%% End: