%% sockctrl.tex
%%
-%% Copyright (C) 2004-2006 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2004-2007 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",
%% license is included in the section entitled "GNU Free Documentation
%% License".
%%
+
\chapter{La gestione dei socket}
\label{cha:sock_generic_management}
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
\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
\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
\subsection{La risoluzione dei nomi a dominio}
\label{sec:sock_name_services}
-La principale funzionalità del \itindex{resolver}\textit{resolver} resta
+La principale funzionalità del \itindex{resolver} \textit{resolver} resta
quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le
funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui
IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi
chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per
-modificare le opzioni del \itindex{resolver}\textit{resolver}; dato che
+modificare le opzioni del \itindex{resolver} \textit{resolver}; dato che
questo non è molto comodo è stata definita\footnote{questa è una estensione
fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.}
un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è:
Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in
fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un
programma che esegue una semplice interrogazione al
-\itindex{resolver}\textit{resolver} usando \func{gethostbyname} e poi ne
+\itindex{resolver} \textit{resolver} usando \func{gethostbyname} e poi ne
stampa a video i risultati. Al solito il sorgente completo, che comprende il
trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto,
è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
copiare il contenuto della sola struttura non è sufficiente per salvare tutti
i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
-una chiamata, occorrerà eseguire quella che si chiama una
-\itindex{deep~copy}\textit{deep copy}.\footnote{si chiama così quella tecnica
- per cui, quando si deve copiare il contenuto di una struttura complessa (con
- puntatori che puntano ad altri dati, che a loro volta possono essere
- puntatori ad altri dati) si deve copiare non solo il contenuto della
- struttura, ma eseguire una scansione per risolvere anche tutti i puntatori
- contenuti in essa (e così via se vi sono altre sottostrutture con altri
- puntatori) e copiare anche i dati da questi referenziati.}
+una chiamata, occorrerà eseguire quella che si chiama una \itindex{deep~copy}
+\textit{deep copy}.\footnote{si chiama così quella tecnica per cui, quando si
+ deve copiare il contenuto di una struttura complessa (con puntatori che
+ puntano ad altri dati, che a loro volta possono essere puntatori ad altri
+ dati) si deve copiare non solo il contenuto della struttura, ma eseguire una
+ scansione per risolvere anche tutti i puntatori contenuti in essa (e così
+ via se vi sono altre sottostrutture con altri puntatori) e copiare anche i
+ dati da questi referenziati.}
Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
versioni rientranti delle precedenti funzioni, al solito queste sono
\param{buf} e \param{buflen}.
Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati
-come \itindex{value~result~argument}\textit{value result argument}, si deve
+come \itindex{value~result~argument} \textit{value result argument}, si deve
specificare l'indirizzo della variabile su cui la funzione dovrà salvare il
codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
puntatore che si userà per accedere i dati con \param{result}.
\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
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.
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
\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
\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
rientrante, ed alloca autonomamente tutta la memoria necessaria in cui
verranno riportati i risultati della risoluzione. La funzione scriverà
all'indirizzo puntato da \param{res} il puntatore iniziale ad una
-\itindex{linked~list}\textit{linked list} di strutture di tipo
+\itindex{linked~list} \textit{linked list} di strutture di tipo
\struct{addrinfo} contenenti tutte le informazioni ottenute.
\begin{figure}[!htb]
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.
\begin{figure}[!htb]
\centering
\includegraphics[width=10cm]{img/addrinfo_list}
- \caption{La \itindex{linked~list}\textit{linked list} delle strutture
+ \caption{La \itindex{linked~list} \textit{linked list} delle strutture
\struct{addrinfo} restituite da \func{getaddrinfo}.}
\label{fig:sock_addrinfo_list}
\end{figure}
Come primo esempio di uso di \func{getaddrinfo} vediamo un programma
-elementare di interrogazione del \itindex{resolver}\textit{resolver} basato
+elementare di interrogazione del \itindex{resolver} \textit{resolver} basato
questa funzione, il cui corpo principale è riportato in
fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa
la gestione delle opzioni in cui è gestita l'eventuale inizializzazione
\end{Verbatim}
%$
-Una volta estratti i risultati dalla \itindex{linked~list}\textit{linked list}
+Una volta estratti i risultati dalla \itindex{linked~list} \textit{linked list}
puntata da \param{res} se questa non viene più utilizzata si dovrà avere cura
di disallocare opportunamente tutta la memoria, per questo viene fornita
l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è:
Si tenga presente infine che se si copiano i risultati da una delle strutture
\struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre
-avere cura di eseguire una \itindex{deep~copy}\textit{deep copy} in cui
+avere cura di eseguire una \itindex{deep~copy} \textit{deep copy} in cui
si copiano anche tutti i dati presenti agli indirizzi contenuti nella
struttura \struct{addrinfo}, perché una volta disallocati i dati con
\func{freeaddrinfo} questi non sarebbero più disponibili.
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
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
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}.}
per entrambe le funzioni. In questo caso \param{optval} viene usato per
ricevere le informazioni ed indica l'indirizzo a cui andranno scritti i dati
letti dal socket, infine \param{optlen} diventa un puntatore ad una variabile
-che viene usata come \itindex{value~result~argument}\textit{value result
+che viene usata come \itindex{value~result~argument} \textit{value result
argument} per indicare, prima della chiamata della funzione, la lunghezza
del buffer allocato per \param{optval} e per ricevere indietro, dopo la
chiamata della funzione, la dimensione effettiva dei dati scritti su di esso.
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
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}
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.
+sez.~\ref{sec:ICMP_protocol}), 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
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
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
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
dell'interfaccia, e restituisce il relativo nome in \var{ifr\_name}.
Il kernel infatti assegna ad ogni interfaccia un numero progressivo, detto
- appunto \index{interface index} \textit{interface index}, che è quello che
+ appunto \itindex{interface~index} \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
\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
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
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
+\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}
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. Il valore può
- 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).
-
-\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à.
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 dispositivo 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}] permette di impostare il valore di scala
- usato nell'opzione \textit{window scale} del protocollo TCP (vedi
- sez.~\ref{sec:TCP_TCP_opt})
-
-\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}).
+\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[\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.
+
+% vecchi, presumibilmente usati quando gli algoritmi di congestione non erano
+% modularizzabili
+% \item[\texttt{tcp\_bic}]
+% \item[\texttt{tcp\_bic\_low\_window}]
+% \item[\texttt{tcp\_bic\_fast\_convergence}]
+
+\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,
+ 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[\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[\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[\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[\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 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[\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
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}]
+\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[\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
+ memoria. Si esce da questo stato di \textsl{pressione} sulla memoria quando
+ il numero di pagine scende sotto il precedente valore \textit{low}.
+
+ Il terzo valore, chiamato \textit{high} indica il numero massimo di pagine
+ che possono essere utilizzate dallo stack TCP/IP, e soprassiede ogni altro
+ valore specificato dagli altri limiti del kernel.
+
+
+\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[\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[\procrelfile{/proc/sys/net/ipv4}{tcp\_stdurg}]
+
+\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[\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[\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[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_recycle}]
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_reuse}]
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_window\_scaling}]
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_vegas\_cong\_avoid}]
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_westwood}]
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_wmem}]
+
\end{basedescript}
% LocalWords: socket sez dotted decimal resolver Domain Name Service cap DNS
% LocalWords: abort overflow adv win app bic convergence dsack ecn fack frto
% LocalWords: intvl probes latency orphans l'ACK SYNQ HSIZE tw buckets mem rfc
% LocalWords: orphan reordering collapse sack stdurg synack syncookies recycle
-% LocalWords: timestamps scaling vegas avoid westwood tcpi l'incapsulazione
+% LocalWords: timestamps scaling vegas avoid westwood tcpi l'incapsulazione NR
% LocalWords: metric EOPNOTSUPP mtu hwaddr ARPHRD interrupt DMA map qlen silly
% LocalWords: rename ifconf syndrome dell'ACK FTP ACCEPTFILTER advanced reno
% LocalWords: congestion control Networking cubic CUBIC highspeed HSTCP htcp
% LocalWords: HTCP hybla HYBLA scalable SCALABLE ifc req iflist access ntoa
+% LocalWords: hop Selective Acknowledgement acknowledgement Explicit RTO stack
+% LocalWords: Notification wireless denial pressure
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
+