cfc4c8530540a00cd5f686f80614fbd13fbbdbf4
[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:TCP_socket}
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:TCP_echo}) sia stato il client ad eseguire
237 la chiusura attiva, nella realtà questa può essere eseguita da uno qualunque
238 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 \textit{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 amministratore, 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 La funzione si usa tutte le volte che si vuole avere l'indirizzo locale di un
1112 socket; ad esempio può essere usata da un client (che usualmente non chiama
1113 \func{bind}) per ottenere numero IP e porta locale associati al socket
1114 restituito da una \func{connect}, o da un server che ha chiamato \func{bind}
1115 su un socket usando 0 come porta locale per ottenere il numero di porta
1116 effimera assegnato dal kernel.
1117
1118 Inoltre quando un server esegue una \func{bind} su un indirizzo generico, se
1119 chiamata dopo il completamento di una connessione sul socket restituito da
1120 \func{accept}, restituisce l'indirizzo locale che il kernel ha assegnato a
1121 quella connessione.
1122
1123 Tutte le volte che si vuole avere l'indirizzo remoto di un socket si usa la
1124 funzione \funcd{getpeername}, il cui prototipo è:
1125 \begin{prototype}{sys/socket.h}
1126   {int getpeername(int sockfd, struct sockaddr * name, socklen\_t * namelen)}
1127   Legge l'indirizzo remoto di un socket.
1128   
1129   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
1130     errore. I codici di errore restituiti in \var{errno} sono i seguenti:
1131   \begin{errlist}
1132   \item[\errcode{EBADF}] l'argomento \param{sockfd} non è un file descriptor
1133     valido.
1134   \item[\errcode{ENOTSOCK}] l'argomento \param{sockfd} non è un socket.
1135   \item[\errcode{ENOTCONN}] il socket non è connesso.
1136   \item[\errcode{ENOBUFS}] non ci sono risorse sufficienti nel sistema per
1137     eseguire l'operazione.
1138   \item[\errcode{EFAULT}] l'argomento \param{name} punta al di fuori dello
1139     spazio di indirizzi del processo.
1140   \end{errlist}}
1141 \end{prototype}
1142
1143 La funzione è identica a \func{getsockname}, ed usa la stessa sintassi, ma
1144 restituisce l'indirizzo remoto del socket, cioè quello associato all'altro
1145 capo della connessione.  Ci si può chiedere a cosa serva questa funzione dato
1146 che dal lato client l'indirizzo remoto è sempre noto quando si esegue la
1147 \func{connect} mentre dal lato server si possono usare, come vedremo in
1148 \figref{fig:TCP_daytime_cunc_server_code}, i valori di ritorno di
1149 \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_daytime_client_code} è riportata la sezione principale del
1303 codice del nostro client. Il sorgente completo del programma
1304 (\file{TCP\_daytime.c}, che comprende il trattamento delle opzioni ed una
1305 funzione per stampare un messaggio di aiuto) è allegato alla guida nella
1306 sezione dei codici sorgente e può essere compilato su una qualunque macchina
1307 GNU/Linux.
1308
1309 \begin{figure}[!htb]
1310   \footnotesize \centering
1311   \begin{minipage}[c]{15cm}
1312     \includecodesample{listati/TCP_daytime.c}
1313   \end{minipage} 
1314   \normalsize
1315   \caption{Esempio di codice di un client elementare per il servizio
1316     \textit{daytime}.} 
1317   \label{fig:TCP_daytime_client_code}
1318 \end{figure}
1319
1320 Il programma anzitutto (\texttt{\small 1--5}) include gli header necessari;
1321 dopo la dichiarazione delle variabili (\texttt{\small 9--12}) si è omessa
1322 tutta la parte relativa al trattamento degli argomenti passati dalla linea di
1323 comando (effettuata con le apposite funzioni illustrate in
1324 \secref{sec:proc_opt_handling}).
1325
1326 Il primo passo (\texttt{\small 14--18}) è creare un socket TCP (quindi di tipo
1327 \const{SOCK\_STREAM} e di famiglia \const{AF\_INET}). La funzione
1328 \func{socket} ritorna il descrittore che viene usato per identificare il
1329 socket in tutte le chiamate successive. Nel caso la chiamata fallisca si
1330 stampa un errore (\texttt{\small 16}) con la funzione \func{perror} e si esce
1331 (\texttt{\small 17}) con un codice di errore.
1332
1333 Il passo seguente (\texttt{\small 19--27}) è quello di costruire un'apposita
1334 struttura \struct{sockaddr\_in} in cui sarà inserito l'indirizzo del server ed
1335 il numero della porta del servizio. Il primo passo (\texttt{\small 20}) è
1336 inizializzare tutto a zero, per poi inserire il tipo di indirizzo
1337 (\texttt{\small 21}) e la porta (\texttt{\small 22}), usando per quest'ultima
1338 la funzione \func{htons} per convertire il formato dell'intero usato dal
1339 computer a quello usato nella rete, infine \texttt{\small 23--27} si può
1340 utilizzare la funzione \func{inet\_pton} per convertire l'indirizzo numerico
1341 passato dalla linea di comando.
1342
1343 A questo punto (\texttt{\small 28--32}) usando la funzione \func{connect} sul
1344 socket creato in precedenza (\texttt{\small 29}) si può stabilire la
1345 connessione con il server. Per questo si deve utilizzare come secondo
1346 argomento la struttura preparata in precedenza con il relativo indirizzo; si
1347 noti come, esistendo diversi tipi di socket, si sia dovuto effettuare un cast.
1348 Un valore di ritorno della funzione negativo implica il fallimento della
1349 connessione, nel qual caso si stampa un errore (\texttt{\small 30}) e si
1350 ritorna (\texttt{\small 31}).
1351
1352 Completata con successo la connessione il passo successivo (\texttt{\small
1353   34--40}) è leggere la data dal socket; il protocollo prevede che il server
1354 invii sempre una stringa alfanumerica, il formato della stringa non è
1355 specificato dallo standard, per cui noi useremo il formato usato dalla
1356 funzione \func{ctime}, seguito dai caratteri di terminazione \verb|\r\n|, cioè
1357 qualcosa del tipo:
1358 \begin{verbatim}
1359 Wed Apr 4 00:53:00 2001\r\n
1360 \end{verbatim}
1361 questa viene letta dal socket (\texttt{\small 34}) con la funzione \func{read}
1362 in un buffer temporaneo; la stringa poi deve essere terminata (\texttt{\small
1363   35}) con il solito carattere nullo per poter essere stampata (\texttt{\small
1364   36}) sullo standard output con l'uso di \func{fputs}.
1365
1366 Come si è già spiegato in \secref{sec:sock_io_behav} la risposta dal socket
1367 potrà arrivare in un unico pacchetto di 26 byte (come avverrà senz'altro nel
1368 caso in questione) ma potrebbe anche arrivare in 26 pacchetti di un byte.  Per
1369 questo nel caso generale non si può mai assumere che tutti i dati arrivino con
1370 una singola lettura, pertanto quest'ultima deve essere effettuata in un ciclo
1371 in cui si continui a leggere fintanto che la funzione \func{read} non ritorni
1372 uno zero (che significa che l'altro capo ha chiuso la connessione) o un numero
1373 minore di zero (che significa un errore nella connessione).
1374
1375 Si noti come in questo caso la fine dei dati sia specificata dal server che
1376 chiude la connessione (anche questo è quanto richiesto dal protocollo); questa
1377 è una delle tecniche possibili (è quella usata pure dal protocollo HTTP), ma
1378 ce ne possono essere altre, ad esempio FTP marca la conclusione di un blocco
1379 di dati con la sequenza ASCII \verb|\r\n| (carriage return e line feed),
1380 mentre il DNS mette la lunghezza in testa ad ogni blocco che trasmette. Il
1381 punto essenziale è che TCP non provvede nessuna indicazione che permetta di
1382 marcare dei blocchi di dati, per cui se questo è necessario deve provvedere il
1383 programma stesso.
1384
1385 Se abilitiamo il servizio \textit{daytime}\footnote{in genere questo viene
1386   fornito direttamente dal \textsl{superdemone} \texttt{inetd}, pertanto basta
1387   assicurarsi che esso sia abilitato nel relativo file di configurazione.}
1388 possiamo verificare il funzionamento del nostro client, avremo allora:
1389 \begin{verbatim}
1390 [piccardi@gont sources]$ ./daytime 127.0.0.1
1391 Mon Apr 21 20:46:11 2003
1392 \end{verbatim}%$
1393 e come si vede tutto funziona regolarmente.
1394
1395
1396 \subsection{Un server \textit{daytime} iterativo}
1397 \label{sec:TCP_daytime_iter_server}
1398
1399 Dopo aver illustrato il client daremo anche un esempio di un server
1400 elementare, che sia anche in grado di rispondere al precedente client. Come
1401 primo esempio realizzeremo un server iterativo, in grado di fornire una sola
1402 risposta alla volta. Il codice del programma è nuovamente mostrato in
1403 \figref{fig:TCP_daytime_iter_server_code}, il sorgente completo
1404 (\file{TCP\_iter\_daytimed.c}) è allegato insieme agli altri file degli esempi.
1405
1406 \begin{figure}[!htbp]
1407   \footnotesize \centering
1408   \begin{minipage}[c]{15cm}
1409     \includecodesample{listati/TCP_iter_daytimed.c}
1410   \end{minipage} 
1411   \normalsize
1412   \caption{Esempio di codice di un semplice server per il servizio daytime.}
1413   \label{fig:TCP_daytime_iter_server_code}
1414 \end{figure}
1415
1416 Come per il client si includono (\texttt{\small 1--9}) gli header necessari a
1417 cui è aggiunto quello per trattare i tempi, e si definiscono (\texttt{\small
1418   14--18}) alcune costanti e le variabili necessarie in seguito. Come nel caso
1419 precedente si sono omesse le parti relative al trattamento delle opzioni da
1420 riga di comando.
1421
1422 La creazione del socket (\texttt{\small 20--24}) è analoga al caso precedente,
1423 come pure l'inizializzazione (\texttt{\small 25--29}) della struttura
1424 \struct{sockaddr\_in}.  Anche in questo caso (\texttt{\small 28}) si usa la
1425 porta standard del servizio daytime, ma come indirizzo IP si usa
1426 (\texttt{\small 27}) il valore predefinito \const{INET\_ANY}, che corrisponde
1427 all'indirizzo generico.
1428
1429 Si effettua poi (\texttt{\small 30--34}) la chiamata alla funzione \func{bind}
1430 che permette di associare la precedente struttura al socket, in modo che
1431 quest'ultimo possa essere usato per accettare connessioni su una qualunque
1432 delle interfacce di rete locali. In caso di errore si stampa (\texttt{\small
1433   31}) un messaggio, e si termina (\texttt{\small 32}) immediatamente il
1434 programma.
1435
1436 Il passo successivo (\texttt{\small 35--39}) è quello di mettere ``in
1437 ascolto'' il socket; questo viene fatto (\texttt{\small 36}) con la funzione
1438 \func{listen} che dice al kernel di accettare connessioni per il socket che
1439 abbiamo creato; la funzione indica inoltre, con il secondo parametro, il
1440 numero massimo di connessioni che il kernel accetterà di mettere in coda per
1441 il suddetto socket. Di nuovo in caso di errore si stampa (\texttt{\small 37})
1442 un messaggio, e si esce (\texttt{\small 38}) immediatamente.
1443
1444 La chiamata a \func{listen} completa la preparazione del socket per l'ascolto
1445 (che viene chiamato anche \textit{listening descriptor}) a questo punto si può
1446 procedere con il ciclo principale (\texttt{\small 40--53}) che viene eseguito
1447 indefinitamente. Il primo passo (\texttt{\small 42}) è porsi in attesa di
1448 connessioni con la chiamata alla funzione \func{accept}, come in precedenza in
1449 caso di errore si stampa (\texttt{\small 43}) un messaggio, e si esce
1450 (\texttt{\small 44}).
1451
1452 Il processo resterà in stato di \textit{sleep} fin quando non arriva e viene
1453 accettata una connessione da un client; quando questo avviene \func{accept}
1454 ritorna, restituendo un secondo descrittore, che viene chiamato
1455 \textit{connected descriptor}, e che è quello che verrà usato dalla successiva
1456 chiamata alla \func{write} per scrivere la risposta al client.
1457
1458 Il ciclo quindi proseguirà determinando (\texttt{\small 46}) il tempo corrente
1459 con una chiamata a \texttt{time}, con il quale si potrà opportunamente
1460 costruire (\texttt{\small 47}) la stringa con la data da trasmettere
1461 (\texttt{\small 48}) con la chiamata a \func{write}. Completata la
1462 trasmissione il nuovo socket viene chiuso (\texttt{\small 52}).  A questo
1463 punto il ciclo si chiude ricominciando da capo in modo da poter ripetere
1464 l'invio della data in risposta ad una successiva connessione.
1465
1466 È importante notare che questo server è estremamente elementare, infatti, a
1467 parte il fatto di poter essere usato solo con indirizzi IPv4, esso è in grado
1468 di rispondere ad un solo un client alla volta: è cioè, come dicevamo, un
1469 \textsl{server iterativo}. Inoltre è scritto per essere lanciato da linea di
1470 comando, se lo si volesse utilizzare come demone occorrerebbero le opportune
1471 modifiche\footnote{come una chiamata a \func{daemon} prima dell'inizio del
1472   ciclo principale.} per tener conto di quanto illustrato in
1473 \secref{sec:sess_daemon}. Si noti anche che non si è inserita nessuna forma di
1474 gestione della terminazione del processo, dato che tutti i file descriptor
1475 vengono chiusi automaticamente alla sua uscita, e che, non generando figli,
1476 non è necessario preoccuparsi di gestire la loro terminazione.
1477
1478
1479 \subsection{Un server \textit{daytime} concorrente}
1480 \label{sec:TCP_daytime_cunc_server}
1481
1482 Il server \texttt{daytime} dell'esempio in
1483 \secref{sec:TCP_daytime_iter_server} è un tipico esempio di server iterativo,
1484 in cui viene servita una richiesta alla volta; in generale però, specie se il
1485 servizio è più complesso e comporta uno scambio di dati più sostanzioso di
1486 quello in questione, non è opportuno bloccare un server nel servizio di un
1487 client per volta; per questo si ricorre alle capacità di multitasking del
1488 sistema.
1489
1490 Come accennato anche in \secref{sec:proc_gen} una delle modalità più comuni di
1491 funzionamento da parte dei server è quella di usare la funzione \func{fork}
1492 per creare, ad ogni richiesta da parte di un client, un processo figlio che si
1493 incarichi della gestione della comunicazione.  Si è allora riscritto il server
1494 \textit{daytime} dell'esempio precedente in forma concorrente, inserendo anche
1495 una opzione per la stampa degli indirizzi delle connessioni ricevute.
1496
1497 In \figref{fig:TCP_daytime_cunc_server_code} è mostrato un estratto del
1498 codice, in cui si sono tralasciati il trattamento delle opzioni e le parti
1499 rimaste invariate rispetto al precedente esempio (cioè tutta la parte
1500 riguardante l'apertura passiva del socket). Al solito il sorgente completo del
1501 server, nel file \file{TCP\_cunc\_daytimed.c}, è allegato insieme ai sorgenti
1502 degli altri esempi.
1503
1504 \begin{figure}[!htb]
1505   \footnotesize \centering
1506   \begin{minipage}[c]{15cm}
1507     \includecodesample{listati/TCP_cunc_daytimed.c}
1508   \end{minipage} 
1509   \normalsize
1510   \caption{Esempio di codice di un server concorrente elementare per il 
1511     servizio daytime.}
1512   \label{fig:TCP_daytime_cunc_server_code}
1513 \end{figure}
1514
1515 Stavolta (\texttt{\small 21--25}) la funzione \func{accept} è chiamata
1516 fornendo una struttura di indirizzi in cui saranno ritornati l'indirizzo IP e
1517 la porta da cui il client effettua la connessione, che in un secondo tempo,
1518 (\texttt{\small 39--43}), se il logging è abilitato, stamperemo sullo standard
1519 output.
1520
1521 Quando \func{accept} ritorna il server chiama la funzione \func{fork}
1522 (\texttt{\small 26--30}) per creare il processo figlio che effettuerà
1523 (\texttt{\small 31--45}) tutte le operazioni relative a quella connessione,
1524 mentre il padre proseguirà l'esecuzione del ciclo principale in attesa di
1525 ulteriori connessioni.
1526
1527 Si noti come il figlio operi solo sul socket connesso, chiudendo
1528 immediatamente (\texttt{\small 32}) il socket \var{list\_fd}; mentre il padre
1529 continua ad operare solo sul socket in ascolto chiudendo (\texttt{\small 47})
1530 \var{sock\_fd} al ritorno dalla \func{fork}. Per quanto abbiamo detto in
1531 \secref{sec:TCP_func_close} nessuna delle due chiamate a \func{close} causa
1532 l'innesco della sequenza di chiusura perché il numero di riferimenti al file
1533 descriptor non si è annullato.
1534
1535 Infatti subito dopo la creazione del socket \var{list\_fd} ha una referenza, e
1536 lo stesso vale per \var{sock\_fd} dopo il ritorno di \func{accept}, ma dopo la
1537 \func{fork} i descrittori vengono duplicati nel padre e nel figlio per cui
1538 entrambi i socket si trovano con due referenze. Questo fa si che quando il
1539 padre chiude \var{sock\_fd} esso resta con una referenza da parte del figlio,
1540 e sarà definitivamente chiuso solo quando quest'ultimo, dopo aver completato
1541 le sue operazioni, chiamerà (\texttt{\small 44}) la funzione \func{close}.
1542
1543 In realtà per il figlio non sarebbe necessaria nessuna chiamata a
1544 \func{close}, in quanto con la \func{exit} finale (\texttt{\small 45}) tutti i
1545 file descriptor, quindi anche quelli associati ai socket, vengono
1546 automaticamente chiusi.  Tuttavia si è preferito effettuare esplicitamente le
1547 chiusure per avere una maggiore chiarezza del codice, e per evitare eventuali
1548 errori, prevenendo ad esempio un uso involontario del \textit{listening
1549   descriptor}.
1550
1551 Si noti invece come sia essenziale che il padre chiuda ogni volta il socket
1552 connesso dopo la \func{fork}; se così non fosse nessuno di questi socket
1553 sarebbe effettivamente chiuso dato che alla chiusura da parte del figlio
1554 resterebbe ancora un riferimento nel padre. Si avrebbero così due effetti: il
1555 padre potrebbe esaurire i descrittori disponibili (che sono un numero limitato
1556 per ogni processo) e soprattutto nessuna delle connessioni con i client
1557 verrebbe chiusa.
1558
1559 Come per ogni server iterativo il lavoro di risposta viene eseguito
1560 interamente dal processo figlio. Questo si incarica (\texttt{\small 33}) di
1561 chiamare \func{time} per leggere il tempo corrente, e di stamparlo
1562 (\texttt{\small 34}) sulla stringa contenuta in \var{buffer} con l'uso di
1563 \func{snprintf} e \func{ctime}. Poi la stringa viene scritta (\texttt{\small
1564   35--38}) sul socket, controllando che non ci siano errori. Anche in questo
1565 caso si è evitato il ricorso a \func{FullWrite} in quanto la stringa è
1566 estremamente breve e verrà senz'altro scritta in un singolo segmento.
1567
1568 Inoltre nel caso sia stato abilitato il \textit{logging} delle connessioni, si
1569 provvede anche (\texttt{\small 39--42}) a stampare sullo standard output
1570 l'indirizzo e la porta da cui il client ha effettuato la connessione, usando
1571 i valori contenuti nelle strutture restituite da \func{accept}, eseguendo le
1572 opportune conversioni con \func{inet\_ntop} e \func{atohs}.
1573
1574 Ancora una volta l'esempio è estremamente semplificato, si noti come di nuovo
1575 non si sia gestita né la terminazione del processo né il suo uso come demone,
1576 che tra l'altro sarebbe stato incompatibile con l'uso della opzione di logging
1577 che stampa gli indirizzi delle connessioni sullo standard output. Un altro
1578 aspetto tralasciato è la gestione della terminazione dei processi figli,
1579 torneremo su questo più avanti quando tratteremo alcuni esempi di server più
1580 complessi.
1581
1582
1583
1584 \section{Un esempio più completo: il servizio \textit{echo}}
1585 \label{sec:TCP_echo_application}
1586
1587 L'esempio precedente, basato sul servizio \textit{daytime}, è un esempio molto
1588 elementare, in cui il flusso dei dati va solo nella direzione dal server al
1589 client. In questa sezione esamineremo un esempio di applicazione client/server
1590 un po' più complessa, che usi i socket TCP per una comunicazione in entrambe
1591 le direzioni.
1592
1593 Ci limiteremo a fornire una implementazione elementare, che usi solo le
1594 funzioni di base viste finora, ma prenderemo in esame, oltre al comportamento
1595 in condizioni normali, anche tutti i possibili scenari particolari (errori,
1596 sconnessione della rete, crash del client o del server durante la connessione)
1597 che possono avere luogo durante l'impiego di un'applicazione di rete, partendo
1598 da una versione primitiva che dovrà essere rimaneggiata di volta in volta per
1599 poter tenere conto di tutte le evenienze che si possono manifestare nella vita
1600 reale di un'applicazione di rete, fino ad arrivare ad un'implementazione
1601 completa.
1602
1603
1604 \subsection{Il servizio \textit{echo}}
1605 \label{sec:TCP_echo}
1606
1607
1608 Nella ricerca di un servizio che potesse fare da esempio per una comunicazione
1609 bidirezionale, si è deciso, seguendo la scelta di Stevens in \cite{UNP1}, di
1610 usare il servizio \textit{echo}, che si limita a restituire in uscita quanto
1611 immesso in ingresso. Infatti, nonostante la sua estrema semplicità, questo
1612 servizio costituisce il prototipo ideale per una generica applicazione di rete
1613 in cui un server risponde alle richieste di un client.  Nel caso di una
1614 applicazione più complessa quello che si potrà avere in più è una elaborazione
1615 dell'input del client, che in molti casi viene interpretato come un comando,
1616 da parte di un server che risponde fornendo altri dati in uscita.
1617
1618 Il servizio \textit{echo} è uno dei servizi standard solitamente provvisti
1619 direttamente dal superserver \cmd{inetd}, ed è definito
1620 dall'\href{http://www.ietf.org/rfc/rfc0862.txt}{RFC~862}. Come dice il nome il
1621 servizio deve riscrivere indietro sul socket i dati che gli vengono inviati in
1622 ingresso. L'RFC descrive le specifiche del servizio sia per TCP che UDP, e per
1623 il primo stabilisce che una volta stabilita la connessione ogni dato in
1624 ingresso deve essere rimandato in uscita fintanto che il chiamante non ha
1625 chiude la connessione. Al servizio è assegnata la porta riservata 7.
1626
1627 Nel nostro caso l'esempio sarà costituito da un client che legge una linea di
1628 caratteri dallo standard input e la scrive sul server. A sua volta il server
1629 leggerà la linea dalla connessione e la riscriverà immutata all'indietro. Sarà
1630 compito del client leggere la risposta del server e stamparla sullo standard
1631 output.
1632
1633
1634 \subsection{Il client: prima versione}
1635 \label{sec:TCP_echo_client}
1636
1637 Il codice della prima versione del client per il servizio \textit{echo},
1638 disponibile nel file \file{TCP\_echo1.c}, è riportato in
1639 \figref{fig:TCP_echo_client_1}. Esso ricalca la struttura del precedente
1640 client per il servizio \textit{daytime} (vedi
1641 \secref{sec:TCP_daytime_client}), e la prima parte (\texttt{\small 10--27}) è
1642 sostanzialmente identica, a parte l'uso di una porta diversa.
1643
1644 \begin{figure}[!htb]
1645   \footnotesize \centering
1646   \begin{minipage}[c]{15.6 cm}
1647     \includecodesample{listati/TCP_echo1.c}
1648   \end{minipage} 
1649   \normalsize
1650   \caption{Codice della prima versione del client \textit{echo}.}
1651   \label{fig:TCP_echo_client_1}
1652 \end{figure}
1653
1654 Al solito si è tralasciata la sezione relativa alla gestione delle opzioni a
1655 riga di comando.  Una volta dichiarate le variabili, si prosegue
1656 (\texttt{\small 10--13}) con della creazione del socket con l'usuale controllo
1657 degli errori, alla preparazione (\texttt{\small 14--17}) della struttura
1658 dell'indirizzo, che stavolta usa la porta 7 riservata al servizio
1659 \textit{echo}, infine si converte (\texttt{\small 18--22}) l'indirizzo
1660 specificato a riga di comando.  A questo punto (\texttt{\small 23--27}) si può
1661 eseguire la connessione al server secondo la stessa modalità usata in
1662 \secref{sec:TCP_daytime_client}.
1663
1664 Completata la connessione, per gestire il funzionamento del protocollo si usa
1665 la funzione \code{ClientEcho}, il cui codice si è riportato a parte in
1666 \figref{fig:TCP_client_echo_sub}. Questa si preoccupa di gestire tutta la
1667 comunicazione, leggendo una riga alla volta dallo standard input \file{stdin},
1668 scrivendola sul socket e ristampando su \file{stdout} quanto ricevuto in
1669 risposta dal server. Al ritorno dalla funzione (\texttt{\small 30--31}) anche
1670 il programma termina.
1671
1672 La funzione \code{ClientEcho} utilizza due buffer (\texttt{\small 3}) per
1673 gestire i dati inviati e letti sul socket.  La comunicazione viene gestita
1674 all'interno di un ciclo (\texttt{\small 5--10}), i dati da inviare sulla
1675 connessione vengono presi dallo \file{stdin} usando la funzione \func{fgets},
1676 che legge una linea di testo (terminata da un \texttt{CR} e fino al massimo di
1677 \const{MAXLINE} caratteri) e la salva sul buffer di invio.
1678
1679 Si usa poi (\texttt{\small 6}) la funzione \func{FullWrite}, vista in
1680 \secref{sec:sock_io_behav}, per scrivere i dati sul socket, gestendo
1681 automaticamente l'invio multiplo qualora una singola \func{write} non sia
1682 sufficiente.  I dati vengono riletti indietro (\texttt{\small 7}) con una
1683 \func{FullRead} sul buffer di ricezione e viene inserita (\texttt{\small 8})
1684 la terminazione della stringa e per poter usare (\texttt{\small 9}) la
1685 funzione \func{fputs} per scriverli su \file{stdout}.
1686
1687 \begin{figure}[!htb]
1688   \footnotesize \centering
1689   \begin{minipage}[c]{15.6cm}
1690     \includecodesample{listati/ClientEcho.c}
1691   \end{minipage} 
1692   \normalsize
1693   \caption{Codice della prima versione della funzione \texttt{ClientEcho} per 
1694     la gestione del servizio \textit{echo}.}
1695   \label{fig:TCP_client_echo_sub}
1696 \end{figure}
1697
1698 Quando si concluderà l'invio di dati mandando un end-of-file sullo standard
1699 input si avrà il ritorno di \func{fgets} con un puntatore nullo (si riveda
1700 quanto spiegato in \secref{sec:file_line_io}) e la conseguente uscita dal
1701 ciclo; al che la subroutine ritorna ed il nostro programma client termina.
1702
1703 Si può effettuare una verifica del funzionamento del client abilitando il
1704 servizio \textit{echo} nella configurazione di \cmd{initd} sulla propria
1705 macchina ed usandolo direttamente verso di esso in locale, vedremo in
1706 dettaglio più avanti (in \secref{sec:TCP_echo_startup}) il funzionamento del
1707 programma, usato però con la nostra versione del server \textit{echo}, che
1708 illustriamo immediatamente.
1709
1710
1711 \subsection{Il server: prima versione}
1712 \label{sec:TCPsimp_server_main}
1713
1714 La prima versione del server, contenuta nel file \file{TCP\_echod\_first.c}, è
1715 riportata in \figref{fig:TCP_echo_server_first_code}. Come abbiamo fatto per
1716 il client anche il server è stato diviso in un corpo principale, costituito
1717 dalla funzione \code{main}, che è molto simile a quello visto nel precedente
1718 esempio per il server del servizio \textit{daytime} di
1719 \secref{sec:TCP_daytime_cunc_server}, e da una funzione ausiliaria
1720 \code{ServEcho} che si cura della gestione del servizio.
1721
1722 \begin{figure}[!htbp]
1723   \footnotesize \centering
1724   \begin{minipage}[c]{15.6cm}
1725     \includecodesample{listati/TCP_echod_first.c}
1726   \end{minipage} 
1727   \normalsize
1728   \caption{Codice del corpo principale della prima versione del server
1729     per il servizio \textit{echo}.}
1730   \label{fig:TCP_echo_server_first_code}
1731 \end{figure}
1732
1733 In questo caso però, rispetto a quanto visto nell'esempio di
1734 \figref{fig:TCP_daytime_cunc_server_code} si è preferito scrivere il server
1735 curando maggiormente alcuni dettagli, per tenere conto anche di alcune
1736 esigenze generali (che non riguardano direttamente la rete), come la
1737 possibilità di lanciare il server anche in modalità interattiva e la cessione
1738 dei privilegi di amministratore non appena questi non sono più necessari.
1739
1740 La sezione iniziale del programma (\texttt{\small 8--21}) è la stessa del
1741 server di \secref{sec:TCP_daytime_cunc_server}, ed ivi descritta in dettaglio:
1742 crea il socket, inizializza l'indirizzo e esegue \func{bind}; dato che
1743 quest'ultima funzione viene usata su una porta riservata, il server dovrà
1744 essere eseguito da un processo con i privilegi di amministratore, pena il
1745 fallimento della chiamata.
1746
1747 Una volta eseguita la funzione \func{bind} però i privilegi di amministratore
1748 non sono più necessari, per questo è sempre opportuno rilasciarli, in modo da
1749 evitare problemi in caso di eventuali vulnerabilità del server.  Per questo
1750 prima (\texttt{\small 22--26}) si esegue \func{setgid} per assegnare il
1751 processo ad un gruppo senza privilegi,\footnote{si è usato il valore 65534,
1752   ovvero -1 per il formato \ctyp{short}, che di norma in tutte le
1753   distribuzioni viene usato per identificare il gruppo \texttt{nogroup} e
1754   l'utente \texttt{nobody}, usati appunto per eseguire programmi che non
1755   richiedono nessun privilegio particolare.} e poi si ripete (\texttt{\small
1756   27--30}) l'operazione usando \func{setuid} per cambiare anche
1757 l'utente.\footnote{si tenga presente che l'ordine in cui si eseguono queste
1758   due operazioni è importante, infatti solo avendo i privilegi di
1759   amministratore si può cambiare il gruppo di un processo ad un'altro di cui
1760   non si fa parte, per cui chiamare prima \func{setuid} farebbe fallire una
1761   successiva chiamata a \func{setgid}.  Inoltre si ricordi (si riveda quanto
1762   esposto in \secref{sec:proc_perms}) che usando queste due funzioni il
1763   rilascio dei privilegi è irreversibile.}  Infine (\texttt{\small 30--36}),
1764 qualora sia impostata la variabile \var{demonize}, prima (\texttt{\small 31})
1765 si apre il sistema di logging per la stampa degli errori, e poi
1766 (\texttt{\small 32--35}) si invoca \func{daemon} per eseguire in background il
1767 processo come demone.
1768
1769 A questo punto il programma riprende di nuovo lo schema già visto usato dal
1770 server per il servizio \textit{daytime}, con l'unica differenza della chiamata
1771 alla funzione \code{PrintErr}, riportata in \figref{fig:TCP_PrintErr}, al
1772 posto di \func{perror} per la stampa degli errori. 
1773
1774 Si inizia con il porre (\texttt{\small 37--41}) in ascolto il socket, e poi si
1775 esegue indefinitamente il ciclo principale (\texttt{\small 42--58}).
1776 All'interno di questo si ricevono (\texttt{\small 43--46}) le connessioni,
1777 creando (\texttt{\small 47--50}) un processo figlio per ciascuna di esse.
1778 Quest'ultimo (\texttt{\small 51--55}), chiuso (\texttt{\small 52}) il
1779 \textit{listening socket}, esegue (\texttt{\small 53}) la funzione di gestione
1780 del servizio \code{ServEcho}, ed al ritorno di questa (\texttt{\small 54})
1781 esce.
1782
1783 Il padre invece si limita (\texttt{\small 56}) a chiudere il \textit{connected
1784   socket} per ricominciare da capo il ciclo in attesa di nuove connessioni. In
1785 questo modo si ha un server concorrente. La terminazione del padre non è
1786 gestita esplicitamente, e deve essere effettuata inviando un segnale al
1787 processo.
1788
1789 Avendo trattato direttamente la gestione del programma come demone, si è
1790 dovuto anche provvedere alla necessità di poter stampare eventuali messaggi di
1791 errore attraverso il sistema del \textit{syslog} trattato in
1792 \secref{sec:sess_daemon}. Come accennato questo è stato fatto utilizzando come
1793 \textit{wrapper} la funzione \code{PrintErr}, il cui codice è riportato in
1794 \figref{fig:TCP_PrintErr}. 
1795
1796 In essa ci si limita a controllare se è stato impostato (valore attivo per
1797 default) l'uso come demone, nel qual caso (\texttt{\small 3}) si usa
1798 \func{syslog} per stampare il messaggio di errore fornito come argomento sui
1799 log di sistema. Se invece si è in modalità interattiva (attivabile con
1800 l'opzione \texttt{-i}) si usa semplicemente la funzione \func{perror} per
1801 stampare sullo standard error.
1802
1803
1804 \begin{figure}[!htb]
1805   \footnotesize \centering
1806   \begin{minipage}[c]{15.6cm}
1807     \includecodesample{listati/PrintErr.c}
1808   \end{minipage} 
1809   \normalsize
1810   \caption{Codice della funzione \code{PrintErr} per la
1811     generalizzazione della stampa degli errori sullo standard input o
1812     attraverso il \texttt{syslog}.}
1813   \label{fig:TCP_PrintErr}
1814 \end{figure}
1815
1816 La gestione del servizio \textit{echo} viene effettuata interamente nella
1817 funzione \code{ServEcho}, il cui codice è mostrato in
1818 \figref{fig:TCP_ServEcho}, la comunicazione viene gestita all'interno del
1819 ciclo (\texttt{\small 6--8}).  I dati inviati dal client vengono letti dal
1820 socket con una semplice \func{read} (che ritorna solo in presenza di dati in
1821 arrivo), la riscrittura viene invece gestita dalla funzione \func{FullWrite}
1822 (descritta in \figref{fig:sock_FullWrite_code}) che si incarica di tenere
1823 conto automaticamente della possibilità che non tutti i dati di cui è
1824 richiesta la scrittura vengano trasmessi con una singola \func{write}.
1825
1826 \begin{figure}[!htb] 
1827   \footnotesize \centering
1828   \begin{minipage}[c]{15.6cm}
1829     \includecodesample{listati/ServEcho.c}
1830   \end{minipage} 
1831   \normalsize
1832   \caption{Codice della prima versione della funzione \code{ServEcho} per la
1833     gestione del servizio \textit{echo}.}
1834   \label{fig:TCP_ServEcho}
1835 \end{figure}
1836
1837 Nella funzione si è anche inserita la possibilità (\texttt{\small 7--14}) di
1838 inviare dei messaggi di debug (abilitabile con l'uso dell'opzione \texttt{-d}
1839 che imposta opportunamente \var{debugging}), gestendo entrambi i casi in cui
1840 la stampa deve essere effettuata tramite \func{syslog} (\texttt{\small 11}) o
1841 direttamente sullo standard output (\texttt{\small 13}).
1842
1843 Quando il client chiude la connessione il ricevimento del FIN fa ritornare la
1844 \func{read} con un numero di byte letti pari a zero, il che causa l'uscita dal
1845 ciclo e il ritorno della funzione, che a sua volta causa la terminazione del
1846 processo figlio.
1847
1848
1849 \subsection{L'avvio e il funzionamento normale}
1850 \label{sec:TCP_echo_startup}
1851
1852 Benché il codice dell'esempio precedente sia molto ridotto, esso ci permetterà
1853 di considerare in dettaglio tutte le problematiche che si possono incontrare
1854 nello scrivere un'applicazione di rete. Infatti attraverso l'esame delle sue
1855 modalità di funzionamento normali, all'avvio e alla terminazione, e di quello
1856 che avviene nelle varie situazioni limite, da una parte potremo approfondire
1857 la comprensione del protocollo TCP/IP e dall'altra ricavare le indicazioni
1858 necessarie per essere in grado di scrivere applicazioni robuste, in grado di
1859 gestire anche i casi limite.
1860
1861 Il primo passo è compilare e lanciare il server (da root, per poter usare la
1862 porta 7 che è riservata), alla partenza esso eseguirà l'apertura passiva con
1863 la sequenza delle chiamate a \func{socket}, \func{bind}, \func{listen} e poi
1864 si bloccherà nella \func{accept}. A questo punto si potrà controllarne lo
1865 stato con \cmd{netstat}:
1866 \begin{verbatim}
1867 [piccardi@roke piccardi]$ netstat -at
1868 Active Internet connections (servers and established)
1869 Proto Recv-Q Send-Q Local Address           Foreign Address         State 
1870 ...
1871 tcp        0      0 *:echo                  *:*                     LISTEN
1872 ...
1873 \end{verbatim} %$
1874 che ci mostra come il socket sia in ascolto sulla porta richiesta, accettando
1875 connessioni da qualunque indirizzo e da qualunque porta e su qualunque
1876 interfaccia locale.
1877
1878 A questo punto si può lanciare il client, esso chiamerà \func{socket} e
1879 \func{connect}; una volta completato il three way handshake la connessione è
1880 stabilita; la \func{connect} ritornerà nel client\footnote{si noti che è
1881   sempre la \func{connect} del client a ritornare per prima, in quanto
1882   questo avviene alla ricezione del secondo segmento (l'ACK del server) del
1883   three way handshake, la \func{accept} del server ritorna solo dopo
1884   un altro mezzo RTT quando il terzo segmento (l'ACK del client) viene
1885   ricevuto.} e la \func{accept} nel server, ed usando di nuovo
1886 \cmd{netstat} otterremmo che:
1887 \begin{verbatim}
1888 Active Internet connections (servers and established)
1889 Proto Recv-Q Send-Q Local Address           Foreign Address         State
1890 tcp        0      0 *:echo                  *:*                     LISTEN
1891 tcp        0      0 roke:echo               gont:32981              ESTABLISHED
1892 \end{verbatim}
1893 mentre per quanto riguarda l'esecuzione dei programmi avremo che:
1894 \begin{itemize}
1895 \item il client chiama la funzione \code{ClientEcho} che si blocca sulla
1896   \func{fgets} dato che non si è ancora scritto nulla sul terminale.
1897 \item il server eseguirà una \func{fork} facendo chiamare al processo figlio
1898   la funzione \code{ServEcho}, quest'ultima si bloccherà sulla \func{read}
1899   dal socket sul quale ancora non sono presenti dati.
1900 \item il processo padre del server chiamerà di nuovo \func{accept}
1901   bloccandosi fino all'arrivo di un'altra connessione.
1902 \end{itemize}
1903 e se usiamo il comando \cmd{ps} per esaminare lo stato dei processi otterremo
1904 un risultato del tipo:
1905 \begin{verbatim}
1906 [piccardi@roke piccardi]$ ps ax
1907   PID TTY      STAT   TIME COMMAND
1908  ...  ...      ...    ...  ...
1909  2356 pts/0    S      0:00 ./echod
1910  2358 pts/1    S      0:00 ./echo 127.0.0.1
1911  2359 pts/0    S      0:00 ./echod
1912 \end{verbatim} %$
1913 (dove si sono cancellate le righe inutili) da cui si evidenzia la presenza di
1914 tre processi, tutti in stato di \textit{sleep} (vedi
1915 \tabref{tab:proc_proc_states}).
1916
1917 Se a questo punto si inizia a scrivere qualcosa sul client non sarà trasmesso
1918 niente fin tanto che non si prema il tasto di a capo (si ricordi quanto detto
1919 in \secref{sec:file_line_io} a proposito dell'I/O su terminale), solo allora
1920 \func{fgets} ritornerà ed il client scriverà quanto immesso sul socket, per
1921 poi passare a rileggere quanto gli viene inviato all'indietro dal server, che
1922 a sua volta sarà inviato sullo standard output, che nel caso ne provoca
1923 l'immediatamente stampa a video.
1924
1925
1926 \subsection{La conclusione normale}
1927 \label{sec:TCP_echo_conclusion}
1928
1929 Tutto quello che scriveremo sul client sarà rimandato indietro dal server e
1930 ristampato a video fintanto che non concluderemo l'immissione dei dati; una
1931 sessione tipica sarà allora del tipo: 
1932 \begin{verbatim}
1933 [piccardi@roke sources]$ ./echo 127.0.0.1
1934 Questa e` una prova
1935 Questa e` una prova
1936 Ho finito
1937 Ho finito
1938 \end{verbatim} %$
1939 che termineremo inviando un EOF dal terminale (usando la combinazione di tasti
1940 ctrl-D, che non compare a schermo); se eseguiamo un \cmd{netstat} a questo
1941 punto avremo:
1942 \begin{verbatim}
1943 [piccardi@roke piccardi]$ netstat -at 
1944 tcp        0      0 *:echo                  *:*                     LISTEN
1945 tcp        0      0 localhost:33032         localhost:echo          TIME_WAIT
1946 \end{verbatim} %$
1947 con il client che entra in \texttt{TIME\_WAIT}.
1948
1949 Esaminiamo allora in dettaglio la sequenza di eventi che porta alla
1950 terminazione normale della connessione, che ci servirà poi da riferimento
1951 quando affronteremo il comportamento in caso di conclusioni anomale:
1952
1953 \begin{enumerate}
1954 \item inviando un carattere di EOF da terminale la \func{fgets} ritorna
1955   restituendo un puntatore nullo che causa l'uscita dal ciclo di
1956   \code{while}, così la \code{ClientEcho} ritorna.
1957 \item al ritorno di \code{ClientEcho} ritorna anche la funzione \code{main}, e
1958   come parte del processo terminazione tutti i file descriptor vengono chiusi
1959   (si ricordi quanto detto in \secref{sec:proc_term_conclusion}); questo causa
1960   la chiusura del socket di comunicazione; il client allora invierà un FIN al
1961   server a cui questo risponderà con un ACK.  A questo punto il client verrà a
1962   trovarsi nello stato \texttt{FIN\_WAIT\_2} ed il server nello stato
1963   \texttt{CLOSE\_WAIT} (si riveda quanto spiegato in
1964   \secref{sec:TCP_conn_term}).
1965 \item quando il server riceve il FIN la \func{read} del processo figlio che
1966   gestisce la connessione ritorna restituendo 0 causando così l'uscita dal
1967   ciclo e il ritorno di \code{ServEcho}, a questo punto il processo figlio
1968   termina chiamando \func{exit}.
1969 \item all'uscita del figlio tutti i file descriptor vengono chiusi, la
1970   chiusura del socket connesso fa sì che venga effettuata la sequenza finale
1971   di chiusura della connessione, viene emesso un FIN dal server che riceverà
1972   un ACK dal client, a questo punto la connessione è conclusa e il client
1973   resta nello stato \texttt{TIME\_WAIT}.
1974 \end{enumerate}
1975
1976
1977 \subsection{La gestione dei processi figli}
1978 \label{sec:TCP_child_hand}
1979
1980 Tutto questo riguarda la connessione, c'è però da tenere conto dell'effetto
1981 del procedimento di chiusura del processo figlio nel server (si veda quanto
1982 esaminato in \secref{sec:proc_termination}). In questo caso avremo l'invio del
1983 segnale \const{SIGCHLD} al padre, ma dato che non si è installato un
1984 gestore e che l'azione predefinita per questo segnale è quella di essere
1985 ignorato, non avendo predisposto la ricezione dello stato di terminazione,
1986 otterremo che il processo figlio entrerà nello stato di zombie\index{zombie}
1987 (si riveda quanto illustrato in \secref{sec:sig_sigchld}), come risulterà
1988 ripetendo il comando \cmd{ps}:
1989 \begin{verbatim}
1990  2356 pts/0    S      0:00 ./echod
1991  2359 pts/0    Z      0:00 [echod <defunct>]
1992 \end{verbatim}
1993
1994 Dato che non è il caso di lasciare processi zombie\index{zombie}, occorrerà
1995 ricevere opportunamente lo stato di terminazione del processo (si veda
1996 \secref{sec:proc_wait}), cosa che faremo utilizzando \const{SIGCHLD} secondo
1997 quanto illustrato in \secref{sec:sig_sigchld}. Una prima modifica al nostro
1998 server è pertanto quella di inserire la gestione della terminazione dei
1999 processi figli attraverso l'uso di un gestore.  Per questo useremo la funzione
2000 \code{Signal} (che abbiamo illustrato in \figref{fig:sig_Signal_code}), per
2001 installare il gestore che riceve i segnali dei processi figli terminati già
2002 visto in \figref{fig:sig_sigchld_handl}.  Basterà allora aggiungere il
2003 seguente codice: \includecodesnip{listati/sigchildhand.c}
2004 \noindent
2005 all'esempio illustrato in \figref{fig:TCP_echo_server_first_code}.
2006
2007 In questo modo però si introduce un altro problema, si ricordi infatti che,
2008 come spiegato in \secref{sec:sig_gen_beha}, quando un programma si trova in
2009 stato di \texttt{sleep} durante l'esecuzione di una system call, questa viene
2010 interrotta alla ricezione di un segnale. Per questo motivo, alla fine
2011 dell'esecuzione del gestore del segnale, se questo ritorna, il programma
2012 riprenderà l'esecuzione ritornando dalla system call con un errore di
2013 \errcode{EINTR}.
2014
2015 Vediamo allora cosa comporta tutto questo nel nostro caso: quando si chiude il
2016 client, il processo figlio che gestisce la connessione terminerà, ed il padre,
2017 per evitare la creazione di zombie, riceverà il segnale \const{SIGCHLD}
2018 eseguendo il relativo gestore. Al ritorno del gestore però l'esecuzione nel
2019 padre ripartirà subito con il ritorno della funzione \func{accept} (a meno di
2020 un caso fortuito in cui il segnale arriva durante l'esecuzione del programma
2021 in risposta ad una connessione) con un errore di \errcode{EINTR}. Non avendo
2022 previsto questa eventualità il programma considera questo un errore fatale
2023 terminando a sua volta con un messaggio del tipo:
2024 \begin{verbatim}
2025 [root@gont sources]# ./echod -i
2026 accept error: Interrupted system call
2027 \end{verbatim}%#
2028
2029
2030 Come accennato in \secref{sec:sig_gen_beha} le conseguenze di questo
2031 comportamento delle system call possono essere superate in due modi diversi,
2032 il più semplice è quello di modificare il codice di \func{Signal} per
2033 richiedere il riavvio automatico delle system call interrotte secondo la
2034 semantica di BSD, usando l'opzione \const{SA\_RESTART} di \func{sigaction};
2035 rispetto a quanto visto in \figref{fig:sig_Signal_code}. Definiremo allora la
2036 nuova funzione \func{SignalRestart} come mostrato in
2037 \figref{fig:sig_SignalRestart_code}, ed installeremo il gestore usando
2038 quest'ultima.
2039
2040 \begin{figure}[!htb]
2041   \footnotesize  \centering
2042   \begin{minipage}[c]{15.6cm}
2043     \includecodesample{listati/SignalRestart.c}
2044   \end{minipage}  
2045   \normalsize 
2046   \caption{La funzione \funcd{SignalRestart}, che installa un gestore di
2047     segnali in semantica BSD per il riavvio automatico delle system call
2048     interrotte.}
2049   \label{fig:sig_SignalRestart_code}
2050 \end{figure}
2051
2052 Come si può notare questa funzione è identica alla precedente \func{Signal},
2053 solo che in questo caso invece di inizializzare a zero il campo
2054 \var{sa\_flags} di \struct{sigaction}, lo si inizializza (\texttt{\small 5})
2055 al valore \const{SA\_RESTART}. Usando questa funzione al posto di
2056 \func{Signal} nel server non è necessaria nessuna altra modifica: le system
2057 call interrotte saranno automaticamente riavviate, e l'errore \errcode{EINTR}
2058 non si manifesterà più.
2059
2060 La seconda soluzione è più invasiva e richiede di controllare tutte le volte
2061 l'errore restituito dalle varie system call, ripetendo la chiamata qualora
2062 questo corrisponda ad \errcode{EINTR}. Questa soluzione ha però il pregio
2063 della portabilità, infatti lo standard POSIX dice che la funzionalità di
2064 riavvio automatico delle system call, fornita da \const{SA\_RESTART}, è
2065 opzionale, per cui non è detto che essa sia disponibile su qualunque sistema.
2066 Inoltre in certi casi,\footnote{Stevens in \cite{UNP1} accenna che la maggior
2067   parte degli Unix derivati da BSD non fanno ripartire \func{select}, ed
2068   alcuni non fanno ripartire neanche \func{accept} e \func{recvfrom}; nel caso
2069   di Linux questa è disponibile.} anche quando questa è presente, non è detto
2070 possa essere usata con \func{accept}. La portabilità però viene al costo di
2071 una riscrittura parziale del server, secondo quanto mostrato in
2072 \figref{fig:TCP_echo_server_code}.
2073
2074 \begin{figure}[!htbp]
2075   \footnotesize \centering
2076   \begin{minipage}[c]{15.6cm}
2077     \includecodesample{listati/TCP_echod.c}
2078   \end{minipage} 
2079   \normalsize
2080   \caption{Codice del corpo principale della seconda versione del server
2081     per il servizio \textit{echo}.}
2082   \label{fig:TCP_echo_server_code}
2083 \end{figure}
2084
2085 In realtà l'unica chiamata critica che può essere interrotta nel server è
2086 quella ad \func{accept}, dato che questa è l'unica che può mettere il processo
2087 padre in stato di sleep.\footnote{si noti infatti che le altre \textit{slow
2088     system call} o sono chiamate prima di entrare nel ciclo principale, quando
2089   ancora non esistono processi figli, o sono chiamate dai figli stessi.}  Per
2090 questo l'unica modifica nella nuova versione del server, rispetto alla
2091 versione precedente vista in \figref{fig:TCP_ServEcho}, è nella sezione
2092 (\texttt{\small 43--48}) in cui si effettua la chiamata di \func{accept}.
2093 Quest'ultima allora viene effettuata (\texttt{\small 43--44}) all'interno di
2094 un ciclo di \code{while}\footnote{la sintassi del C relativa a questo ciclo
2095   può non essere del tutto chiara. In questo caso infatti si è usato un ciclo
2096   vuoto che non esegue nessuna istruzione, in questo modo quello che viene
2097   ripetuto con il ciclo è soltanto il codice che esprime la condizione
2098   all'interno del \code{while}.}  che la ripete indefinitamente qualora in
2099 caso di errore il valore di \var{errno} sia \errcode{EINTR}. Negli altri casi
2100 si esce in caso di errore effettivo (\texttt{\small 45--48}), altrimenti il
2101 programma prosegue esattamente allo stesso modo del precedente.
2102
2103
2104
2105
2106 \section{I vari scenari critici}
2107 \label{sec:TCP_echo_critical}
2108
2109 Con le modifiche viste in \secref{sec:TCP_child_hand} il nostro esempio
2110 diventa in grado di affrontare la gestione ordinaria delle connessioni, ma un
2111 server di rete deve tenere conto che, al contrario di quanto avviene per i
2112 server che operano nei confronti di processi presenti sulla stessa macchina,
2113 la rete è di sua natura inaffidabile, per cui è necessario essere in grado di
2114 gestire tutta una serie di situazioni critiche che non esistono per i processi
2115 locali.
2116
2117 La prima situazione critica è quella della terminazione precoce, per via di un
2118 qualche errore di rete, della connessione effettuata da un client. Come
2119 accennato in \secref{sec:TCP_func_accept} la funzione \func{accept} riporta
2120 tutti gli eventuali errori di rete pendenti su una connessione sul
2121 \textit{connected socket}. 
2122
2123 Questo significa che, oltre alla interruzione da parte di un segnale, che
2124 abbiamo trattato in \secref{sec:TCP_child_hand} nel caso particolare di
2125 \const{SIGCHLD}, si possono avere altri errori non fatali all'uscita di
2126 \func{accept}, che necessitano semplicemente la ripetizione della chiamata
2127 senza che si debba uscire dal programma. Uno scenario tipo è quello mostrato
2128 in \figref{fig:TCP_early_abort}, in cui la connessione viene abortita sul lato
2129 client con l'invio di un segmento RST, prima che nel server sia stata chiamata
2130 la funzione \func{accept}.
2131
2132 \begin{figure}[htb]
2133   \centering
2134   \includegraphics[width=10cm]{img/tcp_client_early_abort}  
2135   \caption{Un possibile caso di terminazione precoce della connessione.}
2136   \label{fig:TCP_early_abort}
2137 \end{figure}
2138
2139 Benché questo non sia un fatto comune un evento simile può essere osservato
2140 con dei server molto occupati. In tal caso, in una struttura del server simile
2141 a quella del nostro esempio, in cui la gestione delle singole connessioni è
2142 demandata a processi figli, può accadere che il three way handshake venga
2143 completato e la relativa connessione abortita subito dopo, prima che il padre,
2144 per via del carico della macchina abbia fatto in tempo a rieseguire la
2145 chiamata \func{accept}. In questo caso si ha una situazione analoga a quella
2146 illustrata in \figref{fig:TCP_early_abort}, la connessione viene stabilita, ma
2147 subito dopo si ha una condizione 
2148
2149
2150 che, come nell'esempio in figura, ritornerebbe
2151 immediatamente con un errore relativo alla connessione abortita.
2152
2153
2154 Si tenga presente che questo tipo di terminazione non è riproducibile
2155 terminando il client prima della chiamata ad \func{accept}; in tal caso
2156 infatti il socket associato alla connessione viene semplicemente chiuso,
2157 attraverso la sequenza vista in \secref{sec:TCP_conn_term}, per cui la
2158 \func{accept} ritornerà senza errori, e si avrà semplicemente un end-of-file
2159 al primo accesso al socket.
2160
2161 In questo caso 
2162
2163
2164
2165 %%% Local Variables: 
2166 %%% mode: latex
2167 %%% TeX-master: "gapil"
2168 %%% End: