%% sockctrl.tex
%%
-%% Copyright (C) 2004-2011 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2004-2012 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
\hline
\hline
\texttt{passwd} & Corrispondenze fra nome dell'utente e relative
- proprietà (\acr{uid}, gruppo principale, ecc.).\\
+ proprietà (\ids{UID}, gruppo principale, ecc.).\\
\texttt{shadow} & Corrispondenze fra username e password dell'utente
(e altre informazioni relative alle password).\\
\texttt{group} & Corrispondenze fra nome del gruppo e proprietà dello
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}}
sono specificati server verrà utilizzato l'indirizzo locale, e se non è
definito un dominio di default sarà usato quello associato con l'indirizzo
locale (ma questo può essere sovrascritto con l'uso della variabile di
-ambiente \texttt{LOCALDOMAIN}). In genere non è necessario eseguire questa
+ambiente \envvar{LOCALDOMAIN}). In genere non è necessario eseguire questa
funzione direttamente in quanto viene automaticamente chiamata la prima volta
che si esegue una delle altre.
Le impostazioni e lo stato del \textit{resolver} vengono mantenuti in una
serie di variabili raggruppate nei campi di una apposita struttura \var{\_res}
-usata da tutte queste funzioni. Essa viene definita in \file{resolv.h} ed è
-utilizzata internamente alle funzioni essendo definita come variabile globale;
-questo consente anche di accedervi direttamente all'interno di un qualunque
-programma, una volta che la sia opportunamente dichiarata come:
+usata da tutte queste funzioni. Essa viene definita in \headfile{resolv.h} ed
+è utilizzata internamente alle funzioni essendo definita come variabile
+globale; questo consente anche di accedervi direttamente all'interno di un
+qualunque programma, una volta che la sia opportunamente dichiarata come:
\includecodesnip{listati/resolv_option.c}
Tutti i campi della struttura sono ad uso interno, e vengono usualmente
\const{RES\_INSECURE1} & Blocca i controlli di sicurezza di tipo 1.\\
\const{RES\_INSECURE2} & Blocca i controlli di sicurezza di tipo 2.\\
\const{RES\_NOALIASES} & Blocca l'uso della variabile di ambiente
- \texttt{HOSTALIASES}.\\
+ \envvar{HOSTALIASES}.\\
\const{RES\_USE\_INET6} & Restituisce indirizzi IPv6 con
\func{gethostbyname}. \\
\const{RES\_ROTATE} & Ruota la lista dei server DNS dopo ogni
modificarli direttamente; gran parte di essi sono infatti impostati dal
contenuto dei file di configurazione, mentre le funzionalità controllate da
alcuni di esse possono essere modificate con l'uso delle opportune variabili
-di ambiente come abbiamo visto per \texttt{LOCALDOMAIN}. In particolare con
-\texttt{RES\_RETRY} si soprassiede il valore del campo \var{retry} che
+di ambiente come abbiamo visto per \envvar{LOCALDOMAIN}. In particolare con
+\envvar{RES\_RETRY} si soprassiede il valore del campo \var{retry} che
controlla quante volte viene ripetuto il tentativo di connettersi ad un server
DNS prima di dichiarare fallimento; il valore di default è 4, un valore nullo
-significa bloccare l'uso del DNS. Infine con \texttt{RES\_TIMEOUT} si
+significa bloccare l'uso del DNS. Infine con \envvar{RES\_TIMEOUT} si
soprassiede il valore del campo \var{retrans},\footnote{preimpostato al valore
- della omonima costante \const{RES\_TIMEOUT} di \file{resolv.h}.} che è il
-valore preso come base (in numero di secondi) per definire la scadenza di una
-richiesta, ciascun tentativo di richiesta fallito viene ripetuto raddoppiando
-il tempo di scadenza per il numero massimo di volte stabilito da
+ della omonima costante \const{RES\_TIMEOUT} di \headfile{resolv.h}.} che è
+il valore preso come base (in numero di secondi) per definire la scadenza di
+una richiesta, ciascun tentativo di richiesta fallito viene ripetuto
+raddoppiando il tempo di scadenza per il numero massimo di volte stabilito da
\texttt{RES\_RETRY}.
La funzione di interrogazione principale è \funcd{res\_query}, che serve ad
eseguire una richiesta ad un server DNS per un nome a dominio
-\textsl{completamente specificato} (quello che si chiama FQDN, \textit{Fully
- Qualified Domain Name}); il suo prototipo è:
+\textsl{completamente specificato} (quello che si chiama
+\itindex{Fully~Qualified~Domain~Name~(FQDN)} FQDN, \textit{Fully Qualified
+ Domain Name}); il suo prototipo è:
\begin{functions}
\headdecl{netinet/in.h}
Come accennato le tipologie di dati che sono mantenibili su un server DNS sono
diverse, ed a ciascuna di essa corrisponde un diverso tipo di \textit{resource
record}. L'elenco delle costanti\footnote{ripreso dai file di dichiarazione
- \file{arpa/nameser.h} e \file{arpa/nameser\_compat.h}.} che definiscono i
-valori che si possono usare per l'argomento \param{type} per specificare il
-tipo di \textit{resource record} da richiedere è riportato in
+ \headfile{arpa/nameser.h} e \headfile{arpa/nameser\_compat.h}.} che
+definiscono i valori che si possono usare per l'argomento \param{type} per
+specificare il tipo di \textit{resource record} da richiedere è riportato in
tab.~\ref{tab:DNS_record_type}; le costanti (tolto il \texttt{T\_} iniziale)
hanno gli stessi nomi usati per identificare i record nei file di zona di
BIND,\footnote{BIND, acronimo di \textit{Berkley Internet Name Domain}, è una
implementazione di un server DNS, ed, essendo utilizzata nella stragrande
- maggioranza dei casi, fa da riferimento; i dati relativi ad un certo
- dominio (cioè i suoi \textit{resource record} vengono mantenuti in quelli
- che sono usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo
- di dominio è identificato da un nome che è appunto identico a quello delle
- costanti di tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.}
-e che normalmente sono anche usati come nomi per indicare i record.
+ maggioranza dei casi, fa da riferimento; i dati relativi ad un certo dominio
+ (cioè i suoi \textit{resource record} vengono mantenuti in quelli che sono
+ usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo di dominio
+ è identificato da un nome che è appunto identico a quello delle costanti di
+ tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.} e che
+normalmente sono anche usati come nomi per indicare i record.
\begin{table}[!htb]
\centering
In questo caso la funzione prende un secondo argomento \param{af} che indica
(i soli valori consentiti sono \const{AF\_INET} o \const{AF\_INET6}, per
-questo è necessario l'uso di \texttt{sys/socket.h}) la famiglia di indirizzi
+questo è necessario l'uso di \headfile{sys/socket.h}) la famiglia di indirizzi
che dovrà essere utilizzata nei risultati restituiti dalla funzione. Per tutto
il resto la funzione è identica a \func{gethostbyname}, ed identici sono i
suoi risultati.
\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}
\end{figure}
Come illustrato la struttura \struct{addrinfo}, la cui definizione\footnote{la
- definizione è ripresa direttamente dal file \texttt{netdb.h} in questa
+ definizione è ripresa direttamente dal file \headfile{netdb.h} in questa
struttura viene dichiarata, la pagina di manuale riporta \type{size\_t} come
tipo di dato per il campo \var{ai\_addrlen}, qui viene usata quanto previsto
dallo standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi
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}
qualora la loro dimensione ecceda quelle specificate dagli argomenti
\param{hostlen} e \param{servlen}. Sono comunque definite le due costanti
\const{NI\_MAXHOST} e \const{NI\_MAXSERV}\footnote{in Linux le due costanti
- sono definite in \file{netdb.h} ed hanno rispettivamente il valore 1024 e
- 12.} che possono essere utilizzate come limiti massimi. In caso di errore
-viene restituito invece un codice che assume gli stessi valori illustrati in
-tab.~\ref{tab:addrinfo_error_code}.
+ sono definite in \headfile{netdb.h} ed hanno rispettivamente il valore 1024
+ e 12.} che possono essere utilizzate come limiti massimi. In caso di
+errore viene restituito invece un codice che assume gli stessi valori
+illustrati in tab.~\ref{tab:addrinfo_error_code}.
A questo punto possiamo fornire degli esempi di utilizzo della nuova
interfaccia, adottandola per le precedenti implementazioni del client e del
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}
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.
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 \texttt{sys/socket.h} ed illustrata in
+ \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}.
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}
\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}
livello da utilizzare è \const{SOL\_IP} (o l'equivalente \const{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 \file{netinet/ip.h}, ed accessibili includendo detto file.
+sono definite in \headfile{netinet/ip.h}, ed accessibili includendo detto
+file.
\begin{table}[!htb]
\centering
\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}
dove sono elencate le rispettive costanti da utilizzare come valore per
l'argomento \param{optname}. Dette costanti e tutte le altre costanti e
strutture collegate all'uso delle opzioni TCP sono definite in
-\file{netinet/tcp.h}, ed accessibili includendo detto file.\footnote{in realtà
- questo è il file usato dalle librerie; la definizione delle opzioni
- effettivamente supportate da Linux si trova nel file \texttt{linux/tcp.h},
- dal quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_tcplevel}.}
+\headfile{netinet/tcp.h}, ed accessibili includendo detto file.\footnote{in
+ realtà questo è il file usato dalle librerie; la definizione delle opzioni
+ effettivamente supportate da Linux si trova nel file
+ \texttt{include/linux/tcp.h} dei sorgenti del kernel, dal quale si sono
+ estratte le costanti di tab.~\ref{tab:sock_opt_tcplevel}.}
\begin{table}[!htb]
\centering
\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
\hline
reno& -- &Algoritmo tradizionale, usato in caso di assenza degli altri.\\
\texttt{bic} &\texttt{TCP\_CONG\_BIC} &
- \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}
- {\textsf{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+ \url{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}.\\
\texttt{cubic} &\texttt{TCP\_CONG\_CUBIC} &
- \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}
- {\textsf{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+ \url{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}.\\
\texttt{highspeed}&\texttt{TCP\_CONG\_HSTCP} &
- \href{http://www.icir.org/floyd/hstcp.html}
- {\textsf{http://www.icir.org/floyd/hstcp.html}}.\\
+ \url{http://www.icir.org/floyd/hstcp.html}.\\
\texttt{htcp} &\texttt{TCP\_CONG\_HTCP} &
- \href{http://www.hamilton.ie/net/htcp/}
- {\textsf{http://www.hamilton.ie/net/htcp/}}.\\
+ \url{http://www.hamilton.ie/net/htcp/}.\\
\texttt{hybla} &\texttt{TCP\_CONG\_HYBLA} &
- \href{http://www.danielinux.net/projects.html}
- {\textsf{http://www.danielinux.net/projects.html}}.\\
+ \url{http://www.danielinux.net/projects.html}.\\
\texttt{scalable}&\texttt{TCP\_CONG\_SCALABLE}&
- \href{http://www.deneholme.net/tom/scalable/}
- {\textsf{http://www.deneholme.net/tom/scalable/}}.\\
+ \url{http://www.deneholme.net/tom/scalable/}.\\
\texttt{vegas} &\texttt{TCP\_CONG\_VEGAS} &
- \href{http://www.cs.arizona.edu/protocols/}
- {\textsf{http://www.cs.arizona.edu/protocols/}}.\\
+ \url{http://www.cs.arizona.edu/protocols/}.\\
\texttt{westwood}&\texttt{TCP\_CONG\_WESTWOOD}&
- \href{http://www.cs.ucla.edu/NRL/hpi/tcpw/}
- {\textsf{http://www.cs.ucla.edu/NRL/hpi/tcpw/}}.\\
+ \url{http://www.cs.ucla.edu/NRL/hpi/tcpw/}.\\
% \texttt{}&\texttt{}& .\\
\hline
\end{tabular}
questo caso per poterle utilizzare occorrerà impostare l'opportuno valore per
l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente
\const{IPPROTO\_UDP}). Le costanti che identificano dette opzioni sono
-definite in \file{netinet/udp.h}, ed accessibili includendo detto
+definite in \headfile{netinet/udp.h}, ed accessibili includendo detto
file.\footnote{come per TCP, la definizione delle opzioni effettivamente
- supportate dal kernel si trova in realtà nel file \texttt{linux/udp.h}, dal
- quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_udplevel}.}
+ supportate dal kernel si trova in realtà nel file
+ \texttt{include/linux/udp.h}, dal quale si sono estratte le costanti di
+ tab.~\ref{tab:sock_opt_udplevel}.}
\begin{table}[!htb]
\centering
\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}
\signal{SIGURG} quando viene completata una operazione di I/O asincrono o
arrivano dei dati urgenti \itindex{out-of-band} (\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 \acr{pid} del
+ \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
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