eafad4875c8a45cb8b59efcf06357cc7e4fd9e1c
[gapil.git] / elemtcp.tex
1 \chapter{Socket TCP elementari}
2 \label{cha:elem_TCP_sock}
3
4 In questo capitolo inizieremo ad approndire la conoscenza dei socket TCP,
5 tratteremo qui dunque il funzionamento delle varie funzioni che si sono usate
6 nei due esempi elementari forniti in precedenza (vedi \ref{sec:net_cli_sample}
7 e \ref{sec:net_serv_sample}), previa una descrizione delle principali
8 caratteristiche del funzionamento di una connessione TCP.
9
10 La seconda parte del capitolo sarà poi dedicata alla scrittura di una prima
11 semplice applicazione client/server completa, che implementi il servizio
12 standard \texttt{echo} su TCP.
13
14 \section{Il funzionamento di una connessione TCP}
15 \label{sec:TCPel_connession}
16
17 Prima di entrare nei dettagli di come si usano le varie funzioni dei socket
18 che operano con TCP, è fondamentale capire alcune basi del funzionamento del
19 protocollo, ed in particolare su come si stabilisce una connessione, come la
20 si conclude e qual'è il significato dei vari stati del protocollo ad essa
21 connessi.
22
23 La conoscenza del funzionamento del protocollo è infatti essenziale per capire
24 il modello di programmazione ed il funzionamento delle API. In tutto questo è
25 di grande aiuto il programma \texttt{netstat}, che useremo per mostrare lo
26 stato in cui si trova ciascuna connessione attiva.
27
28 \subsection{La creazione della connessione: il \textit{three way handushake}}
29 \label{sec:TCPel_conn_cre}
30
31 Lo scenario tipico che si verifica quando si deve stabilire una connessione
32 TCP (lo stesso usato negli esempi elementari \ref{fig:net_cli_code} e
33 \ref{fig:net_serv_code}) la successione degli eventi è la
34 seguente:
35
36 \begin{itemize}
37 \item Il server deve essere preparato per accettare le connessioni in arrivo;
38   il procedimento si chiama \textsl{apertura passiva} del socket (da
39   \textit{passive open}); questo viene fatto chiamando la sequenza di funzioni
40   \texttt{socket}, \texttt{bind} e \texttt{listen}. Infine il server chiama la
41   funzione \texttt{accept} e il processo si blocca in attesa di connessioni.
42   
43 \item Il client richiede l'inizio della connessione usando la funzione
44   \texttt{connect}, attraverso un procedimento che viene chiamato
45   \textsl{apertura attiva}, dall'inglese \textit{active open}. La chiamata di
46   \texttt{connect} blocca il processo e causa l'invio da parte del client di
47   un segmento \texttt{SYN}\footnote{Si ricordi che il segmento è l'unità
48     elementare di dati trasmessa dal protocollo TCP al livello superiore;
49     tutti i segmenti hanno un header che contiene le informazioni che servono
50     allo \textit{stack TCP} (così viene di solito chiamata la parte del kernel
51     che implementa il protocollo) per realizzare la comunicazione, fra questi
52     dati ci sono una serie di flag usati per gestire la connessione, come
53     \texttt{SYN}, \texttt{ACK}, \texttt{URG}, \texttt{FIN}, alcuni di essi,
54     come \texttt{SYN} (che sta per \textit{sincronize}) corrispondono a
55     funzioni particolari del protocollo e danno il nome al segmento, (per
56     maggiori dettagli vedere \ref{cha:tcp_protocol})}, in sostanza viene
57   inviato al server un pacchetto IP che contiene solo gli header IP e TCP (con
58   un numero di sequenza) e le opzioni di TCP.
59   
60 \item il server deve dare ricevuto (l'\textit{acknowledge}) del \texttt{SYN}
61   del client, inoltre anche il server deve inviare il suo \texttt{SYN} al
62   client (e trasmettere il numero di sequenza iniziale) questo viene fatto
63   ritrasmettendo un singolo segmento in cui entrambi i flag \texttt{SYN}
64   \texttt{ACK} e sono settati.
65   
66 \item una volta che il client ha ricevuto l'acknowledge dal server la funzione
67   \texttt{connect} ritorna, l'ultimo passo è dare dare il ricevuto del
68   \texttt{SYN} del server inviando un \texttt{ACK}. Alla ricezione di
69   quest'ultimo la funzione \texttt{accept} del server ritorna e la connessione
70   è stabilita.
71 \end{itemize} 
72
73 Dato che per compiere tutto questo procedimento devono essere scambiati tre
74 pacchetti esso viene generalmente chiamato \textit{three way handshake}. In
75 \nfig\ si è rappresentato graficamente lo sequenza di scambio dei segmenti che
76 stabilisce la connessione.
77
78 % Una analogia citata da R. Stevens per la connessione TCP è quella con il
79 % sistema del telefono. La funzione \texttt{socket} può essere considerata
80 % l'equivalente di avere un telefono. La funzione \texttt{bind} è analoga al
81 % dire alle altre persone qual'è il proprio numero di telefono perché possano
82 % chiamare. La funzione \texttt{listen} è accendere il campanello del telefono
83 % per sentire le chiamate in arrivo.  La funzione \texttt{connect} richiede di
84 % conoscere il numero di chi si vuole chiamare. La funzione \texttt{accept} è
85 % quando si risponde al telefono.
86
87 \begin{figure}[htb]
88   \centering
89   
90   \caption{Il \textit{three way handshake} del TCP}
91   \label{fig:TCPel_TWH}
92 \end{figure}
93
94 Si noti che figura si sono riportati anche i \textsl{numeri di sequenza}
95 associati ai vari pacchetti; per gestire una connessione affidabile infatti il
96 protocollo TCP prevede nell'header la presenza di un \textit{sequence number}
97 a 32 bit che identifica a quale byte nella sequenza dello stream corrisponde
98 il primo byte dei dati contenuti nel segmento.
99
100 Il numero di sequenza di ciascun segmento viene calcolato a partire da un
101 numero di sequenza iniziale generato in maniera casuale del kernel all'inizio
102 della connessione e trasmesso con il SYN; l'acknowledgement di ciascun
103 segmento viene effettuato dall'altro capo della connessione settando il flag
104 \texttt{ACK} e restituendo nell'apposito campo dell'header un
105 \textit{acknowledge number}) pari al numero di sequenza che il ricevente si
106 aspetta di ricevere con il pacchetto successivo; dato che il primo pacchetto
107 SYN consuma un byte, nel \textit{three way handshake} il numero di acknowledge
108 è sempre pari al numero di sequenza iniziale incrementato di uno; lo stesso
109 varrà anche (vedi \nfig) per l'acknowledgement di un FIN.
110
111 \subsection{Le opzioni TCP.}
112 \label{sec:TCPel_TCP_opt}
113
114 Ciascun SYN può contenere delle opzioni per il TCP (le cosiddette \textit{TCP
115   options}, che vengono inserite fra l'header e i dati) che servono a regolare
116 la connessione. Normalmente vengono usate le seguenti opzioni:
117
118 \begin{itemize}
119 \item \textit{MSS option} Sta per \textit{maximum segment size}, con questa
120   opzione ciascun capo della connessione annuncia all'altro il massimo
121   ammontare di dati che vorrebbe accettare per ciascun segmento nella
122   connesione corrente. È possibile leggere e scrivere questo valore attraverso
123   l'opzione del socket \texttt{TCP\_MAXSEG}.
124   
125 \item \textit{window scale option} come spiegato in \ref{cha:tcp_protocol} il
126   protocollo TCP implementa il controllo di flusso attraverso una
127   \textsl{finestra annunciata} (\textit{advertized window}) con la quale
128   ciascun capo della comunicazione dichiara quanto spazio disponibile ha in
129   memoria per i dati. Questo è un numero a 16 bit dell'haeader, che così può
130   indicare un massimo di 65535 bytes (anche se linux usa come massimo 32767
131   per evitare problemi con alcuni stack bacati che usano l'aritmetica con
132   segno per imlementare lo steck TCP); ma alcuni tipi di connessione come
133   quelle ad alta velocità (sopra i 45Mbits/sec) e quelle che hanno grandi
134   ritardi nel cammino dei pacchetti (come i satelliti) richiedono una finestra
135   più grande per poter ottenere il massimo dalla trasmissione, per questo
136   esiste questa opzione che indica un fattore di scala da applicare al valore
137   della finestra annunciata\footnote{essendo una nuova opzione per garantire
138     la compatibilità con delle vecchie implementazioni del protocollo la
139     procedura che la attiva prevede come negoziazione che l'altro capo della
140     connessione riconosca esplicitamente l'opzione inserendola anche lui nel
141     suo SYN di risposta dell'apertura della connessione} per la connessione
142   corrente (espresso come numero di bit cui shiftare a sinistra il valore
143   della finestra annunciata).
144
145 \item \textit{timestamp option} è anche questa una nuova opzione necessaria
146   per le connessioni ad alta velocità per evitare possibili corruzioni di dati
147   dovute a pacchetti perduti che riappaiono; anche questa viene negoziata come
148   la precedente.
149
150 \end{itemize}
151
152 La MSS è generalmente supportata da quasi tutte le implementazioni del
153 protocollo, le ultime due opzioni (trattate nell'RFC 1323) sono meno comuni;
154 vengono anche dette \textit{long fat pipe options} dato che questo è il nome
155 che viene dato alle connessioni caratterizzate da alta velocità o da ritardi
156 elevati. In ogni caso linux supporta pienamente entrambe le opzioni.
157
158 \subsection{La terminazione della connessione}
159 \label{sec:TCPel_conn_term}
160
161 Mentre per creare una connessione occorre un interscambio di tre segmenti, la
162 procedura di chiusura ne richede ben quattro; in questo caso la successione
163 degli eventi è la seguente:
164
165 \begin{enumerate}
166 \item Un processo ad uno dei due capi chiama la funzione \texttt{close}, dando
167   l'avvio a quella che viene chiamata \textsl{chiusura attiva} (da
168   \textit{active close}). Questo comporta l'emissione di un segmento FIN, che
169   significa che si è finito con l'invio dei dati sulla connessione.
170   
171 \item L'altro capo della connessione riceve il FIN ed esegue la
172   \textit{chiusura passiva} (da \textit{passive close}); al FIN, come per
173   tutti i pacchetti, viene risposto con un ACK. Inoltre il ricevimento del FIN
174   viene passato al processo che ha aperto il socket come un end of file sulla
175   lettura (dopo che ogni altro eventuale dato rimasto in coda è stato
176   ricevuto), dato che il ricevimento di un FIN significa che non si
177   riceveranno altri dati sulla connessione.
178
179 \item Dopo un certo tempo anche il secondo processo chiamerà la funzione
180   \texttt{close} sul proprio socket, causando l'emissione di un altro segmento
181   FIN. 
182   
183 \item L'altro capo della connessione riceverà il FIN conclusivo e risponderà
184   con un ACK.
185 \end{enumerate}
186
187
188 Dato che in questo caso sono richiesti un FIN ed un ACK per ciascuna direzione
189 normalmente i segmenti scambiati sono quattro; normalmente giacché in alcune
190 sitazioni il FIN del passo 1) è inviato insieme a dei dati. Comunque non è
191 detto, anche se è possibile, che i segmenti inviati nei passi 2 e 3, siano
192 accorpati in un singolo segmento. In \nfig\ si è rappresentato graficamente lo
193 sequenza di scambio dei segmenti che stabilisce la connessione.
194
195 \begin{figure}[htb]
196   \centering
197   
198   \caption{Il \textit{three way handshake} del TCP}
199   \label{fig:TCPel_TWH}
200 \end{figure}
201
202 Come per il SYN anche il FIN occupa un byte nel numero di sequenza, per cui
203 l'ACK riporterà un \textit{acknowledge number} incrementato di uno. 
204
205 Si noti che nella sequenza di chiusura fra i passi 2 e 3 è in teoria possibile
206 che si mantenga un flusso di dati dal capo della connessione che sta eseguendo
207 la chiusura passiva a quello che sta eseguendo la chiusura attiva. Nella
208 sequenza indicata i dati verrebbero persi, dato che si è chiuso il socket, ma
209 esistono situazione in cui si vuole che avvenga proprio questo, che è chiamato
210 \textit{half-close}, per cui torneremo su questo aspetto e su come utilizzarlo
211 più avanti, quando parleremo della funzione \texttt{shutdown}.
212
213 La emissione del FIN avviene quando il socket viene chiuso, questo però non
214 avviene solo per la chiamata della funzione \texttt{close}, ma anche alla
215 terminazione di un processo, il che vuol dire che se un processo viene
216 terminato da un segnale tutte le connessioni aperte verranno chiuse.
217
218 Infine è da sottolineare che benché nell'esempio sia il client ad eseguire la
219 chusura attiva, nella realtà questa può essere eseguita da uno qualunque dei
220 due capi della comunicazione, e benché questo sia il caso più comune ci sono
221 dei protocolli, di cui il principale è l'HTTP, per i queli è il server ad
222 effettuare la chiusura passiva.
223
224
225 \subsection{Un esempio di connessione}
226 \label{sec:TCPel_conn_dia}
227
228 Le operazioni del TCP nella creazione e conclusione di una connessione sono
229 specificate attraverso il diagramma di transizione degli stati riportato in
230 \nfig. TCP prevede l'esistenza di 11 diversi stati per una connessione ed un
231 insieme di regole per le transizioni da uno stato all'altro basate sullo stato
232 corrente e sul tipo di segmento ricevuto; i nomi degli stati sono gli stessi
233 che vengono riportati del comando \texttt{netstat}.
234
235 Una descrizione completa del funzionamento del protocollo va al di là degli
236 obiettivi di questo libro; un approfondimento sugli aspetti principali si
237 trova in \ref{cha:tcp_protocol}, ma per una trattazione esauriente il miglior
238 riferimento resta (FIXME citare lo Stevens); qui ci limiteremo a descrivere
239 brevemente un semplice esempio di connessione e le transizioni che avvengono
240 nei due casi appena citati (creazione e terminazione della connessione).
241
242 In assenza di connessione lo stato del TCP è \textsl{CLOSED}; quando una
243 applicazione esegue una apertura attiva il TCP emette un SYN e lo stato
244 diventa \textsl{SYN\_SENT}; quando il TCP riceve la risposta del SYN$+$ACK
245 emette un ACK e passa allo stato \textsl{ESTABLISHED}; questo è lo stato
246 finale in cui avviene la gran parte del trasferimento dei dati.
247
248 Dal lato server in genere invece il passaggio che si opera con l'apertura
249 passiva è quello di portare la connessione dallo stato \textsl{CLOSED} allo
250 stato \textsl{LISTEN} in cui vengono accettate le connessioni.
251
252 Dallo stato \textsl{ESTABLISHED} si può uscire in due modi; se un'applicazione
253 chiama la \texttt{close} prima di aver ricevuto un end of file (chiusura
254 attiva) la transizione è verso lo stato \textsl{FIN\_WAIT\_1}; se invece
255 l'applicazione riceve un FIN nello stato \textsl{ESTABLISHED} (chiusura
256 passiva) la transizione è verso lo stato \textsl{CLOSE\_WAIT}.
257
258 In \nfig\ è riportato lo schema dello scambio dei pacchetti che avviene per
259 una connessione, insieme ai vari stati che il protocollo viene ad assumere per
260 i due lati, server e client. 
261
262 \begin{figure}[htb]
263   \centering
264   
265   \caption{Schema dello scambio di pacchetti per un esempio di connessione}
266   \label{fig:TPCel_conn_example}
267 \end{figure}
268
269 La connessione viene iniziata dal client che annuncia un MSS di 1460 (un
270 valore tipico per IPv4 su ethernet) il server risponde con lo stesso valore
271 (ma potrebbe essere anche un valore diverso). 
272
273 Una volta che la connessione è stabilita il client scrive al server una
274 richiesta (che assumiamo stare in un singolo segmento, cioè essere minore dei
275 1460 bytes annunciati dal server), quest'ultimo riceve la richiesta e
276 restituisce una risposta (che di nuovo supponiamo stare in un singolo
277 segmento). Si noti che l'acknowledge della richiesta è mandato insieme alla
278 risposta, questo viene chiamato \textit{piggybacking} ed avviene tutte le
279 volte che che il server è sufficientemente veloce a costruire la risposta (il
280 limite è dell'ordine dei 200~ms), in caso contrario si avrebbe prima
281 l'emissione di un ACK e poi l'invio della risposta. 
282
283 Infine si ha lo scambio dei quattro segmenti che terminano la connessione
284 secondo quanto visto in \ref{sec:TCPel_conn_term}; si noti che il capo della
285 connessione che esegue la chiusura attiva entra nello stato
286 \textsl{TIME\_WAIT} su cui torneremo fra poco.
287
288 È da notare come per effettuare uno scambio di due pacchetti (uno di richiesta
289 e uno di risposta) il TCP abbia generato un totale di ulteriori otto segmenti,
290 quando con l'uso di UDP sarebbero statisufficienti due pacchetti. Questo è il
291 costo dell'affidabilità, passare da TCP a UDP avrebbe significato dover
292 trasferire tutta una serie di dettagli (come la verifica della ricezione dei
293 pacchetti) dal livello di trasporto all'interno dell'applicazione. 
294
295 Pertanto è bene sempre tenere presente quali sono le esigenze che si hanno in
296 una applicazione di rete, e che molte applicazioni che usano UDP lo fanno
297 perché sono necessarie le sue caratteristiche di velocità e compattezza nello
298 scambio dei dati.
299
300 \subsection{Lo stato \texttt{TIME\_WAIT}}
301 \label{sec:TCPel_time_wait}
302
303 Come riportato da Stevens (FIXME citare) lo stato \textsl{TIME\_WAIT} è
304 probabilemente uno degli aspetti meno compresi del protocollo TCP, è infatti
305 comune trovare nei newsgroup domande su come sia possibile evitare che
306 un'applicazione resti in questo stato lasciando attiva una connessione ormai
307 conclusa; la risposta è che non deve essere fatto, ed il motivo cercheremo di
308 spiegarlo adesso.
309
310 Come si è visto nell'esempio precedente (vedi \curfig) \textsl{TIME\_WAIT} è
311 lo stato finale in cui il capo di una connessione che esegue la chiusura
312 attiva resta prima di passare alla chiusura definitiva della connessione. Il
313 tempo in cui l'applicazione resta in questo stato deve essere due volte la MSL
314 (\textit{Maximum Segment Lifetime}). 
315
316 La MSL è la stima del massimo periodo di tempo che un pacchetto IP può vivere
317 sulla rete; questo tempo è limitato perché ogni pacchetto IP può essere
318 ritrasmesso dai router un numero massimo di volte (detto \textit{hop limit});
319 il numero di ritrasmissioni consentito è indicato dal campo TTL dell'header di
320 IP (per maggiori dettagli vedi \ref{sec:appA_xxx}), e viene decrementato ad
321 ogni passaggio da un router e quando si annulla il pacchetto viene scartato
322 Siccome il numero è ad 8 bit il numero massimo di ``salti'' è di 255, pertanto
323 anche se questo non è propriamente un limite sul tempo di vita, si stima che
324 un pacchetto IP non possa vivere per più di MSL secondi.
325
326 Ogni implementazione del TCP deve scegliere un valore per la MSL (l'RFC1122
327 raccomanda 2 minuti, linux usa 30 secondi), questo comporta una durata dello
328 stato \textsl{TIME\_WAIT} da 1 a 4 minuti. 
329
330 I pacchetti si possono perdere nella rete per svariati motivi, ma il caso più
331 comune è quello di anomalie nell'instradamento; può accadere cioè che un
332 router smetta di funzionare o che una connessione fra due router si
333 interrompa, in questo caso i protocolli di instradamento dei pacchetti possono
334 impiegare anche alcuni minuti prima di trovare e stabilire un percorso
335 alternativo. In questo frattempo si possono creare dei circoli
336 nell'instradamento (cioè casi in cui un router manda i pacchetti verso
337 un'altro e quest'ultimo li rispedisce indietro, o li manda ad un terzo router
338 che li rispedisce al primo) in cui restano intrappolati i pacchetti. 
339
340 Assumendo che uno di questi pacchetti intrappolati sia un segmento di TCP chi
341 l'ha inviato non ricevendo risposta provvederà alla ritrasmissione, e se nel
342 frattempo sarà stata stabilita una strada alternativa quest'altro pacchetto
343 potrà giungere a destinazione; ma se dopo un po' (non oltre il limite
344 dell'MSL) la precedente connessione torna a funzionare e il circolo viene
345 spezzato anche i pacchetti intrappolati potranno essere inviati alla
346 destinazione finale, con la conseguenza di avere dei pacchetti duplicati che
347 il TCP deve essere in grado di gestire.
348
349 Lo stato \textsl{TIME\_WAIT} viene utilizzato dal protocollo per due motivi
350 principali:
351 \begin{itemize}
352 \item implementare in maniera affidabile la terminazione della connessione
353   in entrambe le direzioni.
354 \item consentire l'eliminazione dei segmenti duplicati dalla rete. 
355 \end{itemize}
356
357 La prima ragione si può capire tornando a \curfig\ assumendo che l'ultimo ACK
358 vanga perso; il server allora rimanderà il suo FIN, e il client deve mantenere
359 lo stato della connessione per essere in grado di reinviare l'ACK e chiudere
360 correttamente la connessione. Se non fosse così la risposta del server sarebbe
361 un RST (un altro tipo si segmento) che verrebbe interpretato come un errore.
362
363 Se il TCP deve poter chiudere in maniera pulita entrambe le direzioni della
364 connessione allora deve essere in grado di affrontare la perdita di uno
365 qualunque dei quattro segmenti che costituiscono la chiusura. Per questo
366 motivo lo stato \textsl{TIME\_WAIT} deve essere mantenuto anche dopo l'invio
367 dell'ultimo ACK per poter essere in grado di gestirne l'eventuale
368 ritrasmissione in caso di perdita.
369
370 La seconda ragione si può capire a partire dal seguente esempio, si supponga
371 di avere una connessione fra l'IP 195.110.112.236 porta 1550 e l'IP
372 192.84.145.100 porta 22, che questa venga chiusa e che poco dopo si
373 ristabilisca la stessa connessione fra gli stessi IP sulle stesse porte
374 (quella che viene detta una nuova \textsl{incarnazione} della connessione
375 precedente, essendo gli stessi porte e IP), in questo caso ci si potrebbe
376 trovare con dei pacchetti persi relativi alla precedente connessione che
377 riappaiono nella nuova. 
378
379 Ma fintanto che la connessione non è tornata nello stato \textsl{CLOSED} una
380 nuova incarnazione non può essere creata, per questo una connessione resta
381 sempre nello stato \textsl{TIME\_WAIT} per un periodo di 2MSL, in modo da
382 attendere MSL secondi per essere sicuri che tutti i pacchetti duplicati in
383 arrivo siano stati ricevuti o siano stati eliminati dalla rete e altri MSL
384 secondi per essere sicuri che lo stesso avvenga le risposte nella direzione
385 opposta.
386
387 In questo modo TCP si assicura che quando una viene creata una nuova
388 connessione tutti gli eventuali segmenti residui di una precedente connessione
389 che possano causare disturbi sono stati eliminati dalla rete.
390
391 \subsection{I numeri di porta}
392 \label{sec:TCPel_ports}
393
394 In un ambiente multitasking in un dato momento più processi possono dover
395 usare sia UDP che TCP, e ci devono poter essere più connessioni in
396 contemporanea. Per poter tenere distinte le diverse connessioni entrambi i
397 protocolli usano i \textsl{numeri di porta}.
398
399 Quando un client contatta un server deve poter identificare con quale dei vari
400 possibili server attivi intende parlare. Sia TCP che UDP definiscono un gruppo
401 di \textsl{porte conosciute} (le cosiddette \textit{well-known port}) che
402 identificano una serie di servizi noti (ad esempio la porta 22 identifica il
403 servizio \texttt{ssh}) effettuati da appositi server che rispondono alle
404 connessioni verso tali porte.
405
406 D'altra parte un client non ha necessità di usare un numero di porta
407 specifico, per cui in genere vengono usate le cosiddette \textsl{porte
408   effimere} (o \textit{ephemeral ports}) cioè porte a cui non è assegnato
409 nessun servizio noto e che vengono assegnate al client automaticamente dal
410 kernel alla creazione della connessione. Queste sono dette effimere in quanto
411 vengono usate solo per la durata della connessione, e l'unico requisito che
412 deve essere soddisfatto è che ognuna di esse sia assegnata in maniera univoca.
413
414 La lista delle porte conosciute è definita dall'RFC1700 che contiene l'elenco
415 delle porte assegnate dalla IANA (\textit{Internet Assigned Number Authority})
416 ma l'elenco viene costantemente aggiornato e pubblicato all'indirizzo
417 \texttt{ftp://ftp.isi.edu/in-notes/iana/assignements/port-numbers}, inoltre il
418 file \texttt{/etc/services} contiene un analogo elenco, con la corrispondenza
419 fra i numeri di porta ed il nome simbolico del servizio. I numeri sono divisi
420 in tre intervalli:
421
422 \begin{enumerate}
423 \item \textsl{le porte conosciute}. I numeri da 0 a 1023. Queste sono
424   controllate e assegnate dalla IANA, e se possibile la stessa porta è
425   assegnato allo stesso servizio sia su UDP che su TCP (ad esempio la porta 22
426   è assegnata a ssh su entrambi i protocolli, anche se viene usata solo dal
427   TCP).
428   
429 \item \textsl{le porte registrate}. I numeri da 1024 a 49151. Queste porte non
430   sono controllate dalla IANA, che però registra ed elenca chi usa queste
431   porte come servizio agli utenti, come per le precedenti si assegna una porta
432   ad un servizio sia per TCP che UDP anche se poi il servizio è implementato
433   solo su TCP. Ad esempio X Window usa le porte TCP e UDP dal 6000 al 6063
434   anche se il protocollo è implementato solo tramite TCP.
435   
436 \item \textsl{le porte private} o \textsl{dinamiche}. I numeri da 49152 a
437   65535. La IANA non dice nulla riguardo a queste porte che pertanto
438   potrebbero essere usate come porte effimere.
439 \end{enumerate}
440
441 In realtà rispetto a quanto indicato nell'RFC1700 i vari sistemi hanno fatto
442 scelte diverse per le porte effimere, in particolare in \nfig\ sono riportate
443 quelle di BSD, Solaris e linux. Nel caso di linux poi la scelta fra i due
444 intervali possibili viene fatta dinamicamente a seconda della memoria
445 disponibile.
446
447 \begin{figure}[!htb]
448   \centering
449   
450   \caption{Allocazione dei numeri di porta}
451   \label{fig:TCPel_port_alloc}
452 \end{figure}
453
454 I sistemi unix hanno inoltre il concetto di \textsl{porte riservate} (che
455 corrispondono alle porte con numero minore di 1024 e coincidono quindi con le
456 porte conosciute) che possono essere assegnate a un socket solo da un processo
457 con i privilegi di root. Questo per far si che solo l'amministratore possa
458 allocare queste porte per far partire relativi servizi.
459
460 Si tenga conto poi che ci sono alcuni client (in particolare \texttt{rsh} e
461 \texttt{rlogin}) che richiedono una connessione su una porta riservata come
462 parte dell'autenticazione. Questo viene fatto tramite la funzione
463 \texttt{rresvport} assegnando al socket una porta libera nell'intervallo fra
464 512 e 1023.
465
466 Data una connessione TCP si suole chiamare \textit{socket pair} la
467 combinazione dei quattro numeri che definiscono i due capi della connessione e
468 cioè l'indirizzo IP locale e la porta TCP locale, e l'indirizzo IP remoto e la
469 porta TCP remota; questa combinazione idenfica univocamente una connessione su
470 internet. Questo concetto viene di solito esteso anche a UDP, benchè in questo
471 caso non abbia senso parlare di connessione. 
472
473 Vedremo nella prossima sezione quali funzioni specificano le varie parti della
474 \textit{socket pair} per un dato socket.
475
476 \section{Le funzioni dei socket TCP}
477 \label{sec:TCPel_functions}
478
479 In questa sezione descriveremo in dettaglio le varie funzioni necessarie per
480 l'uso dei socket TCP già citate in precedenza (e utilizzate nei due esempi
481 \ref{sec:net_cli_sample} e \ref{sec:net_serv_sample}) con l'eccezione della
482 funzione \texttt{socket} che è stata esaminata in dettaglio in
483 \ref{sec:sock_socket}.
484
485 In \nfig\ abbiamo un tipico schema di funzionamento di un'applicazione
486 client-server che usa i socket TCP: prima il server viene avviato ed in
487 seguito il client si connette, in questo caso, a differenza di quanto accadeva
488 con gli esempi elementari del Cap.~\ref{cha:network} si assume che sia il
489 client ad effettuare delle richieste a cui il server risponde, il client
490 notifica poi di avere concluso inviando un end-of-file a cui il server
491 risponderà anche lui chiudendo la connessione per aspettarne una nuova.
492
493 \begin{figure}[!htb]
494   \centering
495
496   \caption{Struttura delle funzioni dei socket per una semplice applicazione
497     client/server su TCP.}
498   \label{fig:TCPel_cliserv_func}
499 \end{figure}
500
501 Useremo questo schema per l'esempio di implementazione del servizio
502 \texttt{echo} che illustreremo in \ref{sec:TCPel_echo_example}. 
503
504 \subsection{La funzione \texttt{connect}}
505 \label{sec:TCPel_func_connect}
506
507 La funzione \texttt{connect} è usata da un client TCP per stabilire la
508 connessione con un server TCP, il prototipo della funzione, definito in
509 \texttt{sys/socket.h}, è il seguente:
510
511 \begin{itemize}
512 \item \texttt{int connect(int sockfd, const struct sockaddr *serv_addr,
513     socklen_t addrlen) }
514   
515   Il primo argomento è un file descriptor ottenuto da una precedente chiamata
516   a \texttt{socket}, mentre il secondo e terzo argomento sono rispettivamente
517   l'indirizzo e la dimensione della struttura che contiene l'indirizzo del
518   socket, già descritta in \ref{sec:sock_sockaddr}.
519
520   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
521   di errore. La variabile \texttt{errno} viene settata secondo i seguenti
522   codici di errore
523
524   \begin{itemize}
525   \item \texttt{EBADF} Il file descriptor non è valido.
526   \item \texttt{EFAULT} L'indirizzo della struttura di indirizzi è al di fuori
527     dello spazio di indirizzi dell'utente.
528   \item \texttt{ENOTSOCK} Il file descriptor non è associato ad un socket
529   \item \texttt{EISCONN} Il socket è già connesso.
530   \item \texttt{ECONNREFUSED} Non c'è nessuno in ascolto sull'indirizzo remoto.
531   \item \texttt{ETIMEDOUT} Si è avuto timeout durante il tentativo di
532     connessione.
533   \item \texttt{ENETUNREACH} La rete non è rggiungibile/
534   \item \texttt{EADDRINUSE} L'indirizzo locale è in uso.
535   \item \texttt{EINPROGRESS} Il socket è non bloccante e la connessione non
536     può essere conclusa immediatamente.
537   \item \texttt{EALREADY} Il socket è non bloccante e un tentativo precedente
538     di connessione non si è ancora concluso.
539   \item \texttt{EAGAIN} Non ci sono più porte locali libere. 
540   \item \texttt{EAFNOSUPPORT} L'indirizzo non ha una famiglia di indirizzi
541     corretta nel relativo campo.
542   \item \texttt{EACCESS, EPERM} 
543   \end{itemize}
544 \end{itemize}
545
546 La struttura dell'indirizzo deve essere inizializzata con l'indirizzo IP e il
547 numero di porta del server a cui ci si vuole connettere, come mostrato
548 nell'esempio \ref{sec:net_cli_sample} usando le funzioni illustrate in
549 \ref{sec:sock_addr_func}.
550
551 Nel caso di socket TCP la funzione \texttt{connect} avvia il three way
552 handshake, e ritorna solo quando la connessione è stabilita o si è verificato
553 un errore. Le possibili cause di errore sono molteplici (e brevemente
554 riassunte sopra), in particolare le principali sono:
555
556 \begin{enumerate}
557 \item Se il client non riceve risposta al SYN l'errore restituito è
558   \texttt{ETIMEDOUT}. Stevens riporta che BSD invia un primo SYN alla chiamata
559   di \texttt{connect}, un'altro dopo 6 secondi, un terzo dopo 24 secondi, se
560   dopo 75 secondi non ha ricevuto risposta viene ritornato l'errore. Linux
561   invece ripete l'emissione del SYN ad intervalli di 30 secondi per un numero
562   di volte che può essere stabilito dall'utente sia con una opportuna
563   \texttt{sysctl} che attraverso il filesystem \texttt{/proc} scrivendo il
564   valore voluto in \texttt{/proc/sys/net/ipv4/tcp_syn_retries}. Il valore di
565   default per la ripetizione dell'invio è di 5 volte, che comporta un timeout
566   dopo circa 180 secondi.
567 %
568 % Le informazioni su tutte le opzioni settabili via /proc stanno in
569 % linux/Documentation/networking/ip-sysctl.txt
570 %
571 \item Se il client riceve come risposta al SYN un RST significa che non c'è
572   nessun programma in ascolto per la connessione sulla porta specificata (il
573   che vuol dire probablmente che o si è sbagliato il numero della porta o che
574   non è stato avviato il server), questo è un errore fatale e la funzione
575   ritorna non appena il RST viene ricevuto riportando un errore
576   \texttt{ECONNREFUSED}.
577   
578   Il flag RST sta per \textit{reset} ed è un segmento inviato direttamente
579   dal TCP quando qualcosa non va. Tre condizioni che generano un RST sono:
580   quando arriva un SYN per una porta che non ha nessun server in ascolto,
581   quando il TCP abortisce una connessione in corso, quandi TCP riceve un
582   segmento per una connessione che non esiste.
583
584 \item Il SYN del client provoca l'emissione di un messaggio ICMP di
585   destinazione non raggiungibile 
586   
587 \end{enumerate}
588
589 \subsection{La funzione \texttt{bind}}
590 \label{sec:TCPel_func_bind}
591
592
593
594 \subsection{La funzione \texttt{listen}}
595 \label{sec:TCPel_func_listen}
596
597 \subsection{La funzione \texttt{accept}}
598 \label{sec:TCPel_func_accept}
599
600
601 \section{Una semplice implementazione del servizio \textt{echo} su TCP}
602 \label{sec:TCPel_echo_example}
603