X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=c5bfafc116399574e9ff88cf5e9d0a7be4721558;hp=8bc4d038ee9e228a5076463d2193a225a1c1b3cc;hb=e7010c3fbd41a2de44c7b513c5de6e2c6d7ab4b4;hpb=d7db23a35bbd9c7465780719188709ca06e99eaf diff --git a/sockctrl.tex b/sockctrl.tex index 8bc4d03..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. @@ -2239,9 +2240,10 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: \item[\const{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di uscita del socket. Prende per \param{optval} un intero indicante il numero - di byte. Il valore di default ed il valore massimo che si può specificare - come argomento per questa opzione sono impostabili tramiti gli opportuni - valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}). + di byte. Il valore di default ed il valore massimo che si possono + specificare come argomento per questa opzione sono impostabili + rispettivamente tramite gli opportuni valori di \func{sysctl} (vedi + sez.~\ref{sec:sock_sysctl}). \item[\const{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di ingresso del socket. Prende per \param{optval} un intero indicante il numero @@ -2249,6 +2251,25 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: come argomento per questa opzione sono impostabili tramiti gli opportuni valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}). + Si tenga presente che nel caso di socket TCP, per entrambe le opzioni + \const{SO\_RCVBUF} e \const{SO\_SNDBUF}, il kernel alloca effettivamente una + quantità di memoria doppia rispetto a quanto richiesto con + \func{setsockopt}. Questo comporta che una successiva lettura con + \func{getsockopt} riporterà un valore diverso da quello impostato con + \func{setsockopt}. Questo avviene perché TCP necessita dello spazio in più + per mantenere dati amministrativi e strutture interne, e solo una parte + viene usata come buffer per i dati, mentre il valore letto da + \func{getsockopt} e quello riportato nei vari parametri di + \textit{sysctl}\footnote{cioè \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 + essere effettive, devono essere impostate prima della chiamata alle funzioni + \func{listen} o \func{connect}. + \item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene chiuso un socket quando si utilizza un protocollo che supporta le connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e @@ -2281,6 +2302,8 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: \func{select} che ritorna a causa dello stesso. \end{basedescript} +% TODO documentare SO_ATTACH_FILTER e SO_DETACH_FILTER + \subsection{L'uso delle principali opzioni dei socket} \label{sec:sock_options_main} @@ -2298,52 +2321,53 @@ approfondimento sul significato delle opzioni generiche pi La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di tenere sotto controllo lo stato di una connessione. Una connessione infatti -resta attiva anche quando non viene effettuato alcun traffico su di essa, -questo può comportare che un crollo della connessione, qualora avvenisse ad -esempio in conseguenza di una interruzione completa della rete, potrebbe -passare inosservato. +resta attiva anche quando non viene effettuato alcun traffico su di essa; è +allora possibile, in caso di una interruzione completa della rete, che la +caduta della connessione non venga rilevata, dato che sulla stessa non passa +comunque alcun traffico. Se si imposta questa opzione, è invece cura del kernel inviare degli appositi messaggi sulla rete, detti appunto \textit{keep-alive}, per verificare se la -connessione è attiva. L'opzione funziona soltanto con socket che supportino +connessione è attiva. L'opzione funziona soltanto con i socket che supportano le connessioni (non ha senso per socket UDP ad esempio) e si applica principalmente ai socket TCP. Con le impostazioni di default (che sono riprese da BSD) Linux emette un messaggio di \textit{keep-alive}\footnote{in sostanza un segmento ACK vuoto, cui sarà risposto con un altro segmento ACK vuoto.} verso l'altro capo della -connessione se questa è rimasta senza traffico per più di due ore. Se è tutto +connessione se questa è rimasta senza traffico per più di due ore. Se è tutto a posto il messaggio viene ricevuto e verrà emesso un segmento ACK di risposta, alla cui ricezione ripartirà un altro ciclo di attesa per altre due ore di inattività; il tutto avviene all'interno del kernel e le applicazioni non riceveranno nessun dato. -In caso di problemi invece si possono avere i due casi già illustrati in -sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione precoce del server: -il primo è quello in cui la macchina remota è caduta ed è stata riavviata, per -cui dopo il riavvio la connessione non viene più riconosciuta,\footnote{si - ricordi che un normale riavvio non ha questo effetto, in quanto in tal caso - si passa per la chiusura del processo, e questo, come illustrato in - sez.~\ref{sec:file_close}, comporta la chiusura del socket con l'invio di un - segmento FIN all'altro capo della connessione, che verrà regolarmente - chiusa.} in questo caso all'invio del messaggio di \textit{keep-alive} si -otterrà come risposta un segmento RST che indica che l'altro capo non -riconosce più l'esistenza della connessione. In tal caso il socket viene -chiuso dopo aver impostato un errore \errcode{ECONNRESET}. +Qualora ci siano dei problemi di rete si possono invece verificare i due casi +di terminazione precoce del server già illustrati in +sez.~\ref{sec:TCP_conn_crash}. Il primo è quello in cui la macchina remota ha +avuto un crollo del sistema ed è stata riavviata, per cui dopo il riavvio la +connessione non esiste più.\footnote{si ricordi che un normale riavvio o il + crollo dell'applicazione non ha questo effetto, in quanto in tal caso si + passa sempre per la chiusura del processo, e questo, come illustrato in + sez.~\ref{sec:file_close}, comporta anche la regolare chiusura del socket + con l'invio di un segmento FIN all'altro capo della connessione.} In questo +caso all'invio del messaggio di \textit{keep-alive} si otterrà come risposta +un segmento RST che indica che l'altro capo non riconosce più l'esistenza +della connessione ed il socket verrà chiuso riportando un errore di +\errcode{ECONNRESET}. Se invece non viene ricevuta nessuna risposta (indice che la macchina non è più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di 75 secondi per un massimo di 9 volte\footnote{entrambi questi valori possono - essere opportunamente modificati con gli opportuni parametri illustrati in - sez.~\ref{sec:sock_sysctl}, si tenga presente che però questo vale a livello - di kernel ed i suddetti valori saranno applicati a \textsl{tutti} i socket.} -(per un totale di 11 minuti e 15 secondi) dopo di che, se non si è ricevuta -nessuna risposta, il socket viene chiuso dopo aver impostato un errore di -\errcode{ETIMEDOUT}. Qualora la connessione si sia ristabilita e si riceva un -successivo messaggio di risposta il ciclo riparte come se niente fosse -avvenuto. Infine se invece si riceve come risposta un pacchetto ICMP di -destinazione irraggiungibile (vedi sez.~\ref{sec:icmp_protocol_xxx}), verrà -restituito l'errore corrispondente. + essere modificati a livello di sistema (cioè per tutti i socket) con gli + opportuni parametri illustrati in sez.~\ref{sec:sock_sysctl} ed a livello di + singolo socket con le opzioni \texttt{TCP\_KEEP*} di + sez.~\ref{sec:sock_tcp_udp_options}.} (per un totale di 11 minuti e 15 +secondi) dopo di che, se non si è ricevuta nessuna risposta, il socket viene +chiuso dopo aver impostato un errore di \errcode{ETIMEDOUT}. Qualora la +connessione si sia ristabilita e si riceva un successivo messaggio di risposta +il ciclo riparte come se niente fosse avvenuto. Infine se si riceve come +risposta un pacchetto ICMP di destinazione irraggiungibile (vedi +sez.~\ref{sec:ICMP_protocol}), 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 @@ -2351,9 +2375,9 @@ principalmente sui server per evitare di mantenere impegnate le risorse che verrebbero dedicate a trattare delle connessioni che in realtà sono già terminate (quelle che vengono anche chiamate connessioni \textsl{semi-aperte}); in tutti quei casi cioè in cui il server si trova in -attesa di dati in ingresso su una connessione che non arriveranno mai perché o -il client sull'altro capo non è più attivo o non è più in grado di comunicare -con il server via rete. +attesa di dati in ingresso su una connessione che non arriveranno mai o perché +il client sull'altro capo non è più attivo o perché non è più in grado di +comunicare con il server via rete. \begin{figure}[!htb] \footnotesize \centering @@ -2688,42 +2712,42 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file. \hline \hline \const{IP\_OPTIONS} &$\bullet$&$\bullet$&&\texttt{void *}& %??? - Imposta o riceve le opzioni di IP.\\ + imposta o riceve le opzioni di IP.\\ \const{IP\_PKTINFO} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio di informazione.\\ + passa un messaggio di informazione.\\ \const{IP\_RECVTOS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio col campo TOS.\\ + passa un messaggio col campo TOS.\\ \const{IP\_RECVTTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio col campo TTL.\\ + passa un messaggio col campo TTL.\\ \const{IP\_RECVOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio con le opzioni IP.\\ + passa un messaggio con le opzioni IP.\\ \const{IP\_RETOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio con le opzioni IP non trattate.\\ + passa un messaggio con le opzioni IP non trattate.\\ \const{IP\_TOS} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il valore del campo TOS.\\ + imposta il valore del campo TOS.\\ \const{IP\_TTL} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il valore del campo TTL.\\ + imposta il valore del campo TTL.\\ \const{IP\_HDRINCL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa l'intestazione di IP nei dati.\\ + passa l'intestazione di IP nei dati.\\ \const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Abilita la gestione degli errori.\\ + abilita la gestione degli errori.\\ \const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il Path MTU Discovery.\\ + imposta il Path MTU \itindex{Maximum~Transfer~Unit} Discovery.\\ \const{IP\_MTU} &$\bullet$& & &\texttt{int}& - Legge il valore attuale della MTU.\\ + legge il valore attuale della \itindex{Maximum~Transfer~Unit} MTU.\\ \const{IP\_ROUTER\_ALERT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Imposta l'opzione \textit{IP router alert} sui pacchetti.\\ + imposta l'opzione \textit{IP router alert} sui pacchetti.\\ \const{IP\_MULTICAST\_TTL} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\ + imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\ \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Controlla il reinvio a se stessi dei dati di \itindex{multicast} + controlla il reinvio a se stessi dei dati di \itindex{multicast} \textit{multicast}.\\ \const{IP\_ADD\_MEMBERSHIP} & &$\bullet$& &\struct{ip\_mreqn}& - Si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\ + si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\ \const{IP\_DROP\_MEMBERSHIP}& &$\bullet$& &\struct{ip\_mreqn}& - Si sgancia da un gruppo di \textit{multicast}.\\ + si sgancia da un gruppo di \textit{multicast}.\\ \const{IP\_MULTICAST\_IF} & &$\bullet$& &\struct{ip\_mreqn}& - Imposta l'interfaccia locale di un socket \itindex{multicast} + imposta l'interfaccia locale di un socket \itindex{multicast} \textit{multicast}.\\ \hline \end{tabular} @@ -2754,7 +2778,9 @@ seguente elenco: una struttura \struct{pktinfo} (vedi fig.~\ref{fig:sock_pktinfo_struct}) che mantiene una serie di informazioni riguardo i pacchetti in arrivo. In particolare è possibile conoscere l'interfaccia su cui è stato ricevuto un - pacchetto (nel campo \var{ipi\_ifindex}), l'indirizzo locale da esso + pacchetto (nel campo \var{ipi\_ifindex}),\footnote{in questo campo viene + restituito il valore numerico dell'indice dell'interfaccia, + sez.~\ref{sec:sock_ioctl_netdevice}.} l'indirizzo locale da esso utilizzato (nel campo \var{ipi\_spec\_dst}) e l'indirizzo remoto dello stesso (nel campo \var{ipi\_addr}). @@ -2915,13 +2941,13 @@ sez.~\ref{sec:net_sendmsg}). esplicitamente connesso con \func{connect}. Ad esempio con i socket UDP si potrà ottenere una stima iniziale della - \textit{Path MTU} eseguendo prima una \func{connect} verso la destinazione, - e poi usando \func{getsockopt} con questa opzione. Si può anche avviare - esplicitamente il procedimento di scoperta inviando un pacchetto di grosse - dimensioni (che verrà scartato) e ripetendo l'invio coi dati aggiornati. Si - tenga infine conto che durante il procedimento i pacchetti iniziali possono - essere perduti, ed è compito dell'applicazione gestirne una eventuale - ritrasmissione. + \itindex{Maximum~Transfer~Unit} \textit{Path MTU} eseguendo prima una + \func{connect} verso la destinazione, e poi usando \func{getsockopt} con + questa opzione. Si può anche avviare esplicitamente il procedimento di + scoperta inviando un pacchetto di grosse dimensioni (che verrà scartato) e + ripetendo l'invio coi dati aggiornati. Si tenga infine conto che durante il + procedimento i pacchetti iniziali possono essere perduti, ed è compito + dell'applicazione gestirne una eventuale ritrasmissione. \itindend{Maximum~Transfer~Unit} @@ -3000,24 +3026,26 @@ UDP e TCP.\footnote{come per le precedenti, una descrizione di queste opzioni è disponibile nella settima sezione delle pagine di manuale, che si può consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono - alquanto incomplete.} Dato che questi protocolli sono entrambi trasportati -su IP, oltre alle opzioni generiche di sez.~\ref{sec:sock_generic_options} -saranno comunque disponibili anche le precedenti opzioni di -sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in - sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, ma - quelle per TCP e UDP sono le stesse anche quando si usa IPv6.} - + alquanto incomplete.} Dato che questi due protocolli sono entrambi +trasportati su IP,\footnote{qui si sottintende IPv4, ma le opzioni per TCP e + UDP sono le stesse anche quando si usa IPv6.} oltre alle opzioni generiche +di sez.~\ref{sec:sock_generic_options} saranno comunque disponibili anche le +precedenti opzioni di sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in + sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, al + solito, qualora si stesse utilizzando IPv6, si potrebbero utilizzare le + opzioni di quest'ultimo.} Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente -\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si è -riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_tcp}. Le -costanti indicanti le opzioni del protocollo TCP e tutte le altre costanti ad -esse collegate sono definite in \file{netinet/tcp.h}, ed accessibili -includendo detto file.\footnote{in realtà questo è il file usato dalle - librerie; la definizione delle opzioni effettivamente supportate da Linux si - trova nel file \texttt{linux/tcp.h}, dal quale si sono estratte le costanti - di tab.~\ref{tab:sock_opt_tcplevel}.} +\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si sono +riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcplevel}, +dove sono elencate le rispettive costanti da utilizzare come valore per +l'argomento \param{optname}. Dette costanti e tutte le altre costanti e +strutture collegate all'uso delle opzioni TCP sono definite in +\file{netinet/tcp.h}, ed accessibili includendo detto file.\footnote{in realtà + questo è il file usato dalle librerie; la definizione delle opzioni + effettivamente supportate da Linux si trova nel file \texttt{linux/tcp.h}, + dal quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_tcplevel}.} \begin{table}[!htb] \centering @@ -3028,32 +3056,33 @@ includendo detto file.\footnote{in realt \textbf{Descrizione}\\ \hline \hline - \const{TCP\_NODELAY} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_MAXSEG} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_KEEPIDLE} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_KEEPINTVL} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_KEEPCNT} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_SYNCNT} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_LINGER2} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_INFO} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_QUICKACK} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{TCP\_CONGESTION} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ + \const{TCP\_NODELAY} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + spedisce immediatamente i dati in segmenti singoli.\\ + \const{TCP\_MAXSEG} &$\bullet$&$\bullet$& &\texttt{int}& + valore della \itindex{Maximum~Segment~Size} MSS per i segmenti in + uscita.\\ + \const{TCP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + accumula i dati in un unico segmento.\\ + \const{TCP\_KEEPIDLE} &$\bullet$&$\bullet$& &\texttt{int}& + tempo in secondi prima di inviare un \textit{keepalive}.\\ + \const{TCP\_KEEPINTVL} &$\bullet$&$\bullet$& &\texttt{int}& + tempo in secondi prima fra \textit{keepalive} successivi.\\ + \const{TCP\_KEEPCNT} &$\bullet$&$\bullet$& &\texttt{int}& + numero massimo di \textit{keepalive} inviati.\\ + \const{TCP\_SYNCNT} &$\bullet$&$\bullet$& &\texttt{int}& + numero massimo di ritrasmissioni di un SYN.\\ + \const{TCP\_LINGER2} &$\bullet$&$\bullet$& &\texttt{int}& + tempo di vita in stato \texttt{FIN\_WAIT2}.\\ + \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$& &\texttt{int}& + ritorna da \func{accept} solo in presenza di dati.\\ + \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$& &\texttt{int}& + valore della \itindex{advertised~window} \textit{advertised window}.\\ + \const{TCP\_INFO} &$\bullet$& & &\struct{tcp\_info}& + restituisce informazioni sul socket.\\ + \const{TCP\_QUICKACK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + abilita la modalità \textit{quickack}.\\ + \const{TCP\_CONGESTION} &$\bullet$&$\bullet$& &\texttt{char *}& + imposta l'algoritmo per il controllo della congestione.\\ \hline \end{tabular} \caption{Le opzioni per i socket TCP disponibili al livello @@ -3061,41 +3090,342 @@ includendo detto file.\footnote{in realt \label{tab:sock_opt_tcplevel} \end{table} -Le descrizioni di tab.~\ref{tab:sock_opt_tcplevel} sono estremamente -sintetiche, una maggiore quantità di dettagli su queste opzioni è fornita nel -seguente elenco: -\begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}} - -\item[\const{TCP\_NODELAY}] - -\item[\const{TCP\_MAXSEG}] - -\item[\const{TCP\_CORK}] - -\item[\const{TCP\_KEEPINTVL}] - -\item[\const{TCP\_KEEPCNT}] +Le descrizioni delle varie opzioni riportate in +tab.~\ref{tab:sock_opt_tcplevel} sono estremamente sintetiche ed indicative, +la spiegazione del funzionamento delle singole opzioni con una maggiore +quantità di dettagli è fornita nel seguente elenco: +\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{TCP\_SYNCNT}] -\item[\const{TCP\_LINGER2}] +\item[\const{TCP\_NODELAY}] il protocollo TCP utilizza un meccanismo di + bufferizzazione dei dati uscenti, per evitare la trasmissione di tanti + piccoli segmenti con un utilizzo non ottimale della banda + disponibile.\footnote{il problema è chiamato anche \textit{silly window + syndrome}, per averne un'idea si pensi al risultato che si ottiene + 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 + prevede che i dati siano accumulati fintanto che non si raggiunge una + quantità considerata adeguata per eseguire la trasmissione di un singolo + segmento. + + Ci sono però delle situazioni in cui questo comportamento può non essere + desiderabile, ad esempio quando si sa in anticipo che l'applicazione invierà + soltanto un piccolo quantitativo di dati;\footnote{è il caso classico di una + 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. + + Si tenga conto che questa opzione viene sovrascritta dall'eventuale + impostazione dell'opzione \const{TCP\_CORK} (il cui scopo è sostanzialmente + l'opposto) che blocca l'invio immediato. Tuttavia quando la si abilita viene + sempre forzato lo scaricamento della coda di invio (con conseguente + trasmissione di tutti i dati pendenti), anche qualora si fosse già abilitata + \const{TCP\_CORK}.\footnote{si tenga presente però che \const{TCP\_CORK} può + essere specificata insieme a \const{TCP\_NODELAY} soltanto a partire dal + kernel 2.5.71.} + +\item[\const{TCP\_MAXSEG}] con questa opzione si legge o si imposta il valore + della \itindex{Maximum~Segment~Size} MSS (\textit{Maximum~Segment~Size}, + vedi sez.~\ref{sec:net_lim_dim} e sez.~\ref{sez:tcp_protocol_xxx}) dei + segmenti TCP uscenti. Se l'opzione è impostata prima di stabilire la + connessione, si cambia anche il valore della \itindex{Maximum~Segment~Size} + MSS annunciata all'altro capo della connessione. Se si specificano valori + maggiori della \itindex{Maximum~Transfer~Unit} MTU questi verranno ignorati, + inoltre TCP imporrà anche i suoi limiti massimo e minimo per questo valore. + +\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. + + Quando questa opzione viene abilitata non vengono inviati segmenti di dati + fintanto che essa non venga disabilitata; a quel punto tutti i dati rimasti + in coda saranno inviati in un solo segmento TCP. In sostanza con questa + opzione si può controllare il flusso dei dati mettendo una sorta di + ``\textsl{tappo}'' (da cui il nome in inglese) al flusso di uscita, in modo + ottimizzare a mano l'uso della banda. Si tenga presente che per l'effettivo + funzionamento ci si deve ricordare di disattivare l'opzione al termine + dell'invio del blocco dei dati. + + 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_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 + quali i dati accumulati in coda sanno inviati comunque. Questa opzione è + tipica di Linux\footnote{l'opzione è stata introdotta con i kernel della + serie 2.4.x.} e non è disponibile su tutti i kernel unix-like, pertanto + deve essere evitata se si vuole scrivere codice portabile. + +\item[\const{TCP\_KEEPIDLE}] con questa opzione si legge o si imposta + l'intervallo di tempo, in secondi, che deve trascorrere senza traffico sul + socket prima che vengano inviati, qualora si sia attivata su di esso + l'opzione \const{SO\_KEEPALIVE}, i messaggi di \textit{keep-alive} (si veda + la trattazione relativa al \textit{keep-alive} in + sez.~\ref{sec:sock_options_main}). Anche questa opzione non è disponibile + su tutti i kernel unix-like e deve essere evitata se si vuole scrivere + codice portabile. + +\item[\const{TCP\_KEEPINTVL}] con questa opzione si legge o si imposta + l'intervallo di tempo, in secondi, fra due messaggi di \textit{keep-alive} + successivi (si veda sempre quanto illustrato in + sez.~\ref{sec:sock_options_main}). Come la precedente non è disponibile su + tutti i kernel unix-like e deve essere evitata se si vuole scrivere codice + portabile. + +\item[\const{TCP\_KEEPCNT}] con questa opzione si legge o si imposta il numero + totale di messaggi di \textit{keep-alive} da inviare prima di concludere che + la connessione è caduta per assenza di risposte ad un messaggio di + \textit{keep-alive} (di nuovo vedi sez.~\ref{sec:sock_options_main}). Come + la precedente non è disponibile su tutti i kernel unix-like e deve essere + evitata se si vuole scrivere codice portabile. + +\item[\const{TCP\_SYNCNT}] con questa opzione si legge o si imposta il numero + di tentativi di ritrasmissione dei segmenti SYN usati nel + \itindex{three~way~handshake} \textit{three way handshake} prima che il + tentativo di connessione venga abortito (si ricordi quanto accennato in + sez.~\ref{sec:TCP_func_connect}). Sovrascrive 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 + scrivere codice portabile. + +\item[\const{TCP\_LINGER2}] con questa opzione si legge o si imposta, in + numero di secondi, il tempo di sussistenza dei socket terminati nello stato + \texttt{FIN\_WAIT2} (si ricordi quanto visto in + sez.~\ref{sec:TCP_conn_term}).\footnote{si tenga ben presente che questa + opzione non ha nulla a che fare con l'opzione \const{SO\_LINGER} che + abbiamo visto in sez.~\ref{sec:sock_options_main}.} Questa opzione + consente di sovrascrivere per il singolo socket il valore globale impostato + con la \textit{sysctl} \texttt{tcp\_fin\_timeout} (vedi + sez.~\ref{sec:sock_ipv4_sysctl}). Anche questa opzione è da evitare se si + ha a cuore la portabilità del codice. + +\item[\const{TCP\_DEFER\_ACCEPT}] questa opzione consente di modificare il + comportamento standard del protocollo TCP nello stabilirsi di una + connessione; se ricordiamo il meccanismo del \itindex{three~way~handshake} + \textit{three way handshake} illustrato in fig.~\ref{fig:TCP_TWH} possiamo + vedere che in genere un client inizierà ad inviare i dati ad un server solo + dopo l'emissione dell'ultimo segmento di ACK. + + Di nuovo esistono situazioni (e la più tipica è quella di una richiesta + HTTP) in cui sarebbe utile inviare immediatamente la richiesta all'interno + del segmento con l'ultimo ACK del \itindex{three~way~handshake} + \textit{three way handshake}; si potrebbe così risparmiare l'invio di un + segmento successivo per la richiesta e il ritardo sul server fra la + ricezione dell'ACK e quello della richiesta. + + Se si invoca \const{TCP\_DEFER\_ACCEPT} su un socket dal lato client (cioè + dal lato da cui si invoca \func{connect}) si istruisce il kernel a non + inviare immediatamente l'ACK finale del \itindex{three~way~handshake} + \textit{three way handshake}, attendendo per un po' di tempo la prima + scrittura, in modo da inviare i dati di questa insieme col segmento ACK. + Chiaramente la correttezza di questo comportamento dipende in maniera + diretta dal tipo di applicazione che usa il socket; con HTTP, che invia una + breve richiesta, permette di risparmiare un segmento, con FTP, in cui invece + si attende la ricezione del prompt del server, introduce un inutile ritardo. + + Allo stesso tempo il protocollo TCP prevede che sul lato del server la + funzione \func{accept} ritorni dopo la ricezione dell'ACK finale, in tal + caso quello che si fa usualmente è lanciare un nuovo processo per leggere i + successivi dati, che si bloccherà su una \func{read} se questi non sono + disponibili; in questo modo si saranno impiegate delle risorse (per la + creazione del nuovo processo) che non vengono usate immediatamente. L'uso + di \const{TCP\_DEFER\_ACCEPT} consente di intervenire anche in questa + situazione; quando la si invoca sul lato server (vale a dire su un socket in + ascolto) l'opzione fa sì che \func{accept} ritorni soltanto quando sono + presenti dei dati sul socket, e non alla ricezione dell'ACK conclusivo del + \itindex{three~way~handshake} \textit{three way handshake}. + + L'opzione prende un valore intero che indica il numero massimo di secondi + per cui mantenere il ritardo, sia per quanto riguarda il ritorno di + \func{accept} su un server, che per l'invio dell'ACK finale insieme ai dati + su un client. L'opzione è specifica di Linux non deve essere utilizzata in + codice che vuole essere portabile.\footnote{su FreeBSD è presente una + opzione \texttt{SO\_ACCEPTFILTER} che consente di ottenere lo stesso + comportamento di \const{TCP\_DEFER\_ACCEPT} per quanto riguarda il lato + server.} + +\item[\const{TCP\_WINDOW\_CLAMP}] con questa opzione si legge o si imposta + alla dimensione specificata, in byte, il valore dichiarato della + \itindex{advertised~window} \textit{advertised window} (vedi + sez.~\ref{sez:tcp_protocol_xxx}). Il kernel impone comunque una dimensione + minima pari a \texttt{SOCK\_MIN\_RCVBUF/2}. Questa opzione non deve essere + utilizzata in codice che vuole essere portabile. -\item[\const{TCP\_DEFER\_ACCEPT}] +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/tcp_info.h} + \end{minipage} + \caption{La struttura \structd{tcp\_info} contenente le informazioni sul + socket restituita dall'opzione \const{TCP\_INFO}.} + \label{fig:tcp_info_struct} +\end{figure} -\item[\const{TCP\_WINDOW\_CLAMP}] +\item[\const{TCP\_INFO}] questa opzione, specifica di Linux, ma introdotta + anche in altri kernel (ad esempio FreeBSD) permette di controllare lo stato + interno di un socket TCP direttamente da un programma in user space. + L'opzione restituisce in una speciale struttura \struct{tcp\_info}, la cui + definizione è riportata in fig.~\ref{fig:tcp_info_struct}, tutta una serie + di dati che il kernel mantiene, relativi al socket. Anche questa opzione + deve essere evitata se si vuole scrivere codice portabile. + + Con questa opzione diventa possibile ricevere una serie di informazioni + relative ad un socket TCP così da poter effettuare dei controlli senza dover + passare attraverso delle operazioni di lettura. Ad esempio si può verificare + se un socket è stato chiuso usando una funzione analoga a quella illustrata + in fig.~\ref{fig:is_closing}, in cui si utilizza il valore del campo + \var{tcpi\_state} di \struct{tcp\_info} per controllare lo stato del socket. -\item[\const{TCP\_INFO}] +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includecodesnip{listati/is_closing.c} + \end{minipage} + \caption{Codice della funzione \texttt{is\_closing.c}, che controlla lo stato + di un socket TCP per verificare se si sta chiudendo.} + \label{fig:is_closing} +\end{figure} -\item[\const{TCP\_QUICKACK}] +%Si noti come nell'esempio si sia ( + + +\item[\const{TCP\_QUICKACK}] con questa opzione è possibile eseguire una forma + di controllo sull'invio dei segmenti ACK all'interno di in flusso di dati su + TCP. In genere questo invio viene gestito direttamente dal kernel, il + comportamento standard, corrispondente la valore logico di vero (in genere + 1) per questa opzione, è quello di inviare immediatamente i segmenti ACK, in + quanto normalmente questo significa che si è ricevuto un blocco di dati e si + può passare all'elaborazione del blocco successivo. + + Qualora però la nostra applicazione sappia in anticipo che alla ricezione di + un blocco di dati seguirà immediatamente l'invio di un altro + blocco,\footnote{caso tipico ad esempio delle risposte alle richieste HTTP.} + poter accorpare quest'ultimo al segmento ACK permette di risparmiare sia in + termini di dati inviati che di velocità di risposta. Per far questo si può + utilizzare \const{TCP\_QUICKACK} impostando un valore logico falso (cioè 0), + in questo modo il kernel attenderà così da inviare il prossimo segmento di + ACK insieme ai primi dati disponibili. + + Si tenga presente che l'opzione non è permanente, vale a dire che una volta + che la si sia impostata a 0 il kernel la riporterà al valore di default dopo + il suo primo utilizzo. Sul lato server la si può impostare anche una volta + sola su un socket in ascolto, ed essa verrà ereditata da tutti i socket che + si otterranno da esso al ritorno di \func{accept}. + +% TODO trattare con gli esempi di apache + +\item[\const{TCP\_CONGESTION}] questa opzione permette di impostare quale + algoritmo per il controllo della congestione\footnote{il controllo della + congestione è un meccanismo previsto dal protocollo TCP (vedi + sez.~\ref{sez:tcp_protocol_xxx}) per evitare di trasmettere inutilmente + dati quando una connessione è congestionata; un buon algoritmo è + fondamentale per il funzionamento del protocollo, dato che i pacchetti + persi andrebbero ritrasmessi, per cui inviare un pacchetto su una linea + congestionata potrebbe causare facilmente un peggioramento della + situazione.} utilizzare per il singolo socket. L'opzione è stata + introdotta con il kernel 2.6.13,\footnote{alla data di stesura di queste + note (Set. 2006) è pure scarsamente documentata, tanto che non è neanche + definita nelle intestazioni delle \acr{glibc} per cui occorre definirla a + mano al suo valore che è 13.} e prende come per \param{optval} il + puntatore ad un buffer contenente il nome dell'algoritmo di controllo che + si vuole usare. + + L'uso di un nome anziché di un valore numerico è dovuto al fatto che gli + algoritmi di controllo della congestione sono realizzati attraverso + altrettanti moduli del kernel, e possono pertanto essere attivati a + richiesta; il nome consente di caricare il rispettivo modulo e di introdurre + moduli aggiuntivi che implementino altri meccanismi. + + Per poter disporre di questa funzionalità occorre aver compilato il kernel + attivando l'opzione di configurazione generale + \texttt{TCP\_CONG\_ADVANCED},\footnote{disponibile come \textit{TCP: + advanced congestion control} nel menù \textit{Network->Networking + options}, che a sua volta renderà disponibile un ulteriore menù con gli + algoritmi presenti.} e poi abilitare i singoli moduli voluti con le varie + \texttt{TCP\_CONG\_*} presenti per i vari algoritmi disponibili; un elenco + di quelli attualmente supportati nella versione ufficiale del kernel è + riportato in tab.~\ref{tab:sock_tcp_congestion_algo}.\footnote{la lista è + presa dalla versione 2.6.17.} + + + Si tenga presente che prima della implementazione modulare alcuni di questi + algoritmi erano disponibili soltanto come caratteristiche generali del + sistema, attivabili per tutti i socket, questo è ancora possibile con la + \textit{sysctl} \texttt{tcp\_congestion\_control} (vedi + sez.~\ref{sec:sock_ipv4_sysctl}) che ha sostituito le precedenti + \textit{sysctl}.\footnote{riportate anche, alla data di stesura di queste + pagine (Set. 2006) nelle pagine di manuale, ma non più presenti.} -\item[\const{TCP\_CONGESTION}] Introdotta con il kernel 2.6.13. + \begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|l|p{10cm}|} + \hline + \textbf{Nome}&\textbf{Configurazione}&\textbf{Riferimento} \\ + \hline + \hline + reno& -- &algoritmo tradizionale, usato in caso di assenza degli altri.\\ + \texttt{bic} &\texttt{TCP\_CONG\_BIC} & + \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm} + {\texttt{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\ + \texttt{cubic} &\texttt{TCP\_CONG\_CUBIC} & + \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm} + {\texttt{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\ + \texttt{highspeed}&\texttt{TCP\_CONG\_HSTCP} & + \href{http://www.icir.org/floyd/hstcp.html} + {\texttt{http://www.icir.org/floyd/hstcp.html}}.\\ + \texttt{htcp} &\texttt{TCP\_CONG\_HTCP} & + \href{http://www.hamilton.ie/net/htcp/} + {\texttt{http://www.hamilton.ie/net/htcp/}}.\\ + \texttt{hybla} &\texttt{TCP\_CONG\_HYBLA} & + \href{http://www.danielinux.net/projects.html} + {\texttt{http://www.danielinux.net/projects.html}}.\\ + \texttt{scalable}&\texttt{TCP\_CONG\_SCALABLE}& + \href{http://www.deneholme.net/tom/scalable/} + {\texttt{http://www.deneholme.net/tom/scalable/}}.\\ + \texttt{vegas} &\texttt{TCP\_CONG\_VEGAS} & + \href{http://www.cs.arizona.edu/protocols/} + {\texttt{http://www.cs.arizona.edu/protocols/}}.\\ + \texttt{westwood}&\texttt{TCP\_CONG\_WESTWOOD}& + \href{http://www.cs.ucla.edu/NRL/hpi/tcpw/} + {\texttt{http://www.cs.ucla.edu/NRL/hpi/tcpw/}}.\\ +% \texttt{}&\texttt{}& .\\ + \hline + \end{tabular} + \caption{Gli algoritmi per il controllo della congestione disponibili con + Linux con le relative opzioni di configurazione da attivare.} + \label{tab:sock_tcp_congestion_algo} + \end{table} \end{basedescript} Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero -ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udp}; anche in questo -caso per poterle utilizzare occorrerà impostare l'opportuno valore per +ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udplevel}; anche in +questo caso per poterle utilizzare occorrerà impostare l'opportuno valore per l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente \const{IPPROTO\_UDP}). Le costanti che identificano dette opzioni sono definite in \file{netinet/udp.h}, ed accessibili includendo detto @@ -3112,10 +3442,10 @@ file.\footnote{come per TCP, la definizione delle opzioni effettivamente \textbf{Descrizione}\\ \hline \hline - \const{UDP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ - \const{UDP\_ENCAP} &$\bullet$&$\bullet$&&\texttt{}& %??? - .\\ + \const{UDP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? + accumula tutti i dati su un unico pacchetto.\\ + \const{UDP\_ENCAP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? + non documentata.\\ \hline \end{tabular} \caption{Le opzioni per i socket UDP disponibili al livello @@ -3128,9 +3458,17 @@ sono un semplice riferimento, una maggiore quantit caratteristiche delle opzioni citate è quello dell'elenco seguente: \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{UDP\_CORK}] Introdotta con il kernel 2.5.44 +\item[\const{UDP\_CORK}] questa opzione ha l'identico effetto dell'analoga + \const{TCP\_CORK} vista in precedenza per il protocollo TCP, e quando + abilitata consente di accumulare i dati in uscita su un solo pacchetto che + verrà inviato una volta che la si disabiliti. L'opzione è stata introdotta + con il kernel 2.5.44, e non deve essere utilizzata in codice che vuole + essere portabile. -\item[\const{UDP\_ENCAP}] Introdotta con il kernel 2.5.67. +\item[\const{UDP\_ENCAP}] Questa opzione permette di gestire l'incapsulazione + dei dati nel protocollo UDP. L'opzione è stata introdotta con il kernel + 2.5.67, e non è documentata. Come la precedente è specifica di Linux e non + deve essere utilizzata in codice portabile. \end{basedescript} @@ -3220,9 +3558,9 @@ processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con Benché non strettamente attinenti alla gestione dei socket, vale la pena di trattare qui l'interfaccia di accesso a basso livello ai dispositivi di rete che viene appunto fornita attraverso la funzione \texttt{ioctl}. Questa non è -attinente a carattestiche specifiche di un qualche protocollo, ma si applica a -tutti i socket, indipendentemente dal tipo o famiglia dello stesso, e permette -di impostare e rilevare le funzionalità delle interfacce di rete. +attinente a caratteristiche specifiche di un qualche protocollo, ma si applica +a tutti i socket, indipendentemente da tipo e famiglia degli stessi, e +permette di impostare e rilevare le funzionalità delle interfacce di rete. \begin{figure}[!htb] \footnotesize \centering @@ -3240,13 +3578,13 @@ Tutte le operazioni di questo tipo utilizzano come terzo argomento di il primo campo della struttura, \var{ifr\_name} per specificare il nome dell'interfaccia su cui si vuole operare (ad esempio \texttt{eth0}, \texttt{ppp0}, ecc.), e si inseriscono (o ricevono) i valori relativi alle -diversa carateristiche e funzionalità nel secondo campo, che come si può +diversa caratteristiche e funzionalità nel secondo campo, che come si può notare è definito come una \ctyp{union} proprio in quanto il suo significato varia a secondo dell'operazione scelta. Si tenga inoltre presente che alcune di queste operazioni (in particolare quelle che modificano le caratteristiche dell'interfaccia) sono privilegiate e -richiedono i privilegi di amministatore o la \itindex{capabilities} +richiedono i privilegi di amministratore o la \itindex{capabilities} \textit{capability} \const{CAP\_NET\_ADMIN}, altrimenti si otterrà un errore di \errval{EPERM}. Le costanti che identificano le operazioni disponibili sono le seguenti: @@ -3258,21 +3596,23 @@ 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 \textit{interface index}, che è quello che effettivamente la - identifica nelle operazioni a basso livello, il nome dell'interfaccia è - soltanto una etichetta associata a detto \textsl{indice}, che permette di - rendere più comprensibile l'indicazione dell'interfaccia all'interno dei - comandi; si può ottenere un elenco delle interfacce che contiene anche il - valore del relativo indice usando il comando \cmd{ip link}. + 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 + all'interno dei comandi. Una modalità per ottenere questo valore è usare il + comando \cmd{ip link}, che fornisce un elenco delle interfacce presenti + ordinato in base a tale valore (riportato come primo campo). + \item[\const{SIOCGIFINDEX}] restituisce nel campo \var{ifr\_ifindex} il valore numerico dell'indice dell'interfaccia specificata con \var{ifr\_name}, è in sostanza l'operazione inversa di \const{SIOCGIFNAME}. \item[\const{SIOCGIFFLAGS}] permette di ottenere nel campo \var{ifr\_flags} il - valore corrente dei flag dell'interfaccia specificata. Il valore restituito - è una maschera binaria i cui bit sono identificabili attraverso le varie - costanti di tab.~\ref{tab:netdevice_iface_flag}. + valore corrente dei flag dell'interfaccia specificata (con \var{ifr\_name}). + Il valore restituito è una maschera binaria i cui bit sono identificabili + attraverso le varie costanti di tab.~\ref{tab:netdevice_iface_flag}. \begin{table}[htb] \centering @@ -3323,28 +3663,179 @@ sono le seguenti: \item[\const{SIOCSIFFLAGS}] permette di impostare il valore dei flag - dell'interfaccia attraverso il valore della maschera binaria da passare nel + dell'interfaccia specificata (sempre con \var{ifr\_name}, non staremo a + ripeterlo oltre) attraverso il valore della maschera binaria da passare nel campo \var{ifr\_flags}, che può essere ottenuta con l'OR aritmetico delle costanti di tab.~\ref{tab:netdevice_iface_flag}; questa operazione è privilegiata. -\item[\const{SIOCGIFMETRIC}] . -\item[\const{SIOCSIFMETRIC}] . -\item[\const{SIOCGIFMTU}] . -\item[\const{SIOCSIFMTU}] . -\item[\const{SIOCGIFHWADDR}] . -\item[\const{SIOCSIFHWADDR}] . -\item[\const{SIOCSIFHWBROADCAST}] . -\item[\const{SIOCGIFMAP}] . -\item[\const{SIOCSIFMAP}] . -\item[\const{SIOCADDMULTI}] . -\item[\const{SIOCDELMULTI}] . -\item[\const{SIOCGIFTXQLEN}] . -\item[\const{SIOCSIFTXQLEN}] . -\item[\const{SIOCSIFNAME}] . -\item[\const{SIOCGIFCONF}] . +\item[\const{SIOCGIFMETRIC}] permette di leggere il valore della metrica del + dispositivo associato all'interfaccia specificata nel campo + \var{ifr\_metric}. Attualmente non è implementato, e l'operazione + restituisce sempre un valore nullo. + +\item[\const{SIOCSIFMETRIC}] permette di impostare il valore della metrica del + dispositivo al valore specificato nel campo \var{ifr\_metric}, attualmente + non ancora implementato, restituisce un errore di \errval{EOPNOTSUPP}. + +\item[\const{SIOCGIFMTU}] permette di leggere il valore della + \itindex{Maximum~Transfer~Unit} \textit{Maximum Transfer Unit} del + dispositivo nel campo \var{ifr\_mtu}. + +\item[\const{SIOCSIFMTU}] permette di impostare il valore della + \itindex{Maximum~Transfer~Unit} \textit{Maximum Transfer Unit} del + dispositivo al valore specificato campo \var{ifr\_mtu}. L'operazione è + privilegiata, e si tenga presente che impostare un valore troppo basso può + causare un blocco del kernel. + +\item[\const{SIOCGIFHWADDR}] permette di leggere il valore dell'indirizzo + hardware del dispositivo associato all'interfaccia nel campo + \var{ifr\_hwaddr}; questo viene restituito come struttura \struct{sockaddr} + in cui il campo \var{sa\_family} contiene un valore \texttt{ARPHRD\_*} + indicante il tipo di indirizzo ed il campo \var{sa\_data} il valore binario + dell'indirizzo hardware a partire dal byte 0. + +\item[\const{SIOCSIFHWADDR}] permette di impostare il valore dell'indirizzo + hardware del dispositivo associato all'interfaccia attraverso il valore + della struttura \struct{sockaddr} (con lo stesso formato illustrato per + \const{SIOCGIFHWADDR}) passata nel campo \var{ifr\_hwaddr}. L'operazione è + privilegiata. + +\item[\const{SIOCSIFHWBROADCAST}] imposta l'indirizzo \textit{broadcast} + \itindex{broadcast} hardware dell'interfaccia al valore specificato dal + campo \var{ifr\_hwaddr}. L'operazione è privilegiata. + +\item[\const{SIOCGIFMAP}] legge alcuni parametri hardware (memoria, interrupt, + canali di DMA) del driver dell'interfaccia specificata, restituendo i + relativi valori nel campo \var{ifr\_map}; quest'ultimo contiene una + struttura di tipo \struct{ifmap}, la cui definizione è illustrata in + fig.~\ref{fig:netdevice_ifmap_struct}. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/ifmap.h} + \end{minipage} + \caption{La struttura \structd{ifmap} utilizzata per leggere ed impostare i + valori dei parametri hardware di un driver di una interfaccia.} + \label{fig:netdevice_ifmap_struct} +\end{figure} + +\item[\const{SIOCSIFMAP}] imposta i parametri hardware del driver + dell'interfaccia specificata, restituendo i relativi valori nel campo + \var{ifr\_map}. Come per \const{SIOCGIFMAP} questo deve essere passato come + struttura \struct{ifmap}, secondo la definizione di + fig.~\ref{fig:netdevice_ifmap_struct}. + +\item[\const{SIOCADDMULTI}] aggiunge un indirizzo di \itindex{multicast} + \textit{multicast} ai filtri del livello di collegamento associati + dell'interfaccia. Si deve usare un indirizzo hardware da specificare + attraverso il campo \var{ifr\_hwaddr}, che conterrà l'opportuna struttura + \struct{sockaddr}; l'operazione è privilegiata. Per una modalità alternativa + per eseguire la stessa operazione si possono usare i \textit{packet socket}, + vedi sez.~\ref{sec:packet_socket}. + +\item[\const{SIOCDELMULTI}] rimuove un indirizzo di \itindex{multicast} + \textit{multicast} ai filtri del livello di collegamento dell'interfaccia, + vuole un indirizzo hardware specificato come per \const{SIOCADDMULTI}. Anche + questa operazione è privilegiata e può essere eseguita in forma alternativa + con i \textit{packet socket}. + +\item[\const{SIOCGIFTXQLEN}] permette di leggere la lunghezza della coda di + trasmissione del dispositivo associato all'interfaccia specificata nel campo + \var{ifr\_qlen}. + +\item[\const{SIOCSIFTXQLEN}] permette di impostare il valore della lunghezza + della coda di trasmissione del dispositivo associato all'interfaccia, questo + deve essere specificato nel campo \var{ifr\_qlen}. L'operazione è + privilegiata. + +\item[\const{SIOCSIFNAME}] consente di cambiare il nome dell'interfaccia + indicata da \var{ifr\_name} utilizzando il nuovo nome specificato nel campo + \var{ifr\_rename}. + \end{basedescript} +Una ulteriore operazione, che consente di ricavare le caratteristiche delle +interfacce di rete, è \const{SIOCGIFCONF}; però per ragioni di compatibilità +questa operazione è disponibile soltanto per i socket della famiglia +\const{AF\_INET} (vale ad dire per socket IPv4). In questo caso l'utente dovrà +passare come argomento una struttura \struct{ifconf}, definita in +fig.~\ref{fig:netdevice_ifconf_struct}. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/ifconf.h} + \end{minipage} + \caption{La struttura \structd{ifconf}.} + \label{fig:netdevice_ifconf_struct} +\end{figure} + +Per eseguire questa operazione occorrerà allocare preventivamente un buffer di +contenente un vettore di strutture \struct{ifreq}. La dimensione (in byte) di +questo buffer deve essere specificata nel campo \var{ifc\_len} di +\struct{ifconf}, mentre il suo indirizzo andrà specificato nel campo +\var{ifc\_req}. Qualora il buffer sia stato allocato come una stringa, il suo +indirizzo potrà essere fornito usando il campo \var{ifc\_buf}.\footnote{si + noti che l'indirizzo del buffer è definito in \struct{ifconf} con una + \ctyp{union}, questo consente di utilizzare una delle due forme a piacere.} + +La funzione restituisce nel buffer indicato una serie di strutture +\struct{ifreq} contenenti nel campo \var{ifr\_name} il nome dell'interfaccia e +nel campo \var{ifr\_addr} il relativo indirizzo IP. Se lo spazio allocato nel +buffer è sufficiente il kernel scriverà una struttura \struct{ifreq} per +ciascuna interfaccia attiva, restituendo nel campo \var{ifc\_len} il totale +dei byte effettivamente scritti. Il valore di ritorno è 0 se l'operazione ha +avuto successo e negativo in caso contrario. + +Si tenga presente che il kernel non scriverà mai sul buffer di uscita dati +eccedenti numero di byte specificato col valore di \var{ifc\_len} impostato +alla chiamata della funzione, troncando il risultato se questi non dovessero +essere sufficienti. Questa condizione non viene segnalata come errore per cui +occorre controllare il valore di \var{ifc\_len} all'uscita della funzione, e +verificare che esso sia inferiore a quello di ingresso. In caso contrario si è +probabilmente\footnote{probabilmente perché si potrebbe essere nella + condizione in cui sono stati usati esattamente quel numero di byte.} avuta +una situazione di troncamento dei dati. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includecodesample{listati/iflist.c} + \end{minipage} + \caption{Il corpo principale del programma \texttt{iflist.c}.} + \label{fig:netdevice_iflist} +\end{figure} + +Come esempio dell'uso di queste funzioni si è riportato in +fig.~\ref{fig:netdevice_iflist} il corpo principale del programma +\texttt{iflist} in cui si utilizza l'operazione \const{SIOCGIFCONF} per +ottenere una lista delle interfacce attive e dei relativi indirizzi. Al solito +il codice completo è fornito nei sorgenti allegati alla guida. + +Il programma inizia (\texttt{\small 7--11}) con la creazione del socket +necessario ad eseguire l'operazione, dopo di che si inizializzano +opportunamente (\texttt{\small 13--14}) i valori della struttura +\struct{ifconf} indicando la dimensione del buffer ed il suo +indirizzo;\footnote{si noti come in questo caso si sia specificato l'indirizzo + usando il campo \var{ifc\_buf}, mentre nel seguito del programma si accederà + ai valori contenuti nel buffer usando \var{ifc\_req}.} si esegue poi +l'operazione invocando \func{ioctl}, controllando come sempre la corretta +esecuzione, ed uscendo in caso di errore (\texttt{\small 15--19}). + +Si esegue poi un controllo sulla quantità di dati restituiti segnalando un +eventuale overflow del buffer (\texttt{\small 21--23}); se invece è tutto a +posto (\texttt{\small 24--27}) si calcola e si stampa a video il numero di +interfacce attive trovate. L'ultima parte del programma (\texttt{\small + 28--33}) è il ciclo sul contenuto delle varie strutture \struct{ifreq} +restituite in cui si estrae (\texttt{\small 30}) l'indirizzo ad esse +assegnato\footnote{si è definito \var{access} come puntatore ad una struttura + di tipo \struct{sockaddr\_in} per poter eseguire un \textit{casting} + dell'indirizzo del valore restituito nei vari campi \var{ifr\_addr}, così + poi da poterlo poi usare come argomento di \func{inet\_ntoa}.} e lo si +stampa (\texttt{\small 31--32}) insieme al nome dell'interfaccia. + \subsection{L'uso di \func{ioctl} per i socket TCP e UDP} @@ -3471,34 +3962,34 @@ sistema sotto \texttt{/proc/net}, dove sono presenti dei file che non corrispondono a nessun nodo di \func{sysctl}. - \subsection{I valori di controllo per i socket generici} \label{sec:sock_gen_sysctl} Nella directory \texttt{/proc/sys/net/core} sono presenti i file -corrispondenti ai parametri generici validi per tutti i socket. Quelli -descritti anche nella pagina di manuale, accessibile con \texttt{man 7 socket} -sono i seguenti: +corrispondenti ai parametri generici di \textit{sysctl} validi per tutti i +socket. Quelli descritti anche nella pagina di manuale, accessibile con +\texttt{man 7 socket} sono i seguenti: \begin{basedescript}{\desclabelwidth{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 @@ -3521,11 +4012,11 @@ sono i seguenti: 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 @@ -3533,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} @@ -3571,73 +4068,296 @@ dello stesso (come ARP). I file che consentono di controllare le caratteristiche specifiche del protocollo IP in quanto tale, descritti anche nella pagina di manuale accessibile con \texttt{man 7 ip}, sono i seguenti: -\begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}} - -\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 - \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 +\begin{basedescript}{\desclabelwidth{3.5cm}\desclabelstyle{\nextlinelabel}} + +\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à. - \end{basedescript} +I file di \texttt{/proc/sys/net/ipv4} che invece fanno riferimento alle +caratteristiche specifiche del protocollo TCP, elencati anche nella rispettiva +pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: +\begin{basedescript}{\desclabelwidth{3.9cm}\desclabelstyle{\nextlinelabel}} + +\item[\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[\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 destinazione, dovuti al fatto che + alcuni vecchi router non supportano il meccanismo ed alla sua attivazione + scartano i relativi pacchetti.\\ + +\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 + automaticamente portato a 1024 qualora nel sistema ci sia sufficiente + memoria (se maggiore di 128Mb) e ridotto a 128 qualora la memoria sia poca + (inferiore a 32Mb).\footnote{si raccomanda, qualora si voglia aumentare il + valore oltre 1024, di seguire la procedura citata nella pagina di manuale + di TCP, e modificare il valore della costante \texttt{TCP\_SYNQ\_HSIZE} + nel file \texttt{include/net/tcp.h} dei sorgenti del kernel, in modo che + sia $\mathtt{tcp\_max\_syn\_backlog} \ge \mathtt{16*TCP\_SYNQ\_HSIZE}$, + per poi ricompilare il kernel.} + +\item[\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 % LocalWords: client fig LDAP Lightweight Access Protocol NIS Information Sun % LocalWords: like netgroup Switch Solaris glibc libc uclib NSS tab shadow uid @@ -3692,13 +4412,32 @@ accessibile con \texttt{man 7 ip}, sono i seguenti: % LocalWords: rmem wmem message cost burst bucket filter netdev backlog optmem % LocalWords: forward dynaddr dial autoconfig local masquerading ipfrag high % LocalWords: thresh low always defrag CONFIG SETSIG cmd FIOGETOWN FIOSETOWN +% LocalWords: quest'ultime neigh dev weight cong mod somaxconn Di SIOCINQ DoS +% LocalWords: Documentation SIOCATMARK SIOCOUTQ FIONREAD TIOCOUTQ Denial work +% LocalWords: netfilter scheduler mark ARP DHCP BOOTP RARP nonlocal sniffer is +% LocalWords: linux NODELAY MAXSEG CORK KEEPIDLE KEEPINTVL KEEPCNT SYNCNT INFO +% LocalWords: DEFER ACCEPT WINDOW CLAMP QUICKACK CONGESTION ENCAP urgent MSS +% LocalWords: Segment SYN accept advertised window info quickack Nagle ifreq +% LocalWords: ifr ppp union EPERM SIOCGIFNAME dell' interface index IFF NOARP +% LocalWords: SIOCGIFINDEX SIOCGIFFLAGS POINTOPOINT RUNNING PROMISC NOTRAILERS +% LocalWords: ALLMULTI bundle PORTSEL ifmap AUTOMEDIA DYNAMIC SIOCSIFFLAGS way +% LocalWords: SIOCGIFMETRIC SIOCSIFMETRIC SIOCGIFMTU SIOCSIFMTU SIOCGIFHWADDR +% LocalWords: SIOCSIFHWADDR SIOCSIFHWBROADCAST SIOCGIFMAP SIOCSIFMAP sendfile +% LocalWords: SIOCADDMULTI SIOCDELMULTI SIOCGIFTXQLEN SIOCSIFTXQLEN three syn +% LocalWords: SIOCSIFNAME SIOCGIFCONF handshake retries MIN FreeBSD closing Mb +% 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 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: -% LocalWords: quest'ultime neigh dev weight cong mod somaxconn Di SIOCINQ DoS -% LocalWords: Documentation SIOCATMARK SIOCOUTQ FIONREAD TIOCOUTQ Denial work -% LocalWords: netfilter scheduler mark ARP DHCP BOOTP RARP nonlocal sniffer -% LocalWords: linux NODELAY MAXSEG CORK KEEPIDLE KEEPINTVL KEEPCNT SYNCNT INFO -% LocalWords: DEFER ACCEPT WINDOW CLAMP QUICKACK CONGESTION ENCAP urgent +