X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=c5bfafc116399574e9ff88cf5e9d0a7be4721558;hp=ed3b2d9192bed02f29a44d0d3273d0a364691932;hb=e7010c3fbd41a2de44c7b513c5de6e2c6d7ab4b4;hpb=5c629cc297199890314cc71af3b419056a7a9a62 diff --git a/sockctrl.tex b/sockctrl.tex index ed3b2d9..c5bfafc 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1,6 +1,6 @@ %% 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", @@ -8,6 +8,7 @@ %% license is included in the section entitled "GNU Free Documentation %% License". %% + \chapter{La gestione dei socket} \label{cha:sock_generic_management} @@ -617,7 +618,7 @@ argomento (che si presume sia dato da \var{h\_errno}). \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 @@ -682,7 +683,7 @@ Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi 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 è: @@ -719,7 +720,7 @@ suoi risultati. 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. @@ -776,14 +777,14 @@ chiamate i dati potranno essere sovrascritti. Si tenga presente poi che 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 @@ -818,7 +819,7 @@ lunghezza di questo buffer devono essere indicati con gli argomenti \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}. @@ -1255,7 +1256,7 @@ utilizzata dalla funzione per riportare (come \itindex{value~result~argument} 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] @@ -1462,13 +1463,13 @@ lista illustrata in fig.~\ref{fig:sock_addrinfo_list}. \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 @@ -1559,7 +1560,7 @@ IPv4 address: \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 è: @@ -1581,7 +1582,7 @@ per \param{res}. 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. @@ -1979,7 +1980,7 @@ di \func{setsockopt}, anche se non 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. @@ -2259,8 +2260,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 @@ -2364,7 +2367,7 @@ chiuso dopo aver impostato un errore di \errcode{ETIMEDOUT}. Qualora la connessione si sia ristabilita e si riceva un successivo messaggio di risposta il ciclo riparte come se niente fosse avvenuto. Infine se si riceve come risposta un pacchetto ICMP di destinazione irraggiungibile (vedi -sez.~\ref{sec:icmp_protocol_xxx}), verrà restituito l'errore corrispondente. +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 @@ -3162,11 +3165,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 @@ -3202,7 +3205,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 @@ -3593,7 +3596,7 @@ sono le seguenti: 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 @@ -3968,24 +3971,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 @@ -4008,11 +4012,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 @@ -4020,28 +4024,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. % 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} @@ -4060,62 +4070,72 @@ 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. 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 - \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 +\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 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[\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). + +\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. Un valore nullo disabilita la funzionalità, con 1 la + si abilita, con 2 la si abilità in modalità \textsl{prolissa}. + +\item[\procrelfile{/proc/sys/net/ipv4}{ip\_autoconfig}] Specifica se + l'indirizzo IP è stato configurato automaticamente via DHCP, BOOTP o RARP. + +\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}] imposta la + disciplina di ricerca della \itindex{Maximum~Transfer~Unit} \textit{Path + MTU} (vedi sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:sock_ipv4_options}). + +\item[\procrelfile{/proc/sys/net/ipv4}{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. +\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\_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[\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à. @@ -4126,62 +4146,121 @@ 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 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}] - -\item[\texttt{tcp\_app\_win}] - -\item[\texttt{tcp\_bic}] -\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\_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}] 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 +\item[\procrelfile{/proc/sys/net/ipv4}{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 destizione, dovuti al fatto che + 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}] - -\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\_fack}] è un valore logico che + abilita il supporto per il \textit{TCP Forward Acknowledgement}. 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 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 @@ -4194,41 +4273,89 @@ 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}] -\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}] + +\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}] + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}] + + +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_sack}] +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_stdurg}] +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_synack\_retries}] +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_syncookies}] + +\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}] +\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 @@ -4301,13 +4428,16 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: % 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: +