La funzione richiede che venga letto in anticipo il contenuto del file
\param{fd} a partire dalla posizione \param{offset} e per un ammontare di
-\param{count} bytes, in modo da portarlo in cache. La funzione usa la
+\param{count} byte, in modo da portarlo in cache. La funzione usa la
\index{memoria~virtuale} memoria virtuale ed il meccanismo della
\index{paginazione} paginazione per cui la lettura viene eseguita in blocchi
corrispondenti alle dimensioni delle pagine di memoria, ed i valori di
La funzione dichiara al kernel le modalità con cui intende accedere alla
regione del file indicato da \param{fd} che inizia alla posizione
\param{offset} e si estende per \param{len} byte. Se per \param{len} si usa un
-valora nullo la regione coperta sarà da \param{offset} alla fine del
+valore nullo la regione coperta sarà da \param{offset} alla fine del
file.\footnote{questo è vero solo per le versioni più recenti, fino al kernel
2.6.6 il valore nullo veniva interpretato letteralmente.} Le modalità sono
indicate dall'argomento \param{advice} che è una maschera binaria dei valori
illustrati in tab.~\ref{tab:posix_fadvise_flag}. Si tenga presente comunque
che la funzione dà soltanto un avvertimento, non esiste nessun vincolo per il
-kernel, che utilzza semplicemente l'informazione.
+kernel, che utilizza semplicemente l'informazione.
\begin{table}[htb]
\centering
comportamento sarà identico a quello che si
avrebbe senza nessun avviso.\\
\const{POSIX\_FADV\_SEQUENTIAL}& L'applicazione si aspetta di accedere di
- accedere ai dati spercificati in maniera
+ accedere ai dati specificati in maniera
sequenziale, a partire dalle posizioni più
basse.\\
\const{POSIX\_FADV\_RANDOM} & I dati saranno letti in maniera
- completamete causale.\\
+ completamente causale.\\
\const{POSIX\_FADV\_NOREUSE} & I dati saranno acceduti una sola volta.\\
\const{POSIX\_FADV\_WILLNEED}& I dati saranno acceduti a breve.\\
\const{POSIX\_FADV\_DONTNEED}& I dati non saranno acceduti a breve.\\
Anche \func{posix\_fadvise} si appoggia al sistema della memoria virtuale ed
al meccanismo standard del \textit{readahead} utilizzato dal kernel; in
particolare con \const{POSIX\_FADV\_SEQUENTIAL} si raddoppia la dimensione
-dell'ammontare di dati letti preventivamente rispetto al default, apettandosi
+dell'ammontare di dati letti preventivamente rispetto al default, aspettandosi
appunto una lettura sequenziale che li utilizzerà, mentre con
\const{POSIX\_FADV\_RANDOM} si disabilita del tutto il suddetto meccanismo,
dato che con un accesso del tutto casuale è inutile mettersi a leggere i dati
che inizia dalla posizione \param{offset} e si estende per \param{len} byte;
se questa si estende oltre la fine del file le dimensioni di quest'ultimo
saranno incrementate di conseguenza. Dopo aver eseguito con successo la
-funzione è garantito che una scrittura nella regione inidicata non fallirà per
+funzione è garantito che una scrittura nella regione indicata non fallirà per
mancanza di spazio disco.
% LocalWords: NUL sizeof casting printevent nread limits sysconf SC wrapper Di
% LocalWords: splice result argument DMA controller zerocopy Linus Larry Voy
% LocalWords: Jens Anxboe vmsplice seek ESPIPE GIFT TCP CORK MSG splicecp nr
-% LocalWords: nwrite segs patch readahead
+% LocalWords: nwrite segs patch readahead posix fadvise TC advice FADV NORMAL
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
+% LocalWords: SEQUENTIAL NOREUSE WILLNEED DONTNEED streaming fallocate EFBIG
\func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}.
\item[\const{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il
- numero minimo di byte che devono essere presenti nel buffer di scrittura
+ numero minimo di byte che devono essere presenti nel buffer di trasmissione
perché il kernel li invii al protocollo successivo, consentendo ad una
\func{write} di ritornare o segnalando ad una \func{select} (vedi
sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura.
tipo \const{SOCK\_STREAM}.
\item[\const{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di
- uscita del socket. Prende per \param{optval} un intero indicante il numero
- di byte. Il valore di default ed il valore massimo che si possono
+ trasmissione del socket. Prende per \param{optval} un intero indicante il
+ numero di byte. Il valore di default ed il valore massimo che si possono
specificare come argomento per questa opzione sono impostabili
rispettivamente tramite gli opportuni valori di \func{sysctl} (vedi
sez.~\ref{sec:sock_sysctl}).
\item[\const{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di
- ingresso del socket. Prende per \param{optval} un intero indicante il numero
- di byte. Il valore di default ed il valore massimo che si può specificare
- come argomento per questa opzione sono impostabili tramiti gli opportuni
- valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
+ ricezione del socket. Prende per \param{optval} un intero indicante il
+ numero di byte. Il valore di default ed il valore massimo che si può
+ specificare come argomento per questa opzione sono impostabili tramiti gli
+ opportuni valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
Si tenga presente che nel caso di socket TCP, per entrambe le opzioni
\const{SO\_RCVBUF} e \const{SO\_SNDBUF}, il kernel alloca effettivamente una
\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
+ modifiche alle dimensioni dei buffer di ricezione e trasmissione, per poter
essere effettive, devono essere impostate prima della chiamata alle funzioni
\func{listen} o \func{connect}.
\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
+ fra tutti quelli ricevuti, verranno letti. Viene usato principalmente 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}.
\end{figure}
Abilitandola dopo un certo tempo le connessioni effettivamente terminate
-verrano comunque chiuse per cui, utilizzando ad esempio una \func{select}, se
+verranno comunque chiuse per cui, utilizzando ad esempio una \func{select}, se
be potrà rilevare la conclusione e ricevere il relativo errore. Si tenga
presente però che non può avere la certezza assoluta che un errore di
\errcode{ETIMEDOUT} ottenuto dopo aver abilitato questa opzione corrisponda
\const{IP\_DROP\_MEMBERSHIP}& &$\bullet$& &\struct{ip\_mreqn}&
Si sgancia da un gruppo di \textit{multicast}.\\
\const{IP\_MULTICAST\_IF} & &$\bullet$& &\struct{ip\_mreqn}&
- Omposta l'interfaccia locale di un socket \itindex{multicast}
+ Imposta l'interfaccia locale di un socket \itindex{multicast}
\textit{multicast}.\\
\hline
\end{tabular}
quando un programma di terminale invia un segmento TCP per ogni tasto
premuto, 40 byte di intestazione di protocollo con 1 byte di dati
trasmessi; per evitare situazioni del genere è stato introdotto
- l'\textsl{algoritmo di Nagle}.} Questo meccanismo è controllato da un
- apposito algoritmo (detto \textsl{algoritmo di Nagle}, vedi
- sez.~\ref{sez:tcp_protocol_xxx}). Il comportamento normale del protocollo
+ \index{algoritmo~di~Nagle} l'\textsl{algoritmo di Nagle}.} Questo
+ meccanismo è controllato da un apposito algoritmo (detto
+ \index{algoritmo~di~Nagle} \textsl{algoritmo di Nagle}, vedi
+ sez.~\ref{sez:tcp_protocol_xxx}). Il comportamento normale del protocollo
prevede che i dati siano accumulati fintanto che non si raggiunge una
quantità considerata adeguata per eseguire la trasmissione di un singolo
segmento.
richiesta HTTP.} in tal caso l'attesa introdotta dall'algoritmo di
bufferizzazione non soltanto è inutile, ma peggiora le prestazioni
introducendo un ritardo. Impostando questa opzione si disabilita l'uso
- dell'\textsl{algoritmo di Nagle} ed i dati vengono inviati immediatamente in
- singoli segmenti, qualunque sia la loro dimensione. Ovviamente l'uso di
- questa opzione è dedicato a chi ha esigenze particolari come quella
- illustrata, che possono essere stabilite solo per la singola applicazione.
+ \index{algoritmo~di~Nagle} dell'\textsl{algoritmo di Nagle} ed i dati
+ vengono inviati immediatamente in singoli segmenti, qualunque sia la loro
+ dimensione. Ovviamente l'uso di questa opzione è dedicato a chi ha esigenze
+ particolari come quella illustrata, che possono essere stabilite solo per la
+ singola applicazione.
Si tenga conto che questa opzione viene sovrascritta dall'eventuale
impostazione dell'opzione \const{TCP\_CORK} (il cui scopo è sostanzialmente
\item[\const{TCP\_CORK}] questa opzione è il complemento naturale di
\const{TCP\_NODELAY} e serve a gestire a livello applicativo la situazione
opposta, cioè quella in cui si sa fin dal principio che si dovranno inviare
- grosse quantità di dati. Anche in questo caso l'\textsl{algoritmo di Nagle}
- tenderà a suddividerli in dimensioni da lui ritenute
- opportune,\footnote{l'algoritmo cerca di tenere conto di queste situazioni,
- ma essendo un algoritmo generico tenderà comunque ad introdurre delle
- suddivisioni in segmenti diversi, anche quando potrebbero non essere
- necessarie, con conseguente spreco di banda.} ma sapendo fin dall'inizio
- quale è la dimensione dei dati si potranno di nuovo ottenere delle migliori
- prestazioni disabilitandolo, e gestendo direttamente l'invio del nostro
- blocco di dati in soluzione unica.
+ grosse quantità di dati. Anche in questo caso \index{algoritmo~di~Nagle}
+ l'\textsl{algoritmo di Nagle} tenderà a suddividerli in dimensioni da lui
+ ritenute opportune,\footnote{l'algoritmo cerca di tenere conto di queste
+ situazioni, ma essendo un algoritmo generico tenderà comunque ad
+ introdurre delle suddivisioni in segmenti diversi, anche quando potrebbero
+ non essere necessarie, con conseguente spreco di banda.} ma sapendo fin
+ dall'inizio quale è la dimensione dei dati si potranno di nuovo ottenere
+ delle migliori prestazioni disabilitandolo, e gestendo direttamente l'invio
+ del nostro blocco di dati in soluzione unica.
Quando questa opzione viene abilitata non vengono inviati segmenti di dati
fintanto che essa non venga disabilitata; a quel punto tutti i dati rimasti
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
\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.
+ di default del buffer di ricezione (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
+ massima che si può assegnare al buffer di ricezione 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.
+ di default del buffer di trasmissione (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}.
+ massima che si può assegnare al buffer di trasmissione 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
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
+ impossibile 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}{tcp\_mem}] viene usato dallo stack TCP
- per gestire le modalità con cui esso utlizzerà la memoria. Prende una
+ per gestire le modalità con cui esso utilizzerà la memoria. Prende una
tripletta di valori interi, che indicano un numero di pagine:
\begin{itemize*}
\begin{itemize*}
\item il primo valore, chiamato \textit{min} nelle pagine di manuale, indica
- la dimensione minima del buffer di ricezione; il default è 4Kb, ma in
- sistemi con poca memoria viene automaticamente ridotto a
+ la dimensione minima in byte del buffer di ricezione; il default è 4Kb, ma
+ in sistemi con poca memoria viene automaticamente ridotto a
\const{PAGE\_SIZE}. Questo valore viene usato per assicurare che anche in
situazioni di pressione sulla memoria (vedi quanto detto per
- \procrelfile{/proc/sys/net/ipv4}{tcp\_mem}) le allocazioni al di sotto di
+ \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}) le allocazioni al di sotto di
questo limite abbiamo comunque successo. Questo valore non viene comunque
- ad incidere sulla dimensione del buffer di lettura di un singolo socket
+ ad incidere sulla dimensione del buffer di ricezione di un singolo socket
dichiarata con l'opzione \const{SO\_RCVBUF}.
\item il secondo valore, denominato \textit{default} nelle pagine di
\procrelfile{/proc/sys/net/ipv4}{tcp\_window\_scaling}).
\item il terzo valore, denominato \textit{max} nelle pagine di manuale,
- indica la dimensione massima, in byte, del buffer di ricezione di un
- socket TCP; il default è 174760 byte, che viene ridotto automaticamente a
- 87380 per sistemi con poca memoria. Il valore non può comunque eccedere il
+ indica la dimensione massima in byte del buffer di ricezione di un socket
+ TCP; il default è 174760 byte, che viene ridotto automaticamente a 87380
+ per sistemi con poca memoria. Il valore non può comunque eccedere il
limite generale per tutti i socket posto con
\procfile{/proc/sys/net/core/rmem\_max}. Questo valore non viene ad
- incidere sulla dimensione del buffer di lettura di un singolo socket
+ incidere sulla dimensione del buffer di ricezione di un singolo socket
dichiarata con l'opzione \const{SO\_RCVBUF}.
\end{itemize*}
\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_sack}] indica al kernel di
- utilizzare il meccanismo del \textit{TCP selective aknowledment} definito
+ utilizzare il meccanismo del \textit{TCP selective acknowledgement} definito
nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}. Prende un valore
logico e di default è abilitato.
dar luogo a problemi di interoperabilità.
\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_synack\_retries}] indica il numero
- massimo di volte che verrà ritasmesso il segmento SYN/ACK nella creazione di
+ massimo di volte che verrà ritrasmesso il segmento SYN/ACK nella creazione di
una connessione (vedi sez.~\ref{sec:TCP_conn_cre}). Prende un valore intero
ed il valore di default è 5; non si deve superare il valore massimo di 255.
\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_syncookies}] abilita i \textit{TCP
- syncookies}.\footnote{per poter usare quasta funzionalità è necessario
+ syncookies}.\footnote{per poter usare questa funzionalità è necessario
avere abilitato l'opzione \texttt{CONFIG\_SYN\_COOKIES} nella compilazione
del kernel.} Prende un valore logico, e di default è disabilitato. Questa
funzionalità serve a fornire una protezione in caso di un attacco di tipo
\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_recycle}] abilita il
riutilizzo rapido dei socket in stato \texttt{TIME\_WAIT}. Prende un valore
logico e di default è disabilitato. Non è opportuno abilitare questa opzione
- che può causare problemi con il NAT.
+ che può causare problemi con il NAT.\footnote{il \textit{Network Address
+ Translation} è una tecnica, impiegata nei firewall e nei router, che
+ consente di modificare al volo gli indirizzi dei pacchetti che transitano
+ per una macchina, Linux la supporta con il \itindex{netfilter}
+ \textit{netfilter}, per maggiori dettagli si consulti il cap.~2 di
+ \cite{FwGL}.}
\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_reuse}] abilita il riutilizzo
dello stato \texttt{TIME\_WAIT} quando questo è sicuro dal punto di vista
aumentarne le dimensioni. Questa è pienamente supportata dallo stack TCP di
Linux, ma se lo si disabilita la negoziazione del
\itindex{TCP~window~scaling} \textit{TCP window scaling} con l'altro capo
- della conessione non viene effettuata.
-
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_vegas\_cong\_avoid}]
+ della connessione non viene effettuata.
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_westwood}]
+%\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_vegas\_cong\_avoid}]
+% TODO: controllare su internet
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_wmem}]
+%\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_westwood}]
+% TODO: controllare su internet
-\end{basedescript}
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_wmem}] viene usato dallo stack TCP
+ per controllare dinamicamente le dimensioni dei propri buffer di spedizione,
+ adeguandole in rapporto alla memoria disponibile. Prende una tripletta di
+ valori interi separati da spazi che indicano delle dimensioni in byte:
+ \begin{itemize*}
+ \item il primo valore, chiamato \textit{min}, indica la dimensione minima in
+ byte del buffer di spedizione; il default è 4Kb. Come per l'analogo di
+ \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}) viene usato per assicurare
+ che anche in situazioni di pressione sulla memoria (vedi
+ \procrelfile{/proc/sys/net/ipv4}{tcp\_mem}) le allocazioni al di sotto di
+ questo limite abbiamo comunque successo. Di nuovo questo valore non viene
+ ad incidere sulla dimensione del buffer di trasmissione di un singolo
+ socket dichiarata con l'opzione \const{SO\_SNDBUF}.
+
+ \item il secondo valore, denominato \textit{default}, indica la dimensione
+ di default in byte del buffer di spedizione di un socket TCP. Questo
+ valore sovrascrive il default iniziale impostato per tutti i tipi di
+ socket con \procfile{/proc/sys/net/core/wmem\_default}. Il default è 87380
+ byte, ridotto a 43689 per sistemi con poca memoria. Si può aumentare
+ questo valore quando si desiderano dimensioni più ampie del buffer di
+ trasmissione per i socket TCP, ma come per il precedente
+ \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}) se si vuole che in
+ corrispondenza aumentino anche le dimensioni usate per la finestra TCP si
+ deve abilitare il \itindex{TCP~window~scaling} \textit{TCP window scaling}
+ con \procrelfile{/proc/sys/net/ipv4}{tcp\_window\_scaling}.
+
+ \item il terzo valore, denominato \textit{max}, indica la dimensione massima
+ in byte del buffer di spedizione di un socket TCP; il default è 128Kb, che
+ viene ridotto automaticamente a 64Kb per sistemi con poca memoria. Il
+ valore non può comunque eccedere il limite generale per tutti i socket
+ posto con \procfile{/proc/sys/net/core/wmem\_max}. Questo valore non viene
+ ad incidere sulla dimensione del buffer di trasmissione di un singolo
+ socket dichiarata con l'opzione \const{SO\_SNDBUF}.
+ \end{itemize*}
+\end{basedescript}
% 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
+% LocalWords: HTCP hybla HYBLA scalable SCALABLE ifc req iflist access ntoa Kb
+% LocalWords: hop Selective acknowledgement Explicit RTO stack firewall
+% LocalWords: Notification wireless denial pressure ATTACH DETACH
+% LocalWords: libpcap discovery point l'overhaed min PAGE flood
+% LocalWords: selective COOKIES NAT
%%% Local Variables:
%%% mode: latex