X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=7b26d58364a0b2466a6dde3da3d9e2554b397375;hp=3a2afa7b8a466f9a04caa67db9c048eecde84974;hb=bff0559197d4aeb49ef522aa29e61cd5f2a77346;hpb=ffb12837c5ed8ccc095bc9c88349cd19b5e6b472 diff --git a/sockctrl.tex b/sockctrl.tex index 3a2afa7..7b26d58 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1,6 +1,6 @@ %% 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", @@ -118,7 +118,7 @@ problema dell'ordine in cui questi vengono interrogati.\footnote{con le 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 @@ -200,7 +200,7 @@ quello che conta sono le funzioni classiche che il \textit{resolver} mette a 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}} @@ -875,6 +875,7 @@ Disattiva l'uso di connessioni per le interrogazioni ad un server DNS. \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ò @@ -1019,7 +1020,7 @@ servizi di risoluzione dei nomi illustrati in sez.~\ref{sec:sock_resolver}; in 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 @@ -1027,8 +1028,8 @@ tab.~\ref{tab:name_resolution_functions}, dove le si sono suddivise rispetto 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. @@ -1044,15 +1045,15 @@ 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} @@ -1060,13 +1061,13 @@ Delle funzioni di tab.~\ref{tab:name_resolution_functions} abbiamo trattato 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} @@ -1096,7 +1097,7 @@ Il primo argomento è il nome del servizio per \func{getservbyname}, 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 @@ -1131,7 +1132,7 @@ trovati nelle rispettive pagine di manuale. 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 @@ -1163,7 +1164,7 @@ voce. La seconda funzione, \func{setservent}, permette di aprire il file 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. @@ -1188,12 +1189,12 @@ rimandando alle rispettive pagine di manuale. \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} @@ -1445,7 +1446,7 @@ corrispondente è riportato tramite \var{errno}. 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} @@ -1603,7 +1604,7 @@ struttura \struct{addrinfo}, perché una volta disallocati i dati con 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} @@ -1687,8 +1688,8 @@ finora, quello in cui si specifica nel client un indirizzo remoto per la 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 @@ -1700,7 +1701,7 @@ l'uso dei socket. \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} @@ -1722,12 +1723,12 @@ Una volta definite le variabili necessarie (\texttt{\small 3--5}) la funzione 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. @@ -1737,7 +1738,7 @@ validi, ed inizia (\texttt{\small 19}) con l'apertura del socket; se questa 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 @@ -1771,7 +1772,7 @@ codice usato finora per collegarsi (vedi fig.~\ref{fig:TCP_echo_client_1}) 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. @@ -1782,14 +1783,14 @@ 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. @@ -1806,16 +1807,16 @@ passare un valore \val{NULL} come valore per l'argomento \var{host}; l'uso 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 @@ -1838,7 +1839,7 @@ Con l'uso di questa funzione si può modificare anche il codice del nostro 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. @@ -2074,6 +2075,11 @@ tab.~\ref{tab:sock_opt_socklevel}. \label{tab:sock_opt_socklevel} \end{table} +% 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/ + 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 è @@ -2339,6 +2345,9 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: % Documentation/networking/timestamping.txt +% TOFO documentare SO_REUSEPORT introdotta con il kernel 3.9, vedi +% http://git.kernel.org/linus/c617f398edd4db2b8567a28e899a88f8f574798d + \end{basedescript} @@ -2385,12 +2394,12 @@ avuto un crollo del sistema ed è stata riavviata, per cui dopo il riavvio la connessione non esiste più.\footnote{si ricordi che un normale riavvio o il crollo dell'applicazione non ha questo effetto, in quanto in tal caso si passa sempre per la chiusura del processo, e questo, come illustrato in - sez.~\ref{sec:file_close}, comporta anche la regolare chiusura del socket - con l'invio di un segmento FIN all'altro capo della connessione.} In questo -caso all'invio del messaggio di \textit{keep-alive} si otterrà come risposta -un segmento RST che indica che l'altro capo non riconosce più l'esistenza -della connessione ed il socket verrà chiuso riportando un errore di -\errcode{ECONNRESET}. + 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 @@ -2505,9 +2514,9 @@ eventuali pacchetti rimasti intrappolati in una precedente connessione possano 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 @@ -2520,15 +2529,15 @@ guida. \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}. @@ -2545,7 +2554,7 @@ usata (\texttt{\small 14}) come ultimo argomento di \func{setsockopt}. Il 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] @@ -2555,7 +2564,7 @@ valore, per cui in tal caso la successiva chiamata (\texttt{\small 13-17}) a \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} @@ -2623,16 +2632,20 @@ 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 -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}}}|)} @@ -2772,9 +2785,9 @@ file. \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}& @@ -2946,7 +2959,7 @@ sez.~\ref{sec:net_sendmsg}). 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 @@ -2984,12 +2997,11 @@ sez.~\ref{sec:net_sendmsg}). 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 @@ -3003,15 +3015,15 @@ sez.~\ref{sec:net_sendmsg}). 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 @@ -3074,6 +3086,9 @@ sez.~\ref{sec:net_sendmsg}). 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} @@ -3122,7 +3137,7 @@ strutture collegate all'uso delle opzioni TCP sono definite in \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.\\ @@ -3198,13 +3213,14 @@ quantità di dettagli è fornita nel seguente elenco: 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 @@ -3541,11 +3557,10 @@ caratteristiche delle opzioni citate è quello dell'elenco seguente: 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} @@ -3553,10 +3568,10 @@ dei socket. 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 @@ -3573,7 +3588,7 @@ identificano le operazioni sono le seguenti: \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} @@ -3596,10 +3611,10 @@ identificano le operazioni sono le seguenti: 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 @@ -3739,11 +3754,11 @@ sono le seguenti: 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. @@ -3816,6 +3831,10 @@ sono le seguenti: \end{basedescript} + +% TODO aggiunta con il kernel 3.14 SIOCGHWTSTAMP per ottenere il timestamp +% hardware senza modificarlo + Una ulteriore operazione, che consente di ricavare le caratteristiche delle interfacce di rete, è \const{SIOCGIFCONF}; però per ragioni di compatibilità questa operazione è disponibile soltanto per i socket della famiglia @@ -4177,19 +4196,20 @@ di manuale accessibile con \texttt{man 7 ip}, sono i seguenti: \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 @@ -4255,12 +4275,13 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: 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 @@ -4633,7 +4654,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: % 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