%% sockctrl.tex
%%
-%% Copyright (C) 2004-2012 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2004-2014 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",
predefinito e non modificabile (a meno di una ricompilazione delle librerie
stesse).}
-\itindbeg{Name~Service~Switch}
+\itindbeg{Name~Service~Switch~(NSS)}
Per risolvere questa serie di problemi la risoluzione dei nomi a dominio
eseguirà dal \textit{resolver} è stata inclusa all'interno di un meccanismo
generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi
disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
quelle che tratteremo nelle sezioni successive.
-\itindend{Name~Service~Switch}
+\itindend{Name~Service~Switch~(NSS)}
\subsection{Le funzioni di interrogazione del \textit{resolver}}
\noindent e come si può vedere la funzione è estremamente semplice, non
richiedendo nessun argomento.
+% TODO manca gethostent (e gethostent_r) e altro ? (vedi man page)
Infine si può richiedere la risoluzione inversa di un indirizzo IP od IPv6,
per ottenerne il nome a dominio ad esso associato, per fare questo si può
generale infatti ci sono una serie di funzioni nella forma
\texttt{getXXXbyname} e \texttt{getXXXbyaddr} (dove \texttt{XXX} indica il
servizio) per ciascuna delle informazioni di rete mantenute dal
-\itindex{Name~Service~Switch} \textit{Name Service Switch} che permettono
+\itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} che permettono
rispettivamente di trovare una corrispondenza cercando per nome o per numero.
L'elenco di queste funzioni è riportato nelle colonne finali di
al tipo di informazione che forniscono (riportato in prima colonna). Nella
tabella si è anche riportato il file su cui vengono ordinariamente mantenute
queste informazioni, che però può essere sostituito da un qualunque supporto
-interno al \itindex{Name~Service~Switch} \textit{Name Service Switch} (anche
-se usualmente questo avviene solo per la risoluzione degli indirizzi).
+interno al \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch}
+(anche se usualmente questo avviene solo per la risoluzione degli indirizzi).
Ciascuna funzione fa riferimento ad una sua apposita struttura che contiene i
relativi dati, riportata in terza colonna.
indirizzo &\conffile{/etc/hosts}&\struct{hostent}&\func{gethostbyname}&
\func{gethostbyaddr}\\
servizio &\conffile{/etc/services}&\struct{servent}&\func{getservbyname}&
- \func{getservbyaddr}\\
- rete &\conffile{/etc/networks}&\struct{netent}&\func{getnetbyname}&
- \func{getnetbyaddr}\\
+ \func{getservbyport}\\
+ rete &\conffile{/etc/networks}&\struct{netent}&\funcm{getnetbyname}&
+ \funcm{getnetbyaddr}\\
protocollo&\conffile{/etc/protocols}&\struct{protoent}&
- \func{getprotobyname}&\func{getprotobyaddr}\\
+ \funcm{getprotobyname}&\funcm{getprotobyaddr}\\
\hline
\end{tabular}
\caption{Funzioni di risoluzione dei nomi per i vari servizi del
- \itindex{Name~Service~Switch} \textit{Name Service Switch}.}
+ \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch}.}
\label{tab:name_resolution_functions}
\end{table}
finora soltanto quelle relative alla risoluzione dei nomi, dato che sono le
più usate, e prevedono praticamente da sempre la necessità di rivolgersi ad
una entità esterna; per le altre invece, estensioni fornite dal
-\itindex{Name~Service~Switch} NSS a parte, si fa sempre riferimento ai dati
-mantenuti nei rispettivi file.
+\itindex{Name~Service~Switch~(NSS)} NSS a parte, si fa sempre riferimento ai
+dati mantenuti nei rispettivi file.
Dopo la risoluzione dei nomi a dominio una delle ricerche più comuni è quella
sui nomi dei servizi di rete più comuni (cioè \texttt{http}, \texttt{smtp},
ecc.) da associare alle rispettive porte. Le due funzioni da utilizzare per
-questo sono \funcd{getservbyname} e \funcd{getservbyaddr}, che permettono
+questo sono \funcd{getservbyname} e \funcd{getservbyport}, che permettono
rispettivamente di ottenere il numero di porta associato ad un servizio dato
il nome e viceversa; i loro prototipi sono:
\begin{functions}
specificato tramite la stringa \param{name}, mentre \func{getservbyport}
richiede il numero di porta in \param{port}. Entrambe le funzioni eseguono una
ricerca sul file \conffile{/etc/services}\footnote{il
- \itindex{Name~Service~Switch} \textit{Name Service Switch} astrae il
+ \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} astrae il
concetto a qualunque supporto su cui si possano mantenere i suddetti dati.}
ed estraggono i dati dalla prima riga che corrisponde agli argomenti
specificati; se la risoluzione ha successo viene restituito un puntatore ad
Oltre alle funzioni di ricerca esistono delle ulteriori funzioni che prevedono
una lettura sequenziale delle informazioni mantenute nel
-\itindex{Name~Service~Switch} \textit{Name Service Switch} (in sostanza
+\itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} (in sostanza
permettono di leggere i file contenenti le informazioni riga per riga), che
sono analoghe a quelle elencate in tab.~\ref{tab:sys_passwd_func} per le
informazioni relative ai dati degli utenti e dei gruppi. Nel caso specifico
aperto riporta la posizione di lettura alla prima voce del file, in questo
modo si può far ricominciare da capo una lettura sequenziale. L'argomento
\param{stayopen}, se diverso da zero, fa sì che il file resti aperto anche fra
-diverse chiamate a \func{getservbyname} e \func{getservbyaddr}.\footnote{di
+diverse chiamate a \func{getservbyname} e \func{getservbyport}.\footnote{di
default dopo una chiamata a queste funzioni il file viene chiuso, cosicché
una successiva chiamata a \func{getservent} riparte dall'inizio.} La terza
funzione, \funcd{endservent}, provvede semplicemente a chiudere il file.
\hline
indirizzo &\func{sethostent} &\func{gethostent} &\func{endhostent} \\
servizio &\func{setservent} &\func{getservent} &\func{endservent}\\
- rete &\func{setnetent} &\func{getnetent} &\func{endnetent}\\
- protocollo&\func{setprotoent}&\func{getprotoent}&\func{endprotoent}\\
+ rete &\funcm{setnetent} &\funcm{getnetent} &\funcm{endnetent}\\
+ protocollo&\funcm{setprotoent}&\funcm{getprotoent}&\funcm{endprotoent}\\
\hline
\end{tabular}
\caption{Funzioni lettura sequenziale dei dati del
- \itindex{Name~Service~Switch} \textit{Name Service Switch}.}
+ \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch}.}
\label{tab:name_sequential_read}
\end{table}
Come per i codici di errore di \func{gethostbyname} anche in questo caso è
fornita una apposita funzione, analoga di \func{strerror}, che consente di
utilizzarli direttamente per stampare a video un messaggio esplicativo; la
-funzione è \func{gai\_strerror} ed il suo prototipo è:
+funzione è \funcd{gai\_strerror} ed il suo prototipo è:
\begin{functions}
\headdecl{netdb.h}
Anche la nuova interfaccia definita da POSIX prevede una nuova funzione per
eseguire la risoluzione inversa e determinare nomi di servizi e di dominio
dati i rispettivi valori numerici. La funzione che sostituisce le varie
-\func{gethostbyname}, \func{getipnodebyname} e \func{getservname} è
+\func{gethostbyname}, \func{getipnodebyname} e \func{getservbyname} è
\funcd{getnameinfo}, ed il suo prototipo è:
\begin{functions}
\headdecl{sys/socket.h}
connessione al server, e quello in cui si specifica nel server un indirizzo
locale su cui porsi in ascolto.
-La prima funzione della nostra interfaccia semplificata è \func{sockconn} che
-permette di ottenere un socket, connesso all'indirizzo ed al servizio
+La prima funzione della nostra interfaccia semplificata è \texttt{sockconn}
+che permette di ottenere un socket, connesso all'indirizzo ed al servizio
specificati. Il corpo della funzione è riportato in
fig.~\ref{fig:sockconn_code}, il codice completo è nel file \file{SockUtil.c}
dei sorgenti allegati alla guida, che contiene varie funzioni di utilità per
\includecodesample{listati/sockconn.c}
\end{minipage}
\normalsize
- \caption{Il codice della funzione \func{sockconn}.}
+ \caption{Il codice della funzione \texttt{sockconn}.}
\label{fig:sockconn_code}
\end{figure}
prima (\texttt{\small 6}) azzera il contenuto della struttura \var{hint} e poi
provvede (\texttt{\small 7--9}) ad inizializzarne i valori necessari per la
chiamata (\texttt{\small 10}) a \func{getaddrinfo}. Di quest'ultima si
-controlla (\texttt{\small 12-16}) il codice di ritorno, in modo da stampare un
+controlla (\texttt{\small 12--16}) il codice di ritorno, in modo da stampare un
avviso di errore, azzerare \var{errno} ed uscire in caso di errore. Dato che
ad una macchina possono corrispondere più indirizzi IP, e di tipo diverso (sia
IPv4 che IPv6), mentre il servizio può essere in ascolto soltanto su uno solo
di questi, si provvede a tentare la connessione per ciascun indirizzo
-restituito all'interno di un ciclo (\texttt{\small 18-40}) di scansione della
+restituito all'interno di un ciclo (\texttt{\small 18--40}) di scansione della
lista restituita da \func{getaddrinfo}, ma prima (\texttt{\small 17}) si salva
il valore del puntatore per poterlo riutilizzare alla fine per disallocare la
lista.
fallisce si controlla (\texttt{\small 20}) se sono disponibili altri
indirizzi, nel qual caso si passa al successivo (\texttt{\small 21}) e si
riprende (\texttt{\small 22}) il ciclo da capo; se non ve ne sono si stampa
-l'errore ritornando immediatamente (\texttt{\small 24-27}). Quando la
+l'errore ritornando immediatamente (\texttt{\small 24--27}). Quando la
creazione del socket ha avuto successo si procede (\texttt{\small 29})
direttamente con la connessione, di nuovo in caso di fallimento viene ripetuto
(\texttt{\small 30--38}) il controllo se vi sono o no altri indirizzi da
avremo una semplificazione per cui il corpo principale del nostro client
diventerà quello illustrato in fig.~\ref{fig:TCP_echo_fifth}, in cui le
chiamate a \func{socket}, \func{inet\_pton} e \func{connect} sono sostituite
-da una singola chiamata a \func{sockconn}. Inoltre il nuovo client (il cui
+da una singola chiamata a \texttt{sockconn}. Inoltre il nuovo client (il cui
codice completo è nel file \file{TCP\_echo\_fifth.c} dei sorgenti allegati)
consente di utilizzare come argomento del programma un nome a dominio al posto
dell'indirizzo numerico, e può utilizzare sia indirizzi IPv4 che IPv6.
\includecodesample{listati/sockbind.c}
\end{minipage}
\normalsize
- \caption{Il codice della funzione \func{sockbind}.}
+ \caption{Il codice della funzione \texttt{sockbind}.}
\label{fig:sockbind_code}
\end{figure}
-La seconda funzione di ausilio è \func{sockbind}, il cui corpo principale è
+La seconda funzione di ausilio è \texttt{sockbind}, il cui corpo principale è
riportato in fig.~\ref{fig:sockbind_code} (al solito il sorgente completo è
nel file \file{sockbind.c} dei sorgenti allegati alla guida). Come si può
-notare la funzione è del tutto analoga alla precedente \func{sockconn}, e
+notare la funzione è del tutto analoga alla precedente \texttt{sockconn}, e
prende gli stessi argomenti, però invece di eseguire una connessione con
\func{connect} si limita a chiamare \func{bind} per collegare il socket ad una
porta.
del valore \const{AI\_PASSIVE} serve ad ottenere il valore generico nella
rispettiva struttura degli indirizzi.
-Come già detto la funzione è analoga a \func{sockconn} ed inizia azzerando ed
-inizializzando (\texttt{\small 6-11}) opportunamente la struttura \var{hint}
-con i valori ricevuti come argomenti, soltanto che in questo caso si è usata
-(\texttt{\small 8}) una impostazione specifica dei flag di \var{hint} usando
-\const{AI\_PASSIVE} per indicare che il socket sarà usato per una apertura
-passiva. Per il resto la chiamata (\texttt{\small 12-18}) a \func{getaddrinfo}
-e ed il ciclo principale (\texttt{\small 20--42}) sono identici, solo che si è
-sostituita (\texttt{\small 31}) la chiamata a \func{connect} con una chiamata
-a \func{bind}. Anche la conclusione (\texttt{\small 43--44}) della funzione è
-identica.
+Come già detto la funzione è analoga a \texttt{sockconn} ed inizia azzerando
+ed inizializzando (\texttt{\small 6--11}) opportunamente la struttura
+\var{hint} con i valori ricevuti come argomenti, soltanto che in questo caso
+si è usata (\texttt{\small 8}) una impostazione specifica dei flag di
+\var{hint} usando \const{AI\_PASSIVE} per indicare che il socket sarà usato
+per una apertura passiva. Per il resto la chiamata (\texttt{\small 12--18}) a
+\func{getaddrinfo} e ed il ciclo principale (\texttt{\small 20--42}) sono
+identici, solo che si è sostituita (\texttt{\small 31}) la chiamata a
+\func{connect} con una chiamata a \func{bind}. Anche la conclusione
+(\texttt{\small 43--44}) della funzione è identica.
Si noti come anche in questo caso si siano inserite le stampe degli errori
sullo standard error, nonostante la funzione possa essere invocata da un
server \textit{echo}, che rispetto a quanto illustrato nella versione iniziale
di fig.~\ref{fig:TCP_echo_server_first_code} viene modificato nella forma
riportata in fig.~\ref{fig:TCP_echod_third}. In questo caso il socket su cui
-porsi in ascolto viene ottenuto (\texttt{\small 15--18}) da \func{sockbind}
+porsi in ascolto viene ottenuto (\texttt{\small 15--18}) da \texttt{sockbind}
che si cura anche della eventuale risoluzione di un indirizzo specifico sul
quale si voglia far ascoltare il server.
% Documentation/networking/timestamping.txt
+% TOFO documentare SO_REUSEPORT introdotta con il kernel 3.9, vedi
+% http://git.kernel.org/linus/c617f398edd4db2b8567a28e899a88f8f574798d
+
\end{basedescript}
connessione non esiste più.\footnote{si ricordi che un normale riavvio o il
crollo dell'applicazione non ha questo effetto, in quanto in tal caso si
passa sempre per la chiusura del processo, e questo, come illustrato in
- sez.~\ref{sec:file_close}, comporta anche la regolare chiusura del socket
- con l'invio di un segmento FIN all'altro capo della connessione.} In questo
-caso all'invio del messaggio di \textit{keep-alive} si otterrà come risposta
-un segmento RST che indica che l'altro capo non riconosce più l'esistenza
-della connessione ed il socket verrà chiuso riportando un errore di
-\errcode{ECONNRESET}.
+ sez.~\ref{sec:file_open_close}, comporta anche la regolare chiusura del
+ socket con l'invio di un segmento FIN all'altro capo della connessione.} In
+questo caso all'invio del messaggio di \textit{keep-alive} si otterrà come
+risposta un segmento RST che indica che l'altro capo non riconosce più
+l'esistenza della connessione ed il socket verrà chiuso riportando un errore
+di \errcode{ECONNRESET}.
Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di 75
finire fra quelli di una nuova.
Come esempio di uso di questa connessione abbiamo predisposto una nuova
-versione della funzione \func{sockbind} (vedi fig.~\ref{fig:sockbind_code})
+versione della funzione \texttt{sockbind} (vedi fig.~\ref{fig:sockbind_code})
che consenta l'impostazione di questa opzione. La nuova funzione è
-\func{sockbindopt}, e le principali differenze rispetto alla precedente sono
+\texttt{sockbindopt}, e le principali differenze rispetto alla precedente sono
illustrate in fig.~\ref{fig:sockbindopt_code}, dove si sono riportate le
sezioni di codice modificate rispetto alla versione precedente. Il codice
completo della funzione si trova, insieme alle altre funzioni di servizio dei
\includecodesample{listati/sockbindopt.c}
\end{minipage}
\normalsize
- \caption{Le sezioni della funzione \func{sockbindopt} modificate rispetto al
- codice della precedente \func{sockbind}.}
+ \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
-\func{setsockopt}. Si è poi aggiunta una sezione (\texttt{\small 13-17}) che
+\func{setsockopt}. Si è poi aggiunta una sezione (\texttt{\small 13--17}) che
esegue l'impostazione dell'opzione fra la chiamata a \func{socket} e quella a
\func{bind}.
valore di default di questa variabile è nullo, ma usando l'opzione \texttt{-r}
nell'invocazione del server (al solito la gestione delle opzioni non è
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
+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]
\end{minipage}
\normalsize
\caption{Il nuovo codice per l'apertura passiva del server \textit{echo} che
- usa la nuova funzione \func{sockbindopt}.}
+ usa la nuova funzione \texttt{sockbindopt}.}
\label{fig:TCP_echod_fifth}
\end{figure}
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
-esiste, 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 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
+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}.}
+ \const{SO\_REUSEADDR}.}
+
+% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/
+
\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|)}
\const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Abilita la gestione degli errori.\\
\const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}&
- Imposta il Path MTU \itindex{Maximum~Transfer~Unit} Discovery.\\
+ Imposta il Path MTU \itindex{Maximum~Transfer~Unit~(MTU)} Discovery.\\
\const{IP\_MTU} &$\bullet$& & &\texttt{int}&
- Legge il valore attuale della \itindex{Maximum~Transfer~Unit} MTU.\\
+ Legge il valore attuale della \itindex{Maximum~Transfer~Unit~(MTU)} 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}&
come valore logico e non è applicabile a socket di tipo
\const{SOCK\_STREAM}.
-\itindbeg{Maximum~Transfer~Unit}
+\itindbeg{Maximum~Transfer~Unit~(MTU)}
\item[\const{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
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 \itindex{Maximum~Transfer~Unit} \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.}
+ 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[\const{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU}
di percorso del socket. L'opzione richiede per \param{optval} un intero che
esplicitamente connesso con \func{connect}.
Ad esempio con i socket UDP si potrà ottenere una stima iniziale della
- \itindex{Maximum~Transfer~Unit} \textit{Path MTU} eseguendo prima una
- \func{connect} verso la destinazione, e poi usando \func{getsockopt} con
- questa opzione. Si può anche avviare esplicitamente il procedimento di
- scoperta inviando un pacchetto di grosse dimensioni (che verrà scartato) e
- ripetendo l'invio coi dati aggiornati. Si tenga infine conto che durante il
- procedimento i pacchetti iniziali possono essere perduti, ed è compito
- dell'applicazione gestirne una eventuale ritrasmissione.
+ \textit{Path MTU} eseguendo prima una \func{connect} verso la destinazione,
+ e poi usando \func{getsockopt} con questa opzione. Si può anche avviare
+ esplicitamente il procedimento di scoperta inviando un pacchetto di grosse
+ dimensioni (che verrà scartato) e ripetendo l'invio coi dati aggiornati. Si
+ tenga infine conto che durante il procedimento i pacchetti iniziali possono
+ essere perduti, ed è compito dell'applicazione gestirne una eventuale
+ ritrasmissione.
-\itindend{Maximum~Transfer~Unit}
+\itindend{Maximum~Transfer~Unit~(MTU)}
\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
kernel della serie 2.2.x, ed è specifica di Linux. Prende per
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}
+
+
\itindend{multicast}
\end{basedescript}
\const{TCP\_NODELAY} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Spedisce immediatamente i dati in segmenti singoli.\\
\const{TCP\_MAXSEG} &$\bullet$&$\bullet$& &\texttt{int}&
- Valore della \itindex{Maximum~Segment~Size} MSS per i segmenti in
+ Valore della \itindex{Maximum~Segment~Size~(MSS)} MSS per i segmenti in
uscita.\\
\const{TCP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Accumula i dati in un unico segmento.\\
kernel 2.5.71.}
\item[\const{TCP\_MAXSEG}] con questa opzione si legge o si imposta il valore
- della \itindex{Maximum~Segment~Size} MSS (\textit{Maximum~Segment~Size},
- vedi sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:tcp_protocol_xxx}) dei
- segmenti TCP uscenti. Se l'opzione è impostata prima di stabilire la
- connessione, si cambia anche il valore della \itindex{Maximum~Segment~Size}
- MSS annunciata all'altro capo della connessione. Se si specificano valori
- maggiori della \itindex{Maximum~Transfer~Unit} MTU questi verranno ignorati,
- inoltre TCP imporrà anche i suoi limiti massimo e minimo per questo valore.
+ della \itindex{Maximum~Segment~Size~(MSS)} MSS
+ (\textit{Maximum~Segment~Size}, vedi sez.~\ref{sec:net_lim_dim} e
+ sez.~\ref{sec:tcp_protocol_xxx}) dei segmenti TCP uscenti. Se l'opzione è
+ impostata prima di stabilire la connessione, si cambia anche il valore della
+ \itindex{Maximum~Segment~Size~(MSS)} MSS annunciata all'altro capo della
+ connessione. Se si specificano valori maggiori della
+ \itindex{Maximum~Transfer~Unit~(MTU)} MTU questi verranno ignorati, inoltre
+ TCP imporrà anche i suoi limiti massimo e minimo per questo valore.
\item[\const{TCP\_CORK}] questa opzione è il complemento naturale di
\const{TCP\_NODELAY} e serve a gestire a livello applicativo la situazione
Benché la maggior parte delle caratteristiche dei socket sia gestibile con le
funzioni \func{setsockopt} e \func{getsockopt}, alcune proprietà possono
essere impostate attraverso le funzioni \func{fcntl} e \func{ioctl} già
-trattate in sez.~\ref{sec:file_fcntl} e sez.~\ref{sec:file_ioctl}; in
-quell'occasione abbiamo parlato di queste funzioni esclusivamente nell'ambito
-della loro applicazione a file descriptor associati a dei file normali; qui
-tratteremo invece i dettagli del loro utilizzo con file descriptor associati a
-dei socket.
+trattate in sez.~\ref{sec:file_fcntl_ioctl}; in quell'occasione abbiamo
+parlato di queste funzioni esclusivamente nell'ambito della loro applicazione
+a file descriptor associati a dei file normali; qui tratteremo invece i
+dettagli del loro utilizzo con file descriptor associati a dei socket.
\subsection{L'uso di \func{ioctl} e \func{fcntl} per i socket generici}
Tratteremo in questa sezione le caratteristiche specifiche delle funzioni
\func{ioctl} e \func{fcntl} quando esse vengono utilizzate con dei socket
-generici. Quanto già detto in precedenza in sez.~\ref{sec:file_fcntl} e
-sez.~\ref{sec:file_ioctl} continua a valere; quello che tratteremo qui sono le
-operazioni ed i comandi che sono validi, o che hanno significati peculiari,
-quando queste funzioni vengono applicate a dei socket generici.
+generici. Quanto già detto in precedenza sez.~\ref{sec:file_fcntl_ioctl}
+continua a valere; quello che tratteremo qui sono le operazioni ed i comandi
+che sono validi, o che hanno significati peculiari, quando queste funzioni
+vengono applicate a dei socket generici.
Nell'elenco seguente si riportano i valori specifici che può assumere il
secondo argomento della funzione \func{ioctl} (\param{request}, che indica il
\struct{timeval} con la marca temporale dell'ultimo pacchetto ricevuto sul
socket, questa operazione può essere utilizzata per effettuare delle
misurazioni precise del tempo di andata e ritorno\footnote{il
- \itindex{Round~Trip~Time} \textit{Round Trip Time} cui abbiamo già
+ \itindex{Round~Trip~Time~(RTT)} \textit{Round Trip Time} cui abbiamo già
accennato in sez.~\ref{sec:net_tcp}.} dei pacchetti sulla rete.
\item[\const{SIOCSPGRP}] imposta il processo o il \itindex{process~group}
nullo.
\item[\const{FIOASYNC}] Abilita o disabilita la modalità di I/O asincrono sul
- socket. Questo significa (vedi sez.~\ref{sec:file_asyncronous_operation})
- che verrà inviato il segnale di \signal{SIGIO} (o quanto impostato con
- \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl}) in caso di eventi di I/O
- sul socket.
+ socket. Questo significa (vedi sez.~\ref{sec:signal_driven_io}) che verrà
+ inviato il segnale di \signal{SIGIO} (o quanto impostato con
+ \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl_ioctl}) in caso di eventi
+ di I/O sul socket.
\end{basedescript}
Nel caso dei socket generici anche \func{fcntl} prevede un paio di comandi
non ancora implementato, restituisce un errore di \errval{EOPNOTSUPP}.
\item[\const{SIOCGIFMTU}] permette di leggere il valore della
- \itindex{Maximum~Transfer~Unit} \textit{Maximum Transfer Unit} del
+ \itindex{Maximum~Transfer~Unit~(MTU)} \textit{Maximum Transfer Unit} del
dispositivo nel campo \var{ifr\_mtu}.
\item[\const{SIOCSIFMTU}] permette di impostare il valore della
- \itindex{Maximum~Transfer~Unit} \textit{Maximum Transfer Unit} del
+ \itindex{Maximum~Transfer~Unit~(MTU)} \textit{Maximum Transfer Unit} del
dispositivo al valore specificato campo \var{ifr\_mtu}. L'operazione è
privilegiata, e si tenga presente che impostare un valore troppo basso può
causare un blocco del kernel.
\item[\sysctlrelfile{net/ipv4}{ip\_no\_pmtu\_disc}] permette di
disabilitare per i socket \const{SOCK\_STREAM} la ricerca automatica della
- \itindex{Maximum~Transfer~Unit} \textit{Path MTU} (vedi
+ \itindex{Maximum~Transfer~Unit~(MTU)} \textit{Path MTU} (vedi
sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:sock_ipv4_options}). Prende un
valore logico, e di default è disabilitato (cioè la ricerca viene eseguita).
In genere si abilita questo parametro quando per qualche motivo il
- procedimento del \itindex{Maximum~Transfer~Unit} \textit{Path MTU discovery}
- fallisce; dato che questo può avvenire a causa di router\footnote{ad
- esempio se si scartano tutti i pacchetti ICMP, il problema è affrontato
- anche in sez.~3.4.4 di \cite{SGL}.} o interfacce\footnote{ad esempio se i
- due capi di un collegamento \textit{point-to-point} non si accordano sulla
- stessa MTU.} mal configurati è opportuno correggere le configurazioni,
- perché disabilitare globalmente il procedimento con questo parametro ha
- pesanti ripercussioni in termini di prestazioni di rete.
+ procedimento del \itindex{Maximum~Transfer~Unit~(MTU)} \textit{Path MTU
+ discovery} fallisce; dato che questo può avvenire a causa di
+ router\footnote{ad esempio se si scartano tutti i pacchetti ICMP, il
+ problema è affrontato anche in sez.~3.4.4 di \cite{SGL}.} o
+ interfacce\footnote{ad esempio se i due capi di un collegamento
+ \textit{point-to-point} non si accordano sulla stessa MTU.} mal
+ configurati è opportuno correggere le configurazioni, perché disabilitare
+ globalmente il procedimento con questo parametro ha pesanti ripercussioni in
+ termini di prestazioni di rete.
\item[\sysctlrelfile{net/ipv4}{ip\_always\_defrag}] fa si che tutti i
pacchetti IP frammentati siano riassemblati, anche in caso in successivo
negativo. Il default è 2 che significa che al buffer dell'applicazione
viene riservato un quarto del totale.
-\item[\sysctlrelfile{net/ipv4}{tcp\_app\_win}] indica la frazione
- della finestra TCP che viene riservata per gestire l'overhaed dovuto alla
+\item[\sysctlrelfile{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
- dimensione in byte come il massimo fra la \itindex{Maximum~Segment~Size}
- MSS e $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa
- che non viene riservato nessuno spazio; il valore di default è 31.
+ dimensione in byte come il massimo fra la
+ \itindex{Maximum~Segment~Size~(MSS)} MSS e
+ $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che
+ non viene riservato nessuno spazio; il valore di default è 31.
% vecchi, presumibilmente usati quando gli algoritmi di congestione non erano
% modularizzabili
% LocalWords: ERANGE sethostent stayopen endhostent gethostbyaddr order pton
% LocalWords: getipnodebyname getipnodebyaddr flags num MAPPED ALL ADDRCONFIG
% LocalWords: freehostent ip getXXXbyname getXXXbyaddr servent getservbyname
-% LocalWords: getservbyaddr netent getnetbyname getnetbyaddr protoent smtp udp
+% LocalWords: netent getnetbyname getnetbyaddr protoent smtp udp
% LocalWords: getprotobyname getprotobyaddr getservbyport port tcp setservent
% LocalWords: getservent endservent setXXXent getXXXent endXXXent gethostent
% LocalWords: setnetent getnetent endnetent setprotoent getprotoent POSIX RFC