X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=9d5279e6ab62856b34ff617697608b440c23c03e;hp=1b8ee7b917a29f14d1befb29b3ab1513c877373d;hb=0e932d7963332ca87688c3695d7386d45ddcc46a;hpb=b613eaf32bee556b7f2cd436fd37c89adfff8ca1 diff --git a/sockctrl.tex b/sockctrl.tex index 1b8ee7b..9d5279e 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1,6 +1,6 @@ %% sockctrl.tex %% -%% Copyright (C) 2004-2017 Simone Piccardi. Permission is granted to +%% Copyright (C) 2004-2019 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", @@ -36,8 +36,8 @@ porte o altre proprietà del sistema. \label{sec:sock_resolver} \itindbeg{resolver} La risoluzione dei nomi è associata tradizionalmente al -servizio del \itindex{Domain~Name~Service} \textit{Domain Name Service} che -permette di identificare le macchine su internet invece che per numero IP +servizio del \itindex{Domain~Name~Service~(DNS)} \textit{Domain Name Service} +che permette di identificare le macchine su internet invece che per numero IP attraverso il relativo \textsl{nome a dominio}.\footnote{non staremo ad entrare nei dettagli della definizione di cosa è un nome a dominio, dandolo per noto, una introduzione alla problematica si trova in \cite{AGL} (cap.~9) @@ -87,7 +87,7 @@ dominio, e prevedeva solo l'utilizzo del DNS e del file statico Per questo aspetto il file di configurazione principale del sistema è \conffile{/etc/resolv.conf} che contiene in sostanza l'elenco degli indirizzi -IP dei server DNS da contattare; a questo si affiancava (fino alle \acr{glibc} +IP dei server DNS da contattare; a questo si affiancava (fino alla \acr{glibc} 2.4) il file \conffile{/etc/host.conf} il cui scopo principale era indicare l'ordine in cui eseguire la risoluzione dei nomi (se usare prima i valori di \conffile{/etc/hosts} o quelli del DNS). Tralasciamo i dettagli relativi alle @@ -125,9 +125,9 @@ generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi associate chiamato \textit{Name Service Switch}, cui abbiamo accennato anche in sez.~\ref{sec:sys_user_group} per quanto riguarda la gestione dei dati associati a utenti e gruppi. Il sistema è stato introdotto la prima volta -nelle librerie standard di Solaris e le \acr{glibc} hanno ripreso lo stesso +nella libreria standard di Solaris e la \acr{glibc} ha ripreso lo stesso schema; si tenga presente che questo sistema non esiste per altre librerie -standard come le \acr{libc5} o le \acr{uclib}. +standard come la \acr{libc5} o la \acr{uClib}. Il \textit{Name Service Switch} (cui spesso si fa riferimento con l'acronimo NSS) è un sistema di librerie dinamiche che permette di definire in maniera @@ -198,7 +198,7 @@ su cui vengono mantenuti, e che si usino o meno funzionalità aggiuntive fornite dal sistema del \textit{Name Service Switch}, dal punto di vista di un programma che deve effettuare la risoluzione di un nome a dominio, tutto quello che conta sono le funzioni classiche che il \textit{resolver} mette a -disposizione (è cura delle \acr{glibc} tenere conto della presenza del +disposizione (è cura della \acr{glibc} tenere conto della presenza del \textit{Name Service Switch}) e sono queste quelle che tratteremo nelle sezioni successive. @@ -749,7 +749,7 @@ 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 \textit{resolver}; dato che questo non è molto comodo è stata -definita (è una estensione fornita dalle \acr{glibc}, disponibile anche in +definita (è una estensione fornita dalla \acr{glibc}, disponibile anche in altri sistemi unix-like) un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è: @@ -822,7 +822,7 @@ come, essendo il campo \var{h\_addr\_list} un puntatore ad strutture di indirizzi generiche, questo sia ancora di tipo \texttt{char **} e si possa riutilizzare lo stesso puntatore usato per i nomi. -Per ciascun indirizzo valido si provvederà (\texttt{\small 41}) ad una +Per ciascun indirizzo valido si provvederà (\texttt{\small 41}) a una conversione con la funzione \func{inet\_ntop} (vedi sez.~\ref{sec:sock_addr_func}) passandole gli opportuni argomenti, questa restituirà la stringa da stampare (\texttt{\small 42}) con il valore @@ -853,7 +853,7 @@ chiama una \itindex{deep~copy} \textit{deep copy}.\footnote{si chiama così contenuti in essa (e così via se vi sono altre sotto-strutture con altri puntatori) e copiare anche i dati da questi referenziati.} -Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle +Per ovviare a questi problemi nella \acr{glibc} sono definite anche delle versioni rientranti delle precedenti funzioni, al solito queste sono caratterizzate dall'avere un suffisso \texttt{\_r}, pertanto avremo le due funzioni \funcd{gethostbyname\_r} e \funcd{gethostbyname2\_r} i cui prototipi @@ -976,7 +976,7 @@ dominio, la funzione comunque inizializza anche il primo campo della lista Dato che \func{gethostbyaddr} usa un buffer statico, anche di questa funzione esiste una versione rientrante \funcd{gethostbyaddr\_r} fornita come -estensione dalle \acr{glibc}, il cui prototipo è: +estensione dalla \acr{glibc}, il cui prototipo è: \begin{funcproto}{ \fhead{netdb.h} @@ -1017,7 +1017,7 @@ del DNS. Nel caso della \acr{glibc} questa viene usata allora solo per la lettura delle voci presenti in quest'ultimo, come avviene anche in altri sistemi unix-like, ed inoltre ignora le voci relative ad indirizzi IPv6. -Della stessa funzione le \acr{glibc} forniscono anche una versione rientrante +Della stessa funzione la \acr{glibc} fornisce anche una versione rientrante \funcd{gethostent\_r}, il cui prototipo è: \begin{funcproto}{ @@ -1041,8 +1041,8 @@ tipo di indirizzi voluto (cosa che non è possibile con \func{gethostbyname}), è stata successivamente proposta, nell'\href{http://www.ietf.org/rfc/rfc2553.txt}{RFC~2553} un diversa interfaccia con l'introduzione due nuove funzioni di -risoluzione,\footnote{dette funzioni sono presenti nelle \acr{glibc} versione - 2.1.96, ma essendo considerate deprecate (vedi +risoluzione,\footnote{dette funzioni sono presenti nella \acr{glibc} 2.1.96, + ma essendo considerate deprecate (vedi sez.~\ref{sec:sock_advanced_name_services}) sono state rimosse nelle versioni successive.} \funcd{getipnodebyname} e \funcd{getipnodebyaddr}, i cui prototipi sono: @@ -1529,7 +1529,7 @@ tab.~\ref{tab:ai_flags_values}, ciascuna delle quali identifica un bit della maschera. Nella seconda parte della tabella si sono riportati i valori delle costanti -aggiunte a partire dalle \acr{glibc} 2.3.4 per gestire la +aggiunte a partire dalla \acr{glibc} 2.3.4 per gestire la internazionalizazione dei nomi a dominio (IDN o \textit{Internationalized Domain Names}) secondo quanto specificato nell'\href{http://www.ietf.org/rfc/rfc3490.txt}{RFC~3490} (potendo cioè usare @@ -1794,7 +1794,7 @@ argomento \param{flags} è una maschera binaria i cui bit consentono di impostare le modalità con cui viene eseguita la ricerca, e deve essere specificato attraverso l'OR aritmetico dei valori illustrati in tab.~\ref{tab:getnameinfo_flags}, nella seconda parte della tabella si sono -aggiunti i valori introdotto con le \acr{glibc} 2.3.4 per gestire la +aggiunti i valori introdotto con la \acr{glibc} 2.3.4 per gestire la internazionalizzione dei nomi a dominio. \begin{table}[!htb] @@ -2020,27 +2020,30 @@ quale si voglia far ascoltare il server. \label{sec:sock_options} Benché dal punto di vista del loro uso come canali di trasmissione di dati i -socket vengano trattati allo stesso modo dei file, siano acceduti tramite i -file descriptor, e gestiti con le ordinarie funzioni di lettura e scrittura -dei file, l'interfaccia standard usata per la gestione dei file generici non è -comunque sufficiente a poterne controllare tutte le caratteristiche -specifiche, considerato poi che queste variano a seconda del tipo di socket (e -della relativa forma di comunicazione sottostante). +socket vengano trattati allo stesso modo dei file, acceduti tramite i file +descriptor, e gestiti con le ordinarie funzioni di lettura e scrittura dei +file, l'interfaccia standard usata per la gestione dei file generici non è +comunque sufficiente a controllare la moltitudine di caratteristiche +specifiche che li contraddistinguono, considerato tra l'altro che queste +possono essere completamente diverse fra loro a seconda del tipo di socket e +della relativa forma di comunicazione sottostante. In questa sezione vedremo allora quali sono le funzioni dedicate alla gestione -delle caratteristiche specifiche dei vari tipi di socket, le cosiddette -\textit{socket options}, ma soprattutto analizzaremo quali sono queste opzioni -e quali caretteristiche e comportamenti dei socket permettono di controllare. +delle caratteristiche specifiche dei vari tipi di socket, che vengono +raggruppate sotto il nome generico di ``\textit{socket options}'', ma +soprattutto analizzaremo quali sono queste opzioni e quali caretteristiche e +comportamenti dei socket permettono di controllare. \subsection{Le funzioni di gestione delle opzioni dei socket} \label{sec:sock_setsockopt} -Le varie caratteristiche dei socket possono essere gestite attraverso l'uso di -due funzioni generiche che permettono rispettivamente di impostarle e di -recuperarne il valore corrente. La prima di queste due funzioni, quella usata -per impostare le \textit{socket options}, è \funcd{setsockopt}, ed il suo -prototipo è: +La modalità principale con cui si possono gestire le caratteristiche dei +socket (ne vedremo delle ulteriori nelle prossime sezioni) è quella che passa +attraverso l'uso di due funzioni di sistema generiche che permettono +rispettivamente di impostarle e di recuperarne il valore corrente. La prima di +queste due funzioni, quella usata per impostare le \textit{socket options}, è +\funcd{setsockopt}, ed il suo prototipo è: \begin{funcproto}{ \fhead{sys/socket.h} @@ -2084,22 +2087,6 @@ dal socket. Infine \param{level} prevede anche il valore speciale \const{SOL\_SOCKET} usato per le opzioni generiche che sono disponibili per qualunque tipo di socket. -I valori usati per \param{level}, corrispondenti ad un dato protocollo usato -da un socket, sono quelli corrispondenti al valore numerico che identifica il -suddetto protocollo in \conffile{/etc/protocols}; dato che la leggibilità di un -programma non trarrebbe certo beneficio dall'uso diretto dei valori numerici, -più comunemente si indica il protocollo tramite le apposite costanti -\texttt{SOL\_*} riportate in tab.~\ref{tab:sock_option_levels}, dove si sono -riassunti i valori che possono essere usati per l'argomento -\param{level}.\footnote{la notazione in questo caso è, purtroppo, abbastanza - confusa: infatti in Linux il valore si può impostare sia usando le costanti - \texttt{SOL\_*}, che le analoghe \texttt{IPPROTO\_*} (citate anche da - Stevens in \cite{UNP1}); entrambe hanno gli stessi valori che sono - equivalenti ai numeri di protocollo di \conffile{/etc/protocols}, con una - eccezione specifica, che è quella del protocollo ICMP, per la quale non - esista una costante, il che è comprensibile dato che il suo valore, 1, è - quello che viene assegnato a \const{SOL\_SOCKET}.} - \begin{table}[!htb] \centering \footnotesize @@ -2120,13 +2107,30 @@ riassunti i valori che possono essere usati per l'argomento \label{tab:sock_option_levels} \end{table} +I valori usati per \param{level}, corrispondenti ad un dato protocollo usato +da un socket, sono quelli corrispondenti al valore numerico che identifica il +suddetto protocollo in \conffile{/etc/protocols}; dato che la leggibilità di un +programma non trarrebbe certo beneficio dall'uso diretto dei valori numerici, +più comunemente si indica il protocollo tramite le apposite costanti +\texttt{SOL\_*} riportate in tab.~\ref{tab:sock_option_levels}, dove si sono +riassunti i valori che possono essere usati per l'argomento +\param{level}. + +La notazione in questo caso è, purtroppo, abbastanza confusa: infatti in Linux +il valore si può impostare sia usando le costanti \texttt{SOL\_*}, che le +analoghe \texttt{IPPROTO\_*} (citate anche da Stevens in \cite{UNP1}); +entrambe hanno gli stessi valori che sono equivalenti ai numeri di protocollo +di \conffile{/etc/protocols}, con una eccezione specifica, che è quella del +protocollo ICMP, per la quale non esiste una costante, il che è comprensibile +dato che il suo valore, 1, è quello che viene assegnato a \const{SOL\_SOCKET}. + Il quarto argomento, \param{optval} è un puntatore ad una zona di memoria che contiene i dati che specificano il valore dell'opzione che si vuole passare al socket, mentre l'ultimo argomento \param{optlen},\footnote{questo argomento è in realtà sempre di tipo \ctyp{int}, come era nelle \acr{libc4} e \acr{libc5}; l'uso di \type{socklen\_t} è stato introdotto da POSIX (valgono le stesse considerazioni per l'uso di questo tipo di dato fatte in - sez.~\ref{sec:TCP_func_accept}) ed adottato dalle \acr{glibc}.} è la + sez.~\ref{sec:TCP_func_accept}) ed adottato dalla \acr{glibc}.} è la dimensione in byte dei dati presenti all'indirizzo indicato da \param{optval}. Dato che il tipo di dati varia a seconda dell'opzione scelta, occorrerà individuare qual è quello che deve essere usato, ed utilizzare le opportune @@ -2143,15 +2147,18 @@ di opzioni però usano dei tipi di dati peculiari, è questo il motivo per cui La seconda funzione usata per controllare le proprietà dei socket è \funcd{getsockopt}, che serve a leggere i valori delle opzioni dei socket ed a farsi restituire i dati relativi al loro funzionamento; il suo prototipo è: -\begin{functions} - \headdecl{sys/socket.h} - \headdecl{sys/types.h} - \funcdecl{int getsockopt(int s, int level, int optname, void *optval, - socklen\_t *optlen)} Legge le opzioni di un socket. - \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} assumerà i valori: +\begin{funcproto}{ +\fhead{sys/socket.h} +\fhead{sys/types.h} +\fdecl{int getsockopt(int s, int level, int optname, void *optval, + socklen\_t *optlen)} +\fdesc{Legge le opzioni di un socket.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EBADF}] il file descriptor \param{sock} non è valido. \item[\errcode{EFAULT}] l'indirizzo \param{optval} o quello di @@ -2162,7 +2169,7 @@ farsi restituire i dati relativi al loro funzionamento; il suo prototipo è: un socket. \end{errlist} } -\end{functions} +\end{funcproto} I primi tre argomenti sono identici ed hanno lo stesso significato di quelli di \func{setsockopt}, anche se non è detto che tutte le opzioni siano definite @@ -2181,13 +2188,12 @@ per \param{optval} non è sufficiente si avrà un errore. \label{sec:sock_generic_options} Come accennato esiste un insieme generico di opzioni dei socket che possono -applicarsi a qualunque tipo di socket,\footnote{una descrizione di queste - opzioni è generalmente disponibile nella settima sezione delle pagine di - manuale, nel caso specifico la si può consultare con \texttt{man 7 socket}.} -indipendentemente da quale protocollo venga poi utilizzato. Se si vuole -operare su queste opzioni generiche il livello da utilizzare è -\const{SOL\_SOCKET}; si è riportato un elenco di queste opzioni in -tab.~\ref{tab:sock_opt_socklevel}. +applicarsi a qualunque tipo di socket, indipendentemente da quale protocollo +venga poi utilizzato. Una descrizione di queste opzioni è generalmente +disponibile nella settima sezione delle pagine di manuale; nel caso specifico +la si può consultare con \texttt{man 7 socket}. Se si vuole operare su queste +opzioni generiche il livello da utilizzare è \const{SOL\_SOCKET}; si è +riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_socklevel}. \begin{table}[!htb] @@ -2199,48 +2205,74 @@ tab.~\ref{tab:sock_opt_socklevel}. \textbf{Descrizione}\\ \hline \hline + \const{SO\_ACCEPTCONN}&$\bullet$& & &\texttt{int}& + Indica se il socket è in ascolto.\\ + \const{SO\_ATTACH\_FILTER}& &$\bullet$& &\texttt{sock\_fprog}& + Aggancia un filtro BPF al socket.\\ + \const{SO\_BINDTODEVICE}&$\bullet$&$\bullet$& &\texttt{char *}& + Lega il socket ad un dispositivo.\\ + \const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Attiva o disattiva il \textit{broadcast}.\\ + \const{SO\_BSDCOMPAT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita la compatibilità con BSD.\\ + \const{SO\_BUSY\_POLL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Attiva il ``\textit{busy poll}'' sul socket.\\ + \const{SO\_DEBUG} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita il debugging sul socket.\\ + \const{SO\_DETACH\_FILTER}& &$\bullet$&$\bullet$&\texttt{int}& + Rimuove il filtro BPF agganciato al socket.\\ + \const{SO\_DOMAIN} &$\bullet$& & &\texttt{int}& + Legge il tipo di socket.\\ + \const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Non invia attraverso un gateway.\\ + \const{SO\_ERROR} &$\bullet$& & &\texttt{int}& + Riceve e cancella gli errori pendenti.\\ \const{SO\_KEEPALIVE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Controlla l'attività della connessione.\\ + \const{SO\_LINGER} &$\bullet$&$\bullet$& &\texttt{linger}& + Indugia nella chiusura con dati da spedire.\\ + \const{SO\_LOCK\_FILTER}& &$\bullet$&$\bullet$&\texttt{int}& + Blocca il filtro BPF agganciato al socket.\\ + \const{SO\_MARK} &$\bullet$&$\bullet$& &\texttt{int}& + Imposta un ``\textit{firewall mark}'' sul socket.\\ \const{SO\_OOBINLINE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Lascia in linea i dati \textit{out-of-band}.\\ - \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Basso livello sul buffer di ricezione.\\ - \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}& - Basso livello sul buffer di trasmissione.\\ - \const{SO\_RCVTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& - Timeout in ricezione.\\ - \const{SO\_SNDTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& - Timeout in trasmissione.\\ - \const{SO\_BSDCOMPAT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Abilita la compatibilità con BSD.\\ \const{SO\_PASSCRED} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Abilita la ricezione di credenziali.\\ + \const{SO\_PEEK\_OFF} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Imposta il valore del ``\textit{peek offset}''.\\ \const{SO\_PEERCRED} &$\bullet$& & &\texttt{ucred}& Restituisce le credenziali del processo remoto.\\ - \const{SO\_BINDTODEVICE}&$\bullet$&$\bullet$& &\texttt{char *}& - Lega il socket ad un dispositivo.\\ - \const{SO\_DEBUG} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Abilita il debugging sul socket.\\ + \const{SO\_PRIORITY} &$\bullet$&$\bullet$& &\texttt{int}& + Imposta la priorità del socket.\\ + \const{SO\_PROTOCOL} &$\bullet$& & &\texttt{int}& + Ottiene il protocollo usato dal socket.\\ + \const{SO\_RCVBUF} &$\bullet$&$\bullet$& &\texttt{int}& + Imposta dimensione del buffer di ricezione.\\ + \const{SO\_RCVBUFFORCE}&$\bullet$&$\bullet$& &\texttt{int}& + Forza dimensione del buffer di ricezione.\\ + \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Basso livello sul buffer di ricezione.\\ + \const{SO\_RCVTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& + Timeout in ricezione.\\ \const{SO\_REUSEADDR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Consente il riutilizzo di un indirizzo locale.\\ - \const{SO\_TYPE} &$\bullet$& & &\texttt{int}& - Restituisce il tipo di socket.\\ - \const{SO\_ACCEPTCONN}&$\bullet$& & &\texttt{int}& - Indica se il socket è in ascolto.\\ - \const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Non invia attraverso un gateway.\\ - \const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Attiva o disattiva il \textit{broadcast}.\\ + \const{SO\_REUSEPORT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Consente il riutilizzo di una porta.\\ + \const{SO\_RXQ\_OVFL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Richiede messaggio ancillare con pacchetti persi.\\ \const{SO\_SNDBUF} &$\bullet$&$\bullet$& &\texttt{int}& Imposta dimensione del buffer di trasmissione.\\ - \const{SO\_RCVBUF} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta dimensione del buffer di ricezione.\\ - \const{SO\_LINGER} &$\bullet$&$\bullet$& &\texttt{linger}& - Indugia nella chiusura con dati da spedire.\\ - \const{SO\_PRIORITY} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta la priorità del socket.\\ - \const{SO\_ERROR} &$\bullet$& & &\texttt{int}& - Riceve e cancella gli errori pendenti.\\ + \const{SO\_SNDBUFFORCE}&$\bullet$&$\bullet$& &\texttt{int}& + Forza dimensione del buffer di trasmissione.\\ + \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}& + Basso livello sul buffer di trasmissione.\\ + \const{SO\_SNDTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& + Timeout in trasmissione.\\ + \const{SO\_TIMESTAMP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita/disabilita la ricezione dei \textit{timestamp}.\\ + \const{SO\_TYPE} &$\bullet$& & &\texttt{int}& + Restituisce il tipo di socket.\\ \hline \end{tabular} \caption{Le opzioni disponibili al livello \const{SOL\_SOCKET}.} @@ -2250,12 +2282,15 @@ tab.~\ref{tab:sock_opt_socklevel}. % TODO aggiungere e documentare SO_ATTACH_BPF, introdotta con il kernel 3.19, % vedi http://lwn.net/Articles/625224/ % TODO aggiungere e documentare SO_INCOMING_CPU, introdotta con il kernel 3.19, -% vedi https://lwn.net/Articles/626150/ +% TODO documentare SO_PEERGROUPS introdotta con il kernel 4.13, citata +% in https://lwn.net/Articles/727385/ +% TODO documentare SO_ZEROCOPY, vedi https://lwn.net/Articles/726917/ (e il +% resto pure) introdotta con il kernel 4.14 La tabella elenca le costanti che identificano le singole opzioni da usare come valore per \param{optname}; le due colonne seguenti indicano per quali delle due funzioni (\func{getsockopt} o \func{setsockopt}) l'opzione è -disponibile, mentre la colonna successiva indica, quando di ha a che fare con +disponibile, mentre la colonna successiva indica, quando si ha a che fare con un valore di \param{optval} intero, se l'opzione è da considerare un numero o un valore logico. Si è inoltre riportato sulla quinta colonna il tipo di dato usato per \param{optval} ed una breve descrizione del significato delle @@ -2268,100 +2303,28 @@ gestione dei socket, e pertanto il loro utilizzo sarà approfondito separatamente in sez.~\ref{sec:sock_options_main}. Quello che segue è quindi soltanto un elenco più dettagliato della breve descrizione di tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: -\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} - -\item[\const{SO\_KEEPALIVE}] questa opzione abilita un meccanismo di verifica - della persistenza di una connessione associata al socket (ed è pertanto - effettiva solo sui socket che supportano le connessioni, ed è usata - principalmente con il TCP). L'opzione utilizza per \param{optval} un intero - usato come valore logico. Maggiori dettagli sul suo funzionamento sono - forniti in sez.~\ref{sec:sock_options_main}. - -\item[\constd{SO\_OOBINLINE}] se questa opzione viene abilitata i dati - \textit{out-of-band} vengono inviati direttamente nel flusso di dati del - socket (e sono quindi letti con una normale \func{read}) invece che restare - disponibili solo per l'accesso con l'uso del flag \const{MSG\_OOB} di - \func{recvmsg}. L'argomento è trattato in dettaglio in - sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che - supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad - esempio), ed utilizza per \param{optval} un intero usato come valore logico. - -\item[\constd{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il - numero minimo di byte che devono essere presenti nel buffer di ricezione - perché il kernel passi i dati all'utente, restituendoli ad una \func{read} o - segnalando ad una \func{select} (vedi sez.~\ref{sec:TCP_sock_select}) che ci - sono dati in ingresso. L'opzione utilizza per \param{optval} un intero che - specifica il numero di byte, ma con Linux questo valore è sempre 1 e non può - essere cambiato; \func{getsockopt} leggerà questo valore mentre - \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. - -\item[\constd{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il - numero minimo di byte che devono essere presenti nel buffer di trasmissione - perché il kernel li invii al protocollo successivo, consentendo ad una - \func{write} di ritornare o segnalando ad una \func{select} (vedi - sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura. - L'opzione utilizza per \param{optval} un intero che specifica il numero di - byte, come per la precedente \const{SO\_RCVLOWAT} con Linux questo valore è - sempre 1 e non può essere cambiato; \func{getsockopt} leggerà questo valore - mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. - -\item[\constd{SO\_RCVTIMEO}] l'opzione permette di impostare un tempo massimo - sulle operazioni di lettura da un socket, e prende per \param{optval} una - struttura di tipo \struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct}) - identica a quella usata con \func{select}. Con \func{getsockopt} si può - leggere il valore attuale, mentre con \func{setsockopt} si imposta il tempo - voluto, usando un valore nullo per \struct{timeval} il timeout viene - rimosso. - - Se l'opzione viene attivata tutte le volte che una delle funzioni di lettura - (\func{read}, \func{readv}, \func{recv}, \func{recvfrom} e \func{recvmsg}) - si blocca in attesa di dati per un tempo maggiore di quello impostato, essa - ritornerà un valore -1 e la variabile \var{errno} sarà impostata con un - errore di \errcode{EAGAIN} e \errcode{EWOULDBLOCK}, così come sarebbe - avvenuto se si fosse aperto il socket in modalità non bloccante.\footnote{in - teoria, se il numero di byte presenti nel buffer di ricezione fosse - inferiore a quello specificato da \const{SO\_RCVLOWAT}, l'effetto potrebbe - essere semplicemente quello di provocare l'uscita delle funzioni di - lettura restituendo il numero di byte fino ad allora ricevuti; dato che - con Linux questo valore è sempre 1 questo caso non esiste.} - - In genere questa opzione non è molto utilizzata se si ha a che fare con la - lettura dei dati, in quanto è sempre possibile usare una \func{select} che - consente di specificare un \textit{timeout}; l'uso di \func{select} non - consente però di impostare il timeout per l'uso di \func{connect}, per avere - il quale si può ricorrere a questa opzione. - -% TODO verificare il timeout con un programma di test - -\item[\constd{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo - sulle operazioni di scrittura su un socket, ed usa gli stessi valori di - \const{SO\_RCVTIMEO}. In questo caso però si avrà un errore di - \errcode{EAGAIN} o \errcode{EWOULDBLOCK} per le funzioni di scrittura - \func{write}, \func{writev}, \func{send}, \func{sendto} e \func{sendmsg} - qualora queste restino bloccate per un tempo maggiore di quello specificato. - -\item[\constd{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il - comportamento di BSD (in particolare ne riproduce i bug). Attualmente è una - opzione usata solo per il protocollo UDP e ne è prevista la rimozione in - futuro. L'opzione utilizza per \param{optval} un intero usato come valore - logico. - Quando viene abilitata gli errori riportati da messaggi ICMP per un socket - UDP non vengono passati al programma in user space. Con le versioni 2.0.x - del kernel erano anche abilitate altre opzioni per i socket raw, che sono - state rimosse con il passaggio al 2.2; è consigliato correggere i programmi - piuttosto che usare questa funzione. - -\item[\constd{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain - (vedi sez.~\ref{sec:unix_socket}) la ricezione dei messaggi di controllo di - tipo \const{SCM\_CREDENTIALS}. Prende come \param{optval} un intero usato - come valore logico. +\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} +\item[\constd{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket + su cui opera è stato posto in modalità di ricezione di eventuali connessioni + con una chiamata a \func{listen}. L'opzione può essere usata soltanto con + \func{getsockopt} ed utilizza per \param{optval} un intero in cui viene + restituito 1 se il socket è in ascolto e 0 altrimenti. -\item[\constd{SO\_PEERCRED}] questa opzione restituisce le credenziali del - processo remoto connesso al socket; l'opzione è disponibile solo per socket - unix-domain e può essere usata solo con \func{getsockopt}. Utilizza per - \param{optval} una apposita struttura \struct{ucred} (vedi - sez.~\ref{sec:unix_socket}). +\item[\constd{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un + socket un filtro di selezione dei pacchetti con la stessa sintassi del BPF + (\textit{Berkley Packet Filter}) di BSD, che consente di selezionare, fra + tutti quelli ricevuti, verranno letti. Può essere usata solo con + \func{setsockopt} ed utilizza per \param{optval} un puntatore ad una + struttura \struct{sock\_fprog} (definita in + \headfile{linux/filter.h}). Questa opzione viene usata principalmente con i + socket di tipo \const{AF\_PACKET} (torneremo su questo in + sez.~\ref{sec:packet_socket}) dalla libreria \texttt{libpcap} per + implementare programmi di cattura dei pacchetti, e per questo tipo di + applicazione è opportuno usare sempre quest'ultima.\footnote{la trattazione + del BPF va al di là dell'argomento di questa sezione per la documentazione + si consulti il file \texttt{networking/filter.txt} nella documentazione + del kernel.} \item[\constd{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il socket ad una particolare interfaccia, in modo che esso possa ricevere ed @@ -2376,6 +2339,45 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: famiglia \const{AF\_INET}; non è invece supportata per i \textit{packet socket} (vedi sez.~\ref{sec:socket_raw}). +\item[\constd{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast}: + quando abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i + pacchetti inviati all'indirizzo di \textit{broadcast} e potranno scrivere + pacchetti su tale indirizzo. Prende per \param{optval} un intero usato come + valore logico. L'opzione non ha effetti su un socket di tipo + \const{SOCK\_STREAM}. + +\item[\constd{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il + comportamento di BSD (in particolare ne riproduce alcuni bug). Attualmente + è una opzione usata solo per il protocollo UDP e ne è prevista la rimozione. + L'opzione utilizza per \param{optval} un intero usato come valore logico. + + Quando viene abilitata gli errori riportati da messaggi ICMP per un socket + UDP non vengono passati al programma in \textit{user space}. Con le versioni + 2.0.x del kernel erano anche abilitate altre opzioni di compatibilità per i + socket raw (modifiche casuali agli header, perdita del flag di + \textit{broadcast}) che sono state rimosse con il passaggio al 2.2; è + consigliato correggere i programmi piuttosto che usare questa funzione. Dal + kernel 2.4 viene ignorata, e dal 2.6 genera un messaggio di log del kernel. + +\item[\constd{SO\_BUSY\_POLL}] questa opzione, presente dal kernel 3.11, + imposta un tempo approssimato in microsecondi, per cui in caso di ricezione + bloccante verrà eseguito un \itindex{busy~poll} ``\textit{busy + poll}'',\footnote{con \textit{busy poll} si fa riferimento al + \textit{polling} su una risorsa occupata; si continuerà cioè a tentare di + leggere anche quando non ci sono dati senza portare il processo stato di + \textit{sleep}, in alcuni casi, quando ci si aspetta che i dati arrivino a + breve, questa tecnica può dare un miglioramento delle prestazioni.} da + indicare in \param{optval} con un valore intero. Si tratta di una opzione + utilizzabile solo con socket che ricevono dati da un dispositivo di rete che + la supporti, e che consente di ridurre la latenza per alcune applicazioni, + ma che comporta un maggiore utilizzo della CPU (e quindi di energia); per + questo il valore può essere aumentato solo da processi con i privilegi di + amministratore (in particolare con la \textit{capability} + \const{CAP\_NET\_ADMIN}). Il valore di default viene controllato dal file + \sysctlrelfile{net/core}{busy\_read} per le funzioni di lettura mentre il + file \sysctlrelfile{net/core}{busy\_poll} controlla il ``\textit{busy + poll}'' per \func{select} e \func{poll}. + \item[\constd{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni dei socket; l'opzione utilizza per \param{optval} un intero usato come valore logico, e può essere utilizzata solo da un processo con i privilegi @@ -2395,45 +2397,131 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: sulla rete su un buffer circolare che viene letto da un apposito programma, \cmd{trpt}.} -\item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione - \func{bind} su indirizzi locali che siano già in uso da altri socket; - l'opzione utilizza per \param{optval} un intero usato come valore logico. - Questa opzione modifica il comportamento normale dell'interfaccia dei socket - che fa fallire l'esecuzione della funzione \func{bind} con un errore di - \errcode{EADDRINUSE} quando l'indirizzo locale\footnote{più propriamente il - controllo viene eseguito sulla porta.} è già in uso da parte di un altro - socket. Maggiori dettagli sul suo funzionamento sono forniti in - sez.~\ref{sec:sock_options_main}. +\item[\constd{SO\_DETACH\_FILTER}] consente di distaccare un filtro + precedentemente aggiunto ad un socket con l'opzione + \const{SO\_ATTACH\_FILTER}, in genere non viene usata direttamente in quanto + i filtri BPF vengono automaticamente rimossi alla chiusura del socket, il + suo utilizzo è pertanto limitato ai rari casi in cui si vuole rimuovere un + precedente filtro per inserirne uno diverso. Come \const{SO\_ATTACH\_FILTER} + può essere usato solo \func{setsockopt} e prende per \param{optval} un + intero usato come valore logico. + +\item[\constd{SO\_DOMAIN}] questa opzione, presente dal kernel 2.6.32, legge + il ``\textsl{dominio}'' (la famiglia di indirizzi) del socket. +. Funziona solo con \func{getsockopt}, ed + utilizza per \param{optval} un intero in cui verrà restituito il valore + numerico che lo identifica (ad esempio \texttt{AF\_INET}). + +\item[\constd{SO\_DONTROUTE}] questa opzione richiede che l'invio dei + pacchetti del socket sia eseguito soltanto verso una destinazione + direttamente connessa, impedendo l'uso di un \textit{gateway} e saltando + ogni processo relativo all'uso della tabella di routing del kernel. Prende + per \param{optval} un intero usato come valore logico. È equivalente all'uso + del flag \const{MSG\_DONTROUTE} su una \func{send} (vedi + sez.~\ref{sec:net_send_recv}). -\item[\constd{SO\_TYPE}] questa opzione permette di leggere il tipo di socket - su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per - \param{optval} un intero in cui verrà restituito il valore numerico che lo - identifica (ad esempio \const{SOCK\_STREAM}). +\item[\constd{SO\_ERROR}] questa opzione riceve un errore presente sul socket; + può essere utilizzata soltanto con \func{getsockopt} e prende per + \param{optval} un valore intero, nel quale viene restituito il codice di + errore, e la condizione di errore sul socket viene cancellata. Viene + usualmente utilizzata per ricevere il codice di errore, come accennato in + sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una + \func{select} che ritorna a causa dello stesso. -\item[\constd{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket - su cui opera è stato posto in modalità di ricezione di eventuali connessioni - con una chiamata a \func{listen}. L'opzione può essere usata soltanto con - \func{getsockopt} e utilizza per \param{optval} un intero in cui viene - restituito 1 se il socket è in ascolto e 0 altrimenti. +\item[\const{SO\_KEEPALIVE}] questa opzione abilita un meccanismo di verifica + della persistenza di una connessione associata al socket; è pertanto + effettiva solo sui socket che supportano le connessioni, ed è usata + principalmente con il TCP. L'opzione utilizza per \param{optval} un intero + usato come valore logico. Maggiori dettagli sul suo funzionamento sono + forniti in sez.~\ref{sec:sock_options_main}. + +\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 + modifica il comportamento delle funzioni \func{close} e \func{shutdown}. + L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo + \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in + fig.~\ref{fig:sock_linger_struct}. Maggiori dettagli sul suo funzionamento + sono forniti in sez.~\ref{sec:sock_options_main}. -\item[\constd{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei - pacchetti del socket, saltando ogni processo relativo all'uso della tabella - di routing del kernel. Prende per \param{optval} un intero usato come valore +\item[\constd{SO\_LOCK\_FILTER}] consente di bloccare un filtro + precedentemente aggiunto ad un socket con l'opzione + \const{SO\_ATTACH\_FILTER}, in modo che non possa essere né rimosso né + modificato, questo consente di impostare un filtro su un socket, bloccarlo e + poi cedere i privilegi con la sicurezza che il filtro permarrà fino alla + chiusura del socket. Come \const{SO\_ATTACH\_FILTER} può essere usato solo + \func{setsockopt} e prende per \param{optval} un intero usato come valore logico. -\item[\constd{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast}; - quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i - pacchetti inviati all'indirizzo di \textit{broadcast}, e potranno scrivere - pacchetti su tale indirizzo. Prende per \param{optval} un intero usato come - valore logico. L'opzione non ha effetti su un socket di tipo - \const{SOCK\_STREAM}. +\item[\constd{SO\_MARK}] questa opzione, presente dal kernel 2.6.25, imposta + un valore di marcatura sui pacchetti del socket. Questa è una funzionalità + specifica di Linux, ottenibile anche con l'uso del target \texttt{MARK} + del comando \texttt{iptables} (l'argomento è trattato in sez.~3.3.5 di + \cite{SGL}). Il valore di marcatura viene mantenuto all'interno dello stack + di rete del kernel e può essere usato sia dal \itindex{netfilter} + \textit{netfilter}\footnote{il \textit{netfilter} è l'infrastruttura usata + per il filtraggio dei pacchetti del kernel, per maggiori dettagli si + consulti il cap.~2 di \cite{FwGL}.} di Linux che per impostare politiche + di routing avanzato. Il valore deve essere specificato in \param{optval} + come un intero. L'opzione richiede i privilegi di amministratore con la + \textit{capability} \const{CAP\_NET\_ADMIN}. -\item[\constd{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di - trasmissione del socket. Prende per \param{optval} un intero indicante il - numero di byte. Il valore di default ed il valore massimo che si possono - specificare come argomento per questa opzione sono impostabili - rispettivamente tramite gli opportuni valori di \func{sysctl} (vedi - sez.~\ref{sec:sock_sysctl}). +\item[\constd{SO\_OOBINLINE}] se questa opzione viene abilitata i dati + \textit{out-of-band} vengono inviati direttamente nel flusso di dati del + socket (e sono quindi letti con una normale \func{read}) invece che restare + disponibili solo per l'accesso con l'uso del flag \const{MSG\_OOB} di + \func{recvmsg}. L'argomento è trattato in dettaglio in + sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che + supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad + esempio), ed utilizza per \param{optval} un intero usato come valore logico. + +\item[\constd{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain + (vedi sez.~\ref{sec:unix_socket}) la ricezione dei messaggi di controllo di + tipo \const{SCM\_CREDENTIALS}. Prende come \param{optval} un intero usato + come valore logico. + +\item[\constd{SO\_PEEK\_OFF}] questa opzione, disponibile a partire dal kernel + 3.4, imposta un ``\textit{peek offset}'' sul socket (attualmente disponibile + solo per i socket unix-domain (vedi sez.~\ref{sec:unix_socket}). La funzione + serve come ausilio per l'uso del flag \const{MSG\_PEEK} di \func{recv} che + consente di ``\textsl{sbirciare}'' nei dati di un socket, cioè di leggerli + senza rimuoverli dalla coda in cui sono mantenuti, così che vengano + restituiti anche da una successiva lettura ordinaria. + + Un valore negativo (il default è $-1$) riporta alla situazione ordinaria in + cui si ``\textsl{sbircia}'' a partire dalla testa della coda, un valore + positivo consente di leggere a partire dalla posizione indicata nella coda e + tutte le volte che si sbirciano dei dati il valore dell'offset viene + automaticamente aumentato della quantità di dati sbirciati, in modo che si + possa proseguire da dove si era arrivati. Il valore deve essere specificato + in \param{optval} come intero. + +\item[\constd{SO\_PEERCRED}] questa opzione restituisce le credenziali del + processo remoto connesso al socket; l'opzione è disponibile solo per socket + unix-domain di tipo \textit{stream} e anche per quelli di tipo + \textit{datagram} quando se ne crea una coppia con \func{socketpair}, e può + essere usata solo con \func{getsockopt}. Utilizza per + \param{optval} una apposita struttura \struct{ucred} (vedi + sez.~\ref{sec:unix_socket}). + +\item[\constd{SO\_PRIORITY}] questa opzione permette di impostare le priorità + per tutti i pacchetti che sono inviati sul socket, prende per \param{optval} + un valore intero. Con questa opzione il kernel usa il valore per ordinare le + priorità sulle code di rete,\footnote{questo richiede che sia abilitato il + sistema di \textit{Quality of Service} disponibile con le opzioni di + routing avanzato.} i pacchetti con priorità più alta vengono processati + per primi, in modalità che dipendono dalla disciplina di gestione della + coda. Nel caso di protocollo IP questa opzione permette anche di impostare i + valori del campo \textit{type of service} (noto come TOS, vedi + sez.~\ref{sec:IP_header}) per i pacchetti uscenti. Per impostare una + priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i + privilegi di amministratore con la \textit{capability} + \const{CAP\_NET\_ADMIN}. + +\item[\constd{SO\_PROTOCOL}] questa opzione, presente dal kernel 2.6.32, legge + il protocollo usato dal socket. Funziona solo con \func{getsockopt}, ed + utilizza per \param{optval} un intero in cui verrà restituito il valore + numerico che lo identifica (ad esempio \texttt{IPPROTO\_TCP}). \item[\constd{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di ricezione del socket. Prende per \param{optval} un intero indicante il @@ -2441,10 +2529,10 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: specificare come argomento per questa opzione sono impostabili tramiti gli opportuni valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}). - Si tenga presente che nel caso di socket TCP, per entrambe le opzioni - \const{SO\_RCVBUF} e \const{SO\_SNDBUF}, il kernel alloca effettivamente una - quantità di memoria doppia rispetto a quanto richiesto con - \func{setsockopt}. Questo comporta che una successiva lettura con + Si tenga presente che nel caso di socket TCP il kernel alloca effettivamente + una quantità di memoria doppia rispetto a quanto richiesto con + \func{setsockopt} per entrambe le opzioni \const{SO\_RCVBUF} e + \const{SO\_SNDBUF}. 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 @@ -2459,63 +2547,130 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: 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 - modifica il comportamento delle funzioni \func{close} e \func{shutdown}. - L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo - \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in - fig.~\ref{fig:sock_linger_struct}. Maggiori dettagli sul suo funzionamento - sono forniti in sez.~\ref{sec:sock_options_main}. +\item[\constd{SO\_RCVBUFFORCE}] questa opzione, presente dal kernel 2.6.14, è + identica a \const{SO\_RCVBUF} ma consente ad un processo con i privilegi di + amministratore (per la precisione con la \textit{capability} + \const{CAP\_NET\_ADMIN}) di impostare in valore maggiore del limite di + \sysctlrelfile{net/core}{rmem\_max}. -\item[\constd{SO\_PRIORITY}] questa opzione permette di impostare le priorità - per tutti i pacchetti che sono inviati sul socket, prende per \param{optval} - un valore intero. Con questa opzione il kernel usa il valore per ordinare le - priorità sulle code di rete,\footnote{questo richiede che sia abilitato il - sistema di \textit{Quality of Service} disponibile con le opzioni di - routing avanzato.} i pacchetti con priorità più alta vengono processati - per primi, in modalità che dipendono dalla disciplina di gestione della - coda. Nel caso di protocollo IP questa opzione permette anche di impostare i - valori del campo \textit{type of service} (noto come TOS, vedi - sez.~\ref{sec:IP_header}) per i pacchetti uscenti. Per impostare una - priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i - privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}. +\item[\constd{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il + numero minimo di byte che devono essere presenti nel buffer di ricezione + perché il kernel passi i dati all'utente, restituendoli ad una \func{read} o + segnalando ad una \func{select} (vedi sez.~\ref{sec:TCP_sock_select}) che ci + sono dati in ingresso. L'opzione utilizza per \param{optval} un intero che + specifica il numero di byte; con Linux questo valore è sempre 1 e può essere + cambiato solo con i kernel a partire dal 2.4. Si tenga presente però che per + i kernel prima del 2.6.28 sia \func{poll} che \func{select} non supportano + questa funzionalità e ritornano comunque, indicando il socket come + leggibile, non appena almeno un byte è presente, con una successiva lettura + con \func{read} che si blocca fintanto che non diventa disponibile la + quantità di byte indicati. Con \func{getsockopt} si può leggere questo + valore mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT} + quando il cambiamento non è supportato. -\item[\constd{SO\_ERROR}] questa opzione riceve un errore presente sul socket; - può essere utilizzata soltanto con \func{getsockopt} e prende per - \param{optval} un valore intero, nel quale viene restituito il codice di - errore, e la condizione di errore sul socket viene cancellata. Viene - usualmente utilizzata per ricevere il codice di errore, come accennato in - sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una - \func{select} che ritorna a causa dello stesso. +\item[\constd{SO\_RCVTIMEO}] l'opzione permette di impostare un tempo massimo + sulle operazioni di lettura da un socket, e prende per \param{optval} una + struttura di tipo \struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct}) + identica a quella usata con \func{select}. Con \func{getsockopt} si può + leggere il valore attuale, mentre con \func{setsockopt} si imposta il tempo + voluto, usando un valore nullo per \struct{timeval} il timeout viene + rimosso. -\item[\constd{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un - socket un filtro di pacchetti che consente di selezionare quali pacchetti, - fra tutti quelli ricevuti, verranno letti. Viene usato principalmente con i - socket di tipo \const{PF\_PACKET} con la libreria \texttt{libpcap} per - implementare programmi di cattura dei pacchetti, torneremo su questo in - sez.~\ref{sec:packet_socket}. + Se l'opzione viene attivata tutte le volte che una delle funzioni di lettura + (\func{read}, \func{readv}, \func{recv}, \func{recvfrom} e \func{recvmsg}) + si blocca in attesa di dati per un tempo maggiore di quello impostato, essa + ritornerà un valore -1 e la variabile \var{errno} sarà impostata con un + errore di \errcode{EAGAIN} e \errcode{EWOULDBLOCK}, così come sarebbe + avvenuto se si fosse aperto il socket in modalità non bloccante.\footnote{in + teoria, se il numero di byte presenti nel buffer di ricezione fosse + inferiore a quello specificato da \const{SO\_RCVLOWAT}, l'effetto potrebbe + essere semplicemente quello di provocare l'uscita delle funzioni di + lettura restituendo il numero di byte fino ad allora ricevuti.} -\item[\constd{SO\_DETACH\_FILTER}] consente di distaccare un filtro - precedentemente aggiunto ad un socket. + In genere questa opzione non è molto utilizzata se si ha a che fare con la + lettura dei dati, in quanto è sempre possibile usare una \func{select} che + consente di specificare un \textit{timeout}; l'uso di \func{select} non + consente però di impostare il timeout per l'uso di \func{connect}, per avere + il quale si può ricorrere a questa opzione (nel qual caso il raggiungimento + del \textit{timeout} restituisce l'errore \errcode{EINPROGRESS}). + +\item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione + \func{bind} su indirizzi locali che siano già in uso da altri socket; + l'opzione utilizza per \param{optval} un intero usato come valore logico. + Questa opzione modifica il comportamento normale dell'interfaccia dei socket + che fa fallire l'esecuzione della funzione \func{bind} con un errore di + \errcode{EADDRINUSE} quando l'indirizzo locale (più propriamente il + controllo viene eseguito sulla porta) è già in uso da parte di un altro + socket. Maggiori dettagli sul suo funzionamento sono forniti in + sez.~\ref{sec:sock_options_main}. + +\item[\const{SO\_REUSEPORT}] questa opzione, presente a partire dal kernel + 3.9, permette di far usare a più socket di tipo \const{AF\_INET} o + \const{AF\_INET6} lo stesso indirizzo locale, e costituisce una estensione + della precedente \const{SO\_REUSEADDR}. Maggiori dettagli sul suo + funzionamento sono forniti in sez.~\ref{sec:sock_options_main}. + +\item[\constd{SO\_RXQ\_OVFL}] questa opzione, presente dal kernel 2.6.33, + permette di abilitare o disabilitare sul socket la ricezione di un messaggio + ancillare (tratteremo l'argomento in sez.~\ref{sec:net_ancillary_data}) + contenente un intero senza segno a 32 bit che indica il numero di pacchetti + scartati sul socket fra l'ultimo pacchetto ricevuto e questo. L'opzione + utilizza per \param{optval} un intero usato come valore logico. + +% TODO documentare SO_RXQ_OVFL, vedi https://lwn.net/Articles/626150/ capire +% che significa 'questo' + +\item[\constd{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il + numero minimo di byte che devono essere presenti nel buffer di trasmissione + perché il kernel li invii al protocollo successivo, consentendo ad una + \func{write} di ritornare o segnalando ad una \func{select} (vedi + sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura. + L'opzione utilizza per \param{optval} un intero che specifica il numero di + byte; con Linux questo valore è sempre 1 e non può essere cambiato; + \func{getsockopt} leggerà questo valore mentre \func{setsockopt} darà un + errore di \errcode{ENOPROTOOPT}. + +\item[\constd{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di + trasmissione del socket. Prende per \param{optval} un intero indicante il + numero di byte. Il valore di default ed il valore massimo che si possono + specificare come argomento per questa opzione sono impostabili + rispettivamente tramite gli opportuni valori di \func{sysctl} (vedi + sez.~\ref{sec:sock_sysctl}). -% TODO documentare SO_ATTACH_FILTER e SO_DETACH_FILTER -% riferimenti http://www.rcpt.to/lsfcc/lsf.html -% Documentation/networking/filter.txt +\item[\constd{SO\_SNDBUFFORCE}] questa opzione, presente dal kernel 2.6.14, è + identica a \const{SO\_SNDBUF} ma consente ad un processo con i privilegi di + amministratore (per la precisione con la \textit{capability} + \const{CAP\_NET\_ADMIN}) di impostare in valore maggiore del limite di + \sysctlrelfile{net/core}{wmem\_max}. -% TODO documentare SO_MARK, introdotta nel 2.6.25, richiede CAP_NET_ADMIN -%A userspace program may wish to set the mark for each packets its send -%without using the netfilter MARK target. Changing the mark can be used -%for mark based routing without netfilter or for packet filtering. +% TODO verificare il timeout con un programma di test +\item[\constd{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo + sulle operazioni di scrittura su un socket, ed usa gli stessi valori di + \const{SO\_RCVTIMEO}. In questo caso però si avrà un errore di + \errcode{EAGAIN} o \errcode{EWOULDBLOCK} per le funzioni di scrittura + \func{write}, \func{writev}, \func{send}, \func{sendto} e \func{sendmsg} + qualora queste restino bloccate per un tempo maggiore di quello specificato. +\item[\constd{SO\_TIMESTAMP}] questa opzione, presente dal kernel 2.6.30, + permette di abilitare o disabilitare sul socket la ricezione di un messaggio + ancillare di tipo \const{SO\_TIMESTAMP}. Il messaggio viene inviato con + livello \const{SOL\_SOCKET} ed nel campo \var{cmsg\_data} (per i dettagli si + veda sez.~\ref{sec:net_ancillary_data}) viene impostata una struttura + \struct{timeval} che indica il tempo di ricezione dell'ultimo pacchetto + passato all'utente. L'opzione utilizza per \param{optval} un intero usato + come valore logico. + +% TODO capire meglio la tempistica di questi messaggi ancillari % TODO documentare SO_TIMESTAMP e le altre opzioni di timestamping dei % pacchetti, introdotte nel 2.6.30, vedi nei sorgenti del kernel: % Documentation/networking/timestamping.txt +\item[\constd{SO\_TYPE}] questa opzione permette di leggere il tipo di socket + su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per + \param{optval} un intero in cui verrà restituito il valore numerico che lo + identifica (ad esempio \const{SOCK\_STREAM}). -% TOFO documentare SO_REUSEPORT introdotta con il kernel 3.9, vedi -% http://git.kernel.org/linus/c617f398edd4db2b8567a28e899a88f8f574798d \end{basedescript} @@ -2548,13 +2703,13 @@ 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 -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. +messaggio di \textit{keep-alive} (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 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. Qualora ci siano dei problemi di rete si possono invece verificare i due casi di terminazione precoce del server già illustrati in @@ -2608,7 +2763,7 @@ comunicare con il server via rete. Abilitandola dopo un certo tempo le connessioni effettivamente terminate verranno comunque chiuse per cui, utilizzando ad esempio una \func{select}, se -be potrà rilevare la conclusione e ricevere il relativo errore. Si tenga +ne potrà rilevare la conclusione e ricevere il relativo errore. Si tenga presente però che non può avere la certezza assoluta che un errore di \errcode{ETIMEDOUT} ottenuto dopo aver abilitato questa opzione corrisponda necessariamente ad una reale conclusione della connessione, il problema @@ -2638,9 +2793,9 @@ attivando il relativo comportamento. \constbeg{SO\_REUSEADDR} -\subsubsection{L'opzione \const{SO\_REUSEADDR}} +\subsubsection{Le opzioni \const{SO\_REUSEADDR} e \const{SO\_REUSEPORT}} -La seconda opzione da approfondire è \const{SO\_REUSEADDR}, che consente di +La seconda opzione da approfondire è \constd{SO\_REUSEADDR}, che consente di eseguire \func{bind} su un socket anche quando la porta specificata è già in uso da parte di un altro socket. Si ricordi infatti che, come accennato in sez.~\ref{sec:TCP_func_bind}, normalmente la funzione \func{bind} fallisce con @@ -2656,19 +2811,30 @@ sottolinea Stevens in \cite{UNP1}, si distinguono ben quattro casi diversi in cui è prevista la possibilità di un utilizzo di questa opzione, il che la rende una delle più difficili da capire. -Il primo caso, che è anche il più comune, in cui si fa ricorso a -\const{SO\_REUSEADDR} è quello in cui un server è terminato ma esistono ancora -dei processi figli che mantengono attiva almeno una connessione remota che -utilizza l'indirizzo locale, mantenendo occupata la porta. Quando si riesegue -il server allora questo riceve un errore sulla chiamata a \func{bind} dato che -la porta è ancora utilizzata in una connessione esistente.\footnote{questa è - una delle domande più frequenti sui newsgroup dedicati allo sviluppo, in - quanto è piuttosto comune trovarsi in questa situazione quando si sta - sviluppando un server che si ferma e si riavvia in continuazione dopo aver - fatto modifiche.} Inoltre se si usa il protocollo TCP questo può avvenire -anche dopo tutti i processi figli sono terminati, dato che una connessione può -restare attiva anche dopo la chiusura del socket, mantenendosi nello stato -\texttt{TIME\_WAIT} (vedi sez.~\ref{sec:TCP_time_wait}). +Il primo caso in cui si fa ricorso a \const{SO\_REUSEADDR}, che è anche il più +comune, è quello in cui un server è terminato ma esistono ancora dei processi +figli che mantengono attiva almeno una connessione remota che utilizza +l'indirizzo locale, mantenendo occupata la porta. Quando si riesegue il server +allora questo riceve un errore sulla chiamata a \func{bind} dato che la porta +è ancora utilizzata in una connessione esistente.\footnote{questa è una delle + domande più frequenti relative allo sviluppo, in quanto è piuttosto comune + trovarsi in questa situazione quando si sta sviluppando un server che si + ferma e si riavvia in continuazione dopo aver fatto modifiche.} Inoltre se +si usa il protocollo TCP questo può avvenire anche dopo tutti i processi figli +sono terminati, dato che una connessione può restare attiva anche dopo la +chiusura del socket, mantenendosi nello stato \texttt{TIME\_WAIT} (vedi +sez.~\ref{sec:TCP_time_wait}). + +\begin{figure}[!htbp] + \footnotesize \centering + \begin{minipage}[c]{\codesamplewidth} + \includecodesample{listati/sockbindopt.c} + \end{minipage} + \normalsize + \caption{Le sezioni della funzione \texttt{sockbindopt} modificate rispetto al + codice della precedente \texttt{sockbind}.} + \label{fig:sockbindopt_code} +\end{figure} Usando \const{SO\_REUSEADDR} fra la chiamata a \func{socket} e quella a \func{bind} si consente a quest'ultima di avere comunque successo anche se la @@ -2692,17 +2858,6 @@ completo della funzione si trova, insieme alle altre funzioni di servizio dei socket, all'interno del file \texttt{SockUtils.c} dei sorgenti allegati alla guida. -\begin{figure}[!htbp] - \footnotesize \centering - \begin{minipage}[c]{\codesamplewidth} - \includecodesample{listati/sockbindopt.c} - \end{minipage} - \normalsize - \caption{Le sezioni della funzione \texttt{sockbindopt} modificate rispetto al - codice della precedente \texttt{sockbind}.} - \label{fig:sockbindopt_code} -\end{figure} - In realtà tutto quello che si è fatto è stato introdurre nella nuova funzione (\texttt{\small 1}) un nuovo argomento intero, \param{reuse}, che conterrà il valore logico da usare nella successiva chiamata (\texttt{\small 14}) a @@ -2710,6 +2865,16 @@ valore logico da usare nella successiva chiamata (\texttt{\small 14}) a esegue l'impostazione dell'opzione fra la chiamata a \func{socket} e quella a \func{bind}. +\begin{figure}[!htbp] + \footnotesize \centering + \begin{minipage}[c]{\codesamplewidth} + \includecodesample{listati/TCP_echod_fifth.c} + \end{minipage} + \normalsize + \caption{Il nuovo codice per l'apertura passiva del server \textit{echo} che + usa la nuova funzione \texttt{sockbindopt}.} + \label{fig:TCP_echod_fifth} +\end{figure} A questo punto basterà modificare il server per utilizzare la nuova funzione; in fig.~\ref{fig:TCP_echod_fifth} abbiamo riportato le sezioni @@ -2726,19 +2891,8 @@ riportata in fig.~\ref{fig:TCP_echod_fifth}) se ne potrà impostare ad 1 il valore, per cui in tal caso la successiva chiamata (\texttt{\small 13--17}) a \func{setsockopt} attiverà l'opzione \const{SO\_REUSEADDR}. -\begin{figure}[!htbp] - \footnotesize \centering - \begin{minipage}[c]{\codesamplewidth} - \includecodesample{listati/TCP_echod_fifth.c} - \end{minipage} - \normalsize - \caption{Il nuovo codice per l'apertura passiva del server \textit{echo} che - usa la nuova funzione \texttt{sockbindopt}.} - \label{fig:TCP_echod_fifth} -\end{figure} - Il secondo caso in cui viene usata \const{SO\_REUSEADDR} è quando si ha una -macchina cui sono assegnati diversi numeri IP (o come suol dirsi +macchina cui sono assegnati diversi indirizzi IP (o come suol dirsi \textit{multi-homed}) e si vuole porre in ascolto sulla stessa porta un programma diverso (o una istanza diversa dello stesso programma) per indirizzi IP diversi. Si ricordi infatti che è sempre possibile indicare a \func{bind} @@ -2750,10 +2904,12 @@ impostato \const{SO\_REUSEADDR}. Usando questa opzione diventa anche possibile eseguire \func{bind} sull'indirizzo generico, e questo permetterà il collegamento per tutti gli indirizzi (di quelli presenti) per i quali la porta non risulti occupata da -una precedente chiamata più specifica. Infine si tenga presente che con il -protocollo TCP non è mai possibile far partire server che eseguano \func{bind} -sullo stesso indirizzo e la stessa porta, cioè ottenere quello che viene -chiamato un \textit{completely duplicate binding}. +una precedente chiamata più specifica. Si tenga presente infatti che con il +protocollo TCP non è in genere possibile far partire più server che eseguano +\func{bind} sullo stesso indirizzo e la stessa porta se su di esso c'è già un +socket in ascolto, cioè ottenere quello che viene chiamato un +\itindex{completely~duplicate~binding} \textit{completely duplicate binding} +(per questo è stata introdotta \const{SO\_REUSEPORT}). Il terzo impiego è simile al precedente e prevede l'uso di \func{bind} all'interno dello stesso programma per associare indirizzi locali diversi a @@ -2769,50 +2925,76 @@ invocare \func{getsockname} una volta che si è completata la connessione. Infine il quarto caso è quello in cui si vuole effettivamente ottenere un \textit{completely duplicate binding}, quando cioè si vuole eseguire -\func{bind} su un indirizzo ed una porta che sono già \textsl{legati} ad un -altro socket. Questo ovviamente non ha senso per il normale traffico di rete, -in cui i pacchetti vengono scambiati direttamente fra due applicazioni; ma -quando un sistema supporta il traffico in \textit{multicast}, allora ha senso -che su una macchina i pacchetti provenienti dal traffico in \textit{multicast} -possano essere ricevuti da più applicazioni\footnote{l'esempio classico di - traffico in \textit{multicast} è quello di uno streaming di dati (audio, - video, ecc.), l'uso del \textit{multicast} consente in tal caso di - trasmettere un solo pacchetto, che potrà essere ricevuto da tutti i - possibili destinatari (invece di inviarne un duplicato a ciascuno); in - questo caso è perfettamente logico aspettarsi che sulla stessa macchina più - utenti possano lanciare un programma che permetta loro di ricevere gli - stessi dati.} o da diverse istanze della stessa applicazione. - -In questo caso utilizzando \const{SO\_REUSEADDR} si consente ad una +\func{bind} su un indirizzo ed una porta che sono già ``\textsl{legati}'' ad +un altro socket. Come accennato questo con TCP non è possibile, ed ha anche +poco senso pensare di mettere in ascolto due server sulla stessa porta. Se +però si prende in considerazione il traffico in \textit{multicast}, diventa +assolutamente normale che i pacchetti provenienti dal traffico in +\textit{multicast} possano essere ricevuti da più applicazioni o da diverse +istanze della stessa applicazione sulla stessa porte di un indirizzo di +\textit{multicast}. + +Un esempio classico è quello di uno streaming di dati (audio, video, ecc.) in +cui l'uso del \textit{multicast} consente di trasmettere un solo pacchetto da +recapitare a tutti i possibili destinatari (invece di inviarne un duplicato a +ciascuno); in questo caso è perfettamente logico aspettarsi che sulla stessa +macchina più utenti possano lanciare un programma che permetta loro di +ricevere gli stessi dati, e quindi effettuare un \textit{completely duplicate + binding}. + +In questo caso utilizzando \const{SO\_REUSEADDR} si può consentire ad una applicazione eseguire \func{bind} sulla stessa porta ed indirizzo usata da -un'altra, così che anche essa possa ricevere gli stessi pacchetti (chiaramente -la cosa non ha alcun senso per i socket TCP, ed infatti in questo tipo di -applicazione è normale l'uso del protocollo UDP). La regola è che quando si +un'altra, così che anche essa possa ricevere gli stessi pacchetti. Come detto +la cosa non è possibile con i socket TCP (per i quali il \textit{multicast} +comunque non è applicabile), ma lo è per quelli UDP che è il protocollo +normalmente in uso da parte di queste applicazioni. La regola è che quando si hanno più applicazioni che hanno eseguito \func{bind} sulla stessa porta, di tutti pacchetti destinati ad un indirizzo di \textit{broadcast} o di -\textit{multicast} viene inviata una copia a ciascuna applicazione. Non è +\textit{multicast} viene inviata una copia a ciascuna applicazione. Non è definito invece cosa accade qualora il pacchetto sia destinato ad un indirizzo -normale (unicast). - -Essendo questo un caso particolare in alcuni sistemi (come BSD) è stata -introdotta una opzione ulteriore, \const{SO\_REUSEPORT} che richiede che detta -opzione sia specificata per tutti i socket per i quali si vuole eseguire il -\textit{completely duplicate binding}. Nel caso di Linux questa opzione non -esisteva fino al kernel 3.9, ma il comportamento di \const{SO\_REUSEADDR} è -analogo, sarà cioè possibile effettuare un \textit{completely duplicate - binding} ed ottenere il successo di \func{bind} su un socket legato allo -stesso indirizzo e porta solo se il programma che ha eseguito per primo -\func{bind} su di essi ha impostato questa opzione.\footnote{questa - restrizione permette di evitare parzialmente il cosiddetto \textit{port - stealing}, in cui un programma, usando \const{SO\_REUSEADDR}, può - collegarsi ad una porta già in uso e ricevere i pacchetti destinati ad un - altro programma; con questa caratteristica ciò è possibile soltanto se il - primo programma a consentirlo, avendo usato fin dall'inizio - \const{SO\_REUSEADDR}.} +normale (\textit{unicast}). + +% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/ +\constbeg{SO\_REUSEPORT} + +Esistono però dei casi, in particolare per l'uso di programmi +\textit{multithreaded}, in cui può servire un \textit{completely duplicate + binding} anche per delle ordinarie connessioni TCP. Per supportare queste +esigenze a partire dal kernel 3.9 è stata introdotta un'altra opzione, +\const{SO\_REUSEPORT} (già presente in altri sistemi come BSD), che consente +di eseguire il \textit{completely duplicate binding}, fintanto che essa venga +specificata per tutti i socket interessati. Come per \const{SO\_REUSEADDR} +sarà possibile usare l'opzione su un socket legato allo stesso indirizzo e +porta solo se il programma che ha eseguito il primo \func{bind} ha impostato +questa opzione. + +Nel caso di \const{SO\_REUSEPORT} oltre al fatto che l'opzione deve essere +attivata sul socket prima di chiamare \func{bind} ed attiva su tutti i socket +con \textit{completely duplicate binding}, è richiesto pure che tutti i +processi che si mettono in ascolto sullo stesso indirizzo e porta abbiano lo +stesso \ids{UID} effettivo, per evitare che un altro utente possa ottenere il +relativo traffico (eseguendo quello che viene definito \textit{port hijacking} +o \textit{port stealing}). L'opzione utilizza per \param{optval} un intero +usato come valore logico. + +L'opzione si usa sia per socket TCP che UDP, nel primo caso consente un uso +distribuito di \func{accept} in una applicazione \textit{multithreaded} +passando un diverso \textit{listening socket} ad ogni thread, cosa che +migliora le prestazioni rispetto all'approccio tradizionale di usare un thread +per usare \func{accept} e distribuire le connessioni agli altri o avere più +thread che competono per usare \func{accept} sul socket. Nel caso di UDP +l'opzione consente di distribuire meglio i pacchetti su più processi o thread, +rispetto all'approccio tradizionale di far competere gli stessi per l'accesso +in ricezione al socket. + +% TODO documentare SO_REUSEPORT introdotta con il kernel 3.9, vedi +% http://git.kernel.org/linus/c617f398edd4db2b8567a28e899a88f8f574798d TODO: +% in cosa differisce da REUSEADDR? + +\constend{SO\_REUSEPORT} \constend{SO\_REUSEADDR} -% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/ \constbeg{SO\_LINGER} \subsubsection{L'opzione \const{SO\_LINGER}} @@ -2908,74 +3090,326 @@ specificato in \var{l\_linger}. \label{sec:sock_ipv4_options} Il secondo insieme di opzioni dei socket che tratteremo è quello relativo ai -socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni - generiche una descrizione di esse è disponibile nella settima sezione delle - pagine di manuale, nel caso specifico la documentazione si può consultare - con \texttt{man 7 ip}.} Se si vuole operare su queste opzioni generiche il -livello da utilizzare è \const{SOL\_IP} (o l'equivalente -\constd{IPPROTO\_IP}); si è riportato un elenco di queste opzioni in -tab.~\ref{tab:sock_opt_iplevel}. Le costanti indicanti le opzioni e tutte le -altre costanti ad esse collegate sono definite in \headfiled{netinet/ip.h}, ed -accessibili includendo detto file. +socket che usano il protocollo IPv4; come per le precedenti opzioni generiche +una descrizione di esse è disponibile nella settima sezione delle pagine di +manuale, nel caso specifico la documentazione si può consultare con +\texttt{man 7 ip}. \begin{table}[!htb] \centering \footnotesize - \begin{tabular}[c]{|l|c|c|c|l|p{6cm}|} + \begin{tabular}[c]{|l|c|c|c|l|p{4.8cm}|} \hline \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}& \textbf{Descrizione}\\ \hline \hline + \const{IP\_ADD\_MEMBERSHIP} & &$\bullet$& &\struct{ip\_mreqn}& + Si unisce a un gruppo di \textit{multicast}.\\ + \const{IP\_ADD\_SOURCE\_MEMBERSHIP} & &$\bullet$& &\struct{ip\_mreq\_source}& + Si unisce a un gruppo di \textit{multicast} per una sorgente.\\ + \const{IP\_BLOCK\_SOURCE} & &$\bullet$& &\struct{ip\_mreq\_source}& + Smette di ricevere dati di \textit{multicast} per una sorgente.\\ + \const{IP\_DROP\_MEMBERSHIP}& &$\bullet$& &\struct{ip\_mreqn}& + Si sgancia da un gruppo di \textit{multicast}.\\ + \const{IP\_DROP\_SOURCE\_MEMBERSHIP}& &$\bullet$& &\struct{ip\_mreq\_source}& + Si sgancia da un gruppo di \textit{multicast} per una sorgente.\\ + \const{IP\_FREEBIND} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita il \textit{binding} a un indirizzo IP non locale ancora non assegnato.\\ + \const{IP\_HDRINCL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Passa l'intestazione di IP nei dati.\\ + \const{IP\_MINTTL} &$\bullet$&$\bullet$& &\texttt{int}& + Imposta il valore minimo del TTL per i pacchetti accettati.\\ + \const{IP\_MSFILTER} &$\bullet$&$\bullet$& &\struct{ip\_msfilter}& + Accesso completo all'interfaccia per il filtraggio delle sorgenti + \textit{multicast}.\\ + \const{IP\_MTU} &$\bullet$& & &\texttt{int}& + Legge il valore attuale della MTU.\\ + \const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}& + Imposta il \textit{Path MTU Discovery}.\\ + \const{IP\_MULTICAST\_ALL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Imposta l'interfaccia locale di un socket \textit{multicast}.\\ + \const{IP\_MULTICAST\_IF} & &$\bullet$& &\struct{ip\_mreqn}& + Imposta l'interfaccia locale di un socket \textit{multicast}.\\ + \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Controlla il reinvio a se stessi dei dati di \textit{multicast}.\\ + \const{IP\_MULTICAST\_TTL} &$\bullet$&$\bullet$& &\texttt{int}& + Imposta il TTL per i pacchetti \textit{multicast}.\\ + \const{IP\_NODEFRAG} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Disabilita il riassemblaggio di pacchetti frammentati.\\ \const{IP\_OPTIONS} &$\bullet$&$\bullet$&&\texttt{void *}& %??? Imposta o riceve le opzioni di IP.\\ \const{IP\_PKTINFO} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio di informazione.\\ + Abilita i messaggi di informazione.\\ + \const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita i messaggi di errore affidabili.\\ + \const{IP\_RECVOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Passa un messaggio con le opzioni IP.\\ + \const{IP\_RECVORIGSTADDR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita i messaggi con l'indirizzo di destinazione originale.\\ \const{IP\_RECVTOS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Passa un messaggio col campo TOS.\\ \const{IP\_RECVTTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio col campo TTL.\\ - \const{IP\_RECVOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio con le opzioni IP.\\ + Abilita i messaggi col campo TTL.\\ \const{IP\_RETOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio con le opzioni IP non trattate.\\ + Abilita i messaggi con le opzioni IP non trattate.\\ + \const{IP\_ROUTER\_ALERT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Imposta l'opzione \textit{IP router alert} sui pacchetti.\\ \const{IP\_TOS} &$\bullet$&$\bullet$& &\texttt{int}& Imposta il valore del campo TOS.\\ + \const{IP\_TRANSPARENT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita un \textit{proxing} trasparente sul socket.\\ \const{IP\_TTL} &$\bullet$&$\bullet$& &\texttt{int}& Imposta il valore del campo TTL.\\ - \const{IP\_MINTTL} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il valore minimo del TTL per i pacchetti accettati.\\ - \const{IP\_HDRINCL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa l'intestazione di IP nei dati.\\ - \const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Abilita la gestione degli errori.\\ - \const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il \textit{Path MTU Discovery}.\\ - \const{IP\_MTU} &$\bullet$& & &\texttt{int}& - Legge il valore attuale della MTU.\\ - \const{IP\_ROUTER\_ALERT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Imposta l'opzione \textit{IP router alert} sui pacchetti.\\ - \const{IP\_MULTICAST\_TTL} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta il TTL per i pacchetti \textit{multicast}.\\ - \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Controlla il reinvio a se stessi dei dati di \textit{multicast}.\\ - \const{IP\_ADD\_MEMBERSHIP} & &$\bullet$& &\struct{ip\_mreqn}& - Si unisce a un gruppo di \textit{multicast}.\\ - \const{IP\_DROP\_MEMBERSHIP}& &$\bullet$& &\struct{ip\_mreqn}& - Si sgancia da un gruppo di \textit{multicast}.\\ - \const{IP\_MULTICAST\_IF} & &$\bullet$& &\struct{ip\_mreqn}& - Imposta l'interfaccia locale di un socket \textit{multicast}.\\ + \const{IP\_UNBLOCK\_SOURCE} & &$\bullet$& &\struct{ip\_mreq\_source}& + Ricomincia a ricevere dati di \textit{multicast} per una sorgente.\\ \hline \end{tabular} - \caption{Le opzioni disponibili al livello \const{SOL\_IP}.} + \caption{Le opzioni disponibili al livello \const{IPPROTO\_IP}.} \label{tab:sock_opt_iplevel} \end{table} +Se si vuole operare su queste opzioni generiche il livello da utilizzare è +\constd{IPPROTO\_IP} (o l'equivalente \const{SOL\_IP}); si è riportato un +elenco di queste opzioni in tab.~\ref{tab:sock_opt_iplevel}. Le costanti +indicanti le opzioni, e tutte le altre costanti ad esse collegate, sono +definite in \headfiled{netinet/ip.h}, ed accessibili includendo detto file. + Le descrizioni riportate in tab.~\ref{tab:sock_opt_iplevel} sono estremamente succinte, una maggiore quantità di dettagli sulle varie opzioni è fornita nel seguente elenco: -\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} +\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}} +\item[\constd{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di + \textit{multicast}, e può essere usata solo con \func{setsockopt}. + L'argomento \param{optval} in questo caso deve essere una struttura di tipo + \struct{ip\_mreqn}, illustrata in fig.~\ref{fig:ip_mreqn_struct}, che + permette di indicare, con il campo \var{imr\_multiaddr} l'indirizzo del + gruppo di \textit{multicast} a cui ci si vuole unire, con il campo + \var{imr\_address} l'indirizzo dell'interfaccia locale con cui unirsi al + gruppo di \textit{multicast} e con \var{imr\_ifindex} l'indice + dell'interfaccia da utilizzare (un valore nullo indica una interfaccia + qualunque). + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{0.90\textwidth} + \includestruct{listati/ip_mreqn.h} + \end{minipage} + \caption{La struttura \structd{ip\_mreqn} utilizzata per unirsi a un gruppo di + \textit{multicast}.} + \label{fig:ip_mreqn_struct} +\end{figure} + +Questa struttura è presente a partire dal kernel 2.2, per compatibilità è +possibile utilizzare anche un argomento di tipo \struct{ip\_mreq}, presente +fino dal kernel 1.2, che differisce da essa soltanto per l'assenza del campo +\var{imr\_ifindex}; il kernel riconosce il tipo di struttura in base alla +differente dimensione passata in \param{optlen}. + +\item[\constd{IP\_ADD\_SOURCE\_MEMBERSHIP}] L'opzione consente di unirsi ad + gruppo di \textit{multicast}, ricevendo i dati solo da una sorgente + specifica; come \const{IP\_ADD\_MEMBERSHIP} può essere usata solo con + \func{setsockopt}. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{0.90\textwidth} + \includestruct{listati/ip_mreq_source.h} + \end{minipage} + \caption{La struttura \structd{ip\_mreqn} utilizzata per unirsi a un gruppo di + \textit{multicast} per una specifica sorgente.} + \label{fig:ip_mreq_source_struct} +\end{figure} + +L'argomento \param{optval} in questo caso è una struttura +\struct{ip\_mreq\_source} illustrata in fig.~\ref{fig:ip_mreq_source_struct}, +dove il campo \var{imr\_multiaddr} è l'indirizzo del gruppo di +\textit{multicast}, il campo \var{imr\_interface} l'indirizzo dell'interfaccia +locale che deve essere usata per aggiungersi al gruppo di \textit{multicast} e +il campo \var{imr\_sourceaddr} l'indirizzo della sorgente da cui +l'applicazione vuole ricevere i dati. L'opzione può essere ripetuta più volte +per collegarsi a diverse sorgenti. + +\item[\constd{IP\_BLOCK\_SOURCE}] Questa opzione, disponibile dal kernel + 2.4.22, consente di smettere di ricevere dati di \textit{multicast} dalla + sorgente (e relativo gruppo) specificati dalla struttura + \struct{ip\_mreq\_source} (vedi fig.~\ref{fig:ip_mreq_source_struct}) + passata come argomento \param{optval}. L'opzione è utilizzabile solo se si è + già registrati nel gruppo di \textit{multicast} indicato con un precedente + utilizzo di \const{IP\_ADD\_MEMBERSHIP} o + \const{IP\_ADD\_SOURCE\_MEMBERSHIP}. + +\item[\constd{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di \textit{multicast}, + prende per \param{optval} la stessa struttura \struct{ip\_mreqn} (o + \struct{ip\_mreq}) usata per \const{IP\_ADD\_MEMBERSHIP} (vedi + fig.~\ref{fig:ip_mreqn_struct}). + +\item[\constd{IP\_DROP\_SOURCE\_MEMBERSHIP}] Lascia un gruppo di + \textit{multicast} per una specifica sorgente, prende per \param{optval} la + stessa struttura \struct{ip\_mreq\_source} usata per + \const{IP\_ADD\_SOURCE\_MEMBERSHIP} (vedi + fig.~\ref{fig:ip_mreq_source_struct}). Se ci si è registrati per più + sorgenti nello stesso gruppo, si continuerà a ricevere dati sulle altre. Per + smettere di ricevere dati da tutte le sorgenti occorre usare l'opzione + \const{IP\_LEAVE\_GROUP}. + +\item[\constd{IP\_FREEBIND}] Se abilitata questa opzione, disponibile dal + kernel 2.4, consente di usare \func{bind} anche su un indirizzo IP non + locale o che ancora non è stato assegnato. Questo permette ad una + applicazione di mettersi in ascolto su un socket prima che l'interfaccia + sottostante o l'indirizzo che questa deve usare sia stato configurato. È + l'equivalente a livello di singolo socket dell'uso della \textit{sysctl} + \texttt{ip\_nonlocal\_bind} che vedremo in + sez.~\ref{sec:sock_ipv4_sysctl}. Prende per + \param{optval} un intero usato come valore logico. + +\item[\constd{IP\_HDRINCL}] Se viene abilitata questa opzione, presente dal + kernel 2.0, l'utente deve fornire lui stesso l'intestazione del protocollo + IP in testa ai propri dati. L'opzione è valida soltanto per socket di tipo + \const{SOCK\_RAW}, e quando utilizzata eventuali valori impostati con + \const{IP\_OPTIONS}, \const{IP\_TOS} o \const{IP\_TTL} sono ignorati. In + ogni caso prima della spedizione alcuni campi dell'intestazione vengono + comunque modificati dal kernel, torneremo sull'argomento in + sez.~\ref{sec:socket_raw}. Prende per \param{optval} un intero usato come + valore logico. + +\item[\constd{IP\_MSFILTER}] L'opzione, introdotta con il kernel 2.4.22, + fornisce accesso completo all'interfaccia per il filtraggio delle sorgenti + di \textit{multicast} (il cosiddetto \textit{multicast source filtering}, + definito dall'\href{http://www.ietf.org/rfc/rfc3376.txt}{RFC~3376}). + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{0.90\textwidth} + \includestruct{listati/ip_msfilter.h} + \end{minipage} + \caption{La struttura \structd{ip\_msfilter} utilizzata per il + \textit{multicast source filtering}.} + \label{fig:ip_msfilter_struct} +\end{figure} + +L'argomento \param{optval} deve essere una struttura di tipo +\struct{ip\_msfilter} (illustrata in fig.~\ref{fig:ip_msfilter_struct}); il +campo \var{imsf\_multiaddr} indica l'indirizzo del gruppo di +\textit{multicast}, il campo \var{imsf\_interface} l'indirizzo +dell'interfaccia locale, il campo \var{imsf\_mode} indica la modalità di +filtraggio e con i campi \var{imsf\_numsrc} e \var{imsf\_slist} +rispettivamente la lunghezza della lista, e la lista stessa, degli indirizzi +sorgente. + +Come ausilio all'uso di questa opzione sono disponibili le macro +\macro{MCAST\_INCLUDE} e \macro{MCAST\_EXCLUDE} che si possono usare per +\var{imsf\_mode}. Inoltre si può usare la macro +\macro{IP\_MSFILTER\_SIZE}\texttt{(\textsf{n})} per determinare il valore +di \param{optlen} con una struttura \struct{ip\_msfilter} contenente +\texttt{\textsf{n}} sorgenti in \var{imsf\_slist}. + +\item[\constd{IP\_MINTTL}] L'opzione, introdotta con il kernel 2.6.34, imposta + un valore minimo per il campo \textit{Time to Live} dei pacchetti associati + al socket su cui è attivata, che se non rispettato ne causa lo scarto + automatico. L'opzione è nata per implementare + l'\href{http://www.ietf.org/rfc/rfc5082.txt}{RFC~5082} che la prevede come + forma di protezione per i router che usano il protocollo BGP poiché questi, + essendo in genere adiacenti, possono, impostando un valore di 255, scartare + automaticamente tutti gli eventuali pacchetti falsi creati da un attacco a + questo protocollo, senza doversi curare di verificarne la + validità.\footnote{l'attacco viene in genere portato per causare un + \textit{Denial of Service} aumentando il consumo di CPU del router nella + verifica dell'autenticità di un gran numero di pacchetti falsi; questi, + arrivando da sorgenti diverse da un router adiacente, non potrebbero più + avere un TTL di 255 anche qualora questo fosse stato il valore di + partenza, e l'impostazione dell'opzione consente di scartarli senza carico + aggiuntivo sulla CPU (che altrimenti dovrebbe calcolare una checksum).} + +\itindbeg{Path~MTU} +\item[\constd{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU} + del socket. L'opzione richiede per \param{optval} un intero che conterrà il + valore della \textit{Path MTU} in byte. Questa è una opzione introdotta con + i kernel della serie 2.2.x, ed è specifica di Linux. + + È tramite questa opzione che un programma può leggere, quando si è avuto un + errore di \errval{EMSGSIZE}, il valore della MTU corrente del socket. Si + tenga presente che per poter usare questa opzione, oltre ad avere abilitato + la scoperta della \textit{Path MTU}, occorre che il socket sia stato + esplicitamente connesso con \func{connect}. + + Ad esempio con i socket UDP si può 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. + +\item[\constd{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel + della serie 2.2.x, ed è specifica di Linux. L'opzione permette di scrivere + o leggere le impostazioni della modalità usata per la determinazione della + \textit{Path MTU} (vedi sez.~\ref{sec:net_lim_dim}) del + socket. L'opzione prende per \param{optval} un valore intero che indica la + modalità usata, da specificare con una delle costanti riportate in + tab.~\ref{tab:sock_ip_mtu_discover}. + + \begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|r|p{7cm}|} + \hline + \multicolumn{2}{|c|}{\textbf{Valore}}&\textbf{Significato} \\ + \hline + \hline + \constd{IP\_PMTUDISC\_DONT}&0& Non effettua la ricerca dalla \textit{Path + MTU}.\\ + \constd{IP\_PMTUDISC\_WANT}&1& Utilizza il valore impostato per la rotta + utilizzata dai pacchetti (dal comando + \texttt{route}).\\ + \constd{IP\_PMTUDISC\_DO} &2& Esegue la procedura di determinazione + della \textit{Path MTU} come richiesto + dall'\href{http://www.ietf.org/rfc/rfc1191.txt}{RFC~1191}.\\ + \constd{IP\_PMTUDISC\_PROBE}&?& .\\ + \hline + \end{tabular} + \caption{Valori possibili per l'argomento \param{optval} di + \const{IP\_MTU\_DISCOVER}.} + \label{tab:sock_ip_mtu_discover} + \end{table} + + Il valore di default applicato ai socket di tipo \const{SOCK\_STREAM} è + determinato dal parametro \texttt{ip\_no\_pmtu\_disc} (vedi + sez.~\ref{sec:sock_sysctl}), mentre per tutti gli altri socket di default la + ricerca è disabilitata ed è responsabilità del programma creare pacchetti di + dimensioni appropriate e ritrasmettere eventuali pacchetti persi. Se + l'opzione viene abilitata, il kernel si incaricherà di tenere traccia + automaticamente della \textit{Path MTU} verso ciascuna destinazione, e + rifiuterà immediatamente la trasmissione di pacchetti di dimensioni maggiori + della MTU con un errore di \errval{EMSGSIZE}.\footnote{in caso contrario la + trasmissione del pacchetto sarebbe effettuata, ottenendo o un fallimento + successivo della trasmissione, o la frammentazione dello stesso.} +\itindend{Path~MTU} +\item[\constd{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per l'utilizzo + del \textit{multicast}, ed utilizza come \param{optval} le stesse strutture + \struct{ip\_mreqn} o \struct{ip\_mreq} delle due precedenti opzioni. + +\item[\constd{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i dati + che si inviano su un socket usato con il \textit{multicast} vengano ricevuti + anche sulla stessa macchina da cui li si stanno inviando. Prende per + \param{optval} un intero usato come valore logico. + + In generale se si vuole che eventuali client possano ricevere i dati che si + inviano occorre che questa funzionalità sia abilitata (come avviene di + default). Qualora però non si voglia generare traffico per dati che già sono + disponibili in locale l'uso di questa opzione permette di disabilitare + questo tipo di traffico. + +\item[\constd{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il + valore del campo TTL per i pacchetti \textit{multicast} in uscita associati + al socket. È importante che questo valore sia il più basso possibile, ed il + default è 1, che significa che i pacchetti non potranno uscire dalla rete + locale. Questa opzione consente ai programmi che lo richiedono di superare + questo limite. L'opzione richiede per + \param{optval} un intero che conterrà il valore del TTL. +% TODO chiarire quale è la struttura \struct{ip\_mreq} \item[\constd{IP\_OPTIONS}] l'opzione permette di impostare o leggere le opzioni del protocollo IP (si veda sez.~\ref{sec:IP_options}). L'opzione @@ -2987,7 +3421,6 @@ seguente elenco: opzione richiede una profonda conoscenza del funzionamento del protocollo, torneremo in parte sull'argomento in sez.~\ref{sec:sock_IP_options}. - \item[\constd{IP\_PKTINFO}] Quando abilitata l'opzione permette di ricevere insieme ai pacchetti un messaggio ancillare (vedi sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_PKTINFO} contenente @@ -3027,6 +3460,25 @@ sez.~\ref{sec:net_ancillary_data}); il messaggio stesso dovrà poi essere letto o scritto direttamente con \func{recvmsg} e \func{sendmsg} (vedi sez.~\ref{sec:net_sendmsg}). +\item[\constd{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della + serie 2.2.x, ed è specifica di Linux. Essa permette di usufruire di un + meccanismo affidabile per ottenere un maggior numero di informazioni in caso + di errori. Se l'opzione è abilitata tutti gli errori generati su un socket + vengono memorizzati su una coda, dalla quale poi possono essere letti con + \func{recvmsg} (vedi sez.~\ref{sec:net_sendmsg}) come messaggi ancillari + (torneremo su questo in sez.~\ref{sec:net_ancillary_data}) di tipo + \const{IP\_RECVERR}. L'opzione richiede per \param{optval} un intero usato + come valore logico e non è applicabile a socket di tipo + \const{SOCK\_STREAM}. + +\item[\constd{IP\_RECVOPTS}] Quando abilitata l'opzione permette di ricevere + insieme ai pacchetti un messaggio ancillare (vedi + sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_OPTIONS}, contenente + le opzioni IP del protocollo (vedi sez.~\ref{sec:IP_options}). Le + intestazioni di instradamento e le altre opzioni sono già riempite con i + dati locali. L'opzione richiede per \param{optval} un intero usato come + valore logico. L'opzione non è supportata per socket di tipo + \const{SOCK\_STREAM}. \item[\constd{IP\_RECVTOS}] Quando abilitata l'opzione permette di ricevere insieme ai pacchetti un messaggio ancillare (vedi @@ -3043,28 +3495,26 @@ sez.~\ref{sec:net_sendmsg}). intero usato come valore logico. L'opzione non è supportata per socket di tipo \const{SOCK\_STREAM}. -\item[\constd{IP\_RECVOPTS}] Quando abilitata l'opzione permette di ricevere - insieme ai pacchetti un messaggio ancillare (vedi - sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_OPTIONS}, contenente - le opzioni IP del protocollo (vedi sez.~\ref{sec:IP_options}). Le - intestazioni di instradamento e le altre opzioni sono già riempite con i - dati locali. L'opzione richiede per \param{optval} un intero usato come - valore logico. L'opzione non è supportata per socket di tipo - \const{SOCK\_STREAM}. - \item[\constd{IP\_RETOPTS}] Identica alla precedente \const{IP\_RECVOPTS}, ma in questo caso restituisce i dati grezzi delle opzioni, senza che siano riempiti i capi di instradamento e le marche temporali. L'opzione richiede per \param{optval} un intero usato come valore logico. L'opzione non è supportata per socket di tipo \const{SOCK\_STREAM}. +\item[\constd{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i + kernel della serie 2.2.x, ed è specifica di Linux. Prende per + \param{optval} un intero usato come valore logico. Se abilitata + passa tutti i pacchetti con l'opzione \textit{IP Router Alert} (vedi + sez.~\ref{sec:IP_options}) che devono essere inoltrati al socket + corrente. Può essere usata soltanto per socket di tipo raw. + \item[\constd{IP\_TOS}] L'opzione consente di leggere o impostare il campo \textit{Type of Service} dell'intestazione IP (per una trattazione più dettagliata, che riporta anche i valori possibili e le relative costanti di definizione si veda sez.~\ref{sec:IP_header}) che permette di indicare le priorità dei pacchetti. Se impostato il valore verrà mantenuto per tutti i pacchetti del socket; alcuni valori (quelli che aumentano la priorità) - richiedono i privilegi di amministrazione con la capability + richiedono i privilegi di amministrazione con la \textit{capability} \const{CAP\_NET\_ADMIN}. Il campo TOS è di 8 bit e l'opzione richiede per \param{optval} un intero @@ -3084,173 +3534,6 @@ sez.~\ref{sec:net_sendmsg}). estesa si veda sez.~\ref{sec:IP_header}). Il campo TTL è di 8 bit e l'opzione richiede che \param{optval} sia un intero, che ne conterrà il valore. - -\item[\constd{IP\_MINTTL}] L'opzione, introdotta con il kernel 2.6.34, imposta - un valore minimo per il campo \textit{Time to Live} dei pacchetti associati - al socket su cui è attivata, che se non rispettato ne causa lo scarto - automatico. L'opzione è nata per implementare - l'\href{http://www.ietf.org/rfc/rfc5082.txt}{RFC~5082} che la prevede come - forma di protezione per i router che usano il protocollo BGP poiché questi, - essendo in genere adiacenti, possono, impostando un valore di 255, scartare - automaticamente tutti gli eventuali pacchetti falsi creati da un attacco a - questo protocollo, senza doversi curare di verificarne la - validità.\footnote{l'attacco viene in genere portato per causare un - \textit{Denial of Service} aumentando il consumo di CPU del router nella - verifica dell'autenticità di un gran numero di pacchetti di pacchetti - falsi; questi, arrivando da sorgenti diverse da un router adiacente, non - potrebbero più avere un TTL di 255 anche qualora questo fosse stato il - valore di partenza, e l'impostazione dell'opzione consente di scartarli - senza carico aggiuntivo sulla CPU (che altrimenti dovrebbe calcolare una - checksum).} - -\item[\constd{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso - l'intestazione IP in cima ai propri dati. L'opzione è valida soltanto per - socket di tipo \const{SOCK\_RAW}, e quando utilizzata eventuali valori - impostati con \const{IP\_OPTIONS}, \const{IP\_TOS} o \const{IP\_TTL} sono - ignorati. In ogni caso prima della spedizione alcuni campi - dell'intestazione vengono comunque modificati dal kernel, torneremo - sull'argomento in sez.~\ref{sec:socket_raw} - -\item[\constd{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della - serie 2.2.x, ed è specifica di Linux. Essa permette di usufruire di un - meccanismo affidabile per ottenere un maggior numero di informazioni in caso - di errori. Se l'opzione è abilitata tutti gli errori generati su un socket - vengono memorizzati su una coda, dalla quale poi possono essere letti con - \func{recvmsg} (vedi sez.~\ref{sec:net_sendmsg}) come messaggi ancillari - (torneremo su questo in sez.~\ref{sec:net_ancillary_data}) di tipo - \const{IP\_RECVERR}. L'opzione richiede per \param{optval} un intero usato - come valore logico e non è applicabile a socket di tipo - \const{SOCK\_STREAM}. - -\itindbeg{Path~MTU} -\item[\constd{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel - della serie 2.2.x, ed è specifica di Linux. L'opzione permette di scrivere - o leggere le impostazioni della modalità usata per la determinazione della - \textit{Path MTU} (vedi sez.~\ref{sec:net_lim_dim}) del - socket. L'opzione prende per \param{optval} un valore intero che indica la - modalità usata, da specificare con una delle costanti riportate in - tab.~\ref{tab:sock_ip_mtu_discover}. - - \begin{table}[!htb] - \centering - \footnotesize - \begin{tabular}[c]{|l|r|p{7cm}|} - \hline - \multicolumn{2}{|c|}{\textbf{Valore}}&\textbf{Significato} \\ - \hline - \hline - \constd{IP\_PMTUDISC\_DONT}&0& Non effettua la ricerca dalla \textit{Path - MTU}.\\ - \constd{IP\_PMTUDISC\_WANT}&1& Utilizza il valore impostato per la rotta - utilizzata dai pacchetti (dal comando - \texttt{route}).\\ - \constd{IP\_PMTUDISC\_DO} &2& Esegue la procedura di determinazione - della \textit{Path MTU} come richiesto - dall'\href{http://www.ietf.org/rfc/rfc1191.txt}{RFC~1191}.\\ - \hline - \end{tabular} - \caption{Valori possibili per l'argomento \param{optval} di - \const{IP\_MTU\_DISCOVER}.} - \label{tab:sock_ip_mtu_discover} - \end{table} - - Il valore di default applicato ai socket di tipo \const{SOCK\_STREAM} è - determinato dal parametro \texttt{ip\_no\_pmtu\_disc} (vedi - sez.~\ref{sec:sock_sysctl}), mentre per tutti gli altri socket di default la - ricerca è disabilitata ed è responsabilità del programma creare pacchetti di - dimensioni appropriate e ritrasmettere eventuali pacchetti persi. Se - l'opzione viene abilitata, il kernel si incaricherà di tenere traccia - automaticamente della \textit{Path MTU} verso ciascuna destinazione, e - rifiuterà immediatamente la trasmissione di pacchetti di dimensioni maggiori - della MTU con un errore di \errval{EMSGSIZE}.\footnote{in caso contrario la - trasmissione del pacchetto sarebbe effettuata, ottenendo o un fallimento - successivo della trasmissione, o la frammentazione dello stesso.} - -\item[\constd{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU} - di percorso del socket. L'opzione richiede per \param{optval} un intero che - conterrà il valore della \textit{Path MTU} in byte. Questa è una opzione - introdotta con i kernel della serie 2.2.x, ed è specifica di Linux. - - È tramite questa opzione che un programma può leggere, quando si è avuto un - errore di \errval{EMSGSIZE}, il valore della MTU corrente del socket. Si - tenga presente che per poter usare questa opzione, oltre ad avere abilitato - la scoperta della \textit{Path MTU}, occorre che il socket sia stato - 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. - -\itindend{Path~MTU} - -\item[\constd{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i - kernel della serie 2.2.x, ed è specifica di Linux. Prende per - \param{optval} un intero usato come valore logico. Se abilitata - passa tutti i pacchetti con l'opzione \textit{IP Router Alert} (vedi - sez.~\ref{sec:IP_options}) che devono essere inoltrati al socket - corrente. Può essere usata soltanto per socket di tipo raw. - -\item[\constd{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il - valore del campo TTL per i pacchetti \textit{multicast} in uscita associati - al socket. È importante che questo valore sia il più basso possibile, ed il - default è 1, che significa che i pacchetti non potranno uscire dalla rete - locale. Questa opzione consente ai programmi che lo richiedono di superare - questo limite. L'opzione richiede per - \param{optval} un intero che conterrà il valore del TTL. - -\item[\constd{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i dati - che si inviano su un socket usato con il \textit{multicast} vengano ricevuti - anche sulla stessa macchina da cui li si stanno inviando. Prende per - \param{optval} un intero usato come valore logico. - - In generale se si vuole che eventuali client possano ricevere i dati che si - inviano occorre che questa funzionalità sia abilitata (come avviene di - default). Qualora però non si voglia generare traffico per dati che già sono - disponibili in locale l'uso di questa opzione permette di disabilitare - questo tipo di traffico. - -\item[\constd{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di - \textit{multicast}, e può essere usata solo con \func{setsockopt}. - L'argomento \param{optval} in questo caso deve essere una struttura di tipo - \struct{ip\_mreqn}, illustrata in fig.~\ref{fig:ip_mreqn_struct}, che - permette di indicare, con il campo \var{imr\_multiaddr} l'indirizzo del - gruppo di \textit{multicast} a cui ci si vuole unire, con il campo - \var{imr\_address} l'indirizzo dell'interfaccia locale con cui unirsi al - gruppo di \textit{multicast} e con \var{imr\_ifindex} l'indice - dell'interfaccia da utilizzare (un valore nullo indica una interfaccia - qualunque). - - Per compatibilità è possibile utilizzare anche un argomento di tipo - \struct{ip\_mreq}, una precedente versione di \struct{ip\_mreqn}, che - differisce da essa soltanto per l'assenza del campo \var{imr\_ifindex}. - -\begin{figure}[!htb] - \footnotesize \centering - \begin{minipage}[c]{0.80\textwidth} - \includestruct{listati/ip_mreqn.h} - \end{minipage} - \caption{La struttura \structd{ip\_mreqn} utilizzata dalle opzioni dei - socket per le operazioni concernenti l'appartenenza ai gruppi di - \textit{multicast}.} - \label{fig:ip_mreqn_struct} -\end{figure} - -\item[\constd{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di \textit{multicast}, - prende per \param{optval} la stessa struttura \struct{ip\_mreqn} (o - \struct{ip\_mreq}) usata anche per \const{IP\_ADD\_MEMBERSHIP}. - -\item[\constd{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per l'utilizzo - del \textit{multicast}, ed utilizza come \param{optval} le stesse strutture - \struct{ip\_mreqn} o \struct{ip\_mreq} delle due precedenti opzioni. - -% TODO chiarire quale è la struttura \struct{ip\_mreq} - - \end{basedescript} @@ -3521,7 +3804,7 @@ quantità di dettagli è fornita nel seguente elenco: \item[\constd{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. + interno di un socket TCP direttamente da un programma in \textit{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 @@ -3583,7 +3866,7 @@ quantità di dettagli è fornita nel seguente elenco: 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 + definita nelle intestazioni della \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. @@ -3745,15 +4028,15 @@ seguenti: Trip Time} cui abbiamo già accennato in sez.~\ref{sec:net_tcp}.} dei pacchetti sulla rete. -\item[\constd{SIOCSPGRP}] imposta il processo o il \textit{process group} a cui - inviare i segnali \signal{SIGIO} e \signal{SIGURG} quando viene completata - una operazione di I/O asincrono o arrivano dei dati urgenti +\item[\constd{SIOCSPGRP}] imposta il processo o il \textit{process group} a + cui inviare i segnali \signal{SIGIO} e \signal{SIGURG} quando viene + completata una operazione di I/O asincrono o arrivano dei dati urgenti (\texttt{out-of-band}). Il terzo argomento deve essere un puntatore ad una variabile di tipo \type{pid\_t}; un valore positivo indica direttamente il \ids{PID} del processo, mentre un valore negativo indica (col valore assoluto) il \textit{process group}. Senza privilegi di amministratore o la - capability \const{CAP\_KILL} si può impostare solo se stessi o il proprio - \textit{process group}. + \textit{capability} \const{CAP\_KILL} si può impostare solo se stessi o il + proprio \textit{process group}. \item[\constd{SIOCGPGRP}] legge le impostazioni presenti sul socket relativamente all'eventuale processo o \textit{process group} cui devono @@ -4221,20 +4504,18 @@ socket. Quelli descritti anche nella pagina di manuale, accessibile con Il \textit{bucket filter} è un algoritmo generico che permette di impostare dei limiti di flusso su una quantità\footnote{uno analogo viene usato per - imporre dei limiti sul flusso dei pacchetti nel \itindex{netfilter} - \textit{netfilter} di Linux (il \textit{netfilter} è l'infrastruttura - usata per il filtraggio dei pacchetti del kernel, per maggiori dettagli si - consulti il cap.~2 di \cite{FwGL}).} senza dovere eseguire medie - temporali, che verrebbero a dipendere in misura non controllabile dalla - dimensione dell'intervallo su cui si media e dalla distribuzione degli - eventi;\footnote{in caso di un picco di flusso (il cosiddetto - \textit{burst}) il flusso medio verrebbe a dipendere in maniera esclusiva - dalla dimensione dell'intervallo di tempo su cui calcola la media.} in - questo caso si definisce la dimensione di un ``\textsl{bidone}'' (il - \textit{bucket}) e del flusso che da esso può uscire, la presenza di una - dimensione iniziale consente di assorbire eventuali picchi di emissione, - l'aver fissato un flusso di uscita garantisce che a regime questo sarà il - valore medio del flusso ottenibile dal \textit{bucket}. + imporre dei limiti sul flusso dei pacchetti nel \textit{netfilter} di + Linux.} senza dovere eseguire medie temporali, che verrebbero a dipendere + in misura non controllabile dalla dimensione dell'intervallo su cui si media + e dalla distribuzione degli eventi;\footnote{in caso di un picco di flusso + (il cosiddetto \textit{burst}) il flusso medio verrebbe a dipendere in + maniera esclusiva dalla dimensione dell'intervallo di tempo su cui calcola + la media.} in questo caso si definisce la dimensione di un + ``\textsl{bidone}'' (il \textit{bucket}) e del flusso che da esso può + uscire, la presenza di una dimensione iniziale consente di assorbire + eventuali picchi di emissione, l'aver fissato un flusso di uscita garantisce + che a regime questo sarà il valore medio del flusso ottenibile dal + \textit{bucket}. \itindend{bucket~filter} @@ -4251,10 +4532,11 @@ socket. Quelli descritti anche nella pagina di manuale, accessibile con 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 -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: +Oltre a questi, nella directory \texttt{/proc/sys/net/core} si trovano diversi +altri file, la cui documentazione, come per gli altri, 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{2.2cm}\desclabelstyle{\nextlinelabel}} \item[\sysctlrelfiled{net/core}{dev\_weight}] blocco di lavoro (\textit{work quantum}) dello \textit{scheduler} di processo dei pacchetti. @@ -4360,7 +4642,7 @@ di manuale accessibile con \texttt{man 7 ip}, sono i seguenti: disabilitare globalmente il procedimento con questo parametro ha pesanti ripercussioni in termini di prestazioni di rete. -\item[\sysctlrelfiled{net/ipv4}{ip\_always\_defrag}] fa si che tutti i +\item[\sysctlrelfiled{net/ipv4}{ip\_always\_defrag}] fa sì che tutti i pacchetti IP frammentati siano riassemblati, anche in caso in successivo immediato inoltro.\footnote{introdotto con il kernel 2.2.13, nelle versioni precedenti questo comportamento poteva essere solo stabilito un volta per @@ -4372,18 +4654,20 @@ di manuale accessibile con \texttt{man 7 ip}, sono i seguenti: \item[\sysctlrelfiled{net/ipv4}{ipfrag\_high\_thresh}] indica il limite massimo (espresso in numero di byte) sui pacchetti IP frammentati presenti - in coda; quando questo valore viene raggiunta la coda viene ripulita fino al + in coda; quando questo valore viene raggiunto la coda viene ripulita fino al valore \texttt{ipfrag\_low\_thresh}. Prende un valore intero. -\item[\sysctlrelfiled{net/ipv4}{ipfrag\_low\_thresh}] soglia bassa - (specificata in byte) a cui viene riportata la coda dei pacchetti IP - frammentati quando si raggiunge il valore massimo dato da +\item[\sysctlrelfiled{net/ipv4}{ipfrag\_low\_thresh}] indica la dimensione + (specificata in byte) della soglia inferiore a cui viene riportata la coda + dei pacchetti IP frammentati quando si raggiunge il valore massimo dato da \texttt{ipfrag\_high\_thresh}. Prende un valore intero. \item[\sysctlrelfiled{net/ipv4}{ip\_nonlocal\_bind}] se abilitato rende possibile ad una applicazione eseguire \func{bind} anche su un indirizzo che non è presente su nessuna interfaccia locale. Prende un valore logico e di - default è disabilitato. + default è disabilitato. La funzionalità può essere abilitata a livello di + singolo socket con l'opzione \const{IP\_FREEBIND} illustrata in + sez.~\ref{sec:sock_ipv4_options}. Questo può risultare utile per applicazioni particolari (come gli \textit{sniffer}) che hanno la necessità di ricevere pacchetti anche non @@ -4425,7 +4709,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: \item[\sysctlrelfiled{net/ipv4}{tcp\_app\_win}] indica la frazione della finestra TCP che viene riservata per gestire l'overhaed dovuto alla - bufferizzazione. Prende un valore valore intero che consente di calcolare la + bufferizzazione. Prende un valore intero che consente di calcolare la dimensione in byte come il massimo fra la MSS e $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che non viene riservato nessuno spazio; il valore di default è 31. @@ -4451,8 +4735,8 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: \item[\sysctlrelfiled{net/ipv4}{tcp\_ecn}] abilita il meccanismo della \textit{Explicit Congestion Notification} (in breve ECN) nelle connessioni TCP. Prende valore logico che di default è disabilitato. La \textit{Explicit - Congestion Notification} \itindex{Explicit~Congestion~Notification} è un - meccanismo che consente di notificare quando una rotta o una rete è + Congestion Notification} \itindex{Explicit~Congestion~Notification~(ECN)} + è un meccanismo che consente di notificare quando una rotta o una rete è congestionata da un eccesso di traffico,\footnote{il meccanismo è descritto in dettaglio nell'\href{http://www.ietf.org/rfc/rfc3168.txt}{RFC~3168} mentre gli effetti sulle prestazioni del suo utilizzo sono documentate @@ -4504,13 +4788,12 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: risposta prima che il kernel decida che la connessione è caduta e la termini. Prende un valore intero che di default è 9. -\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_time}] indica il numero - di secondi che devono passare senza traffico sulla connessione prima che il - kernel inizi ad inviare pacchetti di pacchetti di - \textit{keepalive}.\footnote{ha effetto solo per i socket per cui si è - impostata l'opzione \const{SO\_KEEPALIVE} (vedi - sez.~\ref{sec:sock_options_main}.} Prende un valore intero che di default - è 7200, pari a due ore. +\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_time}] indica il numero di + secondi che devono passare senza traffico sulla connessione prima che il + kernel inizi ad inviare pacchetti di \textit{keepalive}.\footnote{ha effetto + solo per i socket per cui si è impostata l'opzione \const{SO\_KEEPALIVE} + (vedi sez.~\ref{sec:sock_options_main}.} Prende un valore intero che di + default è 7200, pari a due ore. \item[\sysctlrelfiled{net/ipv4}{tcp\_low\_latency}] indica allo stack TCP del kernel di ottimizzare il comportamento per ottenere tempi di latenza @@ -4708,11 +4991,12 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: \item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_recycle}] abilita il riutilizzo rapido dei socket in stato \texttt{TIME\_WAIT}. Prende un valore logico e di default è disabilitato. Non è opportuno abilitare questa opzione che può - causare problemi con il NAT.\footnote{il - \itindex{Network~Address~Translation} \textit{Network Address Translation} - è una tecnica, impiegata nei firewall e nei router, che consente di - modificare al volo gli indirizzi dei pacchetti che transitano per una - macchina, Linux la supporta con il \textit{netfilter}.} + causare problemi con il NAT.\footnote{la + \itindex{Network~Address~Translation~(NAT)} \textit{Network Address + Translation} (abbreviato in NAT) è una tecnica, impiegata nei firewall e + nei router, che consente di modificare al volo gli indirizzi dei pacchetti + che transitano per una macchina, Linux la supporta con il + \textit{netfilter}.} \item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_reuse}] abilita il riutilizzo dello stato \texttt{TIME\_WAIT} quando questo è sicuro dal punto di vista @@ -4755,9 +5039,9 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: \item il secondo valore, denominato \textit{default}, indica la dimensione di default in byte del buffer di spedizione di un socket TCP. Questo valore sovrascrive il default iniziale impostato per tutti i tipi di - socket con \sysctlfile{net/core/wmem\_default}. Il default è 87380 byte, - ridotto a 43689 per sistemi con poca memoria. Si può aumentare questo - valore quando si desiderano dimensioni più ampie del buffer di + socket sul file \sysctlfile{net/core/wmem\_default}. Il default è 87380 + byte, ridotto a 43689 per sistemi con poca memoria. Si può aumentare + questo valore quando si desiderano dimensioni più ampie del buffer di trasmissione per i socket TCP, ma come per il precedente \sysctlrelfile{net/ipv4}{tcp\_rmem}) se si vuole che in corrispondenza aumentino anche le dimensioni usate per la finestra TCP si deve abilitare