X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=df3ed6921e0c0feb3ffb826be486b32ca4913bf8;hp=69894b38bcee7acf474f037ee8070383bc6f3ef9;hb=ff76d56c6a2c280cbe4f153173488871d7b12336;hpb=d015e72d818c1632b0171cb6bea8c31018ff433e diff --git a/sockctrl.tex b/sockctrl.tex index 69894b3..df3ed69 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. @@ -2775,7 +2776,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}). @@ -3297,7 +3300,7 @@ quantit \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} - \includestruct{listati/is_closing.c} + \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.} @@ -3595,9 +3598,10 @@ sono le seguenti: 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}. + 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 @@ -3665,8 +3669,8 @@ sono le seguenti: \item[\const{SIOCGIFMETRIC}] permette di leggere il valore della metrica del dispositivo associato all'interfaccia specificata nel campo - \var{ifr\_metric}, attualmente non ancora implementato, restituisce sempre 0 - come valore. + \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 @@ -3750,11 +3754,12 @@ sono le seguenti: \end{basedescript} -Una ulteriore operazione che consente di ricavare le caratteristiche delle -interfacce di rete, che però è disponibile soltanto per socket della famiglia -\const{AF\_INET} (vale ad dire per socket IPv4), è \const{SIOCGIFCONF}. In -questo caso l'utente dovrà passare come argomento una struttura -\struct{ifconf}, definita in fig.~\ref{fig:netdevice_ifconf_struct}. +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 @@ -3765,6 +3770,69 @@ questo caso l'utente dovr \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. @@ -3954,7 +4022,9 @@ 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 + 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. @@ -3994,9 +4064,17 @@ accessibile con \texttt{man 7 ip}, sono i seguenti: \begin{basedescript}{\desclabelwidth{3.5cm}\desclabelstyle{\nextlinelabel}} \item[\texttt{ip\_default\_ttl}] imposta il valore di default per il campo TTL - (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti. Il valore può - essere modificato per il singolo socket con l'opzione \const{IP\_TTL}. - Prende un valore intero. + (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti, stabilendo + così il numero massimo di router che i pacchetti possono attraversare. Il + valore può essere modificato anche per il singolo socket con l'opzione + \const{IP\_TTL}. Prende un valore intero, ma dato che il campo citato è di + 8 bit hanno senso solo valori fra 0 e 255. Il valore di default è 64, e non + ci normalmente non c'è nessuna necessità di modificarlo,\footnote{l'unico + motivo sarebbe per raggiungere macchine estremamente ``{lontane}'' in + termini di \textit{hop}, ma è praticamente } aumentare il valore è una + pratica poco gentile, in quanto in caso di problemi di routing si allunga + inutilmente il numero di ritrasmissioni. + \item[\texttt{ip\_forward}] abilita l'inoltro dei pacchetti da una interfaccia ad un altra, e può essere impostato anche per la singola interfaccia. Prende @@ -4058,14 +4136,58 @@ 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[\texttt{tcp\_abort\_on\_overflow}] -\item[\texttt{tcp\_adv\_win\_scale}] -\item[\texttt{tcp\_app\_win}] -\item[\texttt{tcp\_bic\_low\_window}] -\item[\texttt{tcp\_bic\_fast\_convergence}] -\item[\texttt{tcp\_dsack}] -\item[\texttt{tcp\_ecn}] -\item[\texttt{tcp\_fack}] + +\item[\texttt{tcp\_abort\_on\_overflow}] è un valore logico (disabilitato di + default) che indica di azzerare le connessioni quando il programma che le + riceve è troppo lento ed incapace di accettarle. Questo consente di + recuperare le connessioni se si è avuto un eccesso dovuto ad un qualche + picco di traffico, ma ovviamente va a discapito dei client che interrogano + il server. Pertanto è da abilitare soltanto quando si è sicuri che non è + possibile ottimizzare il server in modo che sia in grado di accettare + connessioni più rapidamente. + +\item[\texttt{tcp\_adv\_win\_scale}] questa variabile intera indica al kernel + quanto spazio all'interno del buffer associato ad un socket (quello + impostato con \texttt{tcp\_rmem}) deve essere utilizzato per la finestra del + protocollo TCP (quello che costituisce la \itindex{advertised~window} + \textit{advertised window} annunciata all'altro capo del socket) e quello + che viene usato come buffer applicativo per isolare la rete dalle latenze + dell'applicazione. Il valore viene calcolato secondo la formula + $\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se positivo o con + $\texttt{buffer}-\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se + negativo. Il valore di default è 2 che significa che al buffer + dell'applicazione viene riservato un quarto del totale. + +\item[\texttt{tcp\_app\_win}] il valore indica quanti byte della finestra TCP + vengono riservati per la bufferizzazione, valore è il massimo fra la + \itindex{Maximum~Segment~Size} MSS e + $\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[\texttt{tcp\_dsack}] Abilita il supporto definito + nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884} per il + \textit{Duplicate SACK}.\footnote{si indica con SACK (\textit{Selective + Acknowledgement}) un'opzione TCP, definita + nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}, usata per dare + un \textit{acknowledgement} unico su blocchi di pacchetti non contigui.} + +\item[\texttt{tcp\_ecn}] Abilita il meccanismo della \textit{Explicit + Congestion Notification} (o ECN) definito + nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884}. Si tenga presente + che se si abilita questa opzione si possono avere dei malfunzionamenti + apparentemente casuali dipendenti dalla destinazione, dovuti al fatto che + alcuni vecchi router non supportano il meccanismo ed alla sua attivazione + scartano i relativi pacchetti.\\ + +\item[\texttt{tcp\_fack}] è un valore logico che abilita il supporto per il + \textit{TCP Forward Acknowledgement}. Di default è abilitato. +% TODO documentare o descrivere che cos'è il TCP Forward Acknowledgement \item[\texttt{tcp\_fin\_timeout}] specifica il numero di secondi (il default è 60\footnote{nei kernel della serie 2.2.x era invece di 120 secondi.}) da @@ -4076,13 +4198,50 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: alcuni attacchi di \itindex{Denial~of~Service~(DoS)} \textit{Denial of Service}. - -\item[\texttt{tcp\_frto}] -\item[\texttt{tcp\_keepalive\_intvl}] -\item[\texttt{tcp\_keepalive\_probes}] -\item[\texttt{tcp\_keepalive\_time}] -\item[\texttt{tcp\_low\_latency}] -\item[\texttt{tcp\_max\_orphans}] +\item[\texttt{tcp\_frto}] è un valore logico che abilita il supporto per + l'algoritmo F-RTO, un algoritmo usato per la ritrasmissione dei timeout del + protocollo TCP, che diventa molto utile per le reti wireless dove la perdita + di pacchetti è usualmente dovuta a delle interferenze radio, piuttosto che + alla congestione dei router. Di default è disabilitato. + + +\item[\texttt{tcp\_keepalive\_intvl}] il numero di secondi che deve + trascorrere fra l'emissione di due successivi pacchetti di test quando è + abilitata la funzionalità del \textit{keepalive} (vedi + sez.~\ref{sec:sock_options_main}). Il valore di default è 75. + +\item[\texttt{tcp\_keepalive\_probes}] il massimo numero pacchetti di + \textit{keepalive} (vedi sez.~\ref{sec:sock_options_main}) che devono essere + inviati senza ricevere risposta prima che il kernel decida che la + connessione è caduta e la termini. Il valore di default è 9. + +\item[\texttt{tcp\_keepalive\_time}] il numero di secondi che devono passare + senza traffico sulla connessione prima che il kernel, qualora si sia + utilizzata l'opzione \const{SO\_KEEPALIVE} (vedi + sez.~\ref{sec:sock_options_main}), inizi ad inviare pacchetti di pacchetti + di \textit{keepalive}. Il default è 7200, pari a due ore. + +\item[\texttt{tcp\_low\_latency}] un valore logico che indica allo stack TCP + del kernel di ottimizzare il comportamento per ottenere tempi di latenza più + bassi a scapito di valori più alti per l'utilizzo della banda. Di default è + disabilitato in quanto un maggior utilizzo della banda è preferito, ma + esistono applicazioni particolari in cui la riduzione della latenza è più + importante (ad esempio i cluster di calcolo parallelo) in cui lo si può + abilitare. + +\item[\texttt{tcp\_max\_orphans}] il numero massimo di socket TCP + ``\textsl{orfani}'' (vale a dire non associati a nessun file descriptor) + consentito nel sistema.\footnote{trattasi in genere delle connessioni + relative a socket chiusi che non hanno completato il processo di + chiusura.} Quando il limite viene ecceduto la connessione orfana viene + 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[\texttt{tcp\_max\_syn\_backlog}] un numero intero che indica la lunghezza della coda delle connessioni incomplete, cioè delle connessioni @@ -4101,21 +4260,66 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: sia $\mathtt{tcp\_max\_syn\_backlog} \ge \mathtt{16*TCP\_SYNQ\_HSIZE}$, per poi ricompilare il kernel.} -\item[\texttt{tcp\_max\_tw\_buckets}] -\item[\texttt{tcp\_mem}] -\item[\texttt{tcp\_orphan\_retries}] -\item[\texttt{tcp\_reordering}] +\item[\texttt{tcp\_max\_tw\_buckets}] questo valore indica il numero massimo + di socket in stato \texttt{TIME\_WAIT} consentito nel sistema; viene + impostato per prevenire semplici attacchi di \textit{denial of service} ed + inizializzato di default ad un valore del parametro \texttt{NR\_FILE}, per + poi essere aggiustato a seconda della memoria presente. Se il valore viene + superato il socket viene chiuso con la stampa di un avviso. + + +\item[\texttt{tcp\_mem}] una tripletta di valori usati dallo stack TCP per + controllare il proprio uso della memoria. Il primo valore, chiamato + \textit{low} nelle pagine di manuale, indica il numero di pagine allocate + sotto il quale non viene usato nessun meccanismo di regolazione dell'uso + della memoria. + + 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[\texttt{tcp\_orphan\_retries}] il numero massimo di volte che si esegue + un tentativo di controllo sull'altro capo di una connessione che è stata già + chiusa dalla nostra parte. Il valore di default è 8 volte. + +\item[\texttt{tcp\_reordering}] il numero massimo di volte che un pacchetto + può essere riordinato nel flusso di dati, prima che lo stack TCP assuma che + è andato perso e si ponga nello stato di \textit{slow start} (si veda + sez.~\ref{sez:tcp_protocol_xxx}) viene usata questa metrica di + riconoscimento dei riordinamenti per evitare inutili ritrasmissioni + provocate dal riordinamento. Non è opportuno modificare questo valore dal + default che è 3. + \item[\texttt{tcp\_retrans\_collapse}] -\item[\texttt{tcp\_retries1}] + +\item[\texttt{tcp\_retries1}] imposta il massimo numero di volte che + protocollo tenterà la ritrasmissione si un pacchetto su una connessione + stabilita prima di fare ricorso ad ulteriori sforzi che coinvolgano anche il + livello di rete. Passato questo numero di ritrasmissioni verrà fatto + eseguire al livello di rete un tentativo di aggiornamento della rotta verso + la destinazione prima di eseguire ogni successiva ritrasmissione. \item[\texttt{tcp\_retries2}] imposta il numero di tentativi di ritrasmissione - (il default è 15) di un pacchetto inviato su una connessione già stabilita - per il quale non si sia ricevuto una risposta di ACK (si veda anche quanto - illustrato in sez.~\ref{sec:TCP_server_crash}). + 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[\texttt{tcp\_rfc1337}] -\item[\texttt{tcp\_rmem}] + +\item[\texttt{tcp\_rmem}] + + \item[\texttt{tcp\_sack}] \item[\texttt{tcp\_stdurg}] \item[\texttt{tcp\_synack\_retries}] @@ -4131,6 +4335,8 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: \item[\texttt{tcp\_tw\_recycle}] \item[\texttt{tcp\_tw\_reuse}] \item[\texttt{tcp\_window\_scaling}] + + \item[\texttt{tcp\_vegas\_cong\_avoid}] \item[\texttt{tcp\_westwood}] \item[\texttt{tcp\_wmem}] @@ -4206,13 +4412,15 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: % LocalWords: abort overflow adv win app bic convergence dsack ecn fack frto % LocalWords: intvl probes latency orphans l'ACK SYNQ HSIZE tw buckets mem rfc % LocalWords: orphan reordering collapse sack stdurg synack syncookies recycle -% LocalWords: timestamps scaling vegas avoid westwood tcpi l'incapsulazione +% LocalWords: timestamps scaling vegas avoid westwood tcpi l'incapsulazione NR % LocalWords: metric EOPNOTSUPP mtu hwaddr ARPHRD interrupt DMA map qlen silly % LocalWords: rename ifconf syndrome dell'ACK FTP ACCEPTFILTER advanced reno % LocalWords: congestion control Networking cubic CUBIC highspeed HSTCP htcp -% LocalWords: HTCP hybla HYBLA scalable SCALABLE +% LocalWords: HTCP hybla HYBLA scalable SCALABLE ifc req iflist access ntoa %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" %%% End: +% LocalWords: hop Selective Acknowledgement acknowledgement Explicit RTO stack +% LocalWords: Notification wireless denial pressure