X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=sockctrl.tex;h=d6da06a68604b27ce45b37d2406c44222d09c935;hb=887d819031dbacc1aa2affde1646fc1566008483;hp=bf860378750aa4cecd96eb871011c78420a5c1e4;hpb=9b30f05c5024f48a10a6e7ca882e6dfd32c54f5b;p=gapil.git diff --git a/sockctrl.tex b/sockctrl.tex index bf86037..d6da06a 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1,6 +1,6 @@ %% sockctrl.tex %% -%% Copyright (C) 2004-2005 Simone Piccardi. Permission is granted to +%% Copyright (C) 2004-2006 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Prefazione", @@ -2013,7 +2013,8 @@ tab.~\ref{tab:sock_opt_socklevel}. \const{SO\_KEEPALIVE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& controlla l'attività della connessione.\\ \const{SO\_OOBINLINE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - lascia in linea i dati \textit{out-of-band}.\\ + lascia in linea i dati \itindex{out-of-band} + \textit{out-of-band}.\\ \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& basso livello sul buffer di ricezione.\\ \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}& @@ -2085,13 +2086,14 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: forniti in sez.~\ref{sec:sock_options_main}. \item[\const{SO\_OOBINLINE}] se questa opzione viene abilitata i dati - \textit{out-of-band} vengono inviati direttamente nel flusso di dati del - socket (e sono quindi letti con una normale \func{read}) invece che restare - disponibili solo per l'accesso con l'uso del flag \const{MSG\_OOB} di - \func{recvmsg}. L'argomento è trattato in dettaglio in + \itindex{out-of-band} \textit{out-of-band} vengono inviati direttamente nel + flusso di dati del socket (e sono quindi letti con una normale \func{read}) + invece che restare disponibili solo per l'accesso con l'uso del flag + \const{MSG\_OOB} di \func{recvmsg}. L'argomento è trattato in dettaglio in sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che - supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad - esempio), ed utilizza per \param{optval} un intero usato come valore logico. + supportino i dati \itindex{out-of-band} \textit{out-of-band} (non ha senso + per socket UDP ad esempio), ed utilizza per \param{optval} un intero usato + come valore logico. \item[\const{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il numero minimo di byte che devono essere presenti nel buffer di ricezione @@ -2237,9 +2239,10 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: \item[\const{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di uscita del socket. Prende per \param{optval} un intero indicante il numero - di byte. Il valore di default ed il valore massimo che si può specificare - come argomento per questa opzione sono impostabili tramiti gli opportuni - valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}). + di byte. Il valore di default ed il valore massimo che si possono + specificare come argomento per questa opzione sono impostabili + rispettivamente tramite gli opportuni valori di \func{sysctl} (vedi + sez.~\ref{sec:sock_sysctl}). \item[\const{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di ingresso del socket. Prende per \param{optval} un intero indicante il numero @@ -2247,6 +2250,23 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: come argomento per questa opzione sono impostabili tramiti gli opportuni valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}). + Si tenga presente che nel caso di socket TCP, per entrambe le opzioni + \const{SO\_RCVBUF} e \const{SO\_SNDBUF}, il kernel alloca effettivamente una + quantità di memoria doppia rispetto a quanto richiesto con + \func{setsockopt}. Questo comporta che una successiva lettura con + \func{getsockopt} riporterà un valore diverso da quello impostato con + \func{setsockopt}. Questo avviene perché TCP necessita dello spazio in più + per mantenere dati amministrativi e strutture interne, e solo una parte + viene usata come buffer per i dati, mentre il valore letto da + \func{getsockopt} e quello riportato nei vari parametri di + \textit{sysctl}\footnote{cioè \texttt{wmem\_max} e \texttt{rmem\_max} in + \texttt{/proc/sys/net/core} e \texttt{tcp\_wmem} e \texttt{tcp\_rmem} in + \texttt{/proc/sys/net/ipv4}, vedi sez.~\ref{sec:sock_sysctl}.} indica la + memoria effettivamente impiegata. Si tenga presente inoltre che le + modifiche alle dimensioni dei buffer di ingresso e di uscita, per poter + essere effettive, devono essere impostate prima della chiamata alle funzioni + \func{listen} o \func{connect}. + \item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene chiuso un socket quando si utilizza un protocollo che supporta le connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e @@ -2272,7 +2292,11 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: \item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket; può essere utilizzata soltanto con \func{getsockopt} e prende per - \param{optval} un valore intero. + \param{optval} un valore intero, nel quale viene restituito il codice di + errore, e la condizione di errore sul socket viene cancellata. Viene + usualmente utilizzata per ricevere il codice di errore, come accennato in + sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una + \func{select} che ritorna a causa dello stesso. \end{basedescript} @@ -2292,52 +2316,53 @@ approfondimento sul significato delle opzioni generiche pi 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, -questo può comportare che un crollo della connessione, qualora avvenisse ad -esempio in conseguenza di una interruzione completa della rete, potrebbe -passare inosservato. +resta attiva anche quando non viene effettuato alcun traffico su di essa; è +allora possibile, in caso di una interruzione completa della rete, che la +caduta della connessione non venga rilevata, dato che sulla stessa non passa +comunque alcun traffico. 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 +connessione è attiva. L'opzione funziona soltanto con i socket che supportano le connessioni (non ha senso per socket UDP ad esempio) e si applica principalmente ai socket TCP. Con le impostazioni di default (che sono riprese da BSD) Linux emette un messaggio di \textit{keep-alive}\footnote{in sostanza un segmento ACK vuoto, cui sarà risposto con un altro segmento ACK vuoto.} verso l'altro capo della -connessione se questa è rimasta senza traffico per più di due ore. Se è tutto +connessione se questa è rimasta senza traffico per più di due ore. Se è tutto a posto il messaggio viene ricevuto e verrà emesso un segmento ACK di risposta, alla cui ricezione ripartirà un altro ciclo di attesa per altre due ore di inattività; il tutto avviene all'interno del kernel e le applicazioni non riceveranno nessun dato. -In caso di problemi invece si possono avere i due casi già illustrati in -sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione precoce del server: -il primo è quello in cui la macchina remota è caduta ed è stata riavviata, per -cui dopo il riavvio la connessione non viene più riconosciuta,\footnote{si - ricordi che un normale riavvio non ha questo effetto, in quanto in tal caso - si passa per la chiusura del processo, e questo, come illustrato in - sez.~\ref{sec:file_close}, comporta la chiusura del socket con l'invio di un - segmento FIN all'altro capo della connessione, che verrà regolarmente - chiusa.} 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}. +Qualora ci siano dei problemi di rete si possono invece verificare i due casi +di terminazione precoce del server già illustrati in +sez.~\ref{sec:TCP_conn_crash}. Il primo è quello in cui la macchina remota ha +avuto un crollo del sistema ed è stata riavviata, per cui dopo il riavvio la +connessione non esiste più.\footnote{si ricordi che un normale riavvio o il + crollo dell'applicazione non ha questo effetto, in quanto in tal caso si + passa sempre per la chiusura del processo, e questo, come illustrato in + sez.~\ref{sec:file_close}, comporta anche la regolare chiusura del socket + con l'invio di un segmento 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 ed il socket verrà chiuso riportanto un errore di +\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 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 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 -destinazione irraggiungibile (vedi sez.~\ref{sec:icmp_protocol_xxx}), verrà -restituito l'errore corrispondente. + essere modificati a livello di sistema (cioè per tutti i socket) con gli + opportuni parametri illustrati in sez.~\ref{sec:sock_sysctl} ed a livello di + singolo socket con le opzioni \texttt{TCP\_KEEP*} di + sez.~\ref{sec:sock_tcp_udp_options}.} (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 si riceve come +risposta un pacchetto ICMP di 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 anche quando non si sta facendo traffico su di essa. Viene usata @@ -2345,9 +2370,9 @@ principalmente sui server per evitare di mantenere impegnate le risorse che verrebbero dedicate a trattare delle connessioni che in realtà sono già terminate (quelle che vengono anche chiamate connessioni \textsl{semi-aperte}); in tutti quei casi cioè in cui il server si trova in -attesa di dati in ingresso su una connessione che non arriveranno mai perché o -il client sull'altro capo non è più attivo o non è più in grado di comunicare -con il server via rete. +attesa di dati in ingresso su una connessione che non arriveranno mai o perché +il client sull'altro capo non è più attivo o perché non è più in grado di +comunicare con il server via rete. \begin{figure}[!htb] \footnotesize \centering @@ -2659,8 +2684,6 @@ specificato in \var{l\_linger}. - - \subsection{Le opzioni per il protocollo IPv4} \label{sec:sock_ipv4_options} @@ -2669,11 +2692,10 @@ socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni generiche una descrizione di esse è disponibile nella settima sezione delle pagine di manuale, nel caso specifico la documentazione si può consultare con \texttt{man 7 ip}.} Se si vuole operare su queste opzioni generiche il -livello da utilizzare è \const{SOL\_IP}; si è riportato un elenco di queste -opzioni in tab.~\ref{tab:sock_opt_iplevel}. Le costanti indicanti le opzioni e -tutte le altre costanti ad esse collegate sono definite in -\file{netinet/ip.h}, ed accessibili includendo detto file. - +livello da utilizzare è \const{SOL\_IP} (o l'equivalente \const{IPPROTO\_IP}); +si è riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_iplevel}. +Le costanti indicanti le opzioni e tutte le altre costanti ad esse collegate +sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file. \begin{table}[!htb] \centering @@ -2685,42 +2707,42 @@ tutte le altre costanti ad esse collegate sono definite in \hline \hline \const{IP\_OPTIONS} &$\bullet$&$\bullet$&&\texttt{void *}& %??? - Imposta o riceve le opzioni di IP.\\ + imposta o riceve le opzioni di IP.\\ \const{IP\_PKTINFO} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio di informazione.\\ + passa un messaggio di informazione.\\ \const{IP\_RECVTOS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio col campo TOS.\\ + passa un messaggio col campo TOS.\\ \const{IP\_RECVTTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio col campo TTL.\\ + passa un messaggio col campo TTL.\\ \const{IP\_RECVOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio con le opzioni IP.\\ + passa un messaggio con le opzioni IP.\\ \const{IP\_RETOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio con le opzioni IP non trattate.\\ + passa un messaggio con le opzioni IP non trattate.\\ \const{IP\_TOS} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il valore del campo TOS.\\ + imposta il valore del campo TOS.\\ \const{IP\_TTL} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il valore del campo TTL.\\ + imposta il valore del campo TTL.\\ \const{IP\_HDRINCL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa l'intestazione di IP nei dati.\\ + passa l'intestazione di IP nei dati.\\ \const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Abilita la gestione degli errori.\\ + abilita la gestione degli errori.\\ \const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il Path MTU Discovery.\\ + imposta il Path MTU Discovery.\\ \const{IP\_MTU} &$\bullet$& & &\texttt{int}& - Legge il valore attuale della MTU.\\ + legge il valore attuale della MTU.\\ \const{IP\_ROUTER\_ALERT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Imposta l'opzione \textit{IP router alert} sui pacchetti.\\ + imposta l'opzione \textit{IP router alert} sui pacchetti.\\ \const{IP\_MULTICAST\_TTL} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\ + imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\ \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Controlla il reinvio a se stessi dei dati di \itindex{multicast} + controlla il reinvio a se stessi dei dati di \itindex{multicast} \textit{multicast}.\\ \const{IP\_ADD\_MEMBERSHIP} & &$\bullet$& &\struct{ip\_mreqn}& - Si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\ + si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\ \const{IP\_DROP\_MEMBERSHIP}& &$\bullet$& &\struct{ip\_mreqn}& - Si sgancia da un gruppo di \textit{multicast}.\\ + si sgancia da un gruppo di \textit{multicast}.\\ \const{IP\_MULTICAST\_IF} & &$\bullet$& &\struct{ip\_mreqn}& - Imposta l'interfaccia locale di un socket \itindex{multicast} + imposta l'interfaccia locale di un socket \itindex{multicast} \textit{multicast}.\\ \hline \end{tabular} @@ -2728,9 +2750,9 @@ tutte le altre costanti ad esse collegate sono definite in \label{tab:sock_opt_iplevel} \end{table} -Le descrizioni di tab.~\ref{tab:sock_opt_iplevel} sono estremamente succinte, -una maggiore quantità di dettagli su queste opzioni è fornito nel seguente -elenco: +Le descrizioni riportate in tab.~\ref{tab:sock_opt_iplevel} sono estremamente +succinte, una maggiore quantità di dettagli sulle varie opzioni è fornita nel +seguente elenco: \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} @@ -2988,6 +3010,271 @@ sez.~\ref{sec:net_sendmsg}). +\subsection{Le opzioni per i protocolli TCP e UDP} +\label{sec:sock_tcp_udp_options} + +In questa sezione tratteremo le varie opzioni disponibili per i socket che +usano i due principali protocolli di comunicazione del livello di trasporto; +UDP e TCP.\footnote{come per le precedenti, una descrizione di queste opzioni + è disponibile nella settima sezione delle pagine di manuale, che si può + consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le + pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono + alquanto incomplete.} Dato che questi due protocolli sono entrambi +trasportati su IP,\footnote{qui si sottintende IPv4, ma le opzioni per TCP e + UDP sono le stesse anche quando si usa IPv6.} oltre alle opzioni generiche +di sez.~\ref{sec:sock_generic_options} saranno comunque disponibili anche le +precedenti opzioni di sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in + sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, al + solito qualora si stesse utilizzando IPv6 si potrebbero utilizzare le + opzioni di quest'ultimo.} + + +Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle +utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente +\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si sono +riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcp} dove +sono elencate le rispettive costanti da utilizzare come valore per l'argomento +\param{optname}. Dette costanti e tutte le altre costanti e strutture +collegate all'uso delle opzioni TCP sono definite in \file{netinet/tcp.h}, ed +accessibili includendo detto file.\footnote{in realtà questo è il file usato + dalle librerie; la definizione delle opzioni effettivamente supportate da + Linux si trova nel file \texttt{linux/tcp.h}, dal quale si sono estratte le + costanti di tab.~\ref{tab:sock_opt_tcplevel}.} + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|c|c|c|l|p{7cm}|} + \hline + \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}& + \textbf{Descrizione}\\ + \hline + \hline + \const{TCP\_NODELAY} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + spedisce tutti i pacchetti il prima possibile.\\ + \const{TCP\_MAXSEG} &$\bullet$&$\bullet$& &\texttt{int}& + valore della \itindex{Maximum~Segment~Size} MSS per i pacchetti in + uscita.\\ + \const{TCP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + non invia frame parziali.\\ + \const{TCP\_KEEPIDLE} &$\bullet$&$\bullet$& &\texttt{int}& + tempo in secondi prima di inviare un \textit{keepalive}.\\ + \const{TCP\_KEEPINTVL} &$\bullet$&$\bullet$& &\texttt{int}& + tempo in secondi prima fra \textit{keepalive} successivi.\\ + \const{TCP\_KEEPCNT} &$\bullet$&$\bullet$& &\texttt{int}& + numero massimo di \textit{keepalive} inviati.\\ + \const{TCP\_SYNCNT} &$\bullet$&$\bullet$& &\texttt{int}& + numero massimo di ritrasmissioni del pacchetto SYN.\\ + \const{TCP\_LINGER2} &$\bullet$&$\bullet$& &\texttt{int}& + tempo di vita in stato \texttt{FIN\_WAIT2}.\\ + \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$& &\texttt{int}& + ritorna da \func{accept} solo in presenza di dati.\\ + \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$& &\texttt{int}& + valore della \textit{advertised window}.\\ + \const{TCP\_INFO} &$\bullet$& & &\struct{tcp\_info}& + raccoglie informazioni sul socket.\\ + \const{TCP\_QUICKACK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + abilita la modalità \textit{quickack}.\\ + \const{TCP\_CONGESTION} &$\bullet$&$\bullet$&? &\texttt{?}& %??? + non ancora documentata.\\ + \hline + \end{tabular} + \caption{Le opzioni per i socket TCP disponibili al livello + \const{SOL\_TCP}.} + \label{tab:sock_opt_tcplevel} +\end{table} + +Le descrizioni delle varie opzioni riportate in +tab.~\ref{tab:sock_opt_tcplevel} sono estremamente sintetiche, una maggiore +quantità di dettagli e la spiegazione delle singole opzioni è fornita nel +seguente elenco: +\begin{basedescript}{\desclabelwidth{3.3cm}\desclabelstyle{\nextlinelabel}} + +\item[\const{TCP\_NODELAY}] il protocollo TCP prevede, per evitare la + trasmissione di tanti pacchetti piccoli, che comporta un utilizzo non + ottimale della banda disponibile, un meccanismo di bufferizzazione dei + pacchetti uscenti controllato da un apposito algoritmo (detto + \textsl{algoritmo di Nagle}, vedi sez.\ref{sez:tcp_protocol_xxx}). Il + comportamento normale prevede invece che i pacchetti siano accumulati + fintanto che non si raggiunge una quantità di dati considerata adeguata per + eseguire la trasmissione. + + Impostando questa opzione si disabilita questo meccanismo ed i pacchetti + vengono inviati immediatamente qualunque sia la loro dimensione; l'opzione + viene sovrascritta dall'eventuale impostazione \const{TCP\_CORK} (che blocca + l'invio immediato), tuttavia quando la si abilita viene sempre forzato lo + scaricamento della coda di invio (con conseguente trasmissione di tutti i + pacchetti pendenti), anche qualora si fosse già abilitata + \const{TCP\_CORK}.\footnote{si tenga presente però che \const{TCP\_CORK} può + essere specificata insieme a \const{TCP\_NODELAY} soltanto a partire dal + kernel 2.5.71.} + +\item[\const{TCP\_MAXSEG}] permette di leggere e modificare il valore della + \itindex{Maximum~Segment~Size} MSS dei pacchetti uscenti, e se l'opzione è + impostata prima di stabilire la connessione, cambia anche il valore della + MSS annunciata all'altro capo della connessione. Se si specificano valori + maggiori della MTU questi verranno ignorati, inoltre TCP imporrà anche i + suoi limiti massimo e minimo per questo valore. + +\item[\const{TCP\_CORK}] quando questa opzione viene abilitata non vengono + inviati pacchetti di dati fintanto che essa non venga disabilitata; a quel + punto tutti i dati rimasti in coda saranno inviati in un solo pacchetto. + Questa opzione viene usata per gestire direttamente il flusso dei dati + mettendo un ``\textsl{tappo}'' al flusso di uscita, in modo ottimizzare a + mano il throughput. È molto utile anche quando si effettua il trasferimento + di dati da un file con \func{sendfile} (vedi sez.~\ref{sec:file_sendfile}), + se si vuole inserire una intestazione prima della chiamata a questa + funzione. + + Si tenga presente che l'implementazione corrente di \const{TCP\_CORK} non + consente di bloccare l'invio dei pacchetti per più di 200 millisecondi, + passati i quali i dati accumulati in cosa sanno inviati comunque. Questa + opzione non è disponibile su tutti i kernel unix-like e deve essere evitata + se si vuole scrivere codice portabile. + +\item[\const{TCP\_KEEPIDLE}] imposta l'intervallo di tempo, in secondi, che + deve trascorrere senza traffico sul socket prima che vengano inviati, + qualora si sia attivata su di esso l'opzione \const{SO\_KEEPALIVE}, i + messaggi di \textit{keep-alive} (si veda la trattazione relativa al + \textit{keep-alive} in sez.~\ref{sec:sock_options_main}). Anche questa + opzione non è disponibile su tutti i kernel unix-like e deve essere evitata + se si vuole scrivere codice portabile. + +\item[\const{TCP\_KEEPINTVL}] imposta l'intervallo di tempo, in secondi, fra + due messaggi di \textit{keep-alive} successivi (si veda sempre quanto + illustrato in sez.~\ref{sec:sock_options_main}). Come la precedente non è + disponibile su tutti i kernel unix-like e deve essere evitata se si vuole + scrivere codice portabile. + +\item[\const{TCP\_KEEPCNT}] imposta il numero totale di messaggi di + \textit{keep-alive} da inviare prima di concludere che la connessione è + caduta (di nuovo vedi sez.~\ref{sec:sock_options_main}). Come la precedente + non è disponibile su tutti i kernel unix-like e deve essere evitata se si + vuole scrivere codice portabile. + +\item[\const{TCP\_SYNCNT}] imposta il numero di tentativi di ritrasmissione + dei segmenti SYN usati nel \itindex{three~way~handshake}\textit{three way + handshake} prima che il tentativo di connessione venga abortito (si + ricordi quanto accennato in sez.\ref{sec:TCP_func_connect}). Sovrascrive il + valore globale impostato con la \textit{sysctl} \texttt{tcp\_syn\_retries} + (vedi sez.~\ref{sec:sock_ipv4_sysctl}). Non vengono accettati valori + maggiori di 255; anche questa opzione non è standard e deve essere evitata + se si vuole scrivere codice portabile. + +\item[\const{TCP\_LINGER2}] imposta, in numero di secondi, il tempo di + sussistenza dei socket terminati nello stato \texttt{FIN\_WAIT2} (si ricordi + quanto visto in sez.~\ref{sec:TCP_conn_term}).\footnote{si tenga ben + presente che questa opzione non ha nulla a che fare con l'opzione + \const{SO\_LINGER} che abbiamo visto in sez.~\ref{sec:sock_options_main}.} + Questa opzione consente di sovrascrivere il valore globale impostato con la + \textit{sysctl} \texttt{tcp\_fin\_timeout} (vedi + sez.~\ref{sec:sock_ipv4_sysctl}). Anche questa opzione è da evitare se si + ha a cuore la portabilità del codice. + +\item[\const{TCP\_DEFER\_ACCEPT}] consente ad un socket in ascolto di + ritornare da \func{accept} soltanto quando sono presenti dati sullo stesso, + e non alla conclusione del \itindex{three~way~handshake} \textit{three way + handshake}. Prende un valore intero che indica il numero massimo di + secondi per cui il ritorno di \func{accept} viene rimandato; non deve essere + utilizzata in codice che vuole essere portabile. + +\item[\const{TCP\_WINDOW\_CLAMP}] limita alla dimensione specificata (in byte) + il valore dichiarato della \itindex{advertised~window} \textit{advertised + window} (vedi sez.\ref{sez:tcp_protocol_xxx}). Il kernel impone comunque + una dimensione minima pari a \texttt{SOCK\_MIN\_RCVBUF/2}. Questa opzione + non deve essere utilizzata in codice che vuole essere portabile. + +\item[\const{TCP\_INFO}] opzione, specifica di Linux, ma introdotta anche in + altri kernel (ad esempio FreeBSD) di controllare lo stato di un socket TCP + in user space. L'opzione restituisce in una speciale struttura + \struct{tcp\_info}, la cui definizione è riportata in + fig.~\ref{fig:tcp_info_struct}, tutta una serie di dati relativi al socket. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/tcp_info.h} + \end{minipage} + \caption{La struttura \structd{tcp\_info} contenente le informazioni sul + socket restituita dall'opzione \const{TCP\_INFO}.} + \label{fig:tcp_info_struct} +\end{figure} + +Con questa opzione diventa possibile ricevere una serie di informazioni +relative al socket così da poter effettuare dei controlli, senza passare +attraverso delle operazioni di lettura. Ad esempio si può verificare se un +socket è stato chiuso con un codice come quello illustrato in +fig.~\ref{fig:is_closing}. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/tcp_info.h} + \end{minipage} + \caption{Codice della funzione \texttt{is\_closing.c}, che controlla lo stato + di un socket TCP per verificare se si sta chiudendo..} + \label{fig:is_closing} +\end{figure} + +\item[\const{TCP\_QUICKACK}] abilita la modalità speciale \textit{quickack}, + in cui i pacchetti ACK vengono inviati immediatamente senza le attese + talvolta imposte dal normale funzionamento del protocollo TCP. Questa + opzione prende un valore logico, e non è permanente, nel senso che si limita + a forzare un passaggio da o verso la modalità \textit{quickack}, le + operazioni successive potrebbero a loro volta entrare o uscire da questa + modalità a seconda delle condizioni (ad esempio in presenza di timeout + ritardati per i pacchetti ACK) o del processamento dei dati. + +\item[\const{TCP\_CONGESTION}] Introdotta con il kernel 2.6.13, non + documentata. + +\end{basedescript} + + +Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero +ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udp}; anche in questo +caso per poterle utilizzare occorrerà impostare l'opportuno valore per +l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente +\const{IPPROTO\_UDP}). Le costanti che identificano dette opzioni sono +definite in \file{netinet/udp.h}, ed accessibili includendo detto +file.\footnote{come per TCP, la definizione delle opzioni effettivamente + supportate dal kernel si trova in realtà nel file \texttt{linux/udp.h}, dal + quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_udplevel}.} + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|c|c|c|l|l|} + \hline + \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}& + \textbf{Descrizione}\\ + \hline + \hline + \const{UDP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? + accumula tutti i dati su un unico pacchetto.\\ + \const{UDP\_ENCAP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? + non documentata.\\ + \hline + \end{tabular} + \caption{Le opzioni per i socket UDP disponibili al livello + \const{SOL\_UDP}.} + \label{tab:sock_opt_udplevel} +\end{table} + +Ancora una volta le descrizioni contenute tab.~\ref{tab:sock_opt_udplevel} +sono un semplice riferimento, una maggiore quantità di dettagli sulle +caratteristiche delle opzioni citate è quello dell'elenco seguente: +\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} + +\item[\const{UDP\_CORK}] Introdotta con il kernel 2.5.44 + +\item[\const{UDP\_ENCAP}] Introdotta con il kernel 2.5.67. + +\end{basedescript} + + + + \section{La gestione attraverso le funzioni di controllo} \label{sec:sock_ctrl_func} @@ -3025,18 +3312,19 @@ identificano le operazioni sono le seguenti: \item[\const{SIOCGSTAMP}] restituisce il contenuto di una struttura \struct{timeval} con la marca temporale dell'ultimo pacchetto ricevuto sul socket, questa operazione può essere utilizzata per effettuare delle - misurazioni precise del tempo di andata e ritorno\footnote{il cosiddetto - \itindex{round~trip~time} \textit{round trip time}.} dei pacchetti sulla - rete. + misurazioni precise del tempo di andata e ritorno\footnote{il + \itindex{Round~Trip~Time} \textit{Round Trip Time} cui abbiamo già + accennato in sez.~\ref{sec:net_tcp}.} dei pacchetti sulla rete. \item[\const{SIOCSPGRP}] imposta il processo o il \itindex{process~group} \textit{process group} a cui inviare i segnali \const{SIGIO} e \const{SIGURG} quando viene completata una operazione di I/O asincrono o - arrivano dei dati urgenti. Il terzo argomento deve essere un puntatore ad una - variabile di tipo \type{pid\_t}; un valore positivo indica direttamente il - \acr{pid} del processo, mentre un valore negativo indica (col valore - assoluto) il \textit{process group}. Senza privilegi di amministratore o la - capability \const{CAP\_KILL} si può impostare solo se stessi o il proprio + arrivano dei dati urgenti \itindex{out-of-band} (\texttt{out-of-band}). Il + terzo argomento deve essere un puntatore ad una variabile di tipo + \type{pid\_t}; un valore positivo indica direttamente il \acr{pid} del + processo, mentre un valore negativo indica (col valore assoluto) il + \textit{process group}. Senza privilegi di amministratore o la capability + \const{CAP\_KILL} si può impostare solo se stessi o il proprio \textit{process group}. \item[\const{SIOCGPGRP}] legge le impostazioni presenti sul socket @@ -3064,20 +3352,206 @@ processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con \const{SIOCGPGRP} e \const{SIOCSPGRP}. +\subsection{L'uso di \func{ioctl} per l'accesso ai dispositivi di rete} +\label{sec:sock_ioctl_netdevice} +Benché non strettamente attinenti alla gestione dei socket, vale la pena di +trattare qui l'interfaccia di accesso a basso livello ai dispositivi di rete +che viene appunto fornita attraverso la funzione \texttt{ioctl}. Questa non è +attinente a caratteristiche specifiche di un qualche protocollo, ma si applica a +tutti i socket, indipendentemente dal tipo o famiglia dello stesso, e permette +di impostare e rilevare le funzionalità delle interfacce di rete. -\subsection{L'uso di \func{ioctl} per i socket IP} -\label{sec:sock_ioctl_IP} +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/ifreq.h} + \end{minipage} + \caption{La struttura \structd{ifreq} utilizzata dalle \func{ioctl} per le + operazioni di controllo sui dispositivi di rete.} + \label{fig:netdevice_ifreq_struct} +\end{figure} + +Tutte le operazioni di questo tipo utilizzano come terzo argomento di +\func{ioctl} il puntatore ad una struttura \struct{ifreq}, la cui definizione +è illustrata in fig.~\ref{fig:netdevice_ifreq_struct}. Normalmente si utilizza +il primo campo della struttura, \var{ifr\_name} per specificare il nome +dell'interfaccia su cui si vuole operare (ad esempio \texttt{eth0}, +\texttt{ppp0}, ecc.), e si inseriscono (o ricevono) i valori relativi alle +diversa caratteristiche e funzionalità nel secondo campo, che come si può +notare è definito come una \ctyp{union} proprio in quanto il suo significato +varia a secondo dell'operazione scelta. + +Si tenga inoltre presente che alcune di queste operazioni (in particolare +quelle che modificano le caratteristiche dell'interfaccia) sono privilegiate e +richiedono i privilegi di amministratore o la \itindex{capabilities} +\textit{capability} \const{CAP\_NET\_ADMIN}, altrimenti si otterrà un errore +di \errval{EPERM}. Le costanti che identificano le operazioni disponibili +sono le seguenti: +\begin{basedescript}{\desclabelwidth{2.7cm}\desclabelstyle{\nextlinelabel}} +\item[\const{SIOCGIFNAME}] questa è l'unica operazione che usa il campo + \var{ifr\_name} per restituire un risultato, tutte le altre lo utilizzano + per indicare l'interfaccia sulla quale operare. L'operazione richiede che si + indichi nel campo \var{ifr\_ifindex} il valore numerico dell'\textsl{indice} + dell'interfaccia, e restituisce il relativo nome in \var{ifr\_name}. + + Il kernel infatti assegna ad ogni interfaccia un numero progressivo, detto + appunto \textit{interface index}, che è quello che effettivamente la + identifica nelle operazioni a basso livello, il nome dell'interfaccia è + soltanto una etichetta associata a detto \textsl{indice}, che permette di + rendere più comprensibile l'indicazione dell'interfaccia all'interno dei + comandi; si può ottenere un elenco delle interfacce che contiene anche il + valore del relativo indice usando il comando \cmd{ip link}. + +\item[\const{SIOCGIFINDEX}] restituisce nel campo \var{ifr\_ifindex} il valore + numerico dell'indice dell'interfaccia specificata con \var{ifr\_name}, è in + sostanza l'operazione inversa di \const{SIOCGIFNAME}. + +\item[\const{SIOCGIFFLAGS}] permette di ottenere nel campo \var{ifr\_flags} il + valore corrente dei flag dell'interfaccia specificata. Il valore restituito + è una maschera binaria i cui bit sono identificabili attraverso le varie + costanti di tab.~\ref{tab:netdevice_iface_flag}. + +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Flag} & \textbf{Significato} \\ + \hline + \hline + \const{IFF\_UP} & l'interfaccia è attiva.\\ + \const{IFF\_BROADCAST} & l'interfaccia ha impostato un indirizzo di + \itindex{broadcast} \textit{broadcast} valido.\\ + \const{IFF\_DEBUG} & è attivo il flag interno di debug.\\ + \const{IFF\_LOOPBACK} & l'interfaccia è una interfaccia di + \textit{loopback}.\\ + \const{IFF\_POINTOPOINT}& l'interfaccia è associata ad un collegamento + \textsl{punto-punto}.\\ + \const{IFF\_RUNNING} & l'interfaccia ha delle risorse allocate (non può + quindi essere disattivata).\\ + \const{IFF\_NOARP} & l'interfaccia ha il protocollo ARP disabilitato o + l'indirizzo del livello di rete non è impostato.\\ + \const{IFF\_PROMISC} & l'interfaccia è in \index{modo~promiscuo} + \textsl{modo promiscuo} (riceve cioè tutti i + pacchetti che vede passare, compresi quelli non + direttamente indirizzati a lei).\\ + \const{IFF\_NOTRAILERS}& evita l'uso di \textit{trailer} nei pacchetti.\\ + \const{IFF\_ALLMULTI} & riceve tutti i pacchetti di \itindex{multicast} + \textit{multicast}.\\ + \const{IFF\_MASTER} & l'interfaccia è il master di un bundle per il + bilanciamento di carico.\\ + \const{IFF\_SLAVE} & l'interfaccia è uno slave di un bundle per il + bilanciamento di carico.\\ + \const{IFF\_MULTICAST} & l'interfaccia ha il supporto per il + \textit{multicast} \itindex{multicast} attivo.\\ + \const{IFF\_PORTSEL} & l'interfaccia può impostare i suoi parametri + hardware (con l'uso di \struct{ifmap})..\\ + \const{IFF\_AUTOMEDIA} & l'interfaccia è in grado di selezionare + automaticamente il tipo di collegamento.\\ + \const{IFF\_DYNAMIC} & gli indirizzi assegnati all'interfaccia vengono + persi quando questa viene disattivata.\\ +% \const{IFF\_} & .\\ + \hline + \end{tabular} + \caption{Le costanti che identificano i vari bit della maschera binaria + \var{ifr\_flags} che esprime i flag di una interfaccia di rete.} + \label{tab:netdevice_iface_flag} +\end{table} + + +\item[\const{SIOCSIFFLAGS}] permette di impostare il valore dei flag + dell'interfaccia attraverso il valore della maschera binaria da passare nel + campo \var{ifr\_flags}, che può essere ottenuta con l'OR aritmetico delle + costanti di tab.~\ref{tab:netdevice_iface_flag}; questa operazione è + privilegiata. + +\item[\const{SIOCGIFMETRIC}] . +\item[\const{SIOCSIFMETRIC}] . +\item[\const{SIOCGIFMTU}] . +\item[\const{SIOCSIFMTU}] . +\item[\const{SIOCGIFHWADDR}] . +\item[\const{SIOCSIFHWADDR}] . +\item[\const{SIOCSIFHWBROADCAST}] . +\item[\const{SIOCGIFMAP}] . +\item[\const{SIOCSIFMAP}] . +\item[\const{SIOCADDMULTI}] . +\item[\const{SIOCDELMULTI}] . +\item[\const{SIOCGIFTXQLEN}] . +\item[\const{SIOCSIFTXQLEN}] . +\item[\const{SIOCSIFNAME}] . +\item[\const{SIOCGIFCONF}] . +\end{basedescript} -Oltre alle caratteristiche che si possono impostare per i socket generici, ci -sono operazioni specifiche valide per i socket IP, e per gli altri -protocolli. \subsection{L'uso di \func{ioctl} per i socket TCP e UDP} -\label{sec:sock_ioctl_TCP_UDP} +\label{sec:sock_ioctl_IP} +Non esistono operazioni specifiche per i socket IP in quanto tali,\footnote{a + parte forse \const{SIOCGIFCONF}, che però resta attinente alle proprietà + delle interfacce di rete, per cui l'abbiamo trattata in + sez.~\ref{sec:sock_ioctl_netdevice} insieme alle altre che comunque si + applicano anche ai socket IP.} mentre per i pacchetti di altri protocolli +trasportati su IP, qualora li si gestisca attraverso dei socket, si dovrà fare +riferimento direttamente all'eventuale supporto presente per il tipo di socket +usato: ad esempio si possono ricevere pacchetti ICMP con socket di tipo +\texttt{raw}, nel qual caso si dovrà fare riferimento alle operazioni di +quest'ultimo. + +Tuttavia la gran parte dei socket utilizzati nella programmazione di rete +utilizza proprio il protocollo IP, e quello che succede è che in realtà la +funzione \func{ioctl} consente di effettuare alcune operazioni specifiche per +i socket che usano questo protocollo, ma queste vendono eseguite, invece che a +livello di IP, al successivo livello di trasporto, vale a dire in maniera +specifica per i socket TCP e UDP. + +Le operazioni di controllo disponibili per i socket TCP sono illustrate dalla +relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, e prevedono +come possibile valore per il secondo argomento della funzione le costanti +illustrate nell'elenco seguente; il terzo argomento della funzione, gestito +come \itindex{value~result~argument} \textit{value result argument}, deve +essere sempre il puntatore ad una variabile di tipo \ctyp{int}: +\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} +\item[\const{SIOCINQ}] restituisce la quantità di dati non ancora letti + presenti nel buffer di ricezione; il socket non deve essere in stato + \texttt{LISTEN}, altrimenti si avrà un errore di \errval{EINVAL}. +\item[\const{SIOCATMARK}] ritorna un intero non nullo, da intendere come + valore logico, se il flusso di dati letti sul socket è arrivato sulla + posizione (detta anche \textit{urgent mark}) in cui sono stati ricevuti + \itindex{out-of-band} dati urgenti (vedi sez.~\ref{sec:TCP_urgent_data}). + Una operazione di lettura da un socket non attraversa mai questa posizione, + per cui è possibile controllare se la si è raggiunta o meno con questa + operazione. + + Questo è utile quando si attiva l'opzione \const{SO\_OOBINLINE} (vedi + sez.~\ref{sec:sock_generic_options}) per ricevere i dati urgenti all'interno + del flusso dei dati ordinari del socket;\footnote{vedremo in + sez.~\ref{sec:TCP_urgent_data} che in genere i dati urgenti presenti su un + socket si leggono \textit{out-of-band} usando un opportuno flag per + \func{recvmsg}.} in tal caso quando \const{SIOCATMARK} restituisce un + valore non nullo si saprà che la successiva lettura dal socket restituirà i + dati urgenti e non il normale traffico; torneremo su questo in maggior + dettaglio in sez.~\ref{sec:TCP_urgent_data}. + +\item[\const{SIOCOUTQ}] restituisce la quantità di dati non ancora inviati + presenti nel buffer di spedizione; come per \const{SIOCINQ} il socket non + deve essere in stato \texttt{LISTEN}, altrimenti si avrà un errore di + \errval{EINVAL}. +\end{basedescript} +Le operazioni di controllo disponibili per i socket UDP, anch'esse illustrate +dalla relativa pagina di manuale accessibile con \texttt{man 7 udp}, sono +quelle indicate dalle costanti del seguente elenco; come per i socket TCP il +terzo argomento viene gestito come \itindex{value~result~argument} +\textit{value result argument} e deve essere un puntatore ad una variabile di +tipo \ctyp{int}: +\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} +\item[\const{FIONREAD}] restituisce la dimensione in byte del primo pacchetto + in attesa di ricezione, o 0 qualora non ci sia nessun pacchetto. +\item[\const{TIOCOUTQ}] restituisce il numero di byte presenti nella coda di + invio locale; questa opzione è supportata soltanto a partire dal kernel 2.4 +\end{basedescript} @@ -3092,7 +3566,6 @@ funzionalit \texttt{/proc}, le tratteremo attraverso i file presenti in quest'ultimo. - \subsection{L'uso di \func{sysctl} e \texttt{/proc} per le proprietà della rete} \label{sec:sock_sysctl} @@ -3133,19 +3606,18 @@ sottonodi di quest'ultima sono mappati come file e directory sotto \texttt{/proc/sys/}, non è vero il contrario, ed in particolare Linux consente di impostare alcuni parametri o leggere lo stato della rete a livello di sistema sotto \texttt{/proc/net}, dove sono presenti dei file che non -corrispondono a nessun nodi di \func{sysctl}. - +corrispondono a nessun nodo di \func{sysctl}. \subsection{I valori di controllo per i socket generici} \label{sec:sock_gen_sysctl} Nella directory \texttt{/proc/sys/net/core} sono presenti i file -corrispondenti ai parametri generici validi per tutti i socket. Quelli -descritti anche nella pagina di manuale, accessibile con \texttt{man 7 socket} -sono i seguenti: +corrispondenti ai parametri generici di \textit{sysctl} validi per tutti i +socket. Quelli descritti anche nella pagina di manuale, accessibile con +\texttt{man 7 socket} sono i seguenti: -\begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}} +\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} \item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di lettura (cioè per i dati in ingresso) dei socket. \item[\texttt{rmem\_max}] imposta la dimensione massima che si può assegnare al @@ -3156,60 +3628,96 @@ sono i seguenti: \item[\texttt{wmem\_max}] imposta la dimensione massima che si può assegnare al buffer di uscita dei socket attraverso l'uso dell'opzione \const{SO\_SNDBUF}. -\item[\texttt{message\_cost}, \texttt{message\_burst}] impostano i valori - delle impostazioni del \itindex{bucket~filter} \textit{bucket filter} - (rispettivamente flusso a regime e dimensione di picchi di emissione) che - limita l'ammontare dei messaggi di avvertimento inviati dal kernel a causa - di eventi esterni sulla rete. -% TODO: spiegare il bucket filter e questa opzione +\item[\texttt{message\_cost}, \texttt{message\_burst}] contengono le + impostazioni del \itindex{bucket~filter} \textit{bucket filter} che + controlla l'emissione di messaggi di avviso da parte kernel per eventi + relativi a problemi sulla rete, imponendo un limite che consente di + prevenire eventuali attacchi di \itindex{Denial~of~Service~(DoS)} + \textit{Denial of Service} usando i log.\footnote{senza questo limite un + attaccante potrebbe inviare ad arte un traffico che generi + intenzionalmente messaggi di errore, per saturare il sistema dei log.} + + Il \itindex{bucket~filter} \textit{bucket filter} è un algoritmo generico + che permette di impostare dei limiti di flusso su una quantità\footnote{uno + analogo viene usato nel \index{netfilter} \textit{netfilter} per imporre + dei limiti sul flusso dei pacchetti.} senza dovere eseguire medie + temporali, che verrebbero a dipendere in misura non controllabile dalla + dimensione dell'intervallo su cui si media e dalla distribuzione degli + eventi;\footnote{in caso di un picco di flusso (il cosiddetto + \textit{burst}) il flusso medio verrebbe a dipendere in maniera esclusiva + dalla dimensione dell'intervallo di tempo su cui calcola la media.} in + questo caso si definisce la dimensione di un ``\textsl{bidone}'' (il + \textit{bucket}) e del flusso che da esso può uscire, la presenza di una + dimensione iniziale consente di assorbire eventuali picchi di emissione, + l'aver fissato un flusso di uscita garantisce che a regime questo sarà il + valore medio del flusso ottenibile dal \textit{bucket}. + + I due valori indicano rispettivamente il flusso a regime (non sarà inviato + più di un messaggio per il numero di secondi specificato da + \texttt{message\_cost}) e la dimensione iniziale per in caso di picco di + emissione (verranno accettati inizialmente fino ad un massimo di + \texttt{message\_cost/message\_burst} messaggi). + \item[\texttt{netdev\_max\_backlog}] numero massimo di pacchetti che possono essere contenuti nella coda di ingresso generale. + \item[\texttt{optmem\_max}] lunghezza massima dei dati ancillari e di controllo (vedi sez.~\ref{sec:net_ancillary_data}). \end{basedescript} -Oltre a questi si trovano alcuni ulteriori file, la cui documentazione si -trova nel file ... +Oltre a questi nella directory \texttt{/proc/sys/net/core} si trovano altri +file, la cui documentazione dovrebbe essere mantenuta nei sorgenti del kernel, +nel file \texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di +questi però non è documentato: +\begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}} +\item[\texttt{dev\_weight}] blocco di lavoro (\textit{work quantum}) dello + scheduler di processo dei pacchetti. % TODO da documentare meglio -\begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}} -\item[\texttt{dev\_weight}] +\item[\texttt{lo\_cong}] valore per l'occupazione della coda di ricezione + sotto la quale si considera di avere una bassa congestione. -\item[\texttt{lo\_cong}] +\item[\texttt{mod\_cong}] valore per l'occupazione della coda di ricezione + sotto la quale si considera di avere una congestione moderata. -\item[\texttt{mod\_cong}] +\item[\texttt{no\_cong}] valore per l'occupazione della coda di ricezione + sotto la quale si si considera di non avere congestione. -\item[\texttt{no\_cong}] +\item[\texttt{no\_cong\_thresh}] valore minimo (\textit{low water mark}) per + il riavvio dei dispositivi congestionati. -\item[\texttt{no\_cong\_thresh}] +%\item[\texttt{netdev\_fastroute}] è presente soltanto quando si è compilato il +% kernel con l'apposita opzione di ottimizzazione per l'uso come router (. -\item[\texttt{somaxconn}] +\item[\texttt{somaxconn}] imposta la dimensione massima del \textit{backlog} + della funzione \func{listen} (vedi sez.~\ref{sec:TCP_func_listen}), e + corrisponde al valore della costante \const{SOMAXCONN}; il suo valore di + default è 128. \end{basedescript} \subsection{I valori di controllo per il protocollo IPv4} -\label{sec:sock_gen_sysctl} +\label{sec:sock_ipv4_sysctl} Nella directory \texttt{/proc/sys/net/ipv4} sono presenti i file che corrispondono ai parametri dei socket che usano il protocollo IPv4, relativi quindi sia alle caratteristiche di IP, che a quelle degli altri protocolli che -vengono usati all'interno di quest'ultimo (come ICMP, TCP e UDP). Nella -stessa directory sono presenti altri file che consentono anche di gestire le -altre funzionalità generiche dei vari protocolli. +vengono usati all'interno di quest'ultimo (come ICMP, TCP e UDP) o a fianco +dello stesso (come ARP). I file che consentono di controllare le caratteristiche specifiche del protocollo IP in quanto tale, descritti anche nella pagina di manuale accessibile con \texttt{man 7 ip}, sono i seguenti: -\begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}} +\begin{basedescript}{\desclabelwidth{3.5cm}\desclabelstyle{\nextlinelabel}} \item[\texttt{ip\_default\_ttl}] imposta il valore di default per il campo TTL (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti. Il valore può - essere modificato per il singolo socket con l'opzione - \const{IP\_TTL}. Prende un valore intero. + essere modificato per il singolo socket con l'opzione \const{IP\_TTL}. + Prende un valore intero. \item[\texttt{ip\_forward}] abilita l'inoltro dei pacchetti da una interfaccia - ad un altra, e può essere impostato anche per la singola - interfaccia. Prende un valore logico (0 disabilita, diverso da zero abilita). + ad un altra, e può essere impostato anche per la singola interfaccia. Prende + un valore logico (0 disabilita, diverso da zero abilita). \item[\texttt{ip\_dynaddr}] Abilita la riscrittura automatica degli indirizzi associati ad un socket quando una interfaccia cambia indirizzo. Viene usato @@ -3218,7 +3726,8 @@ accessibile con \texttt{man 7 ip}, sono i seguenti: valore nullo disabilita la funzionalità, con 1 la si abilita, con 2 la si abilità in modalità \textsl{prolissa}. -\item[\texttt{ip\_autoconfig}] non documentato +\item[\texttt{ip\_autoconfig}] Specifica se l'indirizzo IP è stato configurato + automaticamente via DHCP, BOOTP o RARP. \item[\texttt{ip\_local\_port\_range}] imposta l'intervallo dei valori usati per l'assegnazione delle porte effimere, permette cioè di modificare i @@ -3250,15 +3759,101 @@ accessibile con \texttt{man 7 ip}, sono i seguenti: di compilazione del kernel con l'opzione \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.} -\item[\texttt{neigh/*}] La directory contiene i valori - +\item[\texttt{ip\_nonlocal\_bind}] se abilitato (prende un intero come valore + logico) è possibile che una applicazione possa collegarsi (con \func{bind} + su un indirizzo non locale. Questo può risultare utile per applicazioni + particolari (come gli \textit{sniffer}) che hanno la necessità di ricevere + pacchetti anche non diretti agli indirizzi presenti sulla macchina, ad + esempio per intercettare il traffico per uno specifico indirizzo che si + vuole tenere sotto controllo. +% \item[\texttt{neigh/*}] La directory contiene i valori +% TODO trattare neigh/* nella parte su arp, da capire dove sarà. \end{basedescript} +I file di \texttt{/proc/sys/net/ipv4} che invece fanno riferimento alle +caratteristiche specifiche del protocollo TCP, elencati anche nella rispettiva +pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: +\begin{basedescript}{\desclabelwidth{3.9cm}\desclabelstyle{\nextlinelabel}} +\item[\texttt{tcp\_abort\_on\_overflow}] +\item[\texttt{tcp\_adv\_win\_scale}] +\item[\texttt{tcp\_app\_win}] +\item[\texttt{tcp\_bic\_low\_window}] +\item[\texttt{tcp\_bic\_fast\_convergence}] +\item[\texttt{tcp\_dsack}] +\item[\texttt{tcp\_ecn}] +\item[\texttt{tcp\_fack}] + +\item[\texttt{tcp\_fin\_timeout}] specifica il numero di secondi (il default è + 60\footnote{nei kernel della serie 2.2.x era invece di 120 secondi.}) da + passare in stato \texttt{FIN\_WAIT2} nell'attesa delle ricezione del + pacchetto FIN conclusivo, passati quali il socket viene comunque chiuso + forzatamente. L'uso di questa opzione realizza quella che in sostanza è una + violazione delle specifiche del protocollo TCP, ma è utile per fronteggiare + alcuni attacchi di \itindex{Denial~of~Service~(DoS)} \textit{Denial of + Service}. + + +\item[\texttt{tcp\_frto}] +\item[\texttt{tcp\_keepalive\_intvl}] +\item[\texttt{tcp\_keepalive\_probes}] +\item[\texttt{tcp\_keepalive\_time}] +\item[\texttt{tcp\_low\_latency}] +\item[\texttt{tcp\_max\_orphans}] + +\item[\texttt{tcp\_max\_syn\_backlog}] un numero intero che indica la + lunghezza della coda delle connessioni incomplete, cioè delle connessioni + per le quali si è ricevuto un SYN di richiesta ma non l'ACK finale del + \itindex{three~way~handshake} \textit{three way handshake} (si riveda quanto + illustrato in sez.\ref{sec:TCP_func_listen}). + + Quando questo valore è superato il kernel scarterà immediatamente ogni + ulteriore richiesta di connessione. Il valore di default (che è 256) viene + automaticamente portato a 1024 qualora nel sistema ci sia sufficiente + memoria (se maggiore di 128Mb) e ridotto a 128 qualora la memoria sia poca + (inferiore a 32Mb).\footnote{si raccomanda, qualora si voglia aumentare il + valore oltre 1024, di seguire la procedura citata nella pagina di manuale + di TCP, e modificare il valore della costante \texttt{TCP\_SYNQ\_HSIZE} + nel file \texttt{include/net/tcp.h} dei sorgenti del kernel, in modo che + sia $\mathtt{tcp\_max\_syn\_backlog} \ge \mathtt{16*TCP\_SYNQ\_HSIZE}$, + per poi ricompilare il kernel.} + +\item[\texttt{tcp\_max\_tw\_buckets}] +\item[\texttt{tcp\_mem}] +\item[\texttt{tcp\_orphan\_retries}] +\item[\texttt{tcp\_reordering}] +\item[\texttt{tcp\_retrans\_collapse}] +\item[\texttt{tcp\_retries1}] + +\item[\texttt{tcp\_retries2}] imposta il numero di tentativi di ritrasmissione + (il default è 15) di un pacchetto inviato su una connessione già stabilita + per il quale non si sia ricevuto una risposta di ACK (si veda anche quanto + illustrato in sez.~\ref{sec:TCP_server_crash}). + + +\item[\texttt{tcp\_rfc1337}] +\item[\texttt{tcp\_rmem}] +\item[\texttt{tcp\_sack}] +\item[\texttt{tcp\_stdurg}] +\item[\texttt{tcp\_synack\_retries}] +\item[\texttt{tcp\_syncookies}] + +\item[\texttt{tcp\_syn\_retries}] imposta il numero di tentativi (il default è + 5) di ritrasmissione dei pacchetti SYN di inizio connessione del + \itindex{three~way~handshake} \textit{three way handshake} (si ricordi + quanto illustrato in sez.\ref{sec:TCP_func_connect}). Il valore non deve + superare 255. + +\item[\texttt{tcp\_timestamps}] +\item[\texttt{tcp\_tw\_recycle}] +\item[\texttt{tcp\_tw\_reuse}] +\item[\texttt{tcp\_window\_scaling}] +\item[\texttt{tcp\_vegas\_cong\_avoid}] +\item[\texttt{tcp\_westwood}] +\item[\texttt{tcp\_wmem}] +\end{basedescript} -I parametri specifiv - % LocalWords: socket sez dotted decimal resolver Domain Name Service cap DNS % LocalWords: client fig LDAP Lightweight Access Protocol NIS Information Sun @@ -3319,4 +3914,16 @@ I parametri specifiv %%% mode: latex %%% TeX-master: "gapil" %%% End: -% LocalWords: quest'ultime neigh +% LocalWords: quest'ultime neigh dev weight cong mod somaxconn Di SIOCINQ DoS +% LocalWords: Documentation SIOCATMARK SIOCOUTQ FIONREAD TIOCOUTQ Denial work +% LocalWords: netfilter scheduler mark ARP DHCP BOOTP RARP nonlocal sniffer +% LocalWords: linux NODELAY MAXSEG CORK KEEPIDLE KEEPINTVL KEEPCNT SYNCNT INFO +% LocalWords: DEFER ACCEPT WINDOW CLAMP QUICKACK CONGESTION ENCAP urgent MSS +% LocalWords: Segment SYN accept advertised window info quickack Nagle ifreq +% LocalWords: ifr ppp union EPERM SIOCGIFNAME dell' interface index IFF NOARP +% LocalWords: SIOCGIFINDEX SIOCGIFFLAGS POINTOPOINT RUNNING PROMISC NOTRAILERS +% LocalWords: ALLMULTI bundle PORTSEL ifmap AUTOMEDIA DYNAMIC SIOCSIFFLAGS +% LocalWords: SIOCGIFMETRIC SIOCSIFMETRIC SIOCGIFMTU SIOCSIFMTU SIOCGIFHWADDR +% LocalWords: SIOCSIFHWADDR SIOCSIFHWBROADCAST SIOCGIFMAP SIOCSIFMAP +% LocalWords: SIOCADDMULTI SIOCDELMULTI SIOCGIFTXQLEN SIOCSIFTXQLEN +% LocalWords: SIOCSIFNAME SIOCGIFCONF