1 \chapter{Socket TCP elementari}
2 \label{cha:elem_TCP_sock}
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.
10 La seconda parte del capitolo sarà poi dedicata ad una riscrittura
11 dell'esempio precedente per trasformarlo in una prima applicazione
12 client/server semplice, ma completa, che implementi il servizio standard
13 \texttt{time} su TCP (vedremo in seguito un esempio anche con UDP).
16 \section{Il funzionamento di una connessione TCP}
17 \label{sec:TCPel_connession}
19 Prima di entrare nei dettagli di come si usano le varie funzioni dei socket
20 che operano con TCP, è fondamentale capire alcune basi del funzionamento del
21 protocollo, ed in particolare su come si stabilisce una connessione, come la
22 si conclude e qual'è il significato dei vari stati del protocollo ad essa
25 La conoscenza del funzionamento del protocollo è infatti essenziale per capire
26 il modello di programmazione ed il funzionamento delle API. In tutto questo è
27 di grande aiuto il programma \texttt{netstat}, che useremo per mostrare lo
28 stato in cui si trova ciascuna connessione attiva.
30 \subsection{La creazione della connessione: il \textit{three way handushake}}
31 \label{sec:TCPel_conn_cre}
33 Lo scenario tipico che si verifica quando si deve stabilire una connessione
34 TCP (lo stesso usato negli esempi elementari \ref{fig:net_cli_code} e
35 \ref{fig:net_serv_code}) la successione degli eventi è la
39 \item Il server deve essere preparato per accettare le connessioni in arrivo;
40 il procedimento si chiama \textsl{apertura passiva} del socket (da
41 \textit{passive open}); questo viene fatto chiamando la sequenza di funzioni
42 \texttt{socket}, \texttt{bind} e \texttt{listen}. Infine il server chiama la
43 funzione \texttt{accept} e il processo si blocca in attesa di connessioni.
45 \item Il client richiede l'inizio della connessione usando la funzione
46 \texttt{connect}, attraverso un procedimento che viene chiamato
47 \textsl{apertura attiva}, dall'inglese \textit{active open}. La chiamata di
48 \texttt{connect} blocca il processo e causa l'invio da parte del client di
49 un segmento \texttt{SYN}\footnote{Si ricordi che il segmento è l'unità
50 elementare di dati trasmessa dal protocollo TCP al livello superiore;
51 tutti i segmenti hanno un header che contiene le informazioni che servono
52 allo \textit{stack TCP} (così viene di solito chiamata la parte del kernel
53 che implementa il protocollo) per realizzare la comunicazione, fra questi
54 dati ci sono una serie di flag usati per gestire la connessione, come
55 \texttt{SYN}, \texttt{ACK}, \texttt{URG}, \texttt{FIN}, alcuni di essi,
56 come \texttt{SYN} (che sta per \textit{sincronize}) corrispondono a
57 funzioni particolari del protocollo e danno il nome al segmento, (per
58 maggiori dettagli vedere \ref{cha:tcp_protocol})}, in sostanza viene
59 inviato al server un pacchetto IP che contiene solo gli header IP e TCP (con
60 un numero di sequenza) e le opzioni di TCP.
62 \item il server deve dare ricevuto (l'\textit{acknowledge}) del \texttt{SYN}
63 del client, inoltre anche il server deve inviare il suo \texttt{SYN} al
64 client (e trasmettere il numero di sequenza iniziale) questo viene fatto
65 ritrasmettendo un singolo segmento in cui entrambi i flag \texttt{SYN}
66 \texttt{ACK} e sono settati.
68 \item una volta che il client ha ricevuto l'acknowledge dal server la funzione
69 \texttt{connect} ritorna, l'ultimo passo è dare dare il ricevuto del
70 \texttt{SYN} del server inviando un \texttt{ACK}. Alla ricezione di
71 quest'ultimo la funzione \texttt{accept} del server ritorna e la connessione
75 Dato che per compiere tutto questo procedimento devono essere scambiati tre
76 pacchetti esso viene generalmente chiamato \textit{three way handshake}. In
77 \nfig\ si è rappresentato graficamente lo sequenza di scambio dei segmenti che
78 stabilisce la connessione.
80 % Una analogia citata da R. Stevens per la connessione TCP è quella con il
81 % sistema del telefono. La funzione \texttt{socket} può essere considerata
82 % l'equivalente di avere un telefono. La funzione \texttt{bind} è analoga al
83 % dire alle altre persone qual'è il proprio numero di telefono perché possano
84 % chiamare. La funzione \texttt{listen} è accendere il campanello del telefono
85 % per sentire le chiamate in arrivo. La funzione \texttt{connect} richiede di
86 % conoscere il numero di chi si vuole chiamare. La funzione \texttt{accept} è
87 % quando si risponde al telefono.
92 \caption{Il \textit{three way handshake} del TCP}
96 Si noti che figura si sono riportati anche i \textsl{numeri di sequenza}
97 associati ai vari pacchetti; per gestire una connessione affidabile infatti il
98 protocollo TCP prevede nell'header la presenza di un \textit{sequence number}
99 a 32 bit che identifica a quale byte nella sequenza dello stream corrisponde
100 il primo byte dei dati contenuti nel segmento.
102 Il numero di sequenza di ciascun segmento viene calcolato a partire da un
103 numero di sequenza iniziale generato in maniera casuale del kernel all'inizio
104 della connessione e trasmesso con il SYN; l'acknowledgement di ciascun
105 segmento viene effettuato dall'altro capo della connessione settando il flag
106 \texttt{ACK} e restituendo nell'apposito campo dell'header un
107 \textit{acknowledge number}) pari al numero di sequenza che il ricevente si
108 aspetta di ricevere con il pacchetto successivo; dato che il primo pacchetto
109 SYN consuma un byte, nel \textit{three way handshake} il numero di acknowledge
110 è sempre pari al numero di sequenza iniziale incrementato di uno; lo stesso
111 varrà anche (vedi \nfig) per l'acknowledgement di un FIN.
113 \subsection{Le opzioni TCP.}
114 \label{sec:TCPel_TCP_opt}
116 Ciascun SYN può contenere delle opzioni per il TCP (le cosiddette \textit{TCP
117 options}, che vengono inserite fra l'header e i dati) che servono a regolare
118 la connessione. Normalmente vengono usate le seguenti opzioni:
121 \item \textit{MSS option} Sta per \textit{maximum segment size}, con questa
122 opzione ciascun capo della connessione annuncia all'altro il massimo
123 ammontare di dati che vorrebbe accettare per ciascun segmento nella
124 connesione corrente. È possibile leggere e scrivere questo valore attraverso
125 l'opzione del socket \texttt{TCP\_MAXSEG}.
127 \item \textit{window scale option} come spiegato in \ref{cha:tcp_protocol} il
128 protocollo TCP implementa il controllo di flusso attraverso una
129 \textsl{finestra annunciata} (\textit{advertized window}) con la quale
130 ciascun capo della comunicazione dichiara quanto spazio disponibile ha in
131 memoria per i dati. Questo è un numero a 16 bit dell'haeader, che così può
132 indicare un massimo di 65535 bytes; 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).
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
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
159 \subsection{La terminazione della connessione}
160 \label{sec:TCPel_conn_term}
162 Mentre per creare una connessione occorre un interscambio di tre segmenti, la
163 procedura di chiusura ne richede ben quattro; in questo caso la successione
164 degli eventi è la seguente:
167 \item Un processo ad uno dei due capi chiama la funzione \texttt{close}, dando
168 l'avvio a quella che viene chiamata \textsl{chiusura attiva} (da
169 \textit{active close}). Questo comporta l'emissione di un segmento FIN, che
170 significa che si è finito con l'invio dei dati sulla connessione.
172 \item L'altro capo della connessione riceve il FIN ed esegue la
173 \textit{chiusura passiva} (da \textit{passive close}); al FIN, come per
174 tutti i pacchetti, viene risposto con un ACK. Inoltre il ricevimento del FIN
175 viene passato al processo che ha aperto il socket come un end of file sulla
176 lettura (dopo che ogni altro eventuale dato rimasto in coda è stato
177 ricevuto), dato che il ricevimento di un FIN significa che non si
178 riceveranno altri dati sulla connessione.
180 \item Dopo un certo tempo anche il secondo processo chiamerà la funzione
181 \texttt{close} sul proprio socket, causando l'emissione di un altro segmento
184 \item L'altro capo della connessione riceverà il FIN conclusivo e risponderà
189 Dato che in questo caso sono richiesti un FIN ed un ACK per ciascuna direzione
190 normalmente i segmenti scambiati sono quattro; normalmente giacché in alcune
191 sitazioni il FIN del passo 1) è inviato insieme a dei dati. Comunque non è
192 detto, anche se è possibile, che i segmenti inviati nei passi 2 e 3, siano
193 accorpati in un singolo segmento. In \nfig\ si è rappresentato graficamente lo
194 sequenza di scambio dei segmenti che stabilisce la connessione.
199 \caption{Il \textit{three way handshake} del TCP}
200 \label{fig:TCPel_TWH}
203 Come per il SYN anche il FIN occupa un byte nel numero di sequenza, per cui
204 l'ACK riporterà un \textit{acknowledge number} incrementato di uno.
206 Si noti che nella sequenza di chiusura fra i passi 2 e 3 è in teoria possibile
207 che si mantenga un flusso di dati dal capo della connessione che sta eseguendo
208 la chiusura passiva a quello che sta eseguendo la chiusura attiva. Nella
209 sequenza indicata i dati verrebbero persi, dato che si è chiuso il socket, ma
210 esistono situazione in cui si vuole che avvenga proprio questo, che è chiamato
211 \texit{half-close}, per cui torneremo su questo aspetto e su come utilizzarlo
212 più avanti, quando parleremo della funzione \texttt{shutdown}.
214 La emissione del FIN avviene quando il socket viene chiuso, questo però non
215 avviene solo per la chiamata della funzione \texttt{close}, ma anche alla
216 terminazione di un processo, il che vuol dire che se un processo viene
217 terminato da un segnale tutte le connessioni aperte verranno chiuse.
220 \subsection{Un esempio di connessione}
221 \label{sec:TCPel_conn_dia}
223 Le operazioni del TCP nella creazione e conclusione di una connessione sono
224 specificate attraverso il diagramma di transizione degli stati riportato in
225 \nfig. TCP prevede l'esistenza di 11 diversi stati per una connessione ed un
226 insieme di regole per le transizioni da uno stato all'altro basate sullo stato
227 corrente e sul tipo di segmetno ricevuto.
231 \subsection{Lo stato \texttt{TIME\_WAIT}}
232 \label{sec:TCPel_time_wait}
236 \section{I numeri di porta}
237 \label{sec:TCPel_ports}
239 \section{Le funzioni dei socket TCP}
240 \label{sec:TCPel_functions}
242 \subsection{La funzione \texttt{connect}}
243 \label{sec:TCPel_func_connect}
245 \subsection{La funzione \texttt{bind}}
246 \label{sec:TCPel_func_bind}
248 \subsection{La funzione \texttt{listen}}
249 \label{sec:TCPel_func_listen}
251 \subsection{La funzione \texttt{accept}}
252 \label{sec:TCPel_func_accept}
255 \subsection{Le porte}