X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=sockctrl.tex;h=a2323e3e25c1143c9bd0d0e5065bf62125466b32;hb=fb0b0f1382c6f931f1ab929aef90dd6fc8c482fd;hp=9c8c95f795d25cf8a5d236b753ed6bc03d5d4144;hpb=419951b29856965957fe4cacfb61de49e140bb9b;p=gapil.git diff --git a/sockctrl.tex b/sockctrl.tex index 9c8c95f..a2323e3 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -85,19 +85,19 @@ funzioni di librerie utilizzate dai programmi, vale la pena fare una panoramica generale. Originariamente la configurazione del \textit{resolver} riguardava esclusivamente le questioni relative alla gestione dei nomi a dominio, e prevedeva solo l'utilizzo del DNS e del file statico -\file{/etc/hosts}. +\conffile{/etc/hosts}. Per questo aspetto il file di configurazione principale del sistema è -\file{/etc/resolv.conf} che contiene in sostanza l'elenco degli indirizzi IP -dei server DNS da contattare; a questo si affianca il file -\file{/etc/host.conf} il cui scopo principale è indicare l'ordine in cui -eseguire la risoluzione dei nomi (se usare prima i valori di \file{/etc/hosts} -o quelli del DNS). Tralasciamo i dettagli relativi alle varie direttive che -possono essere usate in questi file, che si trovano nelle rispettive pagine di -manuale. +\conffile{/etc/resolv.conf} che contiene in sostanza l'elenco degli indirizzi +IP dei server DNS da contattare; a questo si affianca il file +\conffile{/etc/host.conf} il cui scopo principale è indicare l'ordine in cui +eseguire la risoluzione dei nomi (se usare prima i valori di +\conffile{/etc/hosts} o quelli del DNS). Tralasciamo i dettagli relativi alle +varie direttive che possono essere usate in questi file, che si trovano nelle +rispettive pagine di manuale. Con il tempo però è divenuto possibile fornire diversi sostituti per -l'utilizzo delle associazione statiche in \file{/etc/hosts}, inoltre oltre +l'utilizzo delle associazione statiche in \conffile{/etc/hosts}, inoltre oltre alla risoluzione dei nomi a dominio ci sono anche altri nomi da risolvere, come quelli che possono essere associati ad una rete (invece che ad una singola macchina) o ai gruppi di macchine definiti dal servizio @@ -107,16 +107,17 @@ NIS,\footnote{il \textit{Network Information Service} \textit{netgroup}) varie macchine, centralizzando i servizi di definizione di utenti e gruppi e di autenticazione, oggi è sempre più spesso sostituito da LDAP.} o come quelli dei protocolli e dei servizi che sono mantenuti nei -file statici \file{/etc/protocols} e \file{/etc/services}. Molte di queste -informazioni non si trovano su un DNS, ma in una rete locale può essere molto -utile centralizzare il mantenimento di alcune di esse su opportuni server. -Inoltre l'uso di diversi supporti possibili per le stesse informazioni (ad -esempio il nome delle macchine può essere mantenuto sia tramite -\file{/etc/hosts}, che con il DNS, che con NIS) comporta il problema -dell'ordine in cui questi vengono interrogati.\footnote{con le implementazioni - classiche i vari supporti erano introdotti modificando direttamente le - funzioni di libreria, prevedendo un ordine di interrogazione predefinito e - non modificabile (a meno di una ricompilazione delle librerie stesse).} +file statici \conffile{/etc/protocols} e \conffile{/etc/services}. Molte di +queste informazioni non si trovano su un DNS, ma in una rete locale può essere +molto utile centralizzare il mantenimento di alcune di esse su opportuni +server. Inoltre l'uso di diversi supporti possibili per le stesse +informazioni (ad esempio il nome delle macchine può essere mantenuto sia +tramite \conffile{/etc/hosts}, che con il DNS, che con NIS) comporta il +problema dell'ordine in cui questi vengono interrogati.\footnote{con le + implementazioni classiche i vari supporti erano introdotti modificando + direttamente le funzioni di libreria, prevedendo un ordine di interrogazione + predefinito e non modificabile (a meno di una ricompilazione delle librerie + stesse).} \itindbeg{Name~Service~Switch} Per risolvere questa serie di problemi la risoluzione dei nomi a dominio @@ -169,21 +170,21 @@ tab.~\ref{tab:sys_NSS_classes}. \label{tab:sys_NSS_classes} \end{table} -Il sistema del \textit{Name Service Switch} è controllato dal contenuto del -file \file{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo una - convezione comune per i file di configurazione le righe vuote vengono - ignorate e tutto quello che segue un carattere ``\texttt{\#}'' viene - considerato un commento.} di configurazione per ciascuna di queste classi, -che viene inizia col nome di tab.~\ref{tab:sys_NSS_classes} seguito da un -carattere ``\texttt{:}'' e prosegue con la lista dei \textsl{servizi} su cui -le relative informazioni sono raggiungibili, scritti nell'ordine in cui si +Il sistema del \textit{Name Service Switch} è controllato dal contenuto del +file \conffile{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo + una convezione comune per i file di configurazione le righe vuote vengono + ignorate e tutto quello che segue un carattere ``\texttt{\#}'' viene + considerato un commento.} di configurazione per ciascuna di queste classi, +che viene inizia col nome di tab.~\ref{tab:sys_NSS_classes} seguito da un +carattere ``\texttt{:}'' e prosegue con la lista dei \textsl{servizi} su cui +le relative informazioni sono raggiungibili, scritti nell'ordine in cui si vuole siano interrogati. -Ogni servizio è specificato a sua volta da un nome, come \texttt{file}, -\texttt{dns}, \texttt{db}, ecc. che identifica la libreria dinamica che -realizza l'interfaccia con esso. Per ciascun servizio se \texttt{NAME} è il -nome utilizzato dentro \file{/etc/nsswitch.conf}, dovrà essere presente -(usualmente in \file{/lib}) una libreria \texttt{libnss\_NAME} che ne +Ogni servizio è specificato a sua volta da un nome, come \texttt{file}, +\texttt{dns}, \texttt{db}, ecc. che identifica la libreria dinamica che +realizza l'interfaccia con esso. Per ciascun servizio se \texttt{NAME} è il +nome utilizzato dentro \conffile{/etc/nsswitch.conf}, dovrà essere presente +(usualmente in \file{/lib}) una libreria \texttt{libnss\_NAME} che ne implementa le funzioni. In ogni caso, qualunque sia la modalità con cui ricevono i dati o il supporto @@ -1031,14 +1032,14 @@ colonna. \multicolumn{2}{|c|}{\textbf{Funzioni}}\\ \hline \hline - indirizzo&\file{/etc/hosts}&\struct{hostent}&\func{gethostbyname}& - \func{gethostbyaddr}\\ - servizio &\file{/etc/services}&\struct{servent}&\func{getservbyname}& - \func{getservbyaddr}\\ - rete &\file{/etc/networks}&\struct{netent}&\func{getnetbyname}& - \func{getnetbyaddr}\\ - protocollo&\file{/etc/protocols}&\struct{protoent}&\func{getprotobyname}& - \func{getprotobyaddr}\\ + indirizzo &\conffile{/etc/hosts}&\struct{hostent}&\func{gethostbyname}& + \func{gethostbyaddr}\\ + servizio &\conffile{/etc/services}&\struct{servent}&\func{getservbyname}& + \func{getservbyaddr}\\ + rete &\conffile{/etc/networks}&\struct{netent}&\func{getnetbyname}& + \func{getnetbyaddr}\\ + protocollo&\conffile{/etc/protocols}&\struct{protoent}& + \func{getprotobyname}&\func{getprotobyaddr}\\ \hline \end{tabular} \caption{Funzioni di risoluzione dei nomi per i vari servizi del @@ -1071,12 +1072,12 @@ viceversa; i loro prototipi sono: Entrambe le funzioni prendono come ultimo argomento una stringa \param{proto} che indica il protocollo per il quale si intende effettuare la -ricerca,\footnote{le informazioni mantenute in \file{/etc/services} infatti - sono relative sia alle porte usate su UDP che su TCP, occorre quindi +ricerca,\footnote{le informazioni mantenute in \conffile{/etc/services} + infatti sono relative sia alle porte usate su UDP che su TCP, occorre quindi specificare a quale dei due protocolli si fa riferimento.} che nel caso si IP può avere come valori possibili solo \texttt{udp} o \texttt{tcp};\footnote{in teoria si potrebbe avere un qualunque protocollo fra - quelli citati in \file{/etc/protocols}, posto che lo stesso supporti il + quelli citati in \conffile{/etc/protocols}, posto che lo stesso supporti il concetto di \textsl{porta}, in pratica questi due sono gli unici presenti.} se si specifica un puntatore nullo la ricerca sarà eseguita su un protocollo qualsiasi. @@ -1084,14 +1085,14 @@ qualsiasi. Il primo argomento è il nome del servizio per \func{getservbyname}, specificato tramite la stringa \param{name}, mentre \func{getservbyport} richiede il numero di porta in \param{port}. Entrambe le funzioni eseguono una -ricerca sul file \file{/etc/services}\footnote{il \textit{Name Service Switch} - astrae il concetto a qualunque supporto su cui si possano mantenere i - suddetti dati. } ed estraggono i dati dalla prima riga che corrisponde agli -argomenti specificati; se la risoluzione ha successo viene restituito un -puntatore ad una apposita struttura \struct{servent} contenente tutti i -risultati), altrimenti viene restituito un puntatore nullo. Si tenga presente -che anche in questo caso i dati vengono mantenuti in una area di memoria -statica e che quindi la funzione non è rientrante. +ricerca sul file \conffile{/etc/services}\footnote{il \textit{Name Service + Switch} astrae il concetto a qualunque supporto su cui si possano + mantenere i suddetti dati. } ed estraggono i dati dalla prima riga che +corrisponde agli argomenti specificati; se la risoluzione ha successo viene +restituito un puntatore ad una apposita struttura \struct{servent} contenente +tutti i risultati), altrimenti viene restituito un puntatore nullo. Si tenga +presente che anche in questo caso i dati vengono mantenuti in una area di +memoria statica e che quindi la funzione non è rientrante. \begin{figure}[!htb] \footnotesize \centering @@ -1128,13 +1129,13 @@ prototipi sono: \begin{functions} \headdecl{netdb.h} \funcdecl{void setservent(int stayopen)} - Apre il file \file{/etc/services} e si posiziona al suo inizio. + Apre il file \conffile{/etc/services} e si posiziona al suo inizio. \funcdecl{struct servent *getservent(void)} - Legge la voce successiva nel file \file{/etc/services}. + Legge la voce successiva nel file \conffile{/etc/services}. \funcdecl{void endservent(void)} - Chiude il file \file{/etc/services}. + Chiude il file \conffile{/etc/services}. \bodydesc{Le due funzioni \func{setservent} e \func{endservent} non restituiscono nulla, \func{getservent} restituisce il puntatore ad una @@ -1143,11 +1144,11 @@ prototipi sono: \end{functions} La prima funzione, \func{getservent}, legge una singola voce a partire dalla -posizione corrente in \file{/etc/services}, pertanto si può eseguire una +posizione corrente in \conffile{/etc/services}, pertanto si può eseguire una lettura sequenziale dello stesso invocandola più volte. Se il file non è aperto provvede automaticamente ad aprirlo, nel qual caso leggerà la prima voce. La seconda funzione, \func{setservent}, permette di aprire il file -\file{/etc/services} per una successiva lettura, ma se il file è già stato +\conffile{/etc/services} per una successiva lettura, ma se il file è già stato aperto riporta la posizione di lettura alla prima voce del file, in questo modo si può far ricominciare da capo una lettura sequenziale. L'argomento \param{stayopen}, se diverso da zero, fa sì che il file resti aperto anche fra @@ -1317,7 +1318,7 @@ valore nullo. Il campo \var{ai\_protocol} permette invece di effettuare la selezione dei risultati per il nome del servizio usando il numero identificativo del rispettivo protocollo di trasporto (i cui valori possibili sono riportati in -\file{/etc/protocols}); di nuovo i due soli valori utilizzabili sono quelli +\conffile{/etc/protocols}); di nuovo i due soli valori utilizzabili sono quelli relativi a UDP e TCP, o il valore nullo che indica di ignorare questo campo nella selezione. @@ -1694,7 +1695,7 @@ l'uso dei socket. La funzione prende quattro argomenti, i primi due sono le stringhe che indicano il nome della macchina a cui collegarsi ed il relativo servizio su cui sarà effettuata la risoluzione; seguono il protocollo da usare (da -specificare con il valore numerico di \file{/etc/protocols}) ed il tipo di +specificare con il valore numerico di \conffile{/etc/protocols}) ed il tipo di socket (al solito specificato con i valori illustrati in sez.~\ref{sec:sock_type}). La funzione ritorna il valore del file descriptor associato al socket (un numero positivo) in caso di successo, o -1 in caso di @@ -1897,7 +1898,7 @@ qualunque tipo di socket. I valori usati per \param{level}, corrispondenti ad un dato protocollo usato da un socket, sono quelli corrispondenti al valore numerico che identifica il -suddetto protocollo in \file{/etc/protocols}; dato che la leggibilità di un +suddetto protocollo in \conffile{/etc/protocols}; dato che la leggibilità di un programma non trarrebbe certo beneficio dall'uso diretto dei valori numerici, più comunemente si indica il protocollo tramite le apposite costanti \texttt{SOL\_*} riportate in tab.~\ref{tab:sock_option_levels}, dove si sono @@ -1906,7 +1907,7 @@ riassunti i valori che possono essere usati per l'argomento confusa: infatti in Linux il valore si può impostare sia usando le costanti \texttt{SOL\_*}, che le analoghe \texttt{IPPROTO\_*} (citate anche da Stevens in \cite{UNP1}); entrambe hanno gli stessi valori che sono - equivalenti ai numeri di protocollo di \file{/etc/protocols}, con una + equivalenti ai numeri di protocollo di \conffile{/etc/protocols}, con una eccezione specifica, che è quella del protocollo ICMP, per la quale non esista una costante, il che è comprensibile dato che il suo valore, 1, è quello che viene assegnato a \const{SOL\_SOCKET}.} @@ -2260,8 +2261,10 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: 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 + \textit{sysctl}\footnote{cioè \procrelfile{/proc/sys/net/core}{wmem\_max} e + \procrelfile{/proc/sys/net/core}{rmem\_max} in \texttt{/proc/sys/net/core} + e \procrelfile{/proc/sys/net/ipv4}{tcp\_wmem} e + \procrelfile{/proc/sys/net/ipv4}{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 @@ -2298,9 +2301,23 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: 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} + +\item[\const{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un + socket un filtro di pacchetti che consente di selezionare quali pacchetti, + fra tutti quelli ricevuti, verranno letti. Viene usato pincipalmente con i + socket di tipo \const{PF\_PACKET} con la libreria \texttt{libpcap} per + implementare programmi di cattura dei pacchetti, torneremo su questo in + sez.~\ref{sec:packet_socket}. + +\item[\const{SO\_DETACH\_FILTER}] consente di distaccare un filtro + precedentemente aggiunto ad un socket. % TODO documentare SO_ATTACH_FILTER e SO_DETACH_FILTER +% riferimenti http://www.rcpt.to/lsfcc/lsf.html +% Documentation/networking/filter.txt + + +\end{basedescript} \subsection{L'uso delle principali opzioni dei socket} @@ -2921,11 +2938,12 @@ sez.~\ref{sec:net_sendmsg}). ricerca è disabilitata ed è responsabilità del programma creare pacchetti di dimensioni appropriate e ritrasmettere eventuali pacchetti persi. Se l'opzione viene abilitata, il kernel si incaricherà di tenere traccia - automaticamente della \textit{Path MTU} verso ciascuna destinazione, e - rifiuterà immediatamente la trasmissione di pacchetti di dimensioni maggiori - della MTU con un errore di \errval{EMSGSIZE}.\footnote{in caso contrario la - trasmissione del pacchetto sarebbe effettuata, ottenendo o un fallimento - successivo della trasmissione, o la frammentazione dello stesso.} + automaticamente della \itindex{Maximum~Transfer~Unit} \textit{Path MTU} + verso ciascuna destinazione, e rifiuterà immediatamente la trasmissione di + pacchetti di dimensioni maggiori della MTU con un errore di + \errval{EMSGSIZE}.\footnote{in caso contrario la trasmissione del pacchetto + sarebbe effettuata, ottenendo o un fallimento successivo della + trasmissione, o la frammentazione dello stesso.} \item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU} di percorso del socket. L'opzione richiede per \param{optval} un intero che @@ -3163,11 +3181,11 @@ quantit Si usa molto spesso \const{TCP\_CORK} quando si effettua il trasferimento diretto di un blocco di dati da un file ad un socket con \func{sendfile} - (vedi sez.~\ref{sec:file_sendfile}), per inserire una intestazione prima - della chiamata a questa funzione; senza di essa l'intestazione potrebbe - venire spedita in un segmento a parte, che a seconda delle condizioni - potrebbe richiedere anche una risposta di ACK, portando ad una notevole - penalizzazione delle prestazioni. + (vedi sez.~\ref{sec:file_sendfile_splice}), per inserire una intestazione + prima della chiamata a questa funzione; senza di essa l'intestazione + potrebbe venire spedita in un segmento a parte, che a seconda delle + condizioni potrebbe richiedere anche una risposta di ACK, portando ad una + notevole penalizzazione delle prestazioni. Si tenga presente che l'implementazione corrente di \const{TCP\_CORK} non consente di bloccare l'invio dei dati per più di 200 millisecondi, passati i @@ -3203,7 +3221,7 @@ quantit 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 per il singolo socket il valore + sez.~\ref{sec:TCP_func_connect}). Sovrascrive per il singolo socket 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 @@ -3969,24 +3987,25 @@ socket. Quelli descritti anche nella pagina di manuale, accessibile con \texttt{man 7 socket} sono i seguenti: \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 - buffer di ingresso dei socket attraverso l'uso dell'opzione - \const{SO\_RCVBUF}. -\item[\texttt{wmem\_default}] imposta la dimensione di default del buffer di - scrittura (cioè per i dati in uscita) dei socket. -\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}] 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.} +\item[\procrelfile{/proc/sys/net/core}{rmem\_default}] imposta la dimensione + di default del buffer di lettura (cioè per i dati in ingresso) dei socket. +\item[\procrelfile{/proc/sys/net/core}{rmem\_max}] imposta la dimensione + massima che si può assegnare al buffer di ingresso dei socket attraverso + l'uso dell'opzione \const{SO\_RCVBUF}. +\item[\procrelfile{/proc/sys/net/core}{wmem\_default}] imposta la dimensione + di default del buffer di scrittura (cioè per i dati in uscita) dei socket. +\item[\procrelfile{/proc/sys/net/core}{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[\procrelfile{/proc/sys/net/core}{message\_cost}, + \procrelfile{/proc/sys/net/core}{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 @@ -4009,11 +4028,11 @@ socket. Quelli descritti anche nella pagina di manuale, accessibile con 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[\procrelfile{/proc/sys/net/core}{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}). +\item[\procrelfile{/proc/sys/net/core}{optmem\_max}] lunghezza massima dei + dati ancillari e di controllo (vedi sez.~\ref{sec:net_ancillary_data}). \end{basedescript} Oltre a questi nella directory \texttt{/proc/sys/net/core} si trovano altri @@ -4021,30 +4040,34 @@ 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. +\item[\procrelfile{/proc/sys/net/core}{dev\_weight}] blocco di lavoro + (\textit{work quantum}) dello scheduler di processo dei pacchetti. % TODO da documentare meglio -\item[\texttt{lo\_cong}] valore per l'occupazione della coda di ricezione - sotto la quale si considera di avere una bassa congestione. +\item[\procrelfile{/proc/sys/net/core}{lo\_cong}] valore per l'occupazione + della coda di ricezione sotto la quale si considera di avere una bassa + congestione. -\item[\texttt{mod\_cong}] valore per l'occupazione della coda di ricezione - sotto la quale si considera di avere una congestione moderata. +\item[\procrelfile{/proc/sys/net/core}{mod\_cong}] valore per l'occupazione + della coda di ricezione sotto la quale si considera di avere una congestione + moderata. -\item[\texttt{no\_cong}] valore per l'occupazione della coda di ricezione - sotto la quale si si considera di non avere congestione. +\item[\procrelfile{/proc/sys/net/core}{no\_cong}] valore per l'occupazione + della coda di ricezione sotto la quale si si considera di non avere + congestione. -\item[\texttt{no\_cong\_thresh}] valore minimo (\textit{low water mark}) per - il riavvio dei dispositivi congestionati. +\item[\procrelfile{/proc/sys/net/core}{no\_cong\_thresh}] valore minimo + (\textit{low water mark}) per il riavvio dei dispositivi congestionati. -%\item[\texttt{netdev\_fastroute}] è presente soltanto quando si è compilato il -% kernel con l'apposita opzione di ottimizzazione per l'uso come router (. + % \item[\procrelfile{/proc/sys/net/core}{netdev\_fastroute}] è presente + % soltanto quando si è compilato il kernel con l'apposita opzione di + % ottimizzazione per l'uso come router. -\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. +\item[\procrelfile{/proc/sys/net/core}{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} @@ -4063,70 +4086,92 @@ protocollo IP in quanto tale, descritti anche nella pagina di manuale accessibile con \texttt{man 7 ip}, sono i seguenti: \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, stabilendo - così il numero massimo di router che i pacchetti possono attraversare. Il - valore può essere modificato anche per il singolo socket con l'opzione - \const{IP\_TTL}. Prende un valore intero, ma dato che il campo citato è di - 8 bit hanno senso solo valori fra 0 e 255. Il valore di default è 64, e non - ci normalmente non c'è nessuna necessità di modificarlo,\footnote{l'unico - motivo sarebbe per raggiungere macchine estremamente ``{lontane}'' in - termini di \textit{hop}, ma è praticamente } aumentare il valore è una - pratica poco gentile, in quanto in caso di problemi di routing si allunga - inutilmente il numero di ritrasmissioni. - - -\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). - -\item[\texttt{ip\_dynaddr}] Abilita la riscrittura automatica degli indirizzi - associati ad un socket quando una interfaccia cambia indirizzo. Viene usato - per le interfacce usate nei collegamenti in dial-up, il cui indirizzo IP - viene assegnato dinamicamente dal provider, e può essere modificato. Un - valore nullo disabilita la funzionalità, con 1 la si abilita, con 2 la si - abilità in modalità \textsl{prolissa}. - -\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 - valori illustrati in fig.~\ref{fig:TCP_port_alloc}; prende due valori - numerici, che indicano gli estremi dell'intervallo. Si abbia cura di non - definire un intervallo che si sovrappone a quello delle porte usate per il - \itindex{masquerading} \textit{masquerading}, il kernel può gestire la - sovrapposizione, ma si avrà una perdita di prestazioni. Si imposti sempre un - valore iniziale maggiore di 1024 (o meglio ancora di 4096) per evitare - conflitti con le porte usate dai servizi noti. - -\item[\texttt{ip\_no\_pmtu\_disc}] imposta la disciplina di ricerca della +\item[\procrelfile{/proc/sys/net/ipv4}{ip\_default\_ttl}] imposta il valore di + default per il campo TTL (vedi sez.~\ref{sec:IP_header}) di tutti i + pacchetti uscenti, stabilendo così il numero massimo di router che i + pacchetti possono attraversare. Il valore può essere modificato anche per il + singolo socket con l'opzione \const{IP\_TTL}. Prende un valore intero, ma + dato che il campo citato è di 8 bit hanno senso solo valori fra 0 e 255. Il + valore di default è 64, e normalmente non c'è nessuna necessità di + modificarlo.\footnote{l'unico motivo sarebbe per raggiungere macchine + estremamente ``{lontane}'' in termini di \textit{hop}, ma è praticamente + impossible trovarne.} Aumentare il valore è una pratica poco gentile, in + quanto in caso di problemi di routing si allunga inutilmente il numero di + ritrasmissioni. + +\item[\procrelfile{/proc/sys/net/ipv4}{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), di default è disabilitato. + +\item[\procrelfile{/proc/sys/net/ipv4}{ip\_dynaddr}] abilita la riscrittura + automatica degli indirizzi associati ad un socket quando una interfaccia + cambia indirizzo. Viene usato per le interfacce usate nei collegamenti in + dial-up, il cui indirizzo IP viene assegnato dinamicamente dal provider, e + può essere modificato. Prende un valore intero, con 0 si disabilita la + funzionalità, con 1 la si abilita, con 2 (o con qualunque altro valore + diverso dai precedenti) la si abilità in modalità \textsl{prolissa}; di + default la funzionalità è disabilitata. + +\item[\procrelfile{/proc/sys/net/ipv4}{ip\_autoconfig}] specifica se + l'indirizzo IP è stato configurato automaticamente dal kernel all'avvio + attraverso DHCP, BOOTP o RARP. Riporta un valore logico (0 falso, 1 vero) + accessibile solo in lettura, è inutilizzato nei kernel recenti ed eliminato + a partire dal kernel 2.6.18. + +\item[\procrelfile{/proc/sys/net/ipv4}{ip\_local\_port\_range}] imposta + l'intervallo dei valori usati per l'assegnazione delle porte effimere, + permette cioè di modificare i valori illustrati in + fig.~\ref{fig:TCP_port_alloc}; prende due valori numerici, che indicano gli + estremi dell'intervallo. Si abbia cura di non definire un intervallo che si + sovrappone a quello delle porte usate per il \itindex{masquerading} + \textit{masquerading}, il kernel può gestire la sovrapposizione, ma si avrà + una perdita di prestazioni. Si imposti sempre un valore iniziale maggiore di + 1024 (o meglio ancora di 4096) per evitare conflitti con le porte usate dai + servizi noti. + +\item[\procrelfile{/proc/sys/net/ipv4}{ip\_no\_pmtu\_disc}] permette di + disabilitare per i socket \const{SOCK\_STREAM} la ricerca automatica della \itindex{Maximum~Transfer~Unit} \textit{Path MTU} (vedi - sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:sock_ipv4_options}). - -\item[\texttt{ipfrag\_high\_thresh}] limite massimo (espresso in numero di - byte) sui pacchetti IP frammentati presenti in coda; quando questo valore - viene raggiunta la coda viene ripulita fino al valore - \texttt{ipfrag\_low\_thresh}. - -\item[\texttt{ipfrag\_low\_thresh}] soglia bassa (specificata in byte) cui - viene riportata la coda dei pacchetti IP frammentati quando si raggiunge il - valore \texttt{ipfrag\_high\_thresh}. - -\item[\texttt{ip\_always\_defrag}] se abilitato (prende un intero come valore - logico) tutti i pacchetti IP frammentati saranno riassemblati, anche in caso - in successivo immediato inoltro.\footnote{introdotto con il kernel 2.2.13, - nelle versioni precedenti questo comportamento poteva essere solo in fase - di compilazione del kernel con l'opzione - \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.} - -\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. + sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:sock_ipv4_options}); prende un + valore logico, e di default è disabilitato (cioè la ricerca viene eseguita). + + In genere si abilita questo parametro quando per qualche motivo il + procedimento del \itindex{Maximum~Transfer~Unit} \textit{Path MTU discovery} + fallisce; dato che questo può avveniera a causa di router\footnote{ad + esempio se si scartano tutti i pacchetti ICMP, il problema è affrontato + anche in sez.~1.4.4 di \cite{FwGL}.} o interfacce\footnote{ad esempio se i + due capi di un collegamento \textit{point-to-point} non si accordano sulla + stessa MTU.} mal configurate è opportuno correggere le configurazioni, + perché disabilitare globalmente il procedimento con questo parametro ha + pesanti ripercussioni in termini di prestazioni di rete. + +\item[\procrelfile{/proc/sys/net/ipv4}{ip\_always\_defrag}] fa si che tutti i + pacchetti IP frammentati siano riassemblati, anche in caso in successivo + immediato inoltro;\footnote{introdotto con il kernel 2.2.13, nelle versioni + precedenti questo comportamento poteva essere solo stabilito un volta per + tutte in fase di compilazione del kernel con l'opzione + \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.} prende un valore logico e di default + è disabilitato. Con i kernel dalla serie 2.4 in poi la deframmentazione viene + attivata automaticamente quando si utilizza il sistema del netfilter, e + questo parametro non è più presente. + +\item[\procrelfile{/proc/sys/net/ipv4}{ipfrag\_high\_thresh}] indica il limite + massimo (espresso in numero di byte) sui pacchetti IP frammentati presenti + in coda; quando questo valore viene raggiunta la coda viene ripulita fino al + valore \texttt{ipfrag\_low\_thresh}. + +\item[\procrelfile{/proc/sys/net/ipv4}{ipfrag\_low\_thresh}] soglia bassa + (specificata in byte) cui viene riportata la coda dei pacchetti IP + frammentati quando si raggiunge il valore \texttt{ipfrag\_high\_thresh}. + +\item[\procrelfile{/proc/sys/net/ipv4}{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à. @@ -4137,30 +4182,31 @@ 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}] è un valore logico (disabilitato di - default) che indica di azzerare le connessioni quando il programma che le - riceve è troppo lento ed incapace di accettarle. Questo consente di - recuperare le connessioni se si è avuto un eccesso dovuto ad un qualche - picco di traffico, ma ovviamente va a discapito dei client che interrogano - il server. Pertanto è da abilitare soltanto quando si è sicuri che non è - possibile ottimizzare il server in modo che sia in grado di accettare - connessioni più rapidamente. - -\item[\texttt{tcp\_adv\_win\_scale}] questa variabile intera indica al kernel - quanto spazio all'interno del buffer associato ad un socket (quello - impostato con \texttt{tcp\_rmem}) deve essere utilizzato per la finestra del - protocollo TCP (quello che costituisce la \itindex{advertised~window} - \textit{advertised window} annunciata all'altro capo del socket) e quello - che viene usato come buffer applicativo per isolare la rete dalle latenze - dell'applicazione. Il valore viene calcolato secondo la formula - $\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se positivo o con +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_abort\_on\_overflow}] Un valore + logico (disabilitato di default) che indica di azzerare le connessioni + quando il programma che le riceve è troppo lento ed incapace di accettarle. + Questo consente di recuperare le connessioni se si è avuto un eccesso dovuto + ad un qualche picco di traffico, ma ovviamente va a discapito dei client che + interrogano il server. Pertanto è da abilitare soltanto quando si è sicuri + che non è possibile ottimizzare il server in modo che sia in grado di + accettare connessioni più rapidamente. + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_adv\_win\_scale}] questa variabile + intera indica al kernel quanto spazio all'interno del buffer associato ad un + socket (quello impostato con \texttt{tcp\_rmem}) deve essere utilizzato per + la finestra del protocollo TCP (quello che costituisce la + \itindex{advertised~window} \textit{advertised window} annunciata all'altro + capo del socket) e quello che viene usato come buffer applicativo per + isolare la rete dalle latenze dell'applicazione. Il valore viene calcolato + secondo la formula $\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se + positivo o con $\texttt{buffer}-\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se negativo. Il valore di default è 2 che significa che al buffer dell'applicazione viene riservato un quarto del totale. -\item[\texttt{tcp\_app\_win}] il valore indica quanti byte della finestra TCP - vengono riservati per la bufferizzazione, valore è il massimo fra la - \itindex{Maximum~Segment~Size} MSS e +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_app\_win}] il valore indica quanti + byte della finestra TCP vengono riservati per la bufferizzazione, valore è + il massimo fra la \itindex{Maximum~Segment~Size} MSS e $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che non viene riservato nessuno spazio; il default è 31. @@ -4170,84 +4216,99 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: % \item[\texttt{tcp\_bic\_low\_window}] % \item[\texttt{tcp\_bic\_fast\_convergence}] -\item[\texttt{tcp\_dsack}] Abilita il supporto definito - nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884} per il +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_dsack}] Un valore logico che + abilita il supporto, definito + nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884}, per il \textit{Duplicate SACK}.\footnote{si indica con SACK (\textit{Selective Acknowledgement}) un'opzione TCP, definita nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}, usata per dare - un \textit{acknowledgement} unico su blocchi di pacchetti non contigui.} - -\item[\texttt{tcp\_ecn}] Abilita il meccanismo della \textit{Explicit - Congestion Notification} (o ECN) definito - nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884}. Si tenga presente - che se si abilita questa opzione si possono avere dei malfunzionamenti - apparentemente casuali dipendenti dalla destinazione, dovuti al fatto che - alcuni vecchi router non supportano il meccanismo ed alla sua attivazione - scartano i relativi pacchetti.\\ - -\item[\texttt{tcp\_fack}] è un valore logico che abilita il supporto per il - \textit{TCP Forward Acknowledgement}. Di default è abilitato. + un \textit{acknowledgement} unico su blocchi di pacchetti non contigui, + che consente di diminuire il numero di pacchetti scambiati.} Di default è + abilitato. + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_ecn}] Un valore logico che abilita + il meccanismo della \textit{Explicit Congestion Notification} (in breve ECN) + nelle connessioni TCP. Questo è un meccanismo (è descritto in dettaglio + nell'\href{http://www.ietf.org/rfc/rfc3168.txt}{RFC~3168} mentre gli effetti + sulle prestazioni del suo utilizzo sono documentate + nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884} ) che consente di + notificare quando una rotta o una rete è congestionata da un eccesso di + traffico, si può così essere avvisati e cercare rotte alternative oppure + diminuire l'emissione di pacchetti (in modo da non aumentare la + congestione). Di default è disabilitato. + + Si tenga presente che se si abilita questa opzione si possono avere dei + malfunzionamenti apparentemente casuali dipendenti dalla destinazione, + dovuti al fatto che alcuni vecchi router non supportano il meccanismo ed + alla sua attivazione e scartano i relativi pacchetti, bloccando + completamente il traffico.\\ + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_fack}] è un valore logico che + abilita il supporto per il \textit{TCP Forward Acknowledgement}, un + algoritmo per il controllo della congestione del traffico. Di default è + abilitato. % TODO documentare o descrivere che cos'è il TCP Forward Acknowledgement -\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}] è un valore logico che abilita il supporto per - l'algoritmo F-RTO, un algoritmo usato per la ritrasmissione dei timeout del - protocollo TCP, che diventa molto utile per le reti wireless dove la perdita - di pacchetti è usualmente dovuta a delle interferenze radio, piuttosto che - alla congestione dei router. Di default è disabilitato. - - -\item[\texttt{tcp\_keepalive\_intvl}] il numero di secondi che deve - trascorrere fra l'emissione di due successivi pacchetti di test quando è - abilitata la funzionalità del \textit{keepalive} (vedi +\item[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_frto}] è un valore logico che + abilita il supporto per l'algoritmo F-RTO, un algoritmo usato per la + ritrasmissione dei timeout del protocollo TCP, che diventa molto utile per + le reti wireless dove la perdita di pacchetti è usualmente dovuta a delle + interferenze radio, piuttosto che alla congestione dei router. Di default è + disabilitato. + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_keepalive\_intvl}] il numero di + secondi che deve trascorrere fra l'emissione di due successivi pacchetti di + test quando è abilitata la funzionalità del \textit{keepalive} (vedi sez.~\ref{sec:sock_options_main}). Il valore di default è 75. -\item[\texttt{tcp\_keepalive\_probes}] il massimo numero pacchetti di - \textit{keepalive} (vedi sez.~\ref{sec:sock_options_main}) che devono essere - inviati senza ricevere risposta prima che il kernel decida che la - connessione è caduta e la termini. Il valore di default è 9. +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_keepalive\_probes}] il massimo + numero pacchetti di \textit{keepalive} (vedi + sez.~\ref{sec:sock_options_main}) che devono essere inviati senza ricevere + risposta prima che il kernel decida che la connessione è caduta e la + termini. Il valore di default è 9. -\item[\texttt{tcp\_keepalive\_time}] il numero di secondi che devono passare - senza traffico sulla connessione prima che il kernel, qualora si sia - utilizzata l'opzione \const{SO\_KEEPALIVE} (vedi +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_keepalive\_time}] il numero di + secondi che devono passare senza traffico sulla connessione prima che il + kernel, qualora si sia utilizzata l'opzione \const{SO\_KEEPALIVE} (vedi sez.~\ref{sec:sock_options_main}), inizi ad inviare pacchetti di pacchetti di \textit{keepalive}. Il default è 7200, pari a due ore. -\item[\texttt{tcp\_low\_latency}] un valore logico che indica allo stack TCP - del kernel di ottimizzare il comportamento per ottenere tempi di latenza più - bassi a scapito di valori più alti per l'utilizzo della banda. Di default è - disabilitato in quanto un maggior utilizzo della banda è preferito, ma - esistono applicazioni particolari in cui la riduzione della latenza è più - importante (ad esempio i cluster di calcolo parallelo) in cui lo si può - abilitare. - -\item[\texttt{tcp\_max\_orphans}] il numero massimo di socket TCP - ``\textsl{orfani}'' (vale a dire non associati a nessun file descriptor) - consentito nel sistema.\footnote{trattasi in genere delle connessioni - relative a socket chiusi che non hanno completato il processo di - chiusura.} Quando il limite viene ecceduto la connessione orfana viene +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_low\_latency}] un valore logico + che indica allo stack TCP del kernel di ottimizzare il comportamento per + ottenere tempi di latenza più bassi a scapito di valori più alti per + l'utilizzo della banda. Di default è disabilitato in quanto un maggior + utilizzo della banda è preferito, ma esistono applicazioni particolari in + cui la riduzione della latenza è più importante (ad esempio i cluster di + calcolo parallelo) in cui lo si può abilitare. + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_max\_orphans}] il numero massimo + di socket TCP ``\textsl{orfani}'' (vale a dire non associati a nessun file + descriptor) consentito nel sistema.\footnote{trattasi in genere delle + connessioni relative a socket chiusi che non hanno completato il processo + di chiusura.} Quando il limite viene ecceduto la connessione orfana viene resettata e viene stampato un avvertimento. Questo limite viene usato per contrastare alcuni elementari attacchi di \textit{denial of service}. Diminuire il valore non è mai raccomandato, in certe condizioni di rete può essere opportuno aumentarlo, ma si deve tenere conto del fatto che ciascuna - connessione orfana può consumare fino a 64K di memoria del kernel. Il di - default viene impostato inizialmente al valore del parametro del kernel + connessione orfana può consumare fino a 64K di memoria del kernel. Il valore + di default viene impostato inizialmente al valore del parametro del kernel \texttt{NR\_FILE}, e viene aggiustato a seconda della memoria disponibile. % TODO verificare la spiegazione di connessione orfana -\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}). +\item[\procrelfile{/proc/sys/net/ipv4}{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 @@ -4260,19 +4321,20 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: sia $\mathtt{tcp\_max\_syn\_backlog} \ge \mathtt{16*TCP\_SYNQ\_HSIZE}$, per poi ricompilare il kernel.} -\item[\texttt{tcp\_max\_tw\_buckets}] questo valore indica il numero massimo - di socket in stato \texttt{TIME\_WAIT} consentito nel sistema; viene - impostato per prevenire semplici attacchi di \textit{denial of service} ed - inizializzato di default ad un valore del parametro \texttt{NR\_FILE}, per - poi essere aggiustato a seconda della memoria presente. Se il valore viene - superato il socket viene chiuso con la stampa di un avviso. +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_max\_tw\_buckets}] questo valore + indica il numero massimo di socket in stato \texttt{TIME\_WAIT} consentito + nel sistema; viene impostato per prevenire semplici attacchi di + \textit{denial of service} ed inizializzato di default ad un valore del + parametro \texttt{NR\_FILE}, per poi essere aggiustato a seconda della + memoria presente. Se il valore viene superato il socket viene chiuso con la + stampa di un avviso. -\item[\texttt{tcp\_mem}] una tripletta di valori usati dallo stack TCP per - controllare il proprio uso della memoria. Il primo valore, chiamato - \textit{low} nelle pagine di manuale, indica il numero di pagine allocate - sotto il quale non viene usato nessun meccanismo di regolazione dell'uso - della memoria. +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_mem}] una tripletta di valori + usati dallo stack TCP per controllare il proprio uso della memoria. Il primo + valore, chiamato \textit{low} nelle pagine di manuale, indica il numero di + pagine allocate sotto il quale non viene usato nessun meccanismo di + regolazione dell'uso della memoria. Il secondo valore, chiamato \textit{pressure} indica il numero di pagine allocate passato il quale lo stack TCP inizia a moderare il suo consumo di @@ -4284,62 +4346,97 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: valore specificato dagli altri limiti del kernel. -\item[\texttt{tcp\_orphan\_retries}] il numero massimo di volte che si esegue - un tentativo di controllo sull'altro capo di una connessione che è stata già - chiusa dalla nostra parte. Il valore di default è 8 volte. +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_orphan\_retries}] il numero + massimo di volte che si esegue un tentativo di controllo sull'altro capo di + una connessione che è stata già chiusa dalla nostra parte. Il valore di + default è 8 volte. + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_reordering}] il numero massimo di + volte che un pacchetto può essere riordinato nel flusso di dati, prima che + lo stack TCP assuma che è andato perso e si ponga nello stato di + \textit{slow start} (si veda sez.~\ref{sez:tcp_protocol_xxx}) viene usata + questa metrica di riconoscimento dei riordinamenti per evitare inutili + ritrasmissioni provocate dal riordinamento. Non è opportuno modificare + questo valore dal default che è 3. + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_retrans\_collapse}] in caso di + pacchetti persi durante una connessione, per ottimizzare l'uso della banda + il kernel cerca di eseguire la ritrasmissione inviando pacchetti della + massima dimensione possibile; in sostanza dati che in precedenza erano stati + trasmessi su pacchetti diversi possono essere ritrasmessi riuniti su un solo + pacchetto (o su un numero minore di pacchetti di dimensione maggiore). + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_retries1}] imposta il massimo + numero di volte che protocollo tenterà la ritrasmissione si un pacchetto su + una connessione stabilita prima di fare ricorso ad ulteriori sforzi che + coinvolgano anche il livello di rete. Passato questo numero di + ritrasmissioni verrà fatto eseguire al livello di rete un tentativo di + aggiornamento della rotta verso la destinazione prima di eseguire ogni + successiva ritrasmissione. + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_retries2}] imposta il numero di + tentativi di ritrasmissione 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}). Il valore + default è 15, che significa un tempo variabile fra 13 e 30 minuti; questo + non corrisponde a quanto richiesto + nell'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} dove è indicato un + massimo di 100 secondi, che però è un valore considerato troppo basso. + + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_rfc1337}] un valore logico che + indica allo stack TCP del kernel di abilitare il comportamento richiesto + nell'\href{http://www.ietf.org/rfc/rfc1337.txt}{RFC~1337}; di default è + disabilitato, il che significa che alla ricezione di un segmento RST in stao + \texttt{TIME\_WAIT} il socket viene chiuso immediatamente senza attendere la + conclusione del periodo di \texttt{TIME\_WAIT}. + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}] + -\item[\texttt{tcp\_reordering}] il numero massimo di volte che un pacchetto - può essere riordinato nel flusso di dati, prima che lo stack TCP assuma che - è andato perso e si ponga nello stato di \textit{slow start} (si veda - sez.~\ref{sez:tcp_protocol_xxx}) viene usata questa metrica di - riconoscimento dei riordinamenti per evitare inutili ritrasmissioni - provocate dal riordinamento. Non è opportuno modificare questo valore dal - default che è 3. +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_sack}] un valore logico che indica + al kernel di utilizzare il meccanismo del \textit{TCP selective + aknowledment} definito + nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}; di default è + abilitato. -\item[\texttt{tcp\_retrans\_collapse}] +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_stdurg}] -\item[\texttt{tcp\_retries1}] imposta il massimo numero di volte che - protocollo tenterà la ritrasmissione si un pacchetto su una connessione - stabilita prima di fare ricorso ad ulteriori sforzi che coinvolgano anche il - livello di rete. Passato questo numero di ritrasmissioni verrà fatto - eseguire al livello di rete un tentativo di aggiornamento della rotta verso - la destinazione prima di eseguire ogni successiva ritrasmissione. +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_synack\_retries}] un valore intero + che indica il numero massimo di volte che verrà ritasmesso il segmento + SYN/ACK nella creazione di una connessione (vedi + sez.~\ref{sec:TCP_conn_cre}). Il valore di default è 5, e non si deve + superare il valore massimo di 255. -\item[\texttt{tcp\_retries2}] imposta il numero di tentativi di ritrasmissione - 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}). Il valore default è 15, che significa un - tempo variabile fra 13 e 30 minuti; questo non corrisponde a quanto - richiesto nell'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} dove è - indicato un massimo di 100 secondi, che però è un valore considerato troppo - basso. +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_syncookies}] un valore logico + che abilita i \textit{TCP syncookies},\footnote{per poter usare quasta + funzionalità è necessario avere abilitato l'opzione + \texttt{CONFIG\_SYN\_COOKIES} nella compilazione del kernel.} di default è + disabilitato. +\item[\procrelfile{/proc/sys/net/ipv4}{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\_rfc1337}] +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_timestamps}] un valore logico che + attiva l'uso dei \textit{TCP timestamps}, definiti + nell'\href{http://www.ietf.org/rfc/rfc1323.txt}{RFC~1323}. Di default è + abilitato. -\item[\texttt{tcp\_rmem}] +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_recycle}] +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_reuse}] -\item[\texttt{tcp\_sack}] -\item[\texttt{tcp\_stdurg}] -\item[\texttt{tcp\_synack\_retries}] -\item[\texttt{tcp\_syncookies}] +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_window\_scaling}] -\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[\procrelfile{/proc/sys/net/ipv4}{tcp\_vegas\_cong\_avoid}] -\item[\texttt{tcp\_timestamps}] -\item[\texttt{tcp\_tw\_recycle}] -\item[\texttt{tcp\_tw\_reuse}] -\item[\texttt{tcp\_window\_scaling}] +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_westwood}] +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_wmem}] -\item[\texttt{tcp\_vegas\_cong\_avoid}] -\item[\texttt{tcp\_westwood}] -\item[\texttt{tcp\_wmem}] \end{basedescript} % LocalWords: socket sez dotted decimal resolver Domain Name Service cap DNS