From b8a1f2a162b832eb587152b245309d8f86ddd10e Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 14 May 2005 23:55:25 +0000 Subject: [PATCH] Completata e rivista la trattazione di SO_LINGER. --- sockctrl.tex | 124 +++++++++++++++++++++++++++------------------------ 1 file changed, 66 insertions(+), 58 deletions(-) diff --git a/sockctrl.tex b/sockctrl.tex index d65f7c4..b0cc66c 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2275,11 +2275,12 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: \subsection{Le uso delle principali opzioni dei socket} \label{sec:sock_options_main} -L'elenco sintetico delle caratteristiche delle opzioni dei socket riportato in -sez.~\ref{sec:sock_generic_options} non è sufficientemente dettagliato per -permetterci di approfondire il significato di alcune di esse, che assumono -grande importanza nella programmazione dei socket. Per questo motivo -tratteremo ulteriormente l'uso di alcune di esse in questa sezione. +La descrizione sintetica del significato delle opzioni generiche dei socket, +riportata nell'elenco in sez.~\ref{sec:sock_generic_options}, non è +sufficientemente dettagliata per permetterci di approfondire tutti le +funzionalità che alcune di esse possono controllare, alcune delle quali hanno +un rilevanza notevole nella programmazione dei socket. Per questo motivo +tratteremo nei dettagli le principali opzioni in questa sezione. \index{\texttt{SO\_KEEPALIVE} (costante)|(} @@ -2287,11 +2288,13 @@ tratteremo ulteriormente l'uso di alcune di esse in questa sezione. La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di tenere sotto controllo lo stato di una connessione. Una connessione infatti -resta attiva anche quando non viene effettuato alcun traffico su di essa, per -cui un crollo della stessa potrebbe passare inosservato. +resta attiva anche quando non viene effettuato alcun traffico su di essa, +questo può comportare che un crollo della connessione, qualora avvenisse ad +esempio in conseguenza di una interruzione completa della rete, potrebbe +passare inosservato. -Se si imposta questa opzione, è cura del kernel inviare degli appositi -messaggi sulla rete (detti appunto \textit{keep-alive}) per verificare se la +Se si imposta questa opzione, è invece cura del kernel inviare degli appositi +messaggi sulla rete, detti appunto \textit{keep-alive}, per verificare se la connessione è attiva. L'opzione funziona soltanto con socket che supportino le connessioni (non ha senso per socket UDP ad esempio) e si applica principalmente ai socket TCP. @@ -2311,18 +2314,20 @@ il primo cui dopo il riavvio la connessione non viene più riconosciuta,\footnote{si ricordi che un normale riavvio non ha questo effetto, in quanto si passa per la chiusura del processo, che chiude anche il socket inviando un segmento - FIN all'altro capo della connessione.} e si otterrà come risposta un RST. In + FIN all'altro capo della connessione.} in questo caso all'invio del +messaggio di \textit{keep-alive} si otterrà come risposta un segmento RST che +indica che l'altro capo non riconosce più l'esistenza della connessione. In tal caso il socket viene chiuso dopo aver impostato un errore \errcode{ECONNRESET}. Se invece non viene ricevuta nessuna risposta (indice che la macchina non è più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di 75 -secondi ad un massimo di 9 volte\footnote{entrambi questi valori possono +secondi per un massimo di 9 volte\footnote{entrambi questi valori possono essere opportunamente modificati con gli opportuni parametri illustrati in sez.~\ref{sec:sock_sysctl}, si tenga presente che però questo vale a livello - di kernel ed i valori saranno applicati a \textsl{tutti} i socket.} (per un -totale di 11 minuti e 15 secondi) dopo di che, se non si è ricevuta nessuna -risposta, il socket viene chiuso dopo aver impostato un errore di + di kernel ed i suddetti valori saranno applicati a \textsl{tutti} i socket.} +(per un totale di 11 minuti e 15 secondi) dopo di che, se non si è ricevuta +nessuna risposta, il socket viene chiuso dopo aver impostato un errore di \errcode{ETIMEDOUT}. Qualora la connessione si sia ristabilita e si riceva un successivo messaggio di risposta il ciclo riparte come se niente fosse avvenuto. Infine se invece si riceve come risposta un pacchetto ICMP di @@ -2330,14 +2335,14 @@ destinazione irraggiungibile (vedi sez.~\ref{sec:icmp_protocol_xxx}), verr restituito l'errore corrispondente. In generale questa opzione serve per individuare una caduta della -connessione,\footnote{il crash di un processo di nuovo comporta la chiusura di - tutti i file che aveva aperti e la relativa emissione degli opportuni - segmenti FIN nel caso dei socket.} e viene usata sui server per evitare di +connessione\footnote{la terminazione di un processo di nuovo comporta la + chiusura di tutti i file che aveva aperti e la relativa emissione degli + opportuni segmenti FIN nel caso dei socket.} anche quando non si sta facendo +traffico su di essa. In genere viene usata sui server per evitare di mantenere impegnate le risorse dedicate a trattare delle connessioni in realtà -terminate ad esempio perché l'altro capo è crollato senza che se ne sia -ricevuto un avviso; quelle che vengono anche chiamate conessioni -\textsl{semi-aperte}, in cui il server è in attesa di dati in ingresso che non -arriveranno mai perché il client non è più attivo. +già terminate (quelle che vengono anche chiamate connessioni +\textsl{semi-aperte}) in cui il server è in attesa di dati in ingresso che non +arriveranno mai perché il client sull'altro capo non è più attivo. Abilitandola le connessioni effettivamente terminate vengono chiuse e ad esempio una \func{select} potrà rilevare la conclusione delle stesse e @@ -2356,7 +2361,7 @@ vari tentativi di ritrasmissione del \textit{keep-alive} (anche se questa non \normalsize \caption{La sezione della nuova versione del server del servizio \textit{echo} che prevede l'attivazione del \textit{keepalive} sui - socket.} + socket.} \label{fig:echod_keepalive_code} \end{figure} @@ -2582,19 +2587,20 @@ illustrata; questa combinazione viene utilizzata per riportarsi al comportamento normale qualora esso sia stato cambiato da una precedente chiamata. -Se però si utilizza un valore di \var{l\_onoff} diverso da zero, il -comportamento alla chiusura viene a dipendere dal valore specificato per il -campo \var{l\_linger}; se quest'ultimo è nullo l'uso delle funzioni -\func{close} e \func{shutdown} provoca la terminazione immediata della -connessione: nel caso di TCP cioè non viene eseguito il procedimento di -chiusura illustrato in sez.~\ref{sec:TCP_conn_term}, ma tutti i dati ancora -presenti nel buffer vengono immediatamente scartati e sulla rete viene inviato -un segmento di RST che termina immediatamente la connessione. +Se si utilizza un valore di \var{l\_onoff} diverso da zero, il comportamento +alla chiusura viene a dipendere dal valore specificato per il campo +\var{l\_linger}; se quest'ultimo è nullo l'uso delle funzioni \func{close} e +\func{shutdown} provoca la terminazione immediata della connessione: nel caso +di TCP cioè non viene eseguito il procedimento di chiusura illustrato in +sez.~\ref{sec:TCP_conn_term}, ma tutti i dati ancora presenti nel buffer +vengono immediatamente scartati e sulla rete viene inviato un segmento di RST +che termina immediatamente la connessione. Un esempio di questo comportamento si può abilitare nel nostro client del -servizio \textit{echo} utilizzando l'opzione \texttt{-r}, al solito riportiamo -in fig.~\ref{fig:TCP_echo_sixth} solo la sezione di codice rilevante, il -codice completo è disponibile nei sorgenti allegati. +servizio \textit{echo} utilizzando l'opzione \texttt{-r}; riportiamo in +fig.~\ref{fig:TCP_echo_sixth} la sezione di codice che permette di introdurre +questa funzionalità,; al solito il codice completo è disponibile nei sorgenti +allegati. \begin{figure}[!htb] \footnotesize \centering @@ -2607,31 +2613,33 @@ codice completo \label{fig:TCP_echo_sixth} \end{figure} -In questo caso la sezione indicata viene eseguita dopo aver effettuato la -connessione e prima di chiamare la funzione di gestione, cioè fra le righe -(\texttt{\small 12}) e (\texttt{\small 13}) del precedente esempio di -fig.~\ref{fig:TCP_echo_fifth}. Il codice si limita semplicememente a -controllare (\texttt{\small 3}) il valore della variabile \var{reset} -(opportunamente impostata nella gestione delle opzioni qualora si usi -\texttt{-r} nella chiamata del client) e nel caso impostare (\texttt{\small - 5--6}) gli opportuni valori della struttura \var{ling}, per poi usare questa -nella successiva (\texttt{\small 7}) chiamata a \func{setsockopt}. Di questa -(\texttt{\small 7--10}) viene comunque controllato il valore di ritorno ed -eseguita la terminazione del programma in caso un eventuale errore, con stampa -dello stesso. - -Infine se sia \var{l\_onoff} che \var{l\_linger} hanno un valore diverso da -zero sia \func{close} che \func{shutdown} si bloccano eseguendo la normale -procedura di conclusione della connessione (quella di -sez.~\ref{sec:TCP_conn_term}) e non ritornano fintanto che non si sia concluso -il procedimento di chiusura della connessione, o non siano passati il numero -di secondi\footnote{questa è l'unità di misura indicata da POSIX ed adottata - da Linux, altri kernel possono usare unità di misura diverse, oppure usare - il campo \var{l\_linger} come valore logico (ignorandone il valore) per - rendere (quando diverso da zero) \func{close} e \func{shutdown} bloccanti - fino al completamento della trasmissione dei dati sul buffer.} specificati -da \var{l\_linger}. - +La sezione indicata viene eseguita dopo aver effettuato la connessione e prima +di chiamare la funzione di gestione, cioè fra le righe (\texttt{\small 12}) e +(\texttt{\small 13}) del precedente esempio di fig.~\ref{fig:TCP_echo_fifth}. +Il codice si limita semplicememente a controllare (\texttt{\small 3}) il +valore della variabile \var{reset} che assegnata nella gestione delle opzioni +in corrispondenza all'uso di \texttt{-r} nella chiamata del client. Nel caso +questa sia diversa da zero vengono impostati (\texttt{\small 5--6}) i valori +della struttura \var{ling} che permettono una terminazione immediata della +connessine. Questa viene poi usata nella successiva (\texttt{\small 7}) +chiamata a \func{setsockopt}. Al solito si controlla (\texttt{\small 7--10}) +il valore di ritorno e si termina il programma in caso di errore, stampadone +il valore. + +Infine l'ultima possibilità, quella in cui si utilizza effettivamente +\const{SO\_LINGER} per \textsl{indugiare} nella chiusura, è quella in cui sia +\var{l\_onoff} che \var{l\_linger} hanno un valore diverso da zero. Se si +esegue l'impostazione con questi valori sia \func{close} che \func{shutdown} +si bloccano, nel frattempo viene eseguita la normale procedura di conclusione +della connessione (quella di sez.~\ref{sec:TCP_conn_term}) ma entrambe le +funzioni ritornano fintanto che non si sia concluso il procedimento di +chiusura della connessione, o non sia passato un numero di +secondi\footnote{questa è l'unità di misura indicata da POSIX ed adottata da + Linux, altri kernel possono usare unità di misura diverse, oppure usare il + campo \var{l\_linger} come valore logico (ignorandone il valore) per rendere + (quando diverso da zero) \func{close} e \func{shutdown} bloccanti fino al + completamento della trasmissione dei dati sul buffer.} pari al valore +specificato in \var{l\_linger}. -- 2.30.2