From e91584927c1db3e0b5d08facab44c76b197c101d Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 1 Nov 2015 17:51:28 +0000 Subject: [PATCH] fine (si spera) delle reindicizzazioni --- fileadv.tex | 32 +- filedir.tex | 2 +- fileio.tex | 2 +- intro.tex | 2 +- ipc.tex | 157 ++++---- netlayer.tex | 17 +- network.tex | 31 +- othersock.tex | 19 +- prochand.tex | 8 +- signal.tex | 4 +- sockctrl.tex | 972 ++++++++++++++++++++++++------------------------- socket.tex | 136 ++++--- system.tex | 20 +- tcpsock.tex | 271 +++++++------- trasplayer.tex | 3 + 15 files changed, 829 insertions(+), 847 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 440bc32..0251c7b 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -753,7 +753,7 @@ prototipo è: \item[\errcode{EINVAL}] si è usato un valore non valido per \param{cmd}. \end{errlist} ed inoltre \errcode{EDEADLK} e \errcode{ENOLCK} con lo stesso significato - che hanno con \funcd{fcntl}. + che hanno con \func{fcntl}. } \end{funcproto} @@ -1050,13 +1050,13 @@ identifica un insieme di segnali. Per la manipolazione di questi \textit{file \vspace{3pt} \begin{funcbox}{ \fhead{sys/select.h} -\fdecl{void \macro{FD\_ZERO}(fd\_set *set)} +\fdecl{void \macrod{FD\_ZERO}(fd\_set *set)} \fdesc{Inizializza l'insieme (vuoto).} -\fdecl{void \macro{FD\_SET}(int fd, fd\_set *set)} +\fdecl{void \macrod{FD\_SET}(int fd, fd\_set *set)} \fdesc{Inserisce il file descriptor \param{fd} nell'insieme.} -\fdecl{void \macro{FD\_CLR}(int fd, fd\_set *set)} +\fdecl{void \macrod{FD\_CLR}(int fd, fd\_set *set)} \fdesc{Rimuove il file descriptor \param{fd} dall'insieme.} -\fdecl{int \macro{FD\_ISSET}(int fd, fd\_set *set)} +\fdecl{int \macrod{FD\_ISSET}(int fd, fd\_set *set)} \fdesc{Controlla se il file descriptor \param{fd} è nell'insieme.} } \end{funcbox}} @@ -1974,12 +1974,12 @@ funzione di sistema si chiama \funcd{epoll\_pwait}\footnote{la funzione è {La funzione ritorna il numero di file descriptor pronti in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori già - visti con \funcd{epoll\_wait}. + visti con \func{epoll\_wait}. } \end{funcproto} -La funzione è del tutto analoga \funcd{epoll\_wait}, soltanto che alla sua +La funzione è del tutto analoga \func{epoll\_wait}, soltanto che alla sua uscita viene ripristinata la maschera di segnali originale, sostituita durante l'esecuzione da quella impostata con l'argomento \param{sigmask}; in sostanza la chiamata a questa funzione è equivalente al seguente codice, eseguito però @@ -2005,7 +2005,7 @@ notifiche di eventi tramite i segnali, presente da sempre nei sistemi unix-like, porti a notevoli problemi nell'interazione con le funzioni per l'\textit{I/O multiplexing}, tanto che per evitare possibili \textit{race condition} sono state introdotte estensioni dello standard POSIX e funzioni -apposite come \func{pselect}, \func{ppoll} e \funcd{epoll\_pwait}. +apposite come \func{pselect}, \func{ppoll} e \func{epoll\_pwait}. Benché i segnali siano il meccanismo più usato per effettuare notifiche ai processi, la loro interfaccia di programmazione, che comporta l'esecuzione di @@ -2056,7 +2056,7 @@ gestore in occasione dell'arrivo di un segnale, e rilevarne l'avvenuta ricezione leggendone la notifica tramite l'uso di uno speciale file descriptor. Trattandosi di un file descriptor questo potrà essere tenuto sotto osservazione con le ordinarie funzioni dell'\textit{I/O multiplexing} (vale a -dire con le solite \func{select}, \func{poll} e \funcd{epoll\_wait}) allo +dire con le solite \func{select}, \func{poll} e \func{epoll\_wait}) allo stesso modo di quelli associati a file o socket, per cui alla fine si potrà attendere in contemporanea sia l'arrivo del segnale che la disponibilità di accesso ai dati relativi a questi ultimi. @@ -2164,7 +2164,7 @@ condizioni di gestione, né da un gestore, né dalla funzione \func{sigwaitinfo} Come anticipato, essendo questo lo scopo principale della nuova interfaccia, il file descriptor può essere tenuto sotto osservazione tramite le funzioni dell'\textit{I/O multiplexing} (vale a dire con le solite \func{select}, -\func{poll} e \funcd{epoll\_wait}), e risulterà accessibile in lettura quando +\func{poll} e \func{epoll\_wait}), e risulterà accessibile in lettura quando uno o più dei segnali indicati tramite \param{mask} sarà pendente. La funzione può essere chiamata più volte dallo stesso processo, consentendo @@ -2813,9 +2813,9 @@ tab.~\ref{tab:file_lease_fctnl}. \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \consts{F\_RDLCK} & Richiede un \textit{read lease}.\\ - \consts{F\_WRLCK} & Richiede un \textit{write lease}.\\ - \consts{F\_UNLCK} & Rilascia un \textit{file lease}.\\ + \constd{F\_RDLCK} & Richiede un \textit{read lease}.\\ + \constd{F\_WRLCK} & Richiede un \textit{write lease}.\\ + \constd{F\_UNLCK} & Rilascia un \textit{file lease}.\\ \hline \end{tabular} \caption{Costanti per i tre possibili valori dell'argomento \param{arg} di @@ -3514,7 +3514,7 @@ nome sta per \textit{asyncronous I/O control block}), che viene passata come argomento a tutte le funzioni dell'interfaccia. La sua definizione, come effettuata in \headfiled{aio.h}, è riportata in fig.~\ref{fig:file_aiocb}. Nello steso file è definita la macro -\macro{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la disponibilità +\macrod{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la disponibilità dell'interfaccia per l'I/O asincrono. \begin{figure}[!htb] @@ -3544,8 +3544,8 @@ del blocco di dati da trasferire. Il campo \var{aio\_reqprio} permette di impostare la priorità delle operazioni di I/O, in generale perché ciò sia possibile occorre che la piattaforma supporti questa caratteristica, questo viene indicato dal fatto che le macro -\macro{\_POSIX\_PRIORITIZED\_IO}, e \macro{\_POSIX\_PRIORITY\_SCHEDULING} sono -definite. La priorità viene impostata a partire da quella del processo +\macrod{\_POSIX\_PRIORITIZED\_IO}, e \macrod{\_POSIX\_PRIORITY\_SCHEDULING} +sono definite. La priorità viene impostata a partire da quella del processo chiamante (vedi sez.~\ref{sec:proc_priority}), cui viene sottratto il valore di questo campo. Il campo \var{aio\_lio\_opcode} è usato solo dalla funzione \func{lio\_listio}, che, come vedremo, permette di eseguire con una sola diff --git a/filedir.tex b/filedir.tex index 4c70860..ae7b557 100644 --- a/filedir.tex +++ b/filedir.tex @@ -5832,7 +5832,7 @@ prototipo è: } \end{funcproto} -La funzione è del tutto è analoga a \funcd{acl\_set\_file} ma opera +La funzione è del tutto è analoga a \func{acl\_set\_file} ma opera esclusivamente sui file identificati tramite un file descriptor. Non dovendo avere a che fare con directory (e con la conseguente possibilità di avere una ACL di default) la funzione non necessita che si specifichi il tipo di ACL, diff --git a/fileio.tex b/fileio.tex index ead199a..20c4c1d 100644 --- a/fileio.tex +++ b/fileio.tex @@ -1858,7 +1858,7 @@ costanti utilizzabili per i valori di \param{flags}. Un'ultima differenza fra le \textit{at-functions} e le funzioni tradizionali di cui sono estensione è, come accennato in sez.~\ref{sec:file_temp_file}, -quella relativa a \funcm{utimensat} che non è propriamente una corrispondente +quella relativa a \func{utimensat} che non è propriamente una corrispondente esatta di \func{utimes} e \func{lutimes}, dato che questa funzione ha una maggiore precisione nella indicazione dei tempi dei file, per i quali come per \func{futimes}, si devono usare strutture \struct{timespec} che consentono una diff --git a/intro.tex b/intro.tex index dba0ded..fd6a41b 100644 --- a/intro.tex +++ b/intro.tex @@ -1442,7 +1442,7 @@ una opportuna macro; queste estensioni sono illustrate nel seguente elenco: sez.~\ref{sec:file_openat}. \item[\macrod{\_REENTRANT}] definendo questa macro, o la equivalente - \macro{\_THREAD\_SAFE} (fornita per compatibilità) si rendono disponibili le + \macrod{\_THREAD\_SAFE} (fornita per compatibilità) si rendono disponibili le versioni rientranti (vedi sez.~\ref{sec:proc_reentrant}) di alcune funzioni, necessarie quando si usano i \textit{thread}. Alcune di queste funzioni sono anche previste nello standard POSIX.1c, ma ve ne sono altre che sono diff --git a/ipc.tex b/ipc.tex index 7520e33..bc8d542 100644 --- a/ipc.tex +++ b/ipc.tex @@ -954,7 +954,7 @@ Usando la stessa chiave due processi diversi possono ricavare l'identificatore associato ad un oggetto ed accedervi. Il problema che sorge a questo punto è come devono fare per accordarsi sull'uso di una stessa chiave. Se i processi sono \textsl{imparentati} la soluzione è relativamente semplice, in tal caso -infatti si può usare il valore speciale \texttt{IPC\_PRIVATE} per creare un +infatti si può usare il valore speciale \constd{IPC\_PRIVATE} per creare un nuovo oggetto nel processo padre, l'identificatore così ottenuto sarà disponibile in tutti i figli, e potrà essere passato come argomento attraverso una \func{exec}. @@ -1045,8 +1045,8 @@ il proprietario, il suo gruppo e tutti gli altri. Se però si vogliono usare le costanti simboliche di tab.~\ref{tab:file_mode_flags} occorrerà includere anche il file -\headfile{sys/stat.h}; alcuni sistemi definiscono le costanti \const{MSG\_R} -(il valore ottale \texttt{0400}) e \const{MSG\_W} (il valore ottale +\headfile{sys/stat.h}; alcuni sistemi definiscono le costanti \constd{MSG\_R} +(il valore ottale \texttt{0400}) e \constd{MSG\_W} (il valore ottale \texttt{0200}) per indicare i permessi base di lettura e scrittura per il proprietario, da utilizzare, con gli opportuni shift, pure per il gruppo e gli altri. In Linux, visto la loro scarsa utilità, queste costanti non sono @@ -1127,8 +1127,8 @@ Il sistema dispone sempre di un numero fisso di oggetti di IPC, fino al kernel \const{SHMMNI}, e potevano essere cambiati (come tutti gli altri limiti relativi al \textit{SysV-IPC}) solo con una ricompilazione del kernel. A partire dal kernel 2.4.x è possibile cambiare questi valori a sistema attivo -scrivendo sui file \sysctlrelfiled{kernel}{shmmni}, -\sysctlrelfiled{kernel}{msgmni} e \sysctlrelfiled{kernel}{sem} di +scrivendo sui file \sysctlrelfile{kernel}{shmmni}, +\sysctlrelfile{kernel}{msgmni} e \sysctlrelfiled{kernel}{sem} di \file{/proc/sys/kernel} o con l'uso di \func{sysctl}. \begin{figure}[!htb] @@ -1151,7 +1151,7 @@ numero di oggetti presenti viene sommato il valore corrente del campo Questo in realtà è quanto avveniva fino ai kernel della serie 2.2, dalla serie 2.4 viene usato lo stesso fattore di moltiplicazione per qualunque tipo di -oggetto, utilizzando il valore dalla costante \const{IPCMNI} (definita in +oggetto, utilizzando il valore dalla costante \constd{IPCMNI} (definita in \file{include/linux/ipc.h}), che indica il limite massimo complessivo per il numero di tutti gli oggetti presenti nel \textit{SysV-IPC}, ed il cui default è 32768. Si evita così il riutilizzo degli stessi numeri, e si fa sì che @@ -1267,10 +1267,10 @@ validi. Se invece si vuole creare una nuova coda di messaggi \param{flag} non può essere nullo e deve essere fornito come maschera binaria, impostando il bit -corrispondente al valore \const{IPC\_CREAT}. In questo caso i nove bit meno +corrispondente al valore \constd{IPC\_CREAT}. In questo caso i nove bit meno significativi di \param{flag} saranno usati come permessi per il nuovo oggetto, secondo quanto illustrato in sez.~\ref{sec:ipc_sysv_access_control}. -Se si imposta anche il bit corrispondente a \const{IPC\_EXCL} la funzione avrà +Se si imposta anche il bit corrispondente a \constd{IPC\_EXCL} la funzione avrà successo solo se l'oggetto non esiste già, fallendo con un errore di \errcode{EEXIST} altrimenti. @@ -1292,11 +1292,11 @@ creazione di una nuova coda. & \textbf{Significato} \\ \hline \hline - \const{MSGMNI}& 16& \file{msgmni} & Numero massimo di code di + \constd{MSGMNI}& 16& \file{msgmni} & Numero massimo di code di messaggi.\\ - \const{MSGMAX}& 8192& \file{msgmax} & Dimensione massima di un singolo + \constd{MSGMAX}& 8192& \file{msgmax} & Dimensione massima di un singolo messaggio.\\ - \const{MSGMNB}&16384& \file{msgmnb} & Dimensione massima del contenuto di + \constd{MSGMNB}&16384& \file{msgmnb} & Dimensione massima del contenuto di una coda.\\ \hline \end{tabular} @@ -1435,17 +1435,17 @@ comportamento della funzione dipende dal valore dell'argomento \param{cmd}, che specifica il tipo di azione da eseguire. I valori possibili per \param{cmd} sono: \begin{basedescript}{\desclabelwidth{1.6cm}\desclabelstyle{\nextlinelabel}} -\item[\const{IPC\_STAT}] Legge le informazioni riguardo la coda nella +\item[\constd{IPC\_STAT}] Legge le informazioni riguardo la coda nella struttura \struct{msqid\_ds} indicata da \param{buf}. Occorre avere il permesso di lettura sulla coda. -\item[\const{IPC\_RMID}] Rimuove la coda, cancellando tutti i dati, con +\item[\constd{IPC\_RMID}] Rimuove la coda, cancellando tutti i dati, con effetto immediato. Tutti i processi che cercheranno di accedere alla coda riceveranno un errore di \errcode{EIDRM}, e tutti processi in attesa su funzioni di lettura o di scrittura sulla coda saranno svegliati ricevendo il medesimo errore. Questo comando può essere eseguito solo da un processo con \ids{UID} effettivo corrispondente al creatore o al proprietario della coda, o all'amministratore. -\item[\const{IPC\_SET}] Permette di modificare i permessi ed il proprietario +\item[\constd{IPC\_SET}] Permette di modificare i permessi ed il proprietario della coda, ed il limite massimo sulle dimensioni del totale dei messaggi in essa contenuti (\var{msg\_qbytes}). I valori devono essere passati in una struttura \struct{msqid\_ds} puntata da \param{buf}. Per modificare i @@ -1459,8 +1459,8 @@ per \param{cmd} sono: \end{basedescript} A questi tre valori, che sono quelli previsti dallo standard, su Linux se ne -affiancano altri tre (\const{IPC\_INFO}, \const{MSG\_STAT} e -\const{MSG\_INFO}) introdotti ad uso del programma \cmd{ipcs} per ottenere le +affiancano altri tre (\constd{IPC\_INFO}, \constd{MSG\_STAT} e +\constd{MSG\_INFO}) introdotti ad uso del programma \cmd{ipcs} per ottenere le informazioni generali relative alle risorse usate dalle code di messaggi. Questi potranno essere modificati o rimossi in favore dell'uso di \texttt{/proc}, per cui non devono essere usati e non li tratteremo. @@ -1533,7 +1533,7 @@ argomento è solo quella del messaggio, non quella di tutta la struttura, se cioè \var{message} è una propria struttura che si passa alla funzione, \param{msgsz} dovrà essere uguale a \code{sizeof(message)-sizeof(long)}, (se consideriamo il caso dell'esempio in fig.~\ref{fig:ipc_msbuf}, \param{msgsz} -dovrà essere pari a \const{LENGTH}). +dovrà essere pari a \var{LENGTH}). Per capire meglio il funzionamento della funzione riprendiamo in considerazione la struttura della coda illustrata in @@ -1550,7 +1550,7 @@ della funzione. Di norma, quando si specifica un valore nullo, la funzione ritorna immediatamente a meno che si sia ecceduto il valore di \var{msg\_qbytes}, o il limite di sistema sul numero di messaggi, nel qual caso si blocca. Se si specifica per \param{flag} il valore -\const{IPC\_NOWAIT} la funzione opera in modalità non-bloccante, ed in questi +\constd{IPC\_NOWAIT} la funzione opera in modalità non-bloccante, ed in questi casi ritorna immediatamente con un errore di \errcode{EAGAIN}. Se non si specifica \const{IPC\_NOWAIT} la funzione resterà bloccata fintanto @@ -1602,11 +1602,11 @@ scrivendolo sulla struttura puntata da \param{msgp}, che dovrà avere un formato analogo a quello di fig.~\ref{fig:ipc_msbuf}. Una volta estratto, il messaggio sarà rimosso dalla coda. L'argomento \param{msgsz} indica la lunghezza massima del testo del messaggio (equivalente al valore del parametro -\const{LENGTH} nell'esempio di fig.~\ref{fig:ipc_msbuf}). +\var{LENGTH} nell'esempio di fig.~\ref{fig:ipc_msbuf}). Se il testo del messaggio ha lunghezza inferiore a \param{msgsz} esso viene rimosso dalla coda; in caso contrario, se \param{msgflg} è impostato a -\const{MSG\_NOERROR}, il messaggio viene troncato e la parte in eccesso viene +\constd{MSG\_NOERROR}, il messaggio viene troncato e la parte in eccesso viene perduta, altrimenti il messaggio non viene estratto e la funzione ritorna con un errore di \errcode{E2BIG}. @@ -1630,7 +1630,7 @@ coda, è quello meno recente); in particolare: Il valore di \param{msgflg} permette di controllare il comportamento della funzione, esso può essere nullo o una maschera binaria composta da uno o più valori. Oltre al precedente \const{MSG\_NOERROR}, sono possibili altri due -valori: \const{MSG\_EXCEPT}, che permette, quando \param{msgtyp} è positivo, +valori: \constd{MSG\_EXCEPT}, che permette, quando \param{msgtyp} è positivo, di leggere il primo messaggio nella coda con tipo diverso da \param{msgtyp}, e \const{IPC\_NOWAIT} che causa il ritorno immediato della funzione quando non ci sono messaggi sulla coda. @@ -2020,17 +2020,17 @@ direttamente nel file \sysctlfile{kernel/sem}. \textbf{Costante} & \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \const{SEMMNI}& 128 & Numero massimo di insiemi di semafori.\\ - \const{SEMMSL}& 250 & Numero massimo di semafori per insieme.\\ - \const{SEMMNS}&\const{SEMMNI}*\const{SEMMSL}& Numero massimo di semafori - nel sistema.\\ - \const{SEMVMX}& 32767 & Massimo valore per un semaforo.\\ - \const{SEMOPM}& 32 & Massimo numero di operazioni per chiamata a - \func{semop}. \\ - \const{SEMMNU}&\const{SEMMNS}& Massimo numero di strutture di ripristino.\\ - \const{SEMUME}&\const{SEMOPM}& Massimo numero di voci di ripristino.\\ - \const{SEMAEM}&\const{SEMVMX}& Valore massimo per l'aggiustamento - all'uscita. \\ + \constd{SEMMNI}& 128 & Numero massimo di insiemi di semafori.\\ + \constd{SEMMSL}& 250 & Numero massimo di semafori per insieme.\\ + \constd{SEMMNS}&\const{SEMMNI}*\const{SEMMSL}& Numero massimo di semafori + nel sistema.\\ + \constd{SEMVMX}& 32767 & Massimo valore per un semaforo.\\ + \constd{SEMOPM}& 32 & Massimo numero di operazioni per chiamata a + \func{semop}. \\ + \constd{SEMMNU}&\const{SEMMNS}& Massimo numero di strutture di ripristino.\\ + \constd{SEMUME}&\const{SEMOPM}& Massimo numero di voci di ripristino.\\ + \constd{SEMAEM}&\const{SEMVMX}& Valore massimo per l'aggiustamento + all'uscita. \\ \hline \end{tabular} \caption{Valori delle costanti associate ai limiti degli insiemi di @@ -2099,7 +2099,7 @@ Nelle versioni più vecchie delle \acr{glibc} questa unione veniva definita in \file{sys/sem.h}, ma nelle versioni più recenti questo non avviene più in quanto lo standard POSIX.1-2001 richiede che sia sempre definita a cura del chiamante. In questa seconda evenienza le \acr{glibc} definiscono però la -macro \macro{\_SEM\_SEMUN\_UNDEFINED} che può essere usata per controllare la +macro \macrod{\_SEM\_SEMUN\_UNDEFINED} che può essere usata per controllare la situazione. Come già accennato sia il comportamento della funzione che il numero di @@ -2126,40 +2126,40 @@ i seguenti: \var{sem\_ctime}. L'\ids{UID} effettivo del processo deve corrispondere o al creatore o al proprietario dell'insieme, o all'amministratore. L'argomento \param{semnum} viene ignorato. -\item[\const{GETALL}] Restituisce il valore corrente di ciascun semaforo +\item[\constd{GETALL}] Restituisce il valore corrente di ciascun semaforo dell'insieme (corrispondente al campo \var{semval} di \struct{sem}) nel vettore indicato da \param{arg.array}. Occorre avere il permesso di lettura. L'argomento \param{semnum} viene ignorato. -\item[\const{GETNCNT}] Restituisce come valore di ritorno della funzione il +\item[\constd{GETNCNT}] Restituisce come valore di ritorno della funzione il numero di processi in attesa che il semaforo \param{semnum} dell'insieme \param{semid} venga incrementato (corrispondente al campo \var{semncnt} di \struct{sem}). Va invocata con tre argomenti. Occorre avere il permesso di lettura. -\item[\const{GETPID}] Restituisce come valore di ritorno della funzione il +\item[\constd{GETPID}] Restituisce come valore di ritorno della funzione il \ids{PID} dell'ultimo processo che ha compiuto una operazione sul semaforo \param{semnum} dell'insieme \param{semid} (corrispondente al campo \var{sempid} di \struct{sem}). Va invocata con tre argomenti. Occorre avere il permesso di lettura. -\item[\const{GETVAL}] Restituisce come valore di ritorno della funzione il il +\item[\constd{GETVAL}] Restituisce come valore di ritorno della funzione il il valore corrente del semaforo \param{semnum} dell'insieme \param{semid} (corrispondente al campo \var{semval} di \struct{sem}). Va invocata con tre argomenti. Occorre avere il permesso di lettura. -\item[\const{GETZCNT}] Restituisce come valore di ritorno della funzione il +\item[\constd{GETZCNT}] Restituisce come valore di ritorno della funzione il numero di processi in attesa che il valore del semaforo \param{semnum} dell'insieme \param{semid} diventi nullo (corrispondente al campo \var{semncnt} di \struct{sem}). Va invocata con tre argomenti. Occorre avere il permesso di lettura. -\item[\const{SETALL}] Inizializza il valore di tutti i semafori dell'insieme, +\item[\constd{SETALL}] Inizializza il valore di tutti i semafori dell'insieme, aggiornando il campo \var{sem\_ctime} di \struct{semid\_ds}. I valori devono essere passati nel vettore indicato da \param{arg.array}. Si devono avere i privilegi di scrittura. L'argomento \param{semnum} viene ignorato. -\item[\const{SETVAL}] Inizializza il semaforo \param{semnum} al valore passato +\item[\constd{SETVAL}] Inizializza il semaforo \param{semnum} al valore passato dall'argomento \param{arg.val}, aggiornando il campo \var{sem\_ctime} di \struct{semid\_ds}. Si devono avere i privilegi di scrittura. \end{basedescript} Come per \func{msgctl} esistono tre ulteriori valori, \const{IPC\_INFO}, -\const{SEM\_STAT} e \const{SEM\_INFO}, specifici di Linux e fuori da ogni +\constd{SEM\_STAT} e \constd{SEM\_INFO}, specifici di Linux e fuori da ogni standard, creati specificamente ad uso del comando \cmd{ipcs}. Dato che anche questi potranno essere modificati o rimossi, non devono essere utilizzati e pertanto non li tratteremo. @@ -2304,7 +2304,7 @@ un valore nullo di \var{sem\_num}. Il campo \var{sem\_flg} è un flag, mantenuto come maschera binaria, per il quale possono essere impostati i due valori \const{IPC\_NOWAIT} e -\const{SEM\_UNDO}. Impostando \const{IPC\_NOWAIT} si fa si che in tutti quei +\constd{SEM\_UNDO}. Impostando \const{IPC\_NOWAIT} si fa si che in tutti quei casi in cui l'esecuzione di una operazione richiederebbe di porre il processo vada nello stato di \textit{sleep}, invece di bloccarsi \func{semop} ritorni immediatamente (abortendo così le eventuali operazioni restanti) con un errore @@ -2587,7 +2587,7 @@ l'argomento \param{flag}, specifici di \func{shmget}, attinenti alle modalità di gestione del segmento di memoria condivisa in relazione al sistema della memoria virtuale. -Il primo dei due flag è \const{SHM\_HUGETLB} che consente di richiedere la +Il primo dei due flag è \constd{SHM\_HUGETLB} che consente di richiedere la creazione del segmento usando una \textit{huge page}, le pagine di memoria di grandi dimensioni introdotte con il kernel 2.6 per ottimizzare le prestazioni nei sistemi più recenti che hanno grandi quantità di memoria. L'operazione è @@ -2596,7 +2596,7 @@ privilegiata e richiede che il processo abbia la \textit{capability} portabile. Il secondo flag aggiuntivo, introdotto a partire dal kernel 2.6.15, è -\const{SHM\_NORESERVE}, ed ha lo stesso scopo del flag \const{MAP\_NORESERVE} +\constd{SHM\_NORESERVE}, ed ha lo stesso scopo del flag \const{MAP\_NORESERVE} di \func{mmap} (vedi sez.~\ref{sec:file_memory_map}): non vengono riservate delle pagine di swap ad uso del meccanismo del \textit{copy on write} per mantenere le modifiche fatte sul segmento. Questo significa che caso di @@ -2685,27 +2685,27 @@ che permettono di cambiarne il valore. & \textbf{Significato} \\ \hline \hline - \const{SHMALL}& 0x200000&\sysctlrelfile{kernel}{shmall} - & Numero massimo di pagine che - possono essere usate per i segmenti di - memoria condivisa.\\ - \const{SHMMAX}&0x2000000&\sysctlrelfile{kernel}{shmmax} - & Dimensione massima di un segmento di memoria - condivisa.\\ - \const{SHMMNI}& 4096&\sysctlrelfile{kernel}{msgmni} - & Numero massimo di segmenti di memoria condivisa + \constd{SHMALL}& 0x200000&\sysctlrelfiled{kernel}{shmall} + & Numero massimo di pagine che + possono essere usate per i segmenti di + memoria condivisa.\\ + \constd{SHMMAX}&0x2000000&\sysctlrelfiled{kernel}{shmmax} + & Dimensione massima di un segmento di memoria + condivisa.\\ + \constd{SHMMNI}& 4096&\sysctlrelfiled{kernel}{shmmni} + & Numero massimo di segmenti di memoria condivisa presenti nel kernel.\\ - \const{SHMMIN}& 1& --- & Dimensione minima di un segmento di - memoria condivisa.\\ - \const{SHMLBA}&\const{PAGE\_SIZE}&--- & Limite inferiore per le dimensioni - minime di un segmento (deve essere - allineato alle dimensioni di una - pagina di memoria).\\ - \const{SHMSEG}& --- & --- & Numero massimo di segmenti di - memoria condivisa per ciascun - processo (l'implementazione non - prevede l'esistenza di questo - limite).\\ + \constd{SHMMIN}& 1& --- & Dimensione minima di un segmento di + memoria condivisa.\\ + \constd{SHMLBA}&\const{PAGE\_SIZE}&--- & Limite inferiore per le dimensioni + minime di un segmento (deve essere + allineato alle dimensioni di una + pagina di memoria).\\ + \constd{SHMSEG}& --- & --- & Numero massimo di segmenti di + memoria condivisa per ciascun + processo (l'implementazione non + prevede l'esistenza di questo + limite).\\ \hline @@ -2775,7 +2775,7 @@ consentono di estendere le funzionalità, ovviamente non devono essere usati se si ha a cuore la portabilità. Questi comandi aggiuntivi sono: \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} -\item[\const{SHM\_LOCK}] Abilita il \textit{memory locking} sul segmento di +\item[\constd{SHM\_LOCK}] Abilita il \textit{memory locking} sul segmento di memoria condivisa, impedendo che la memoria usata per il segmento venga salvata su disco dal meccanismo della memoria virtuale. Come illustrato in sez.~\ref{sec:proc_mem_lock} fino al kernel 2.6.9 solo l'amministratore @@ -2784,13 +2784,13 @@ si ha a cuore la portabilità. Questi comandi aggiuntivi sono: 2.6.10 anche gli utenti normali possono farlo fino al limite massimo determinato da \const{RLIMIT\_MEMLOCK} (vedi sez.~\ref{sec:sys_resource_limit}). -\item[\const{SHM\_UNLOCK}] Disabilita il \textit{memory locking} sul segmento +\item[\constd{SHM\_UNLOCK}] Disabilita il \textit{memory locking} sul segmento di memoria condivisa. Fino al kernel 2.6.9 solo l'amministratore poteva utilizzare questo comando in corrispondenza di un segmento da lui bloccato. \end{basedescript} A questi due, come per \func{msgctl} e \func{semctl}, si aggiungono tre -ulteriori valori, \const{IPC\_INFO}, \const{MSG\_STAT} e \const{MSG\_INFO}, +ulteriori valori, \const{IPC\_INFO}, \constd{SHM\_STAT} e \constd{SHM\_INFO}, introdotti ad uso del programma \cmd{ipcs} per ottenere le informazioni generali relative alle risorse usate dai segmenti di memoria condivisa. Dato che potranno essere modificati o rimossi in favore dell'uso di \texttt{/proc}, @@ -2873,14 +2873,14 @@ momento sono sono tre e sono identificati dalle costanti \const{SHM\_RND}, \const{SHM\_RDONLY} e \const{SHM\_REMAP} che vanno combinate con un OR aritmetico. -Specificando \const{SHM\_RND} si evita che \func{shmat} ritorni un errore +Specificando \constd{SHM\_RND} si evita che \func{shmat} ritorni un errore quando \param{shmaddr} non è allineato ai confini di una pagina. Si può quindi usare un valore qualunque per \param{shmaddr}, e il segmento verrà comunque agganciato, ma al più vicino multiplo di \const{SHMLBA}; il nome della costante sta infatti per \textit{rounded}, e serve per specificare un indirizzo come arrotondamento. -L'uso di \const{SHM\_RDONLY} permette di agganciare il segmento in sola +L'uso di \constd{SHM\_RDONLY} permette di agganciare il segmento in sola lettura (si ricordi che anche le pagine di memoria hanno dei permessi), in tal caso un tentativo di scrivere sul segmento comporterà una violazione di accesso con l'emissione di un segnale di \signal{SIGSEGV}. Il comportamento @@ -2889,13 +2889,13 @@ lettura e scrittura (ed il processo deve aver questi permessi in \var{shm\_perm}), non è prevista la possibilità di agganciare un segmento in sola scrittura. -Infine \const{SHM\_REMAP} è una estensione specifica di Linux (quindi non +Infine \constd{SHM\_REMAP} è una estensione specifica di Linux (quindi non portabile) che indica che la mappatura del segmento deve rimpiazzare ogni precedente mappatura esistente nell'intervallo iniziante all'indirizzo \param{shmaddr} e di dimensione pari alla lunghezza del segmento. In condizioni normali questo tipo di richiesta fallirebbe con un errore di \errval{EINVAL}. Ovviamente usando \const{SHM\_REMAP} -l'argomento \param{shmaddr} non può essere nullo. +l'argomento \param{shmaddr} non può essere nullo. In caso di successo la funzione \func{shmat} aggiorna anche i seguenti campi della struttura \struct{shmid\_ds}: @@ -3785,7 +3785,7 @@ dei limiti sono: \item[\sysctlfiled{fs/mqueue/msg\_max}] Indica il valore massimo del numero di messaggi in una coda e agisce come limite superiore per il valore di \var{attr->mq\_maxmsg} in \func{mq\_open}. Il suo valore di default è 10. Il - valore massimo è \const{HARD\_MAX} che vale \code{(131072/sizeof(void *))}, + valore massimo è \constd{HARD\_MAX} che vale \code{(131072/sizeof(void *))}, ed il valore minimo 1 (ma era 10 per i kernel precedenti il 2.6.28). Questo limite viene ignorato per i processi con privilegi amministrativi (più precisamente con la \textit{capability} \const{CAP\_SYS\_RESOURCE}) ma @@ -3938,7 +3938,8 @@ I rispettivi prototipi sono: \fhead{time.h} \fdecl{int mq\_timedsend(mqd\_t mqdes, const char *msg\_ptr, size\_t msg\_len, \\ -\phantom{int mq\_timedsend(}unsigned int msg\_prio, const struct timespec *abs\_timeout)} +\phantom{int mq\_timedsend(}unsigned int msg\_prio, const struct timespec +*abs\_timeout)} \fdesc{Esegue l'inserimento di un messaggio su una coda entro un tempo specificato} } @@ -3973,7 +3974,7 @@ priorità maggiore vengono inseriti davanti a quelli di priorità inferiore, e quindi saranno riletti per primi. A parità del valore della priorità il messaggio sarà inserito in coda a tutti quelli che hanno la stessa priorità che quindi saranno letti con la politica di una \textit{fifo}. Il valore della -priorità non può eccedere il limite di sistema \const{MQ\_PRIO\_MAX}, che al +priorità non può eccedere il limite di sistema \constd{MQ\_PRIO\_MAX}, che al momento è pari a 32768. Qualora la coda sia piena, entrambe le funzioni si bloccano, a meno che non @@ -4194,7 +4195,7 @@ mount -t tmpfs -o size=128M,nr_inodes=10k,mode=700 tmpfs /mytmpfs Il filesystem riconosce, oltre quelle mostrate, le opzioni \texttt{uid} e \texttt{gid} che identificano rispettivamente utente e gruppo cui assegnarne la titolarità, e \texttt{nr\_blocks} che permette di specificarne la -dimensione in blocchi, cioè in multipli di \const{PAGECACHE\_SIZE} che in +dimensione in blocchi, cioè in multipli di \constd{PAGECACHE\_SIZE} che in questo caso è l'unità di allocazione elementare. La funzione che permette di aprire un segmento di memoria condivisa POSIX, ed @@ -4424,7 +4425,7 @@ esistente o per crearne uno nuovi, i relativi prototipi sono: \fdesc{Crea un semaforo o ne apre uno esistente.} } {La funzione ritorna l'indirizzo del semaforo in caso di successo e - \const{SEM\_FAILED} per un errore, nel qual caso \var{errno} assumerà uno + \constd{SEM\_FAILED} per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EACCES}] il semaforo esiste ma non si hanno permessi @@ -4432,7 +4433,7 @@ esistente o per crearne uno nuovi, i relativi prototipi sono: \item[\errcode{EEXIST}] si sono specificati \const{O\_CREAT} e \const{O\_EXCL} ma il semaforo esiste. \item[\errcode{EINVAL}] il valore di \param{value} eccede - \const{SEM\_VALUE\_MAX} o il nome è solo ``\texttt{/}''. + \constd{SEM\_VALUE\_MAX} o il nome è solo ``\texttt{/}''. \item[\errcode{ENAMETOOLONG}] si è utilizzato un nome troppo lungo. \item[\errcode{ENOENT}] non si è usato \const{O\_CREAT} ed il nome specificato non esiste. @@ -4527,7 +4528,7 @@ semaforo con una chiamata a \func{sem\_post}) così che poi essa possa decrementarlo con successo e proseguire. Si tenga presente che la funzione può sempre essere interrotta da un segnale, -nel qual caso si avrà un errore di \const{EINTR}; inoltre questo avverrà +nel qual caso si avrà un errore di \errval{EINTR}; inoltre questo avverrà comunque, anche qualora si fosse richiesta la gestione con la semantica BSD, installando il gestore del suddetto segnale con l'opzione \const{SA\_RESTART} (vedi sez.~\ref{sec:sig_sigaction}) per riavviare le \textit{system call} diff --git a/netlayer.tex b/netlayer.tex index a7d778b..f113a7e 100644 --- a/netlayer.tex +++ b/netlayer.tex @@ -304,24 +304,24 @@ priorità e politiche di distribuzione degli stessi. \multicolumn{2}{|c|}{\textbf{Valore}}&\textbf{Significato}\\ \hline \hline - \const{IPTOS\_LOWDELAY} &\texttt{0x10}& Minimizza i ritardi + \constd{IPTOS\_LOWDELAY} &\texttt{0x10}& Minimizza i ritardi per rendere più veloce possibile la ritrasmissione dei pacchetti (usato per traffico interattivo di controllo come SSH).\\ - \const{IPTOS\_THROUGHPUT} &\texttt{0x8} & Ottimizza la trasmissione + \constd{IPTOS\_THROUGHPUT} &\texttt{0x8} & Ottimizza la trasmissione per rendere il più elevato possibile il flusso netto di dati (usato su traffico dati, come quello di FTP).\\ - \const{IPTOS\_RELIABILITY} &\texttt{0x4} & Ottimizza la trasmissione + \constd{IPTOS\_RELIABILITY} &\texttt{0x4} & Ottimizza la trasmissione per ridurre al massimo le perdite di pacchetti (usato su traffico soggetto a rischio di perdita di pacchetti come TFTP o DHCP).\\ - \const{IPTOS\_MINCOST} &\texttt{0x2} & Indica i dati di riempimento, + \constd{IPTOS\_MINCOST} &\texttt{0x2} & Indica i dati di riempimento, dove non interessa se si ha una bassa velocità di trasmissione, da utilizzare @@ -609,11 +609,10 @@ quello di IPv6 sono le seguenti: frammentazione di pacchetti troppo grandi potrà essere gestita solo ai capi della comunicazione (usando un'apposita estensione vedi sez.~\ref{sec:IP_ipv6_extens}). -\item IPv6 richiede il supporto per il \itindex{Maximum~Transfer~Unit~(MTU)} - \textit{path MTU discovery} (cioè il protocollo per la selezione della - massima lunghezza del pacchetto); seppure questo sia in teoria opzionale, - senza di esso non sarà possibile inviare pacchetti più larghi della - dimensione minima (576 byte). +\item IPv6 richiede il supporto per il \textit{path MTU discovery} (cioè il + protocollo per la selezione della massima lunghezza del pacchetto); seppure + questo sia in teoria opzionale, senza di esso non sarà possibile inviare + pacchetti più larghi della dimensione minima (576 byte). \end{itemize} \subsection{Gli indirizzi di IPv6} diff --git a/network.tex b/network.tex index 2e1d070..6470c1f 100644 --- a/network.tex +++ b/network.tex @@ -627,17 +627,18 @@ protocollo IP sono forniti nell'appendice sez.~\ref{sec:ip_protocol}. \subsection{User Datagram Protocol (UDP)} \label{sec:net_udp} -UDP è un protocollo di trasporto molto semplice; la sua descrizione completa è -contenuta dell'\href{http://www.ietf.org/rfc/rfc0768.txt}{RFC~768}, ma in -sostanza esso è una semplice interfaccia al protocollo IP dal livello di -trasporto. Quando un'applicazione usa UDP essa scrive un pacchetto di dati (il -cosiddetto \textit{datagram} che da il nome al protocollo) su un socket, al -pacchetto viene aggiunto un header molto semplice (per una descrizione più -accurata vedi sez.~\ref{sec:udp_protocol}), e poi viene passato al livello -superiore (IPv4 o IPv6 che sia) che lo spedisce verso la destinazione. Dato -che né IPv4 né IPv6 garantiscono l'affidabilità niente assicura che il -pacchetto arrivi a destinazione, né che più pacchetti arrivino nello stesso -ordine in cui sono stati spediti. +Il protocollo UDP è un protocollo di trasporto molto semplice; la sua +descrizione completa è contenuta +dell'\href{http://www.ietf.org/rfc/rfc0768.txt}{RFC~768}, ma in sostanza esso +è una semplice interfaccia al protocollo IP dal livello di trasporto. Quando +un'applicazione usa UDP essa scrive un pacchetto di dati (il cosiddetto +\textit{datagram} che da il nome al protocollo) su un socket, al pacchetto +viene aggiunto un header molto semplice (per una descrizione più accurata vedi +sez.~\ref{sec:udp_protocol}), e poi viene passato al livello superiore (IPv4 o +IPv6 che sia) che lo spedisce verso la destinazione. Dato che né IPv4 né IPv6 +garantiscono l'affidabilità niente assicura che il pacchetto arrivi a +destinazione, né che più pacchetti arrivino nello stesso ordine in cui sono +stati spediti. Pertanto il problema principale che si affronta quando si usa UDP è la mancanza di affidabilità, se si vuole essere sicuri che i pacchetti arrivino a @@ -698,9 +699,9 @@ minuti. Inoltre, per tenere conto delle diverse condizioni in cui può trovarsi la linea di comunicazione, TCP comprende anche un algoritmo di calcolo dinamico del tempo di andata e ritorno dei pacchetti fra un client e un server (il -cosiddetto RTT, \itindex{Round~Trip~Time~(RTT)} \textit{Round Trip Time}), che -lo rende in grado di adattarsi alle condizioni della rete per non generare -inutili ritrasmissioni o cadere facilmente in timeout. +cosiddetto RTT, \textit{Round Trip Time}), che lo rende in grado di adattarsi +alle condizioni della rete per non generare inutili ritrasmissioni o cadere +facilmente in timeout. Inoltre TCP è in grado di preservare l'ordine dei dati assegnando un numero di sequenza ad ogni byte che trasmette. Ad esempio se un'applicazione scrive 3000 @@ -846,7 +847,7 @@ annuncia all'altro capo della connessione la dimensione massima dimensione del segmento di dati che può essere ricevuto, così da evitare la frammentazione. Di norma viene impostato alla dimensione della MTU dell'interfaccia meno la lunghezza delle intestazioni di IP e TCP, in Linux il -default, mantenuto nella costante \const{TCP\_MSS} è 512. +default, mantenuto nella costante \constd{TCP\_MSS} è 512. \itindend{Maximum~Transfer~Unit~(MTU)} diff --git a/othersock.tex b/othersock.tex index 6d73bee..3f2e28a 100644 --- a/othersock.tex +++ b/othersock.tex @@ -55,11 +55,10 @@ utilizzando per il tipo di socket il valore \const{SOCK\_DGRAM}. Questa differenza comporta ovviamente che anche le modalità con cui si usano i socket UDP sono completamente diverse rispetto ai socket TCP, ed in particolare non esistendo il concetto di connessione non esiste il meccanismo -del \itindex{three~way~handshake} \textit{three way handshake} né quello degli -stati del protocollo. In realtà tutto quello che avviene nella comunicazione -attraverso dei socket UDP è la trasmissione di un pacchetto da un client ad un -server o viceversa, secondo lo schema illustrato in -fig.~\ref{fig:UDP_packet-exchange}. +del \textit{three way handshake} né quello degli stati del protocollo. In +realtà tutto quello che avviene nella comunicazione attraverso dei socket UDP +è la trasmissione di un pacchetto da un client ad un server o viceversa, +secondo lo schema illustrato in fig.~\ref{fig:UDP_packet-exchange}. \begin{figure}[!htb] \centering \includegraphics[width=10cm]{img/udp_connection} @@ -210,11 +209,11 @@ qualora si sia specificato un indirizzo è possibile ricevere un errore di Finora abbiamo tralasciato l'argomento \param{flags}; questo è un intero usato come maschera binaria che permette di impostare una serie di modalità di funzionamento della comunicazione attraverso il socket (come -\const{MSG\_NOSIGNAL} che impedisce l'invio del segnale \signal{SIGPIPE} quando -si è già chiuso il capo locale della connessione). Torneremo con maggiori -dettagli sul significato di questo argomento in sez.~\ref{sec:net_sendmsg}, -dove tratteremo le funzioni avanzate dei socket, per il momento ci si può -limitare ad usare sempre un valore nullo. +\constd{MSG\_NOSIGNAL} che impedisce l'invio del segnale \signal{SIGPIPE} +quando si è già chiuso il capo locale della connessione). Torneremo con +maggiori dettagli sul significato di questo argomento in +sez.~\ref{sec:net_sendmsg}, dove tratteremo le funzioni avanzate dei socket, +per il momento ci si può limitare ad usare sempre un valore nullo. La seconda funzione utilizzata nella comunicazione fra socket UDP è \funcd{recvfrom}, che serve a ricevere i dati inviati da un altro socket; il diff --git a/prochand.tex b/prochand.tex index 1a51f3c..db19575 100644 --- a/prochand.tex +++ b/prochand.tex @@ -2962,8 +2962,8 @@ corrente. Benché la funzione sia utilizzabile anche con processi sottoposti a politica ordinaria essa ha senso soltanto per quelli \textit{real-time}, dato che per i primi la priorità statica può essere soltanto nulla. La disponibilità di entrambe le funzioni può essere verificata controllando la -macro \macrod{\_POSIX\_PRIORITY\_SCHEDULING} che è definita -nell'\textit{header file} \headfiled{sched.h}. +macro \macro{\_POSIX\_PRIORITY\_SCHEDULING} che è definita nell'\textit{header + file} \headfiled{sched.h}. Se invece si vuole sapere quale è politica di \textit{scheduling} di un processo si può usare la funzione di sistema \funcd{sched\_getscheduler}, il @@ -4477,8 +4477,8 @@ parte del programmatore. In genere le funzioni di libreria non sono rientranti, molte di esse ad esempio utilizzano variabili statiche, la \acr{glibc} però mette a -disposizione due macro di compilatore, \macrod{\_REENTRANT} e -\macrod{\_THREAD\_SAFE}, la cui definizione attiva le versioni rientranti di +disposizione due macro di compilatore, \macro{\_REENTRANT} e +\macro{\_THREAD\_SAFE}, la cui definizione attiva le versioni rientranti di varie funzioni di libreria, che sono identificate aggiungendo il suffisso \code{\_r} al nome della versione normale. diff --git a/signal.tex b/signal.tex index e348bb1..f78b3db 100644 --- a/signal.tex +++ b/signal.tex @@ -2824,7 +2824,7 @@ Secondo lo standard POSIX la profondità della coda è indicata dalla costante \constd{SIGQUEUE\_MAX}, una della tante costanti di sistema definite dallo standard POSIX che non abbiamo riportato esplicitamente in sez.~\ref{sec:sys_limits}. Il suo valore minimo secondo lo standard, -\constd{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux la coda ha una +\macrod{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux la coda ha una dimensione variabile; fino alla versione 2.6.7 c'era un limite massimo globale che poteva essere impostato come parametro del kernel in \sysctlfiled{kernel/rtsig-max} ed il valore predefinito era pari a 1024. A @@ -3555,7 +3555,7 @@ singolo (in gergo \textit{one shot}). Infine, quando un timer non viene più utilizzato, lo si può cancellare, rimuovendolo dal sistema e recuperando le relative risorse, effettuando in -sostanza l'operazione inversa rispetto a \funcd{timer\_create}. Per questo +sostanza l'operazione inversa rispetto a \func{timer\_create}. Per questo compito lo standard prevede una apposita funzione di sistema, \funcd{timer\_delete}, il cui prototipo è: diff --git a/sockctrl.tex b/sockctrl.tex index 78b2dc1..7d0d957 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -296,43 +296,43 @@ comportamento del \textit{resolver}. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{RES\_INIT} & Viene attivato se è stata chiamata - \func{res\_init}. \\ - \const{RES\_DEBUG} & Stampa dei messaggi di debug.\\ - \const{RES\_AAONLY} & Accetta solo risposte autoritative.\\ - \const{RES\_USEVC} & Usa connessioni TCP per contattare i server - invece che l'usuale UDP.\\ - \const{RES\_PRIMARY} & Interroga soltanto server DNS primari. - \\ - \const{RES\_IGNTC} & Ignora gli errori di troncamento, non ritenta la - richiesta con una connessione TCP.\\ - \const{RES\_RECURSE} & Imposta il bit che indica che si desidera - eseguire una interrogazione ricorsiva.\\ - \const{RES\_DEFNAMES} & Se attivo \func{res\_search} aggiunge il nome - del dominio di default ai nomi singoli (che non - contengono cioè un ``\texttt{.}'').\\ - \const{RES\_STAYOPEN} & Usato con \const{RES\_USEVC} per mantenere - aperte le connessioni TCP fra interrogazioni - diverse. \\ - \const{RES\_DNSRCH} & Se attivo \func{res\_search} esegue le ricerche - di nomi di macchine nel dominio corrente o nei - domini ad esso sovrastanti.\\ - \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 - \envvar{HOSTALIASES}.\\ - \const{RES\_USE\_INET6} & Restituisce indirizzi IPv6 con - \func{gethostbyname}. \\ - \const{RES\_ROTATE} & Ruota la lista dei server DNS dopo ogni - interrogazione.\\ - \const{RES\_NOCHECKNAME}& Non controlla i nomi per verificarne la - correttezza sintattica. \\ - \const{RES\_KEEPTSIG} & Non elimina i record di tipo \texttt{TSIG}.\\ - \const{RES\_BLAST} & Effettua un ``\textit{blast}'' inviando - simultaneamente le richieste a tutti i server; - non ancora implementata. \\ - \const{RES\_DEFAULT} & Combinazione di \const{RES\_RECURSE}, - \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}.\\ + \constd{RES\_INIT} & Viene attivato se è stata chiamata + \func{res\_init}. \\ + \constd{RES\_DEBUG} & Stampa dei messaggi di debug.\\ + \constd{RES\_AAONLY} & Accetta solo risposte autoritative.\\ + \constd{RES\_USEVC} & Usa connessioni TCP per contattare i server + invece che l'usuale UDP.\\ + \constd{RES\_PRIMARY} & Interroga soltanto server DNS primari. + \\ + \constd{RES\_IGNTC} & Ignora gli errori di troncamento, non ritenta la + richiesta con una connessione TCP.\\ + \constd{RES\_RECURSE} & Imposta il bit che indica che si desidera + eseguire una interrogazione ricorsiva.\\ + \constd{RES\_DEFNAMES} & Se attivo \func{res\_search} aggiunge il nome + del dominio di default ai nomi singoli (che non + contengono cioè un ``\texttt{.}'').\\ + \constd{RES\_STAYOPEN} & Usato con \const{RES\_USEVC} per mantenere + aperte le connessioni TCP fra interrogazioni + diverse. \\ + \constd{RES\_DNSRCH} & Se attivo \func{res\_search} esegue le ricerche + di nomi di macchine nel dominio corrente o nei + domini ad esso sovrastanti.\\ + \constd{RES\_INSECURE1} & Blocca i controlli di sicurezza di tipo 1.\\ + \constd{RES\_INSECURE2} & Blocca i controlli di sicurezza di tipo 2.\\ + \constd{RES\_NOALIASES} & Blocca l'uso della variabile di ambiente + \envvar{HOSTALIASES}.\\ + \constd{RES\_USE\_INET6} & Restituisce indirizzi IPv6 con + \func{gethostbyname}. \\ + \constd{RES\_ROTATE} & Ruota la lista dei server DNS dopo ogni + interrogazione.\\ + \constd{RES\_NOCHECKNAME}& Non controlla i nomi per verificarne la + correttezza sintattica. \\ + \constd{RES\_KEEPTSIG} & Non elimina i record di tipo \texttt{TSIG}.\\ + \constd{RES\_BLAST} & Effettua un ``\textit{blast}'' inviando + simultaneamente le richieste a tutti i server; + non ancora implementata. \\ + \constd{RES\_DEFAULT} & Combinazione di \const{RES\_RECURSE}, + \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}.\\ \hline \end{tabular} \caption{Costanti utilizzabili come valori per \var{\_res.options}.} @@ -428,7 +428,7 @@ pratica oggi viene utilizzata soltanto quella degli indirizzi internet; le costanti che identificano dette classi, da usare come valore per l'argomento \param{class} delle precedenti funzioni, sono riportate in tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe - \const{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta.} + \constd{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta.} \begin{table}[htb] \centering @@ -438,12 +438,12 @@ tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{C\_IN} & Indirizzi internet, in pratica i soli utilizzati oggi.\\ - \const{C\_HS} & Indirizzi \textit{Hesiod}, utilizzati solo al MIT, oggi - completamente estinti. \\ - \const{C\_CHAOS}& Indirizzi per la rete \textit{Chaosnet}, un'altra rete - sperimentale nata al MIT. \\ - \const{C\_ANY} & Indica un indirizzo di classe qualunque.\\ + \constd{C\_IN} & Indirizzi internet, in pratica i soli utilizzati oggi.\\ + \constd{C\_HS} & Indirizzi \textit{Hesiod}, utilizzati solo al MIT, oggi + completamente estinti. \\ + \constd{C\_CHAOS}& Indirizzi per la rete \textit{Chaosnet}, un'altra rete + sperimentale nata al MIT. \\ + \constd{C\_ANY} & Indica un indirizzo di classe qualunque.\\ \hline \end{tabular} \caption{Costanti identificative delle classi di indirizzi per l'argomento @@ -476,47 +476,47 @@ normalmente sono anche usati come nomi per indicare i record. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{T\_A} & Indirizzo di una stazione.\\ - \const{T\_NS} & Server DNS autoritativo per il dominio richiesto.\\ - \const{T\_MD} & Destinazione per la posta elettronica.\\ - \const{T\_MF} & Redistributore per la posta elettronica.\\ - \const{T\_CNAME} & Nome canonico.\\ - \const{T\_SOA} & Inizio di una zona di autorità.\\ - \const{T\_MB} & Nome a dominio di una casella di posta.\\ - \const{T\_MG} & Nome di un membro di un gruppo di posta.\\ - \const{T\_MR} & Nome di un cambiamento di nome per la posta.\\ - \const{T\_NULL} & Record nullo.\\ - \const{T\_WKS} & Servizio noto.\\ - \const{T\_PTR} & Risoluzione inversa di un indirizzo numerico.\\ - \const{T\_HINFO} & Informazione sulla stazione.\\ - \const{T\_MINFO} & Informazione sulla casella di posta.\\ - \const{T\_MX} & Server cui instradare la posta per il dominio.\\ - \const{T\_TXT} & Stringhe di testo (libere).\\ - \const{T\_RP} & Nome di un responsabile (\textit{responsible person}).\\ - \const{T\_AFSDB} & Database per una cella AFS.\\ - \const{T\_X25} & Indirizzo di chiamata per X.25.\\ - \const{T\_ISDN} & Indirizzo di chiamata per ISDN.\\ - \const{T\_RT} & Router.\\ - \const{T\_NSAP} & Indirizzo NSAP.\\ - \const{T\_NSAP\_PTR}& Risoluzione inversa per NSAP (deprecato).\\ - \const{T\_SIG} & Firma digitale di sicurezza.\\ - \const{T\_KEY} & Chiave per firma.\\ - \const{T\_PX} & Corrispondenza per la posta X.400.\\ - \const{T\_GPOS} & Posizione geografica.\\ - \const{T\_AAAA} & Indirizzo IPv6.\\ - \const{T\_LOC} & Informazione di collocazione.\\ - \const{T\_NXT} & Dominio successivo.\\ - \const{T\_EID} & Identificatore di punto conclusivo.\\ - \const{T\_NIMLOC}& Posizionatore \textit{nimrod}.\\ - \const{T\_SRV} & Servizio.\\ - \const{T\_ATMA} & Indirizzo ATM.\\ - \const{T\_NAPTR} & Puntatore ad una \textit{naming authority}.\\ - \const{T\_TSIG} & Firma di transazione.\\ - \const{T\_IXFR} & Trasferimento di zona incrementale.\\ - \const{T\_AXFR} & Trasferimento di zona di autorità.\\ - \const{T\_MAILB} & Trasferimento di record di caselle di posta.\\ - \const{T\_MAILA} & Trasferimento di record di server di posta.\\ - \const{T\_ANY} & Valore generico.\\ + \constd{T\_A} & Indirizzo di una stazione.\\ + \constd{T\_NS} & Server DNS autoritativo per il dominio richiesto.\\ + \constd{T\_MD} & Destinazione per la posta elettronica.\\ + \constd{T\_MF} & Redistributore per la posta elettronica.\\ + \constd{T\_CNAME} & Nome canonico.\\ + \constd{T\_SOA} & Inizio di una zona di autorità.\\ + \constd{T\_MB} & Nome a dominio di una casella di posta.\\ + \constd{T\_MG} & Nome di un membro di un gruppo di posta.\\ + \constd{T\_MR} & Nome di un cambiamento di nome per la posta.\\ + \constd{T\_NULL} & Record nullo.\\ + \constd{T\_WKS} & Servizio noto.\\ + \constd{T\_PTR} & Risoluzione inversa di un indirizzo numerico.\\ + \constd{T\_HINFO} & Informazione sulla stazione.\\ + \constd{T\_MINFO} & Informazione sulla casella di posta.\\ + \constd{T\_MX} & Server cui instradare la posta per il dominio.\\ + \constd{T\_TXT} & Stringhe di testo (libere).\\ + \constd{T\_RP} & Nome di un responsabile (\textit{responsible person}).\\ + \constd{T\_AFSDB} & Database per una cella AFS.\\ + \constd{T\_X25} & Indirizzo di chiamata per X.25.\\ + \constd{T\_ISDN} & Indirizzo di chiamata per ISDN.\\ + \constd{T\_RT} & Router.\\ + \constd{T\_NSAP} & Indirizzo NSAP.\\ + \constd{T\_NSAP\_PTR}& Risoluzione inversa per NSAP (deprecato).\\ + \constd{T\_SIG} & Firma digitale di sicurezza.\\ + \constd{T\_KEY} & Chiave per firma.\\ + \constd{T\_PX} & Corrispondenza per la posta X.400.\\ + \constd{T\_GPOS} & Posizione geografica.\\ + \constd{T\_AAAA} & Indirizzo IPv6.\\ + \constd{T\_LOC} & Informazione di collocazione.\\ + \constd{T\_NXT} & Dominio successivo.\\ + \constd{T\_EID} & Identificatore di punto conclusivo.\\ + \constd{T\_NIMLOC}& Posizionatore \textit{nimrod}.\\ + \constd{T\_SRV} & Servizio.\\ + \constd{T\_ATMA} & Indirizzo ATM.\\ + \constd{T\_NAPTR} & Puntatore ad una \textit{naming authority}.\\ + \constd{T\_TSIG} & Firma di transazione.\\ + \constd{T\_IXFR} & Trasferimento di zona incrementale.\\ + \constd{T\_AXFR} & Trasferimento di zona di autorità.\\ + \constd{T\_MAILB} & Trasferimento di record di caselle di posta.\\ + \constd{T\_MAILA} & Trasferimento di record di server di posta.\\ + \constd{T\_ANY} & Valore generico.\\ \hline \end{tabular} \caption{Costanti identificative del tipo di record per l'argomento @@ -578,15 +578,15 @@ tab.~\ref{tab:h_errno_values}. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{HOST\_NOT\_FOUND} & L'indirizzo richiesto non è valido e la + \constd{HOST\_NOT\_FOUND}& L'indirizzo richiesto non è valido e la macchina indicata è sconosciuta.\\ - \const{NO\_ADDRESS} & Il nome a dominio richiesto è valido, ma non ha + \constd{NO\_ADDRESS} & Il nome a dominio richiesto è valido, ma non ha un indirizzo associato ad esso (alternativamente può essere indicato come - \const{NO\_DATA}).\\ - \const{NO\_RECOVERY} & Si è avuto un errore non recuperabile + \constd{NO\_DATA}).\\ + \constd{NO\_RECOVERY} & Si è avuto un errore non recuperabile nell'interrogazione di un server DNS.\\ - \const{TRY\_AGAIN} & Si è avuto un errore temporaneo + \constd{TRY\_AGAIN} & Si è avuto un errore temporaneo nell'interrogazione di un server DNS, si può ritentare l'interrogazione in un secondo tempo.\\ @@ -627,12 +627,11 @@ argomento (che si presume sia dato da \var{h\_errno}). \subsection{La risoluzione dei nomi a dominio} \label{sec:sock_name_services} -La principale funzionalità del \itindex{resolver} \textit{resolver} resta -quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci -dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le -funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui -scopo è ottenere l'indirizzo di una stazione noto il suo nome a dominio, il -suo prototipo è: +La principale funzionalità del \textit{resolver} resta quella di risolvere i +nomi a dominio in indirizzi IP, per cui non ci dedicheremo oltre alle funzioni +di richiesta generica ed esamineremo invece le funzioni a questo dedicate. La +prima funzione è \funcd{gethostbyname} il cui scopo è ottenere l'indirizzo di +una stazione noto il suo nome a dominio, il suo prototipo è: \begin{prototype}{netdb.h} {struct hostent *gethostbyname(const char *name)} @@ -692,10 +691,10 @@ Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per -modificare le opzioni del \itindex{resolver} \textit{resolver}; dato che -questo non è molto comodo è stata definita\footnote{questa è una estensione - fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.} -un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è: +modificare le opzioni del \textit{resolver}; dato che questo non è molto +comodo è stata definita\footnote{questa è una estensione fornita dalle + \acr{glibc}, disponibile anche in altri sistemi unix-like.} un'altra +funzione, \funcd{gethostbyname2}, il cui prototipo è: \begin{functions} \headdecl{netdb.h} \headdecl{sys/socket.h} @@ -728,11 +727,11 @@ suoi risultati. Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un -programma che esegue una semplice interrogazione al -\itindex{resolver} \textit{resolver} usando \func{gethostbyname} e poi ne -stampa a video i risultati. Al solito il sorgente completo, che comprende il -trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto, -è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida. +programma che esegue una semplice interrogazione al \textit{resolver} usando +\func{gethostbyname} e poi ne stampa a video i risultati. Al solito il +sorgente completo, che comprende il trattamento delle opzioni ed una funzione +per stampare un messaggio di aiuto, è nel file \texttt{mygethost.c} dei +sorgenti allegati alla guida. Il programma richiede un solo argomento che specifichi il nome da cercare, senza il quale (\texttt{\small 15--18}) esce con un errore. Dopo di che @@ -968,19 +967,19 @@ tab.~\ref{tab:sock_getipnodebyname_flags}. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{AI\_V4MAPPED} & Usato con \const{AF\_INET6} per richiedere una - ricerca su un indirizzo IPv4 invece che IPv6; gli - eventuali risultati saranno rimappati su indirizzi - IPv6.\\ - \const{AI\_ALL} & Usato con \const{AI\_V4MAPPED}; richiede sia - indirizzi IPv4 che IPv6, e gli indirizzi IPv4 - saranno rimappati in IPv6.\\ - \const{AI\_ADDRCONFIG}& Richiede che una richiesta IPv4 o IPv6 venga - eseguita solo se almeno una interfaccia del - sistema è associata ad un indirizzo di tale tipo.\\ - \const{AI\_DEFAULT} & Il valore di default, è equivalente alla - combinazione di \const{AI\_ADDRCONFIG} e di - \const{AI\_V4MAPPED}.\\ + \constd{AI\_V4MAPPED} & Usato con \const{AF\_INET6} per richiedere una + ricerca su un indirizzo IPv4 invece che IPv6; gli + eventuali risultati saranno rimappati su indirizzi + IPv6.\\ + \constd{AI\_ALL} & Usato con \const{AI\_V4MAPPED}; richiede sia + indirizzi IPv4 che IPv6, e gli indirizzi IPv4 + saranno rimappati in IPv6.\\ + \constd{AI\_ADDRCONFIG}& Richiede che una richiesta IPv4 o IPv6 venga + eseguita solo se almeno una interfaccia del + sistema è associata ad un indirizzo di tale tipo.\\ + \constd{AI\_DEFAULT} & Il valore di default, è equivalente alla + combinazione di \const{AI\_ADDRCONFIG} e di + \const{AI\_V4MAPPED}.\\ \hline \end{tabular} \caption{Valori possibili per i bit dell'argomento \param{flags} della @@ -1166,7 +1165,7 @@ modo si può far ricominciare da capo una lettura sequenziale. L'argomento 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. +funzione, \func{endservent}, provvede semplicemente a chiudere il file. Queste tre funzioni per la lettura sequenziale di nuovo sono presenti per ciascuno dei vari tipi di informazione relative alle reti di @@ -1341,37 +1340,37 @@ nella selezione. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{AI\_PASSIVE} & Viene utilizzato per ottenere un indirizzo in - formato adatto per una successiva chiamata a - \func{bind}. Se specificato quando si è usato - \val{NULL} come valore per \param{node} gli - indirizzi restituiti saranno inizializzati al - valore generico (\const{INADDR\_ANY} per IPv4 e - \const{IN6ADDR\_ANY\_INIT} per IPv6), altrimenti - verrà usato l'indirizzo dell'interfaccia di - \textit{loopback}. Se invece non è impostato gli - indirizzi verranno restituiti in formato adatto ad - una chiamata a \func{connect} o \func{sendto}.\\ - \const{AI\_CANONNAME} & Richiede la restituzione del nome canonico della - macchina, che verrà salvato in una stringa il cui - indirizzo sarà restituito nel campo - \var{ai\_canonname} della prima struttura - \struct{addrinfo} dei risultati. Se il nome - canonico non è disponibile al suo posto - viene restituita una copia di \param{node}. \\ - \const{AI\_NUMERICHOST}& Se impostato il nome della macchina specificato - con \param{node} deve essere espresso in forma - numerica, altrimenti sarà restituito un errore - \const{EAI\_NONAME} (vedi - tab.~\ref{tab:addrinfo_error_code}), in questo - modo si evita ogni chiamata alle funzioni di - risoluzione.\\ + \constd{AI\_PASSIVE} & Viene utilizzato per ottenere un indirizzo in + formato adatto per una successiva chiamata a + \func{bind}. Se specificato quando si è usato + \val{NULL} come valore per \param{node} gli + indirizzi restituiti saranno inizializzati al + valore generico (\const{INADDR\_ANY} per IPv4 e + \const{IN6ADDR\_ANY\_INIT} per IPv6), altrimenti + verrà usato l'indirizzo dell'interfaccia di + \textit{loopback}. Se invece non è impostato gli + indirizzi verranno restituiti in formato adatto ad + una chiamata a \func{connect} o \func{sendto}.\\ + \constd{AI\_CANONNAME} & Richiede la restituzione del nome canonico della + macchina, che verrà salvato in una stringa il cui + indirizzo sarà restituito nel campo + \var{ai\_canonname} della prima struttura + \struct{addrinfo} dei risultati. Se il nome + canonico non è disponibile al suo posto + viene restituita una copia di \param{node}. \\ + \constd{AI\_NUMERICHOST}& Se impostato il nome della macchina specificato + con \param{node} deve essere espresso in forma + numerica, altrimenti sarà restituito un errore + \const{EAI\_NONAME} (vedi + tab.~\ref{tab:addrinfo_error_code}), in questo + modo si evita ogni chiamata alle funzioni di + risoluzione.\\ \const{AI\_V4MAPPED} & Stesso significato dell'analoga di - tab.~\ref{tab:sock_getipnodebyname_flags}.\\ + tab.~\ref{tab:sock_getipnodebyname_flags}.\\ \const{AI\_ALL} & Stesso significato dell'analoga di - tab.~\ref{tab:sock_getipnodebyname_flags}.\\ + tab.~\ref{tab:sock_getipnodebyname_flags}.\\ \const{AI\_ADDRCONFIG} & Stesso significato dell'analoga di - tab.~\ref{tab:sock_getipnodebyname_flags}.\\ + tab.~\ref{tab:sock_getipnodebyname_flags}.\\ \hline \end{tabular} \caption{Costanti associate ai bit del campo \var{ai\_flags} della struttura @@ -1404,37 +1403,37 @@ corrispondente è riportato tramite \var{errno}. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{EAI\_FAMILY} & La famiglia di indirizzi richiesta non è - supportata. \\ - \const{EAI\_SOCKTYPE}& Il tipo di socket richiesto non è supportato. \\ - \const{EAI\_BADFLAGS}& Il campo \var{ai\_flags} contiene dei valori non - validi. \\ - \const{EAI\_NONAME} & Il nome a dominio o il servizio non sono noti, - viene usato questo errore anche quando si specifica - il valore \val{NULL} per entrambi gli argomenti - \param{node} e \param{service}. \\ - \const{EAI\_SERVICE} & Il servizio richiesto non è disponibile per il tipo - di socket richiesto, anche se può esistere per - altri tipi di socket. \\ - \const{EAI\_ADDRFAMILY}& La rete richiesta non ha nessun indirizzo di rete - per la famiglia di indirizzi specificata. \\ - \const{EAI\_NODATA} & La macchina specificata esiste, ma non ha nessun - indirizzo di rete definito. \\ - \const{EAI\_MEMORY} & È stato impossibile allocare la memoria necessaria - alle operazioni. \\ - \const{EAI\_FAIL} & Il DNS ha restituito un errore di risoluzione - permanente. \\ - \const{EAI\_AGAIN} & Il DNS ha restituito un errore di risoluzione - temporaneo, si può ritentare in seguito. \\ - \const{EAI\_SYSTEM} & C'è stato un errore di sistema, si può controllare - \var{errno} per i dettagli. \\ + \constd{EAI\_FAMILY} & La famiglia di indirizzi richiesta non è + supportata. \\ + \constd{EAI\_SOCKTYPE}& Il tipo di socket richiesto non è supportato. \\ + \constd{EAI\_BADFLAGS}& Il campo \var{ai\_flags} contiene dei valori non + validi. \\ + \constd{EAI\_NONAME} & Il nome a dominio o il servizio non sono noti, + viene usato questo errore anche quando si specifica + il valore \val{NULL} per entrambi gli argomenti + \param{node} e \param{service}. \\ + \constd{EAI\_SERVICE} & Il servizio richiesto non è disponibile per il tipo + di socket richiesto, anche se può esistere per + altri tipi di socket. \\ + \constd{EAI\_ADDRFAMILY}& La rete richiesta non ha nessun indirizzo di rete + per la famiglia di indirizzi specificata. \\ + \constd{EAI\_NODATA} & La macchina specificata esiste, ma non ha nessun + indirizzo di rete definito. \\ + \constd{EAI\_MEMORY} & È stato impossibile allocare la memoria necessaria + alle operazioni. \\ + \constd{EAI\_FAIL} & Il DNS ha restituito un errore di risoluzione + permanente. \\ + \constd{EAI\_AGAIN} & Il DNS ha restituito un errore di risoluzione + temporaneo, si può ritentare in seguito. \\ + \constd{EAI\_SYSTEM} & C'è stato un errore di sistema, si può controllare + \var{errno} per i dettagli. \\ % \hline % TODO estensioni GNU, trovarne la documentazione -% \const{EAI\_INPROGRESS}& Richiesta in corso. \\ -% \const{EAI\_CANCELED}& La richiesta è stata cancellata.\\ -% \const{EAI\_NOTCANCELED}& La richiesta non è stata cancellata. \\ -% \const{EAI\_ALLDONE} & Tutte le richieste sono complete. \\ -% \const{EAI\_INTR} & Richiesta interrotta. \\ +% \constd{EAI\_INPROGRESS}& Richiesta in corso. \\ +% \constd{EAI\_CANCELED}& La richiesta è stata cancellata.\\ +% \constd{EAI\_NOTCANCELED}& La richiesta non è stata cancellata. \\ +% \constd{EAI\_ALLDONE} & Tutte le richieste sono complete. \\ +% \constd{EAI\_INTR} & Richiesta interrotta. \\ \hline \end{tabular} \caption{Costanti associate ai valori dei codici di errore della funzione @@ -1482,13 +1481,12 @@ lista illustrata in fig.~\ref{fig:sock_addrinfo_list}. \end{figure} Come primo esempio di uso di \func{getaddrinfo} vediamo un programma -elementare di interrogazione del \itindex{resolver} \textit{resolver} basato -questa funzione, il cui corpo principale è riportato in -fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa -la gestione delle opzioni in cui è gestita l'eventuale inizializzazione -dell'argomento \var{hints} per restringere le ricerche su protocolli, tipi di -socket o famiglie di indirizzi, è disponibile nel file \texttt{mygetaddr.c} -dei sorgenti allegati alla guida. +elementare di interrogazione del \textit{resolver} basato questa funzione, il +cui corpo principale è riportato in fig.~\ref{fig:mygetaddr_example}. Il +codice completo del programma, compresa la gestione delle opzioni in cui è +gestita l'eventuale inizializzazione dell'argomento \var{hints} per +restringere le ricerche su protocolli, tipi di socket o famiglie di indirizzi, +è disponibile nel file \texttt{mygetaddr.c} dei sorgenti allegati alla guida. \begin{figure}[!htbp] \footnotesize \centering @@ -1595,10 +1593,10 @@ per \param{res}. Si tenga presente infine che se si copiano i risultati da una delle strutture \struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre -avere cura di eseguire una \itindex{deep~copy} \textit{deep copy} in cui -si copiano anche tutti i dati presenti agli indirizzi contenuti nella -struttura \struct{addrinfo}, perché una volta disallocati i dati con -\func{freeaddrinfo} questi non sarebbero più disponibili. +avere cura di eseguire una \textit{deep copy} in cui si copiano anche tutti i +dati presenti agli indirizzi contenuti nella struttura \struct{addrinfo}, +perché una volta disallocati i dati con \func{freeaddrinfo} questi non +sarebbero più disponibili. Anche la nuova interfaccia definita da POSIX prevede una nuova funzione per eseguire la risoluzione inversa e determinare nomi di servizi e di dominio @@ -1645,20 +1643,20 @@ tab.~\ref{tab:getnameinfo_flags}. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{NI\_NOFQDN} & Richiede che venga restituita solo il nome della - macchina all'interno del dominio al posto del - nome completo (FQDN).\\ - \const{NI\_NUMERICHOST}& Richiede che venga restituita la forma numerica - dell'indirizzo (questo succede sempre se il nome - non può essere ottenuto).\\ - \const{NI\_NAMEREQD} & Richiede la restituzione di un errore se il nome - non può essere risolto.\\ - \const{NI\_NUMERICSERV}& Richiede che il servizio venga restituito in - forma numerica (attraverso il numero di porta).\\ - \const{NI\_DGRAM} & Richiede che venga restituito il nome del - servizio su UDP invece che quello su TCP per quei - pichi servizi (porte 512-214) che soni diversi - nei due protocolli.\\ + \constd{NI\_NOFQDN} & Richiede che venga restituita solo il nome della + macchina all'interno del dominio al posto del + nome completo (FQDN).\\ + \constd{NI\_NUMERICHOST}& Richiede che venga restituita la forma numerica + dell'indirizzo (questo succede sempre se il nome + non può essere ottenuto).\\ + \constd{NI\_NAMEREQD} & Richiede la restituzione di un errore se il nome + non può essere risolto.\\ + \constd{NI\_NUMERICSERV}& Richiede che il servizio venga restituito in + forma numerica (attraverso il numero di porta).\\ + \constd{NI\_DGRAM} & Richiede che venga restituito il nome del + servizio su UDP invece che quello su TCP per quei + pichi servizi (porte 512-214) che soni diversi + nei due protocolli.\\ \hline \end{tabular} \caption{Costanti associate ai bit dell'argomento \param{flags} della @@ -1671,7 +1669,7 @@ indirizzi indicati dagli argomenti \param{host} e \param{serv} come stringhe terminate dal carattere NUL, a meno che queste non debbano essere troncate 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 +\constd{NI\_MAXHOST} e \constd{NI\_MAXSERV}\footnote{in Linux le due costanti 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 @@ -1932,11 +1930,11 @@ riassunti i valori che possono essere usati per l'argomento \textbf{Livello} & \textbf{Significato} \\ \hline \hline - \const{SOL\_SOCKET}& Opzioni generiche dei socket.\\ - \const{SOL\_IP} & Opzioni specifiche per i socket che usano IPv4.\\ - \const{SOL\_TCP} & Opzioni per i socket che usano TCP.\\ - \const{SOL\_IPV6} & Opzioni specifiche per i socket che usano IPv6.\\ - \const{SOL\_ICMPV6}& Opzioni specifiche per i socket che usano ICMPv6.\\ + \constd{SOL\_SOCKET}& Opzioni generiche dei socket.\\ + \constd{SOL\_IP} & Opzioni specifiche per i socket che usano IPv4.\\ + \constd{SOL\_TCP} & Opzioni per i socket che usano TCP.\\ + \constd{SOL\_IPV6} & Opzioni specifiche per i socket che usano IPv6.\\ + \constd{SOL\_ICMPV6}& Opzioni specifiche per i socket che usano ICMPv6.\\ \hline \end{tabular} \caption{Possibili valori dell'argomento \param{level} delle @@ -2026,8 +2024,7 @@ tab.~\ref{tab:sock_opt_socklevel}. \const{SO\_KEEPALIVE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Controlla l'attività della connessione.\\ \const{SO\_OOBINLINE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Lascia in linea i dati \itindex{out-of-band} - \textit{out-of-band}.\\ + Lascia in linea i dati \textit{out-of-band}.\\ \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Basso livello sul buffer di ricezione.\\ \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}& @@ -2102,17 +2099,16 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: usato come valore logico. Maggiori dettagli sul suo funzionamento sono forniti in sez.~\ref{sec:sock_options_main}. -\item[\const{SO\_OOBINLINE}] se questa opzione viene abilitata i dati - \itindex{out-of-band} \textit{out-of-band} vengono inviati direttamente nel - flusso di dati del socket (e sono quindi letti con una normale \func{read}) - invece che restare disponibili solo per l'accesso con l'uso del flag - \const{MSG\_OOB} di \func{recvmsg}. L'argomento è trattato in dettaglio in +\item[\constd{SO\_OOBINLINE}] se questa opzione viene abilitata i dati + \textit{out-of-band} vengono inviati direttamente nel flusso di dati del + socket (e sono quindi letti con una normale \func{read}) invece che restare + disponibili solo per l'accesso con l'uso del flag \const{MSG\_OOB} di + \func{recvmsg}. L'argomento è trattato in dettaglio in sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che - supportino i dati \itindex{out-of-band} \textit{out-of-band} (non ha senso - per socket UDP ad esempio), ed utilizza per \param{optval} un intero usato - come valore logico. + supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad + esempio), ed utilizza per \param{optval} un intero usato come valore logico. -\item[\const{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il +\item[\constd{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il numero minimo di byte che devono essere presenti nel buffer di ricezione perché il kernel passi i dati all'utente, restituendoli ad una \func{read} o segnalando ad una \func{select} (vedi sez.~\ref{sec:TCP_sock_select}) che ci @@ -2121,7 +2117,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: essere cambiato; \func{getsockopt} leggerà questo valore mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. -\item[\const{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il +\item[\constd{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il numero minimo di byte che devono essere presenti nel buffer di trasmissione perché il kernel li invii al protocollo successivo, consentendo ad una \func{write} di ritornare o segnalando ad una \func{select} (vedi @@ -2131,7 +2127,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: sempre 1 e non può essere cambiato; \func{getsockopt} leggerà questo valore mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. -\item[\const{SO\_RCVTIMEO}] l'opzione permette di impostare un tempo massimo +\item[\constd{SO\_RCVTIMEO}] l'opzione permette di impostare un tempo massimo sulle operazioni di lettura da un socket, e prende per \param{optval} una struttura di tipo \struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct}) identica a quella usata con \func{select}. Con \func{getsockopt} si può @@ -2159,14 +2155,14 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: % TODO verificare il timeout con un programma di test -\item[\const{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo +\item[\constd{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo sulle operazioni di scrittura su un socket, ed usa gli stessi valori di \const{SO\_RCVTIMEO}. In questo caso però si avrà un errore di \errcode{EAGAIN} o \errcode{EWOULDBLOCK} per le funzioni di scrittura \func{write}, \func{writev}, \func{send}, \func{sendto} e \func{sendmsg} qualora queste restino bloccate per un tempo maggiore di quello specificato. -\item[\const{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il +\item[\constd{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il comportamento di BSD (in particolare ne riproduce i bug). Attualmente è una opzione usata solo per il protocollo UDP e ne è prevista la rimozione in futuro. L'opzione utilizza per \param{optval} un intero usato come valore @@ -2178,18 +2174,18 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: state rimosse con il passaggio al 2.2; è consigliato correggere i programmi piuttosto che usare questa funzione. -\item[\const{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain +\item[\constd{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain (vedi sez.~\ref{sec:unix_socket}) la ricezione dei messaggi di controllo di tipo \const{SCM\_CREDENTIALS}. Prende come \param{optval} un intero usato come valore logico. -\item[\const{SO\_PEERCRED}] questa opzione restituisce le credenziali del +\item[\constd{SO\_PEERCRED}] questa opzione restituisce le credenziali del processo remoto connesso al socket; l'opzione è disponibile solo per socket unix-domain e può essere usata solo con \func{getsockopt}. Utilizza per \param{optval} una apposita struttura \struct{ucred} (vedi sez.~\ref{sec:unix_socket}). -\item[\const{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il +\item[\constd{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il socket ad una particolare interfaccia, in modo che esso possa ricevere ed inviare pacchetti solo su quella. L'opzione richiede per \param{optval} il puntatore ad una stringa contenente il nome dell'interfaccia (ad esempio @@ -2197,24 +2193,24 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: \param{optlen} si può rimuovere un precedente collegamento. Il nome della interfaccia deve essere specificato con una stringa terminata - da uno zero e di lunghezza massima pari a \const{IFNAMSIZ}; l'opzione è + da uno zero e di lunghezza massima pari a \constd{IFNAMSIZ}; l'opzione è effettiva solo per alcuni tipi di socket, ed in particolare per quelli della famiglia \const{AF\_INET}; non è invece supportata per i \textit{packet socket} (vedi sez.~\ref{sec:socket_raw}). -\item[\const{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni +\item[\constd{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni dei socket; l'opzione utilizza per \param{optval} un intero usato come valore logico, e può essere utilizzata solo da un processo con i privilegi di amministratore (in particolare con la \textit{capability} \const{CAP\_NET\_ADMIN}). L'opzione necessita inoltre dell'opportuno supporto nel kernel;\footnote{deve cioè essere definita la macro di - preprocessore \macro{SOCK\_DEBUGGING} nel file \file{include/net/sock.h} + preprocessore \macrod{SOCK\_DEBUGGING} nel file \file{include/net/sock.h} dei sorgenti del kernel, questo è sempre vero nei kernel delle serie superiori alla 2.3, per i kernel delle serie precedenti invece è necessario aggiungere a mano detta definizione; è inoltre possibile abilitare anche il tracciamento degli stati del TCP definendo la macro - \macro{STATE\_TRACE} in \file{include/net/tcp.h}.} quando viene abilitata - una serie di messaggi con le informazioni di debug vengono inviati + \macrod{STATE\_TRACE} in \file{include/net/tcp.h}.} quando viene + abilitata una serie di messaggi con le informazioni di debug vengono inviati direttamente al sistema del kernel log.\footnote{si tenga presente che il comportamento è diverso da quanto avviene con BSD, dove l'opzione opera solo sui socket TCP, causando la scrittura di tutti i pacchetti inviati @@ -2231,37 +2227,37 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: socket. Maggiori dettagli sul suo funzionamento sono forniti in sez.~\ref{sec:sock_options_main}. -\item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket +\item[\constd{SO\_TYPE}] questa opzione permette di leggere il tipo di socket su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per \param{optval} un intero in cui verrà restituito il valore numerico che lo identifica (ad esempio \const{SOCK\_STREAM}). -\item[\const{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket +\item[\constd{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket su cui opera è stato posto in modalità di ricezione di eventuali connessioni con una chiamata a \func{listen}. L'opzione può essere usata soltanto con \func{getsockopt} e utilizza per \param{optval} un intero in cui viene restituito 1 se il socket è in ascolto e 0 altrimenti. -\item[\const{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei +\item[\constd{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei pacchetti del socket, saltando ogni processo relativo all'uso della tabella di routing del kernel. Prende per \param{optval} un intero usato come valore logico. -\item[\const{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast}; +\item[\constd{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast}; quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i pacchetti inviati all'indirizzo di \textit{broadcast}, e potranno scrivere pacchetti su tale indirizzo. Prende per \param{optval} un intero usato come valore logico. L'opzione non ha effetti su un socket di tipo \const{SOCK\_STREAM}. -\item[\const{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di +\item[\constd{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di trasmissione del socket. Prende per \param{optval} un intero indicante il numero di byte. Il valore di default ed il valore massimo che si possono specificare come argomento per questa opzione sono impostabili rispettivamente tramite gli opportuni valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}). -\item[\const{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di +\item[\constd{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di ricezione del socket. Prende per \param{optval} un intero indicante il numero di byte. Il valore di default ed il valore massimo che si può specificare come argomento per questa opzione sono impostabili tramiti gli @@ -2294,7 +2290,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: fig.~\ref{fig:sock_linger_struct}. Maggiori dettagli sul suo funzionamento sono forniti in sez.~\ref{sec:sock_options_main}. -\item[\const{SO\_PRIORITY}] questa opzione permette di impostare le priorità +\item[\constd{SO\_PRIORITY}] questa opzione permette di impostare le priorità per tutti i pacchetti che sono inviati sul socket, prende per \param{optval} un valore intero. Con questa opzione il kernel usa il valore per ordinare le priorità sulle code di rete,\footnote{questo richiede che sia abilitato il @@ -2307,7 +2303,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}. -\item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket; +\item[\constd{SO\_ERROR}] questa opzione riceve un errore presente sul socket; può essere utilizzata soltanto con \func{getsockopt} e prende per \param{optval} un valore intero, nel quale viene restituito il codice di errore, e la condizione di errore sul socket viene cancellata. Viene @@ -2315,14 +2311,14 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una \func{select} che ritorna a causa dello stesso. -\item[\const{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un +\item[\constd{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un socket un filtro di pacchetti che consente di selezionare quali pacchetti, fra tutti quelli ricevuti, verranno letti. Viene usato principalmente con i socket di tipo \const{PF\_PACKET} con la libreria \texttt{libpcap} per implementare programmi di cattura dei pacchetti, torneremo su questo in sez.~\ref{sec:packet_socket}. -\item[\const{SO\_DETACH\_FILTER}] consente di distaccare un filtro +\item[\constd{SO\_DETACH\_FILTER}] consente di distaccare un filtro precedentemente aggiunto ad un socket. % TODO documentare SO_ATTACH_FILTER e SO_DETACH_FILTER @@ -2585,7 +2581,7 @@ Il terzo impiego è simile al precedente e prevede l'uso di \func{bind} all'interno dello stesso programma per associare indirizzi locali diversi a socket diversi. In genere questo viene fatto per i socket UDP quando è necessario ottenere l'indirizzo a cui sono rivolte le richieste del client ed -il sistema non supporta l'opzione \const{IP\_RECVDSTADDR};\footnote{nel caso +il sistema non supporta l'opzione \constd{IP\_RECVDSTADDR};\footnote{nel caso di Linux questa opzione è stata supportata per in certo periodo nello sviluppo del kernel 2.1.x, ma è in seguito stata soppiantata dall'uso di \const{IP\_PKTINFO} (vedi sez.~\ref{sec:sock_ipv4_options}).} in tale modo @@ -2738,11 +2734,11 @@ socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni generiche una descrizione di esse è disponibile nella settima sezione delle pagine di manuale, nel caso specifico la documentazione si può consultare con \texttt{man 7 ip}.} Se si vuole operare su queste opzioni generiche il -livello da utilizzare è \const{SOL\_IP} (o l'equivalente \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 \headfiled{netinet/ip.h}, ed accessibili includendo detto -file. +livello da utilizzare è \const{SOL\_IP} (o l'equivalente +\constd{IPPROTO\_IP}); si è riportato un elenco di queste opzioni in +tab.~\ref{tab:sock_opt_iplevel}. Le costanti indicanti le opzioni e tutte le +altre costanti ad esse collegate sono definite in \headfiled{netinet/ip.h}, ed +accessibili includendo detto file. \begin{table}[!htb] \centering @@ -2778,7 +2774,7 @@ file. \const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}& Imposta il \textit{Path MTU Discovery}.\\ \const{IP\_MTU} &$\bullet$& & &\texttt{int}& - Legge il valore attuale della \itindex{Maximum~Transfer~Unit~(MTU)} MTU.\\ + Legge il valore attuale della MTU.\\ \const{IP\_ROUTER\_ALERT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Imposta l'opzione \textit{IP router alert} sui pacchetti.\\ \const{IP\_MULTICAST\_TTL} &$\bullet$&$\bullet$& &\texttt{int}& @@ -2803,7 +2799,7 @@ seguente elenco: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{IP\_OPTIONS}] l'opzione permette di impostare o leggere le +\item[\constd{IP\_OPTIONS}] l'opzione permette di impostare o leggere le opzioni del protocollo IP (si veda sez.~\ref{sec:IP_options}). L'opzione prende come valore dell'argomento \param{optval} un puntatore ad un buffer dove sono mantenute le opzioni, mentre \param{optlen} indica la dimensione @@ -2814,7 +2810,7 @@ seguente elenco: torneremo in parte sull'argomento in sez.~\ref{sec:sock_IP_options}. -\item[\const{IP\_PKTINFO}] Quando abilitata l'opzione permette di ricevere +\item[\constd{IP\_PKTINFO}] Quando abilitata l'opzione permette di ricevere insieme ai pacchetti un messaggio ancillare (vedi sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_PKTINFO} contenente una struttura \struct{pktinfo} (vedi fig.~\ref{fig:sock_pktinfo_struct}) che @@ -2854,14 +2850,14 @@ letto o scritto direttamente con \func{recvmsg} e \func{sendmsg} (vedi sez.~\ref{sec:net_sendmsg}). -\item[\const{IP\_RECVTOS}] Quando abilitata l'opzione permette di ricevere +\item[\constd{IP\_RECVTOS}] Quando abilitata l'opzione permette di ricevere insieme ai pacchetti un messaggio ancillare (vedi sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_TOS}, che contiene un byte con il valore del campo \textit{Type of Service} dell'intestazione IP del pacchetto stesso (vedi sez.~\ref{sec:IP_header}). Prende per \param{optval} un intero usato come valore logico. -\item[\const{IP\_RECVTTL}] Quando abilitata l'opzione permette di ricevere +\item[\constd{IP\_RECVTTL}] Quando abilitata l'opzione permette di ricevere insieme ai pacchetti un messaggio ancillare (vedi sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_RECVTTL}, contenente un byte con il valore del campo \textit{Time to Live} dell'intestazione IP @@ -2869,7 +2865,7 @@ sez.~\ref{sec:net_sendmsg}). intero usato come valore logico. L'opzione non è supportata per socket di tipo \const{SOCK\_STREAM}. -\item[\const{IP\_RECVOPTS}] Quando abilitata l'opzione permette di ricevere +\item[\constd{IP\_RECVOPTS}] Quando abilitata l'opzione permette di ricevere insieme ai pacchetti un messaggio ancillare (vedi sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_OPTIONS}, contenente le opzioni IP del protocollo (vedi sez.~\ref{sec:IP_options}). Le @@ -2878,13 +2874,13 @@ sez.~\ref{sec:net_sendmsg}). valore logico. L'opzione non è supportata per socket di tipo \const{SOCK\_STREAM}. -\item[\const{IP\_RETOPTS}] Identica alla precedente \const{IP\_RECVOPTS}, ma +\item[\constd{IP\_RETOPTS}] Identica alla precedente \const{IP\_RECVOPTS}, ma in questo caso restituisce i dati grezzi delle opzioni, senza che siano riempiti i capi di instradamento e le marche temporali. L'opzione richiede per \param{optval} un intero usato come valore logico. L'opzione non è supportata per socket di tipo \const{SOCK\_STREAM}. -\item[\const{IP\_TOS}] L'opzione consente di leggere o impostare il campo +\item[\constd{IP\_TOS}] L'opzione consente di leggere o impostare il campo \textit{Type of Service} dell'intestazione IP (per una trattazione più dettagliata, che riporta anche i valori possibili e le relative costanti di definizione si veda sez.~\ref{sec:IP_header}) che permette di indicare le @@ -2903,7 +2899,7 @@ sez.~\ref{sec:net_sendmsg}). dal protocollo utilizzando l'opzione \const{SO\_PRIORITY} illustrata in sez.~\ref{sec:sock_generic_options}. -\item[\const{IP\_TTL}] L'opzione consente di leggere o impostare per tutti i +\item[\constd{IP\_TTL}] L'opzione consente di leggere o impostare per tutti i pacchetti associati al socket il campo \textit{Time to Live} dell'intestazione IP che indica il numero massimo di \textit{hop} (passaggi da un router ad un altro) restanti al paccheto (per una trattazione più @@ -2911,7 +2907,7 @@ sez.~\ref{sec:net_sendmsg}). l'opzione richiede che \param{optval} sia un intero, che ne conterrà il valore. -\item[\const{IP\_MINTTL}] L'opzione, introdotta con il kernel 2.6.34, imposta +\item[\constd{IP\_MINTTL}] L'opzione, introdotta con il kernel 2.6.34, imposta un valore minimo per il campo \textit{Time to Live} dei pacchetti associati al socket su cui è attivata, che se non rispettato ne causa lo scarto automatico. L'opzione è nata per implementare @@ -2929,7 +2925,7 @@ sez.~\ref{sec:net_sendmsg}). senza carico aggiuntivo sulla CPU (che altrimenti dovrebbe calcolare una checksum).} -\item[\const{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso +\item[\constd{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso l'intestazione IP in cima ai propri dati. L'opzione è valida soltanto per socket di tipo \const{SOCK\_RAW}, e quando utilizzata eventuali valori impostati con \const{IP\_OPTIONS}, \const{IP\_TOS} o \const{IP\_TTL} sono @@ -2937,7 +2933,7 @@ sez.~\ref{sec:net_sendmsg}). dell'intestazione vengono comunque modificati dal kernel, torneremo sull'argomento in sez.~\ref{sec:socket_raw} -\item[\const{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della +\item[\constd{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di Linux. Essa permette di usufruire di un meccanismo affidabile per ottenere un maggior numero di informazioni in caso di errori. Se l'opzione è abilitata tutti gli errori generati su un socket @@ -2949,7 +2945,7 @@ sez.~\ref{sec:net_sendmsg}). \const{SOCK\_STREAM}. \itindbeg{Path~MTU} -\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel +\item[\constd{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di Linux. L'opzione permette di scrivere o leggere le impostazioni della modalità usata per la determinazione della \textit{Path MTU} (vedi sez.~\ref{sec:net_lim_dim}) del @@ -2965,14 +2961,14 @@ sez.~\ref{sec:net_sendmsg}). \multicolumn{2}{|c|}{\textbf{Valore}}&\textbf{Significato} \\ \hline \hline - \const{IP\_PMTUDISC\_DONT}&0& Non effettua la ricerca dalla \textit{Path - MTU}.\\ - \const{IP\_PMTUDISC\_WANT}&1& Utilizza il valore impostato per la rotta - utilizzata dai pacchetti (dal comando - \texttt{route}).\\ - \const{IP\_PMTUDISC\_DO} &2& Esegue la procedura di determinazione - della \textit{Path MTU} come richiesto - dall'\href{http://www.ietf.org/rfc/rfc1191.txt}{RFC~1191}.\\ + \constd{IP\_PMTUDISC\_DONT}&0& Non effettua la ricerca dalla \textit{Path + MTU}.\\ + \constd{IP\_PMTUDISC\_WANT}&1& Utilizza il valore impostato per la rotta + utilizzata dai pacchetti (dal comando + \texttt{route}).\\ + \constd{IP\_PMTUDISC\_DO} &2& Esegue la procedura di determinazione + della \textit{Path MTU} come richiesto + dall'\href{http://www.ietf.org/rfc/rfc1191.txt}{RFC~1191}.\\ \hline \end{tabular} \caption{Valori possibili per l'argomento \param{optval} di @@ -2992,7 +2988,7 @@ sez.~\ref{sec:net_sendmsg}). 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} +\item[\constd{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU} di percorso del socket. L'opzione richiede per \param{optval} un intero che conterrà il valore della \textit{Path MTU} in byte. Questa è una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di Linux. @@ -3014,14 +3010,14 @@ sez.~\ref{sec:net_sendmsg}). \itindend{Path~MTU} -\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i +\item[\constd{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di Linux. Prende per \param{optval} un intero usato come valore logico. Se abilitata passa tutti i pacchetti con l'opzione \textit{IP Router Alert} (vedi sez.~\ref{sec:IP_options}) che devono essere inoltrati al socket corrente. Può essere usata soltanto per socket di tipo raw. -\item[\const{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il +\item[\constd{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il valore del campo TTL per i pacchetti \textit{multicast} in uscita associati al socket. È importante che questo valore sia il più basso possibile, ed il default è 1, che significa che i pacchetti non potranno uscire dalla rete @@ -3029,7 +3025,7 @@ sez.~\ref{sec:net_sendmsg}). questo limite. L'opzione richiede per \param{optval} un intero che conterrà il valore del TTL. -\item[\const{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i dati +\item[\constd{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i dati che si inviano su un socket usato con il \textit{multicast} vengano ricevuti anche sulla stessa macchina da cui li si stanno inviando. Prende per \param{optval} un intero usato come valore logico. @@ -3040,7 +3036,7 @@ sez.~\ref{sec:net_sendmsg}). disponibili in locale l'uso di questa opzione permette di disabilitare questo tipo di traffico. -\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di +\item[\constd{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di \textit{multicast}, e può essere usata solo con \func{setsockopt}. L'argomento \param{optval} in questo caso deve essere una struttura di tipo \struct{ip\_mreqn}, illustrata in fig.~\ref{fig:ip_mreqn_struct}, che @@ -3066,11 +3062,11 @@ sez.~\ref{sec:net_sendmsg}). \label{fig:ip_mreqn_struct} \end{figure} -\item[\const{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di \textit{multicast}, +\item[\constd{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di \textit{multicast}, prende per \param{optval} la stessa struttura \struct{ip\_mreqn} (o \struct{ip\_mreq}) usata anche per \const{IP\_ADD\_MEMBERSHIP}. -\item[\const{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per l'utilizzo +\item[\constd{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per l'utilizzo del \textit{multicast}, ed utilizza come \param{optval} le stesse strutture \struct{ip\_mreqn} o \struct{ip\_mreq} delle due precedenti opzioni. @@ -3101,7 +3097,7 @@ precedenti opzioni di sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente -\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si sono +\constd{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si sono riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcplevel}, dove sono elencate le rispettive costanti da utilizzare come valore per l'argomento \param{optname}. Dette costanti e tutte le altre costanti e @@ -3124,8 +3120,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)} MSS per i segmenti in - uscita.\\ + Valore della MSS per i segmenti in uscita.\\ \const{TCP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Accumula i dati in un unico segmento.\\ \const{TCP\_KEEPIDLE} &$\bullet$&$\bullet$& &\texttt{int}& @@ -3161,17 +3156,17 @@ la spiegazione del funzionamento delle singole opzioni con una maggiore quantità di dettagli è fornita nel seguente elenco: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{TCP\_NODELAY}] il protocollo TCP utilizza un meccanismo di +\item[\constd{TCP\_NODELAY}] il protocollo TCP utilizza un meccanismo di bufferizzazione dei dati uscenti, per evitare la trasmissione di tanti piccoli segmenti con un utilizzo non ottimale della banda - disponibile.\footnote{il problema è chiamato anche \textit{silly window - syndrome}, per averne un'idea si pensi al risultato che si ottiene - quando un programma di terminale invia un segmento TCP per ogni tasto - premuto, 40 byte di intestazione di protocollo con 1 byte di dati - trasmessi; per evitare situazioni del genere è stato introdotto - \index{algoritmo~di~Nagle} l'\textsl{algoritmo di Nagle}.} Questo - meccanismo è controllato da un apposito algoritmo (detto - \index{algoritmo~di~Nagle} \textsl{algoritmo di Nagle}, vedi + disponibile.\footnote{il problema è chiamato anche + \itindex{silly~window~syndrome} \textit{silly window syndrome}, per averne + un'idea si pensi al risultato che si ottiene quando un programma di + terminale invia un segmento TCP per ogni tasto premuto, 40 byte di + intestazione di protocollo con 1 byte di dati trasmessi; per evitare + situazioni del genere è stato introdotto \index{algoritmo~di~Nagle} + l'\textsl{algoritmo di Nagle}.} Questo meccanismo è controllato da un + apposito algoritmo (detto \textsl{algoritmo di Nagle}, vedi sez.~\ref{sec:tcp_protocol_xxx}). Il comportamento normale del protocollo prevede che i dati siano accumulati fintanto che non si raggiunge una quantità considerata adeguata per eseguire la trasmissione di un singolo @@ -3183,11 +3178,10 @@ quantità di dettagli è fornita nel seguente elenco: richiesta HTTP.} in tal caso l'attesa introdotta dall'algoritmo di bufferizzazione non soltanto è inutile, ma peggiora le prestazioni introducendo un ritardo. Impostando questa opzione si disabilita l'uso - \index{algoritmo~di~Nagle} dell'\textsl{algoritmo di Nagle} ed i dati - vengono inviati immediatamente in singoli segmenti, qualunque sia la loro - dimensione. Ovviamente l'uso di questa opzione è dedicato a chi ha esigenze - particolari come quella illustrata, che possono essere stabilite solo per la - singola applicazione. + dell'\textsl{algoritmo di Nagle} ed i dati vengono inviati immediatamente in + singoli segmenti, qualunque sia la loro dimensione. Ovviamente l'uso di + questa opzione è dedicato a chi ha esigenze particolari come quella + illustrata, che possono essere stabilite solo per la singola applicazione. Si tenga conto che questa opzione viene sovrascritta dall'eventuale impostazione dell'opzione \const{TCP\_CORK} (il cui scopo è sostanzialmente @@ -3198,28 +3192,26 @@ quantità di dettagli è fornita nel seguente elenco: essere specificata insieme a \const{TCP\_NODELAY} soltanto a partire dal kernel 2.5.71.} -\item[\const{TCP\_MAXSEG}] con questa opzione si legge o si imposta il valore - della \itindex{Maximum~Segment~Size~(MSS)} MSS - (\textit{Maximum~Segment~Size}, vedi sez.~\ref{sec:net_lim_dim} e +\item[\constd{TCP\_MAXSEG}] con questa opzione si legge o si imposta il valore + della 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. + MSS annunciata all'altro capo della connessione. Se si specificano valori + maggiori della 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 +\item[\constd{TCP\_CORK}] questa opzione è il complemento naturale di \const{TCP\_NODELAY} e serve a gestire a livello applicativo la situazione opposta, cioè quella in cui si sa fin dal principio che si dovranno inviare - grosse quantità di dati. Anche in questo caso \index{algoritmo~di~Nagle} - l'\textsl{algoritmo di Nagle} tenderà a suddividerli in dimensioni da lui - ritenute opportune,\footnote{l'algoritmo cerca di tenere conto di queste - situazioni, ma essendo un algoritmo generico tenderà comunque ad - introdurre delle suddivisioni in segmenti diversi, anche quando potrebbero - non essere necessarie, con conseguente spreco di banda.} ma sapendo fin - dall'inizio quale è la dimensione dei dati si potranno di nuovo ottenere - delle migliori prestazioni disabilitandolo, e gestendo direttamente l'invio - del nostro blocco di dati in soluzione unica. + grosse quantità di dati. Anche in questo caso l'\textsl{algoritmo di Nagle} + tenderà a suddividerli in dimensioni da lui ritenute + opportune,\footnote{l'algoritmo cerca di tenere conto di queste situazioni, + ma essendo un algoritmo generico tenderà comunque ad introdurre delle + suddivisioni in segmenti diversi, anche quando potrebbero non essere + necessarie, con conseguente spreco di banda.} ma sapendo fin dall'inizio + quale è la dimensione dei dati si potranno di nuovo ottenere delle migliori + prestazioni disabilitandolo, e gestendo direttamente l'invio del nostro + blocco di dati in soluzione unica. Quando questa opzione viene abilitata non vengono inviati segmenti di dati fintanto che essa non venga disabilitata; a quel punto tutti i dati rimasti @@ -3245,7 +3237,7 @@ quantità di dettagli è fornita nel seguente elenco: serie 2.4.x.} e non è disponibile su tutti i kernel unix-like, pertanto deve essere evitata se si vuole scrivere codice portabile. -\item[\const{TCP\_KEEPIDLE}] con questa opzione si legge o si imposta +\item[\constd{TCP\_KEEPIDLE}] con questa opzione si legge o si imposta l'intervallo di tempo, in secondi, che deve trascorrere senza traffico sul socket prima che vengano inviati, qualora si sia attivata su di esso l'opzione \const{SO\_KEEPALIVE}, i messaggi di \textit{keep-alive} (si veda @@ -3254,31 +3246,30 @@ quantità di dettagli è fornita nel seguente elenco: su tutti i kernel unix-like e deve essere evitata se si vuole scrivere codice portabile. -\item[\const{TCP\_KEEPINTVL}] con questa opzione si legge o si imposta +\item[\constd{TCP\_KEEPINTVL}] con questa opzione si legge o si imposta l'intervallo di tempo, in secondi, fra due messaggi di \textit{keep-alive} successivi (si veda sempre quanto illustrato in sez.~\ref{sec:sock_options_main}). Come la precedente non è disponibile su tutti i kernel unix-like e deve essere evitata se si vuole scrivere codice portabile. -\item[\const{TCP\_KEEPCNT}] con questa opzione si legge o si imposta il numero +\item[\constd{TCP\_KEEPCNT}] con questa opzione si legge o si imposta il numero totale di messaggi di \textit{keep-alive} da inviare prima di concludere che la connessione è caduta per assenza di risposte ad un messaggio di \textit{keep-alive} (di nuovo vedi sez.~\ref{sec:sock_options_main}). Come la precedente non è disponibile su tutti i kernel unix-like e deve essere evitata se si vuole scrivere codice portabile. -\item[\const{TCP\_SYNCNT}] con questa opzione si legge o si imposta il numero - di tentativi di ritrasmissione dei segmenti SYN usati nel - \itindex{three~way~handshake} \textit{three way handshake} prima che il - tentativo di connessione venga abortito (si ricordi quanto accennato in - sez.~\ref{sec:TCP_func_connect}). Sovrascrive per il singolo socket il valore - globale impostato con la \textit{sysctl} \texttt{tcp\_syn\_retries} (vedi - sez.~\ref{sec:sock_ipv4_sysctl}). Non vengono accettati valori maggiori di - 255; anche questa opzione non è standard e deve essere evitata se si vuole - scrivere codice portabile. - -\item[\const{TCP\_LINGER2}] con questa opzione si legge o si imposta, in +\item[\constd{TCP\_SYNCNT}] con questa opzione si legge o si imposta il numero + di tentativi di ritrasmissione dei segmenti SYN usati nel \textit{three way + handshake} prima che il tentativo di connessione venga abortito (si + ricordi quanto accennato in sez.~\ref{sec:TCP_func_connect}). Sovrascrive + per il singolo socket il valore globale impostato con la \textit{sysctl} + \texttt{tcp\_syn\_retries} (vedi sez.~\ref{sec:sock_ipv4_sysctl}). Non + vengono accettati valori maggiori di 255; anche questa opzione non è + standard e deve essere evitata se si vuole scrivere codice portabile. + +\item[\constd{TCP\_LINGER2}] con questa opzione si legge o si imposta, in numero di secondi, il tempo di sussistenza dei socket terminati nello stato \texttt{FIN\_WAIT2} (si ricordi quanto visto in sez.~\ref{sec:TCP_conn_term}).\footnote{si tenga ben presente che questa @@ -3289,29 +3280,28 @@ quantità di dettagli è fornita nel seguente elenco: sez.~\ref{sec:sock_ipv4_sysctl}). Anche questa opzione è da evitare se si ha a cuore la portabilità del codice. -\item[\const{TCP\_DEFER\_ACCEPT}] questa opzione consente di modificare il +\item[\constd{TCP\_DEFER\_ACCEPT}] questa opzione consente di modificare il comportamento standard del protocollo TCP nello stabilirsi di una - connessione; se ricordiamo il meccanismo del \itindex{three~way~handshake} - \textit{three way handshake} illustrato in fig.~\ref{fig:TCP_TWH} possiamo - vedere che in genere un client inizierà ad inviare i dati ad un server solo - dopo l'emissione dell'ultimo segmento di ACK. + connessione; se ricordiamo il meccanismo del \textit{three way handshake} + illustrato in fig.~\ref{fig:TCP_TWH} possiamo vedere che in genere un client + inizierà ad inviare i dati ad un server solo dopo l'emissione dell'ultimo + segmento di ACK. Di nuovo esistono situazioni (e la più tipica è quella di una richiesta HTTP) in cui sarebbe utile inviare immediatamente la richiesta all'interno - del segmento con l'ultimo ACK del \itindex{three~way~handshake} - \textit{three way handshake}; si potrebbe così risparmiare l'invio di un - segmento successivo per la richiesta e il ritardo sul server fra la - ricezione dell'ACK e quello della richiesta. + del segmento con l'ultimo ACK del \textit{three way handshake}; si potrebbe + così risparmiare l'invio di un segmento successivo per la richiesta e il + ritardo sul server fra la ricezione dell'ACK e quello della richiesta. Se si invoca \const{TCP\_DEFER\_ACCEPT} su un socket dal lato client (cioè dal lato da cui si invoca \func{connect}) si istruisce il kernel a non - inviare immediatamente l'ACK finale del \itindex{three~way~handshake} - \textit{three way handshake}, attendendo per un po' di tempo la prima - scrittura, in modo da inviare i dati di questa insieme col segmento ACK. - Chiaramente la correttezza di questo comportamento dipende in maniera - diretta dal tipo di applicazione che usa il socket; con HTTP, che invia una - breve richiesta, permette di risparmiare un segmento, con FTP, in cui invece - si attende la ricezione del prompt del server, introduce un inutile ritardo. + inviare immediatamente l'ACK finale del \textit{three way handshake}, + attendendo per un po' di tempo la prima scrittura, in modo da inviare i dati + di questa insieme col segmento ACK. Chiaramente la correttezza di questo + comportamento dipende in maniera diretta dal tipo di applicazione che usa il + socket; con HTTP, che invia una breve richiesta, permette di risparmiare un + segmento, con FTP, in cui invece si attende la ricezione del prompt del + server, introduce un inutile ritardo. Allo stesso tempo il protocollo TCP prevede che sul lato del server la funzione \func{accept} ritorni dopo la ricezione dell'ACK finale, in tal @@ -3323,7 +3313,7 @@ quantità di dettagli è fornita nel seguente elenco: situazione; quando la si invoca sul lato server (vale a dire su un socket in ascolto) l'opzione fa sì che \func{accept} ritorni soltanto quando sono presenti dei dati sul socket, e non alla ricezione dell'ACK conclusivo del - \itindex{three~way~handshake} \textit{three way handshake}. + \textit{three way handshake}. L'opzione prende un valore intero che indica il numero massimo di secondi per cui mantenere il ritardo, sia per quanto riguarda il ritorno di @@ -3334,7 +3324,7 @@ quantità di dettagli è fornita nel seguente elenco: comportamento di \const{TCP\_DEFER\_ACCEPT} per quanto riguarda il lato server.} -\item[\const{TCP\_WINDOW\_CLAMP}] con questa opzione si legge o si imposta +\item[\constd{TCP\_WINDOW\_CLAMP}] con questa opzione si legge o si imposta alla dimensione specificata, in byte, il valore dichiarato della \textit{advertised window} (vedi sez.~\ref{sec:tcp_protocol_xxx}). Il kernel impone comunque una dimensione minima pari a \texttt{SOCK\_MIN\_RCVBUF/2}. @@ -3351,7 +3341,7 @@ quantità di dettagli è fornita nel seguente elenco: \label{fig:tcp_info_struct} \end{figure} -\item[\const{TCP\_INFO}] questa opzione, specifica di Linux, ma introdotta +\item[\constd{TCP\_INFO}] questa opzione, specifica di Linux, ma introdotta anche in altri kernel (ad esempio FreeBSD) permette di controllare lo stato interno di un socket TCP direttamente da un programma in user space. L'opzione restituisce in una speciale struttura \struct{tcp\_info}, la cui @@ -3379,7 +3369,7 @@ quantità di dettagli è fornita nel seguente elenco: %Si noti come nell'esempio si sia ( -\item[\const{TCP\_QUICKACK}] con questa opzione è possibile eseguire una forma +\item[\constd{TCP\_QUICKACK}] con questa opzione è possibile eseguire una forma di controllo sull'invio dei segmenti ACK all'interno di in flusso di dati su TCP. In genere questo invio viene gestito direttamente dal kernel, il comportamento standard, corrispondente la valore logico di vero (in genere @@ -3404,7 +3394,7 @@ quantità di dettagli è fornita nel seguente elenco: % TODO trattare con gli esempi di apache -\item[\const{TCP\_CONGESTION}] questa opzione permette di impostare quale +\item[\constd{TCP\_CONGESTION}] questa opzione permette di impostare quale algoritmo per il controllo della congestione\footnote{il controllo della congestione è un meccanismo previsto dal protocollo TCP (vedi sez.~\ref{sec:tcp_protocol_xxx}) per evitare di trasmettere inutilmente @@ -3486,7 +3476,7 @@ Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udplevel}; anche in 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 +\constd{IPPROTO\_UDP}). Le costanti che identificano dette opzioni sono definite in \headfiled{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 @@ -3502,9 +3492,9 @@ file.\footnote{come per TCP, la definizione delle opzioni effettivamente \textbf{Descrizione}\\ \hline \hline - \const{UDP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? + \constd{UDP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? Accumula tutti i dati su un unico pacchetto.\\ - \const{UDP\_ENCAP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? + \constd{UDP\_ENCAP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? Non documentata.\\ \hline \end{tabular} @@ -3520,14 +3510,14 @@ sono un semplice riferimento, una maggiore quantità di dettagli sulle caratteristiche delle opzioni citate è quello dell'elenco seguente: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{UDP\_CORK}] questa opzione ha l'identico effetto dell'analoga +\item[\constd{UDP\_CORK}] questa opzione ha l'identico effetto dell'analoga \const{TCP\_CORK} vista in precedenza per il protocollo TCP, e quando abilitata consente di accumulare i dati in uscita su un solo pacchetto che verrà inviato una volta che la si disabiliti. L'opzione è stata introdotta con il kernel 2.5.44, e non deve essere utilizzata in codice che vuole essere portabile. -\item[\const{UDP\_ENCAP}] Questa opzione permette di gestire l'incapsulazione +\item[\constd{UDP\_ENCAP}] Questa opzione permette di gestire l'incapsulazione dei dati nel protocollo UDP. L'opzione è stata introdotta con il kernel 2.5.67, e non è documentata. Come la precedente è specifica di Linux e non deve essere utilizzata in codice portabile. @@ -3570,24 +3560,24 @@ deve sempre essere passato come puntatore ad una variabile (o struttura) precedentemente allocata. Le costanti che identificano le operazioni sono le seguenti: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{SIOCGSTAMP}] restituisce il contenuto di una struttura +\item[\constd{SIOCGSTAMP}] restituisce il contenuto di una struttura \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~(RTT)} \textit{Round Trip Time} cui abbiamo già - accennato in sez.~\ref{sec:net_tcp}.} dei pacchetti sulla rete. + misurazioni precise del tempo di andata e ritorno\footnote{il \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 \textit{process group} a cui +\item[\constd{SIOCSPGRP}] imposta il processo o il \textit{process group} a cui inviare i segnali \signal{SIGIO} e \signal{SIGURG} quando viene completata una operazione di I/O asincrono o arrivano dei dati urgenti - \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 \ids{PID} del processo, mentre un valore negativo - indica (col valore assoluto) il \textit{process group}. Senza privilegi di - amministratore o la capability \const{CAP\_KILL} si può impostare solo se - stessi o il proprio \textit{process group}. - -\item[\const{SIOCGPGRP}] legge le impostazioni presenti sul socket + (\texttt{out-of-band}). Il terzo argomento deve essere un puntatore ad una + variabile di tipo \type{pid\_t}; un valore positivo indica direttamente il + \ids{PID} del processo, mentre un valore negativo indica (col valore + assoluto) il \textit{process group}. Senza privilegi di amministratore o la + capability \const{CAP\_KILL} si può impostare solo se stessi o il proprio + \textit{process group}. + +\item[\constd{SIOCGPGRP}] legge le impostazioni presenti sul socket relativamente all'eventuale processo o \textit{process group} cui devono essere inviati i segnali \signal{SIGIO} e \signal{SIGURG}. Come per \const{SIOCSPGRP} l'argomento passato deve un puntatore ad una variabile di @@ -3647,7 +3637,7 @@ richiedono i privilegi di amministratore o la \textit{capability} \const{CAP\_NET\_ADMIN}, altrimenti si otterrà un errore di \errval{EPERM}. Le costanti che identificano le operazioni disponibili sono le seguenti: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{SIOCGIFNAME}] questa è l'unica operazione che usa il campo +\item[\constd{SIOCGIFNAME}] questa è l'unica operazione che usa il campo \var{ifr\_name} per restituire un risultato, tutte le altre lo utilizzano per indicare l'interfaccia sulla quale operare. L'operazione richiede che si indichi nel campo \var{ifr\_ifindex} il valore numerico dell'\textsl{indice} @@ -3663,11 +3653,11 @@ Le costanti che identificano le operazioni disponibili sono le seguenti: ordinato in base a tale valore (riportato come primo campo). -\item[\const{SIOCGIFINDEX}] restituisce nel campo \var{ifr\_ifindex} il valore +\item[\constd{SIOCGIFINDEX}] restituisce nel campo \var{ifr\_ifindex} il valore numerico dell'indice dell'interfaccia specificata con \var{ifr\_name}, è in sostanza l'operazione inversa di \const{SIOCGIFNAME}. -\item[\const{SIOCGIFFLAGS}] permette di ottenere nel campo \var{ifr\_flags} il +\item[\constd{SIOCGIFFLAGS}] permette di ottenere nel campo \var{ifr\_flags} il valore corrente dei flag dell'interfaccia specificata (con \var{ifr\_name}). Il valore restituito è una maschera binaria i cui bit sono identificabili attraverso le varie costanti di tab.~\ref{tab:netdevice_iface_flag}. @@ -3680,35 +3670,36 @@ Le costanti che identificano le operazioni disponibili sono le seguenti: \textbf{Flag} & \textbf{Significato} \\ \hline \hline - \const{IFF\_UP} & L'interfaccia è attiva.\\ - \const{IFF\_BROADCAST} & L'interfaccia ha impostato un indirizzo di + \constd{IFF\_UP} & L'interfaccia è attiva.\\ + \constd{IFF\_BROADCAST} & L'interfaccia ha impostato un indirizzo di \textit{broadcast} valido.\\ - \const{IFF\_DEBUG} & È attivo il flag interno di debug.\\ - \const{IFF\_LOOPBACK} & L'interfaccia è una interfaccia di + \constd{IFF\_DEBUG} & È attivo il flag interno di debug.\\ + \constd{IFF\_LOOPBACK} & L'interfaccia è una interfaccia di \textit{loopback}.\\ - \const{IFF\_POINTOPOINT}&L'interfaccia è associata ad un collegamento + \constd{IFF\_POINTOPOINT}&L'interfaccia è associata ad un collegamento \textsl{punto-punto}.\\ - \const{IFF\_RUNNING} & L'interfaccia ha delle risorse allocate (non può + \constd{IFF\_RUNNING} & L'interfaccia ha delle risorse allocate (non può quindi essere disattivata).\\ - \const{IFF\_NOARP} & L'interfaccia ha il protocollo ARP disabilitato o + \constd{IFF\_NOARP} & L'interfaccia ha il protocollo ARP disabilitato o l'indirizzo del livello di rete non è impostato.\\ - \const{IFF\_PROMISC} & L'interfaccia è in \index{modo~promiscuo} - \textsl{modo promiscuo} (riceve cioè tutti i - pacchetti che vede passare, compresi quelli non - direttamente indirizzati a lei).\\ - \const{IFF\_NOTRAILERS}& Evita l'uso di \textit{trailer} nei pacchetti.\\ - \const{IFF\_ALLMULTI} & Riceve tutti i pacchetti di \textit{multicast}.\\ - \const{IFF\_MASTER} & L'interfaccia è il master di un bundle per il + \constd{IFF\_PROMISC} & L'interfaccia è nel cosiddetto + \index{modo~promiscuo} \textsl{modo promiscuo}, + riceve cioè tutti i pacchetti che vede passare, + compresi quelli non direttamente indirizzati a + lei.\\ + \constd{IFF\_NOTRAILERS}& Evita l'uso di \textit{trailer} nei pacchetti.\\ + \constd{IFF\_ALLMULTI} & Riceve tutti i pacchetti di \textit{multicast}.\\ + \constd{IFF\_MASTER} & L'interfaccia è il master di un bundle per il bilanciamento di carico.\\ - \const{IFF\_SLAVE} & L'interfaccia è uno slave di un bundle per il + \constd{IFF\_SLAVE} & L'interfaccia è uno slave di un bundle per il bilanciamento di carico.\\ - \const{IFF\_MULTICAST} & L'interfaccia ha il supporto per il + \constd{IFF\_MULTICAST} & L'interfaccia ha il supporto per il \textit{multicast} attivo.\\ - \const{IFF\_PORTSEL} & L'interfaccia può impostare i suoi parametri + \constd{IFF\_PORTSEL} & L'interfaccia può impostare i suoi parametri hardware (con l'uso di \struct{ifmap}).\\ - \const{IFF\_AUTOMEDIA} & L'interfaccia è in grado di selezionare + \constd{IFF\_AUTOMEDIA} & L'interfaccia è in grado di selezionare automaticamente il tipo di collegamento.\\ - \const{IFF\_DYNAMIC} & Gli indirizzi assegnati all'interfaccia vengono + \constd{IFF\_DYNAMIC} & Gli indirizzi assegnati all'interfaccia vengono persi quando questa viene disattivata.\\ % \const{IFF\_} & .\\ \hline @@ -3719,50 +3710,48 @@ Le costanti che identificano le operazioni disponibili sono le seguenti: \end{table} -\item[\const{SIOCSIFFLAGS}] permette di impostare il valore dei flag +\item[\constd{SIOCSIFFLAGS}] permette di impostare il valore dei flag dell'interfaccia specificata (sempre con \var{ifr\_name}, non staremo a ripeterlo oltre) attraverso il valore della maschera binaria da passare nel campo \var{ifr\_flags}, che può essere ottenuta con l'OR aritmetico delle costanti di tab.~\ref{tab:netdevice_iface_flag}; questa operazione è privilegiata. -\item[\const{SIOCGIFMETRIC}] permette di leggere il valore della metrica del +\item[\constd{SIOCGIFMETRIC}] permette di leggere il valore della metrica del dispositivo associato all'interfaccia specificata nel campo \var{ifr\_metric}. Attualmente non è implementato, e l'operazione restituisce sempre un valore nullo. -\item[\const{SIOCSIFMETRIC}] permette di impostare il valore della metrica del +\item[\constd{SIOCSIFMETRIC}] permette di impostare il valore della metrica del dispositivo al valore specificato nel campo \var{ifr\_metric}, attualmente non ancora implementato, restituisce un errore di \errval{EOPNOTSUPP}. -\item[\const{SIOCGIFMTU}] permette di leggere il valore della - \itindex{Maximum~Transfer~Unit~(MTU)} \textit{Maximum Transfer Unit} del - dispositivo nel campo \var{ifr\_mtu}. +\item[\constd{SIOCGIFMTU}] permette di leggere il valore della \textit{Maximum + Transfer Unit} del dispositivo nel campo \var{ifr\_mtu}. -\item[\const{SIOCSIFMTU}] permette di impostare il valore della - \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[\constd{SIOCSIFMTU}] permette di impostare il valore della + \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[\const{SIOCGIFHWADDR}] permette di leggere il valore dell'indirizzo +\item[\constd{SIOCGIFHWADDR}] permette di leggere il valore dell'indirizzo hardware del dispositivo associato all'interfaccia nel campo \var{ifr\_hwaddr}; questo viene restituito come struttura \struct{sockaddr} in cui il campo \var{sa\_family} contiene un valore \texttt{ARPHRD\_*} indicante il tipo di indirizzo ed il campo \var{sa\_data} il valore binario dell'indirizzo hardware a partire dal byte 0. -\item[\const{SIOCSIFHWADDR}] permette di impostare il valore dell'indirizzo +\item[\constd{SIOCSIFHWADDR}] permette di impostare il valore dell'indirizzo hardware del dispositivo associato all'interfaccia attraverso il valore della struttura \struct{sockaddr} (con lo stesso formato illustrato per \const{SIOCGIFHWADDR}) passata nel campo \var{ifr\_hwaddr}. L'operazione è privilegiata. -\item[\const{SIOCSIFHWBROADCAST}] imposta l'indirizzo \textit{broadcast} +\item[\constd{SIOCSIFHWBROADCAST}] imposta l'indirizzo \textit{broadcast} hardware dell'interfaccia al valore specificato dal campo \var{ifr\_hwaddr}. L'operazione è privilegiata. -\item[\const{SIOCGIFMAP}] legge alcuni parametri hardware (memoria, interrupt, +\item[\constd{SIOCGIFMAP}] legge alcuni parametri hardware (memoria, interrupt, canali di DMA) del driver dell'interfaccia specificata, restituendo i relativi valori nel campo \var{ifr\_map}; quest'ultimo contiene una struttura di tipo \struct{ifmap}, la cui definizione è illustrata in @@ -3778,13 +3767,13 @@ Le costanti che identificano le operazioni disponibili sono le seguenti: \label{fig:netdevice_ifmap_struct} \end{figure} -\item[\const{SIOCSIFMAP}] imposta i parametri hardware del driver +\item[\constd{SIOCSIFMAP}] imposta i parametri hardware del driver dell'interfaccia specificata, restituendo i relativi valori nel campo \var{ifr\_map}. Come per \const{SIOCGIFMAP} questo deve essere passato come struttura \struct{ifmap}, secondo la definizione di fig.~\ref{fig:netdevice_ifmap_struct}. -\item[\const{SIOCADDMULTI}] aggiunge un indirizzo di \textit{multicast} ai +\item[\constd{SIOCADDMULTI}] aggiunge un indirizzo di \textit{multicast} ai filtri del livello di collegamento associati dell'interfaccia. Si deve usare un indirizzo hardware da specificare attraverso il campo \var{ifr\_hwaddr}, che conterrà l'opportuna struttura \struct{sockaddr}; l'operazione è @@ -3792,22 +3781,22 @@ Le costanti che identificano le operazioni disponibili sono le seguenti: si possono usare i \textit{packet socket}, vedi sez.~\ref{sec:packet_socket}. -\item[\const{SIOCDELMULTI}] rimuove un indirizzo di \textit{multicast} ai +\item[\constd{SIOCDELMULTI}] rimuove un indirizzo di \textit{multicast} ai filtri del livello di collegamento dell'interfaccia, vuole un indirizzo hardware specificato come per \const{SIOCADDMULTI}. Anche questa operazione è privilegiata e può essere eseguita in forma alternativa con i \textit{packet socket}. -\item[\const{SIOCGIFTXQLEN}] permette di leggere la lunghezza della coda di +\item[\constd{SIOCGIFTXQLEN}] permette di leggere la lunghezza della coda di trasmissione del dispositivo associato all'interfaccia specificata nel campo \var{ifr\_qlen}. -\item[\const{SIOCSIFTXQLEN}] permette di impostare il valore della lunghezza +\item[\constd{SIOCSIFTXQLEN}] permette di impostare il valore della lunghezza della coda di trasmissione del dispositivo associato all'interfaccia, questo deve essere specificato nel campo \var{ifr\_qlen}. L'operazione è privilegiata. -\item[\const{SIOCSIFNAME}] consente di cambiare il nome dell'interfaccia +\item[\constd{SIOCSIFNAME}] consente di cambiare il nome dell'interfaccia indicata da \var{ifr\_name} utilizzando il nuovo nome specificato nel campo \var{ifr\_rename}. @@ -3818,7 +3807,7 @@ Le costanti che identificano le operazioni disponibili sono le seguenti: % hardware senza modificarlo Una ulteriore operazione, che consente di ricavare le caratteristiche delle -interfacce di rete, è \const{SIOCGIFCONF}; però per ragioni di compatibilità +interfacce di rete, è \constd{SIOCGIFCONF}; però per ragioni di compatibilità questa operazione è disponibile soltanto per i socket della famiglia \const{AF\_INET} (vale ad dire per socket IPv4). In questo caso l'utente dovrà passare come argomento una struttura \struct{ifconf}, definita in @@ -3927,16 +3916,15 @@ illustrate nell'elenco seguente; il terzo argomento della funzione, gestito come \textit{value result argument}, deve essere sempre il puntatore ad una variabile di tipo \ctyp{int}: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{SIOCINQ}] restituisce la quantità di dati non ancora letti +\item[\constd{SIOCINQ}] restituisce la quantità di dati non ancora letti presenti nel buffer di ricezione; il socket non deve essere in stato \texttt{LISTEN}, altrimenti si avrà un errore di \errval{EINVAL}. -\item[\const{SIOCATMARK}] ritorna un intero non nullo, da intendere come +\item[\constd{SIOCATMARK}] ritorna un intero non nullo, da intendere come valore logico, se il flusso di dati letti sul socket è arrivato sulla - posizione (detta anche \textit{urgent mark}) in cui sono stati ricevuti - \itindex{out-of-band} dati urgenti (vedi sez.~\ref{sec:TCP_urgent_data}). - Una operazione di lettura da un socket non attraversa mai questa posizione, - per cui è possibile controllare se la si è raggiunta o meno con questa - operazione. + posizione (detta anche \textit{urgent mark}) in cui sono stati ricevuti dati + urgenti (vedi sez.~\ref{sec:TCP_urgent_data}). Una operazione di lettura da + un socket non attraversa mai questa posizione, per cui è possibile + controllare se la si è raggiunta o meno con questa operazione. Questo è utile quando si attiva l'opzione \const{SO\_OOBINLINE} (vedi sez.~\ref{sec:sock_generic_options}) per ricevere i dati urgenti all'interno @@ -3948,7 +3936,7 @@ variabile di tipo \ctyp{int}: dati urgenti e non il normale traffico; torneremo su questo in maggior dettaglio in sez.~\ref{sec:TCP_urgent_data}. -\item[\const{SIOCOUTQ}] restituisce la quantità di dati non ancora inviati +\item[\constd{SIOCOUTQ}] restituisce la quantità di dati non ancora inviati presenti nel buffer di spedizione; come per \const{SIOCINQ} il socket non deve essere in stato \texttt{LISTEN}, altrimenti si avrà un errore di \errval{EINVAL}. @@ -4043,19 +4031,22 @@ socket. Quelli descritti anche nella pagina di manuale, accessibile con massima che si può assegnare al buffer di trasmissione dei socket attraverso l'uso dell'opzione \const{SO\_SNDBUF}. \item[\sysctlrelfiled{net/core}{message\_cost}, - \sysctlrelfiled{net/core}{message\_burst}] contengono le impostazioni - del \itindex{bucket~filter} \textit{bucket filter} che controlla l'emissione - di messaggi di avviso da parte del kernel per eventi relativi a problemi - sulla rete, imponendo un limite che consente di prevenire eventuali attacchi - di \itindex{Denial~of~Service~(DoS)} \textit{Denial of Service} usando i - log.\footnote{senza questo limite un attaccante potrebbe inviare ad arte un - traffico che generi intenzionalmente messaggi di errore, per saturare il - sistema dei log.} - - Il \itindex{bucket~filter} \textit{bucket filter} è un algoritmo generico - che permette di impostare dei limiti di flusso su una quantità\footnote{uno - analogo viene usato nel \itindex{netfilter} \textit{netfilter} per imporre - dei limiti sul flusso dei pacchetti.} senza dovere eseguire medie + \sysctlrelfiled{net/core}{message\_burst}] contengono le impostazioni del + \textit{bucket filter} che controlla l'emissione di + messaggi di avviso da parte del kernel per eventi relativi a problemi sulla + rete, imponendo un limite che consente di prevenire eventuali attacchi di + \textit{Denial of Service} usando i log.\footnote{senza questo limite un + attaccante potrebbe inviare ad arte un traffico che generi + intenzionalmente messaggi di errore, per saturare il sistema dei log.} + + \itindbeg{bucket~filter} + + Il \textit{bucket filter} è un algoritmo generico che permette di impostare + dei limiti di flusso su una quantità\footnote{uno analogo viene usato per + imporre dei limiti sul flusso dei pacchetti nel \itindex{netfilter} + \textit{netfilter} di Linux (il \textit{netfilter} è l'infrastruttura + usata per il filtraggio dei pacchetti del kernel, per maggiori dettagli si + consulti il cap.~2 di \cite{FwGL}).} senza dovere eseguire medie temporali, che verrebbero a dipendere in misura non controllabile dalla dimensione dell'intervallo su cui si media e dalla distribuzione degli eventi;\footnote{in caso di un picco di flusso (il cosiddetto @@ -4067,6 +4058,8 @@ socket. Quelli descritti anche nella pagina di manuale, accessibile con l'aver fissato un flusso di uscita garantisce che a regime questo sarà il valore medio del flusso ottenibile dal \textit{bucket}. + \itindend{bucket~filter} + I due valori indicano rispettivamente il flusso a regime (non sarà inviato più di un messaggio per il numero di secondi specificato da \texttt{message\_cost}) e la dimensione iniziale per in caso di picco di @@ -4094,25 +4087,24 @@ questi però non è documentato: della coda di ricezione sotto la quale si considera di avere una bassa congestione. -\item[\sysctlrelfiled{net/core}{mod\_cong}] valore per l'occupazione - della coda di ricezione sotto la quale si considera di avere una congestione +\item[\sysctlrelfiled{net/core}{mod\_cong}] valore per l'occupazione della + coda di ricezione sotto la quale si considera di avere una congestione moderata. -\item[\sysctlrelfiled{net/core}{no\_cong}] valore per l'occupazione - della coda di ricezione sotto la quale si considera di non avere - congestione. +\item[\sysctlrelfiled{net/core}{no\_cong}] valore per l'occupazione della coda + di ricezione sotto la quale si considera di non avere congestione. -\item[\sysctlrelfiled{net/core}{no\_cong\_thresh}] valore minimo - (\textit{low water mark}) per il riavvio dei dispositivi congestionati. +\item[\sysctlrelfiled{net/core}{no\_cong\_thresh}] valore minimo (\textit{low + water mark}) per il riavvio dei dispositivi congestionati. % \item[\sysctlrelfiled{net/core}{netdev\_fastroute}] è presente % soltanto quando si è compilato il kernel con l'apposita opzione di % ottimizzazione per l'uso come router. -\item[\sysctlrelfiled{net/core}{somaxconn}] imposta la dimensione - massima utilizzabile per il \textit{backlog} della funzione \func{listen} - (vedi sez.~\ref{sec:TCP_func_listen}), e corrisponde al valore della - costante \const{SOMAXCONN}; il suo valore di default è 128. +\item[\sysctlrelfiled{net/core}{somaxconn}] imposta la dimensione massima + utilizzabile per il \textit{backlog} della funzione \func{listen} (vedi + sez.~\ref{sec:TCP_func_listen}), e corrisponde al valore della costante + \constd{SOMAXCONN}; il suo valore di default è 128. \end{basedescript} @@ -4164,16 +4156,15 @@ di manuale accessibile con \texttt{man 7 ip}, sono i seguenti: accessibile solo in lettura, è inutilizzato nei kernel recenti ed eliminato a partire dal kernel 2.6.18. -\item[\sysctlrelfiled{net/ipv4}{ip\_local\_port\_range}] imposta - l'intervallo dei valori usati per l'assegnazione delle porte effimere, - permette cioè di modificare i valori illustrati in - fig.~\ref{fig:TCP_port_alloc}; prende due valori interi separati da spazi, - che indicano gli estremi dell'intervallo. Si abbia cura di non definire un - intervallo che si sovrappone a quello delle porte usate per il - \itindex{masquerading} \textit{masquerading}, il kernel può gestire la - sovrapposizione, ma si avrà una perdita di prestazioni. Si imposti sempre un - valore iniziale maggiore di 1024 (o meglio ancora di 4096) per evitare - conflitti con le porte usate dai servizi noti. +\item[\sysctlrelfiled{net/ipv4}{ip\_local\_port\_range}] imposta l'intervallo + dei valori usati per l'assegnazione delle porte effimere, permette cioè di + modificare i valori illustrati in fig.~\ref{fig:TCP_port_alloc}; prende due + valori interi separati da spazi, che indicano gli estremi + dell'intervallo. Si abbia cura di non definire un intervallo che si + sovrappone a quello delle porte usate per il \textit{masquerading}, il + kernel può gestire la sovrapposizione, ma si avrà una perdita di + prestazioni. Si imposti sempre un valore iniziale maggiore di 1024 (o meglio + ancora di 4096) per evitare conflitti con le porte usate dai servizi noti. \item[\sysctlrelfiled{net/ipv4}{ip\_no\_pmtu\_disc}] permette di disabilitare per i socket \const{SOCK\_STREAM} la ricerca automatica della \textit{Path @@ -4199,8 +4190,7 @@ di manuale accessibile con \texttt{man 7 ip}, sono i seguenti: \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.} Prende un valore logico e di default è disabilitato. Con i kernel dalla serie 2.4 in poi la deframmentazione viene attivata automaticamente quando si utilizza il sistema del - \itindex{netfilter} \textit{netfilter}, e questo parametro non è più - presente. + \textit{netfilter}, e questo parametro non è più presente. \item[\sysctlrelfiled{net/ipv4}{ipfrag\_high\_thresh}] indica il limite massimo (espresso in numero di byte) sui pacchetti IP frammentati presenti @@ -4258,8 +4248,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: \item[\sysctlrelfiled{net/ipv4}{tcp\_app\_win}] indica la frazione della finestra TCP che viene riservata per gestire l'overhaed dovuto alla bufferizzazione. Prende un valore valore intero che consente di calcolare la - dimensione in byte come il massimo fra la - \itindex{Maximum~Segment~Size~(MSS)} MSS e + dimensione in byte come il massimo fra la MSS e $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che non viene riservato nessuno spazio; il valore di default è 31. @@ -4309,15 +4298,14 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: % TODO documentare o descrivere che cos'è il TCP Forward Acknowledgement o % mettere riferimento nelle appendici -\item[\sysctlrelfiled{net/ipv4}{tcp\_fin\_timeout}] specifica il numero - di secondi da passare in stato \texttt{FIN\_WAIT2} nell'attesa delle - ricezione del pacchetto FIN conclusivo, passati quali il socket viene - comunque chiuso forzatamente. Prende un valore intero che indica i secondi - e di default è 60.\footnote{nei kernel della serie 2.2.x era il valore - utilizzato era invece di 120 secondi.} L'uso di questa opzione realizza - quella che in sostanza è una violazione delle specifiche del protocollo TCP, - ma è utile per fronteggiare alcuni attacchi di - \itindex{Denial~of~Service~(DoS)} \textit{Denial of Service}. +\item[\sysctlrelfiled{net/ipv4}{tcp\_fin\_timeout}] specifica il numero di + secondi da passare in stato \texttt{FIN\_WAIT2} nell'attesa delle ricezione + del pacchetto FIN conclusivo, passati quali il socket viene comunque chiuso + forzatamente. Prende un valore intero che indica i secondi e di default è + 60.\footnote{nei kernel della serie 2.2.x era il valore utilizzato era + invece di 120 secondi.} L'uso di questa opzione realizza quella che in + sostanza è una violazione delle specifiche del protocollo TCP, ma è utile + per fronteggiare alcuni attacchi di \textit{Denial of Service}. \item[\sysctlrelfiled{net/ipv4}{tcp\_frto}] abilita il supporto per l'algoritmo F-RTO, un algoritmo usato per la ritrasmissione dei timeout del @@ -4370,11 +4358,11 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: % TODO verificare la spiegazione di connessione orfana. -\item[\sysctlrelfiled{net/ipv4}{tcp\_max\_syn\_backlog}] indica la - lunghezza della coda delle connessioni incomplete, cioè delle connessioni - per le quali si è ricevuto un SYN di richiesta ma non l'ACK finale del - \itindex{three~way~handshake} \textit{three way handshake} (si riveda quanto - illustrato in sez.~\ref{sec:TCP_func_listen}). +\item[\sysctlrelfiled{net/ipv4}{tcp\_max\_syn\_backlog}] indica la lunghezza + della coda delle connessioni incomplete, cioè delle connessioni per le quali + si è ricevuto un SYN di richiesta ma non l'ACK finale del \textit{three way + handshake} (si riveda quanto illustrato in + sez.~\ref{sec:TCP_func_listen}). Quando questo valore è superato il kernel scarterà immediatamente ogni ulteriore richiesta di connessione. Prende un valore intero; il default, che @@ -4481,13 +4469,12 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: \item il secondo valore, denominato \textit{default} nelle pagine di manuale, indica la dimensione di default, in byte, del buffer di ricezione di un socket TCP. Questo valore sovrascrive il default iniziale impostato - per tutti i socket con \sysctlfile{net/core/mem\_default} che vale - per qualunque protocollo. Il default è 87380 byte, ridotto a 43689 per - sistemi con poca memoria. Se si desiderano dimensioni più ampie per tutti - i socket si può aumentare questo valore, ma se si vuole che in - corrispondenza aumentino anche le dimensioni usate per la finestra TCP si - deve abilitare il \itindex{TCP~window~scaling} \textit{TCP window scaling} - (di default è abilitato, vedi più avanti + per tutti i socket con \sysctlfile{net/core/mem\_default} che vale per + qualunque protocollo. Il default è 87380 byte, ridotto a 43689 per sistemi + con poca memoria. Se si desiderano dimensioni più ampie per tutti i socket + si può aumentare questo valore, ma se si vuole che in corrispondenza + aumentino anche le dimensioni usate per la finestra TCP si deve abilitare + il \textit{TCP window scaling} (di default è abilitato, vedi più avanti \sysctlrelfile{net/ipv4}{tcp\_window\_scaling}). \item il terzo valore, denominato \textit{max} nelle pagine di manuale, @@ -4529,26 +4516,25 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: funzionalità come le estensioni e può causare problemi per i client ed il reinoltro dei pacchetti. -\item[\sysctlrelfiled{net/ipv4}{tcp\_syn\_retries}] imposta il numero - di tentativi di ritrasmissione dei pacchetti SYN di inizio connessione del - \itindex{three~way~handshake} \textit{three way handshake} (si ricordi - quanto illustrato in sez.~\ref{sec:TCP_func_connect}). Prende un valore - intero che di default è 5; non si deve superare il valore massimo di 255. +\item[\sysctlrelfiled{net/ipv4}{tcp\_syn\_retries}] imposta il numero di + tentativi di ritrasmissione dei pacchetti SYN di inizio connessione del + \textit{three way handshake} (si ricordi quanto illustrato in + sez.~\ref{sec:TCP_func_connect}). Prende un valore intero che di default è + 5; non si deve superare il valore massimo di 255. \item[\sysctlrelfiled{net/ipv4}{tcp\_timestamps}] abilita l'uso dei \textit{TCP timestamps}, come definiti nell'\href{http://www.ietf.org/rfc/rfc1323.txt}{RFC~1323}. Prende un valore logico e di default è abilitato. -\item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_recycle}] abilita il - riutilizzo rapido dei socket in stato \texttt{TIME\_WAIT}. Prende un valore - logico e di default è disabilitato. Non è opportuno abilitare questa opzione - che può causare problemi con il NAT.\footnote{il \textit{Network Address - Translation} è una tecnica, impiegata nei firewall e nei router, che - consente di modificare al volo gli indirizzi dei pacchetti che transitano - per una macchina, Linux la supporta con il \itindex{netfilter} - \textit{netfilter}, per maggiori dettagli si consulti il cap.~2 di - \cite{FwGL}.} +\item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_recycle}] abilita il riutilizzo + rapido dei socket in stato \texttt{TIME\_WAIT}. Prende un valore logico e di + default è disabilitato. Non è opportuno abilitare questa opzione che può + causare problemi con il NAT.\footnote{il + \itindex{Network~Address~Translation} \textit{Network Address Translation} + è una tecnica, impiegata nei firewall e nei router, che consente di + modificare al volo gli indirizzi dei pacchetti che transitano per una + macchina, Linux la supporta con il \textit{netfilter}.} \item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_reuse}] abilita il riutilizzo dello stato \texttt{TIME\_WAIT} quando questo è sicuro dal punto di vista @@ -4591,14 +4577,14 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: \item il secondo valore, denominato \textit{default}, indica la dimensione di default in byte del buffer di spedizione di un socket TCP. Questo valore sovrascrive il default iniziale impostato per tutti i tipi di - socket con \sysctlfile{net/core/wmem\_default}. Il default è 87380 - byte, ridotto a 43689 per sistemi con poca memoria. Si può aumentare - questo valore quando si desiderano dimensioni più ampie del buffer di + socket con \sysctlfile{net/core/wmem\_default}. Il default è 87380 byte, + ridotto a 43689 per sistemi con poca memoria. Si può aumentare questo + valore quando si desiderano dimensioni più ampie del buffer di trasmissione per i socket TCP, ma come per il precedente - \sysctlrelfile{net/ipv4}{tcp\_rmem}) se si vuole che in - corrispondenza aumentino anche le dimensioni usate per la finestra TCP si - deve abilitare il \itindex{TCP~window~scaling} \textit{TCP window scaling} - con \sysctlrelfile{net/ipv4}{tcp\_window\_scaling}. + \sysctlrelfile{net/ipv4}{tcp\_rmem}) se si vuole che in corrispondenza + aumentino anche le dimensioni usate per la finestra TCP si deve abilitare + il \textit{TCP window scaling} con + \sysctlrelfile{net/ipv4}{tcp\_window\_scaling}. \item il terzo valore, denominato \textit{max}, indica la dimensione massima in byte del buffer di spedizione di un socket TCP; il default è 128Kb, che diff --git a/socket.tex b/socket.tex index 2287b17..52d4809 100644 --- a/socket.tex +++ b/socket.tex @@ -199,36 +199,36 @@ comunicazione. \textbf{Nome}&\textbf{Valore}&\textbf{Utilizzo}&\textbf{Man page} \\ \hline \hline - \const{PF\_UNSPEC} & 0& Non specificato & \\ - \const{PF\_LOCAL} & 1& Local communication & unix(7) \\ - \const{PF\_UNIX}, \const{PF\_FILE}&1&Sinonimi di \const{PF\_LOCAL}& \\ - \const{PF\_INET} & 2& IPv4 Internet protocols & ip(7) \\ - \const{PF\_AX25} & 3& Amateur radio AX.25 protocol & \\ - \const{PF\_IPX} & 4& IPX - Novell protocols & \\ - \const{PF\_APPLETALK}& 5& Appletalk & ddp(7) \\ - \const{PF\_NETROM} & 6& Amateur radio NetROM & \\ - \const{PF\_BRIDGE} & 7& Multiprotocol bridge & \\ - \const{PF\_ATMPVC} & 8& Access to raw ATM PVCs & \\ - \const{PF\_X25} & 9& ITU-T X.25 / ISO-8208 protocol& x25(7) \\ - \const{PF\_INET6} &10& IPv6 Internet protocols & ipv6(7) \\ - \const{PF\_ROSE} &11& Amateur Radio X.25 PLP & \\ - \const{PF\_DECnet} &12& Reserved for DECnet project & \\ - \const{PF\_NETBEUI} &13& Reserved for 802.2LLC project & \\ - \const{PF\_SECURITY} &14& Security callback pseudo AF & \\ - \const{PF\_KEY} &15& PF\_KEY key management API & \\ - \const{PF\_NETLINK} &16& Kernel user interface device & netlink(7) \\ - \const{PF\_ROUTE} &16& Sinonimo di \const{PF\_NETLINK} emula BSD.&\\ - \const{PF\_PACKET} &17& Low level packet interface & packet(7) \\ - \const{PF\_ASH} &18& Ash & \\ - \const{PF\_ECONET} &19& Acorn Econet & \\ - \const{PF\_ATMSVC} &20& ATM SVCs & \\ - \const{PF\_SNA} &22& Linux SNA Project & \\ - \const{PF\_IRDA} &23& IRDA socket (infrarossi) & \\ - \const{PF\_PPPOX} &24& PPPoX socket & \\ - \const{PF\_WANPIPE} &25& Wanpipe API socket & \\ - \const{PF\_LLC} &26& Linux LLC & \\ - \const{PF\_CAN} &29& Controller Are network & \\ - \const{PF\_BLUETOOTH}&31& Bluetooth socket & \\ + \constd{PF\_UNSPEC} & 0& Non specificato & \\ + \constd{PF\_LOCAL} & 1& Local communication & unix(7) \\ + \constd{PF\_UNIX}, \constd{PF\_FILE}&1&Sinonimi di \const{PF\_LOCAL}& \\ + \constd{PF\_INET} & 2& IPv4 Internet protocols & ip(7) \\ + \constd{PF\_AX25} & 3& Amateur radio AX.25 protocol & \\ + \constd{PF\_IPX} & 4& IPX - Novell protocols & \\ + \constd{PF\_APPLETALK}& 5& Appletalk & ddp(7) \\ + \constd{PF\_NETROM} & 6& Amateur radio NetROM & \\ + \constd{PF\_BRIDGE} & 7& Multiprotocol bridge & \\ + \constd{PF\_ATMPVC} & 8& Access to raw ATM PVCs & \\ + \constd{PF\_X25} & 9& ITU-T X.25 / ISO-8208 protocol& x25(7) \\ + \constd{PF\_INET6} &10& IPv6 Internet protocols & ipv6(7) \\ + \constd{PF\_ROSE} &11& Amateur Radio X.25 PLP & \\ + \constd{PF\_DECnet} &12& Reserved for DECnet project & \\ + \constd{PF\_NETBEUI} &13& Reserved for 802.2LLC project & \\ + \constd{PF\_SECURITY} &14& Security callback pseudo AF & \\ + \constd{PF\_KEY} &15& PF\_KEY key management API & \\ + \constd{PF\_NETLINK} &16& Kernel user interface device & netlink(7) \\ + \constd{PF\_ROUTE} &16& Sinonimo di \const{PF\_NETLINK} emula BSD.&\\ + \constd{PF\_PACKET} &17& Low level packet interface & packet(7) \\ + \constd{PF\_ASH} &18& Ash & \\ + \constd{PF\_ECONET} &19& Acorn Econet & \\ + \constd{PF\_ATMSVC} &20& ATM SVCs & \\ + \constd{PF\_SNA} &22& Linux SNA Project & \\ + \constd{PF\_IRDA} &23& IRDA socket (infrarossi) & \\ + \constd{PF\_PPPOX} &24& PPPoX socket & \\ + \constd{PF\_WANPIPE} &25& Wanpipe API socket & \\ + \constd{PF\_LLC} &26& Linux LLC & \\ + \constd{PF\_CAN} &29& Controller Are network & \\ + \constd{PF\_BLUETOOTH}&31& Bluetooth socket & \\ \hline \end{tabular} \caption{Famiglie di protocolli definiti in Linux.} @@ -256,8 +256,8 @@ elenco delle famiglie di protocolli disponibili in Linux è riportato in tab.~\ref{tab:net_pf_names}. L'elenco indica tutti i protocolli definiti; fra questi però saranno utilizzabili solo quelli per i quali si è compilato il supporto nel kernel (o si sono caricati gli opportuni moduli), viene definita -anche una costante \const{PF\_MAX} che indica il valore massimo associabile ad -un dominio. +anche una costante \constd{PF\_MAX} che indica il valore massimo associabile +ad un dominio. Si tenga presente che non tutte le famiglie di protocolli sono utilizzabili dall'utente generico, ad esempio in generale tutti i socket di tipo @@ -281,28 +281,27 @@ seguenti costanti:\footnote{le pagine di manuale POSIX riportano solo i primi \texttt{include/linux/net.h} dei sorgenti del kernel.} \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{SOCK\_STREAM}] Provvede un canale di trasmissione dati +\item[\constd{SOCK\_STREAM}] Provvede un canale di trasmissione dati bidirezionale, sequenziale e affidabile. Opera su una connessione con un altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di byte (da cui il nome \textit{stream}) e possono essere letti in blocchi di dimensioni qualunque. Può supportare la trasmissione dei cosiddetti dati - urgenti (o \itindex{out-of-band} \textit{out-of-band}, vedi - sez.~\ref{sec:TCP_urgent_data}). -\item[\const{SOCK\_DGRAM}] Viene usato per trasmettere pacchetti di dati + urgenti (o \textit{out-of-band}, vedi sez.~\ref{sec:TCP_urgent_data}). +\item[\constd{SOCK\_DGRAM}] Viene usato per trasmettere pacchetti di dati (\textit{datagram}) di lunghezza massima prefissata, indirizzati singolarmente. Non esiste una connessione e la trasmissione è effettuata in maniera non affidabile. -\item[\const{SOCK\_SEQPACKET}] Provvede un canale di trasmissione di dati +\item[\constd{SOCK\_SEQPACKET}] Provvede un canale di trasmissione di dati bidirezionale, sequenziale e affidabile. Opera su una connessione con un altro socket. I dati possono vengono trasmessi per pacchetti di dimensione massima fissata, e devono essere letti integralmente da ciascuna chiamata a \func{read}. -\item[\const{SOCK\_RAW}] Provvede l'accesso a basso livello ai protocolli di +\item[\constd{SOCK\_RAW}] Provvede l'accesso a basso livello ai protocolli di rete e alle varie interfacce. I normali programmi di comunicazione non devono usarlo, è riservato all'uso di sistema. -\item[\const{SOCK\_RDM}] Provvede un canale di trasmissione di dati +\item[\constd{SOCK\_RDM}] Provvede un canale di trasmissione di dati affidabile, ma in cui non è garantito l'ordine di arrivo dei pacchetti. -\item[\const{SOCK\_PACKET}] Obsoleto, non deve essere più usato (e pertanto +\item[\constd{SOCK\_PACKET}] Obsoleto, non deve essere più usato (e pertanto non ne parleremo ulteriormente). \end{basedescript} @@ -313,12 +312,12 @@ non strettamente attinenti all'indicazione del tipo secondo i valori appena illustrati. Essi infatti possono essere combinati con un OR aritmetico delle ulteriori costanti: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\const{SOCK\_CLOEXEC}] imposta il flag di \textit{close-on-exec} sul +\item[\constd{SOCK\_CLOEXEC}] imposta il flag di \textit{close-on-exec} sul file descriptor del socket, ottenendo lo stesso effetto del flag \const{O\_CLOEXEC} di \func{open} (vedi tab.~\ref{tab:open_operation_flag}), di cui costituisce l'analogo. -\item[\const{SOCK\_NONBLOCK}] crea il socket in modalità non-bloccante, con +\item[\constd{SOCK\_NONBLOCK}] crea il socket in modalità non-bloccante, con effetti identici ad una successiva chiamata a \func{fcntl} per impostare il flag di \const{O\_NONBLOCK} sul file descriptor (si faccia di nuovo riferimenti al significato di quest'ultimo come spiegato in @@ -503,7 +502,7 @@ protocolli di livello superiore come TCP e UDP. Questa struttura però viene usata anche per i socket RAW che accedono direttamente al livello di IP, nel qual caso il numero della porta viene impostato al numero di protocollo. -Il membro \var{sin\_family} deve essere sempre impostato a \const{AF\_INET}, +Il membro \var{sin\_family} deve essere sempre impostato a \constd{AF\_INET}, altrimenti si avrà un errore di \errcode{EINVAL}; il membro \var{sin\_port} specifica il \textsl{numero di porta}. I numeri di porta sotto il 1024 sono chiamati \textsl{riservati} in quanto utilizzati da servizi standard e @@ -547,7 +546,7 @@ riportata in fig.~\ref{fig:sock_sa_ipv6_struct}. \label{fig:sock_sa_ipv6_struct} \end{figure} -Il campo \var{sin6\_family} deve essere sempre impostato ad \const{AF\_INET6}, +Il campo \var{sin6\_family} deve essere sempre impostato ad \constd{AF\_INET6}, il campo \var{sin6\_port} è analogo a quello di IPv4 e segue le stesse regole; il campo \var{sin6\_flowinfo} è a sua volta diviso in tre parti di cui i 24 bit inferiori indicano l'etichetta di flusso, i successivi 4 bit la priorità e @@ -589,7 +588,7 @@ fig.~\ref{fig:sock_sa_local_struct}. \label{fig:sock_sa_local_struct} \end{figure} -In questo caso il campo \var{sun\_family} deve essere \const{AF\_UNIX}, mentre +In questo caso il campo \var{sun\_family} deve essere \constd{AF\_UNIX}, mentre il campo \var{sun\_path} deve specificare un indirizzo. Questo ha due forme; può essere un file (di tipo socket) nel filesystem o una stringa univoca (mantenuta in uno spazio di nomi astratto). Nel primo caso l'indirizzo viene @@ -615,7 +614,7 @@ I socket AppleTalk permettono di usare il protocollo DDP, che è un protocollo a pacchetto, di tipo \const{SOCK\_DGRAM}; l'argomento \param{protocol} di \func{socket} deve essere nullo. È altresì possibile usare i socket raw specificando un tipo \const{SOCK\_RAW}, nel qual caso l'unico valore valido -per \param{protocol} è \const{ATPROTO\_DDP}. +per \param{protocol} è \constd{ATPROTO\_DDP}. Gli indirizzi AppleTalk devono essere specificati tramite una struttura \struct{sockaddr\_atalk}, la cui definizione è riportata in @@ -632,18 +631,18 @@ il file \headfiled{netatalk/at.h}. \label{fig:sock_sa_atalk_struct} \end{figure} -Il campo \var{sat\_family} deve essere sempre \const{AF\_APPLETALK}, mentre il -campo \var{sat\_port} specifica la porta che identifica i vari servizi. Valori -inferiori a 129 sono usati per le \textsl{porte riservate}, e possono essere -usati solo da processi con i privilegi di amministratore o con la -\textit{capability} \const{CAP\_NET\_BIND\_SERVICE}. L'indirizzo remoto è +Il campo \var{sat\_family} deve essere sempre \constd{AF\_APPLETALK}, mentre +il campo \var{sat\_port} specifica la porta che identifica i vari +servizi. Valori inferiori a 129 sono usati per le \textsl{porte riservate}, e +possono essere usati solo da processi con i privilegi di amministratore o con +la \textit{capability} \const{CAP\_NET\_BIND\_SERVICE}. L'indirizzo remoto è specificato nella struttura \var{sat\_addr}, e deve essere in \textit{network - order} (vedi sez.~\ref{sec:endianness}); esso è composto da un parte di -rete data dal campo \var{s\_net}, che può assumere il valore -\const{AT\_ANYNET}, che indica una rete generica e vale anche per indicare la -rete su cui si è, il singolo nodo è indicato da \var{s\_node}, e può prendere -il valore generico \const{AT\_ANYNODE} che indica anche il nodo corrente, ed -il valore \const{ATADDR\_BCAST} che indica tutti i nodi della rete. + order} (vedi sez.~\ref{sec:endianness}); esso è composto da un parte di rete +data dal campo \var{s\_net}, che può assumere il valore \constd{AT\_ANYNET}, +che indica una rete generica e vale anche per indicare la rete su cui si è, il +singolo nodo è indicato da \var{s\_node}, e può prendere il valore generico +\constd{AT\_ANYNODE} che indica anche il nodo corrente, ed il valore +\constd{ATADDR\_BCAST} che indica tutti i nodi della rete. \subsection{La struttura degli indirizzi dei \textit{packet socket}} @@ -684,7 +683,7 @@ Nella creazione di un \textit{packet socket} il valore dell'argomento utilizzare. I valori possibili sono definiti secondo lo standard IEEE 802.3, e quelli disponibili in Linux sono accessibili attraverso opportune costanti simboliche definite nel file \file{linux/if\_ether.h}. Se si usa il valore -speciale \const{ETH\_P\_ALL} passeranno sul \textit{packet socket} tutti i +speciale \constd{ETH\_P\_ALL} passeranno sul \textit{packet socket} tutti i pacchetti, qualunque sia il loro protocollo di collegamento. Ovviamente l'uso di questi socket è una operazione privilegiata e può essere effettuati solo da un processo con i privilegi di amministratore (\ids{UID} effettivo nullo) o @@ -718,7 +717,7 @@ entrambi i tipi di socket), per la ricezione dei i dati relativi a ciascun pacchetto. Al solito il campo \var{sll\_family} deve essere sempre impostato al valore -\const{AF\_PACKET}. Il campo \var{sll\_protocol} indica il protocollo scelto, +\constd{AF\_PACKET}. Il campo \var{sll\_protocol} indica il protocollo scelto, e deve essere indicato in \textit{network order}, facendo uso delle costanti simboliche definite in \file{linux/if\_ether.h}. Il campo \var{sll\_ifindex} è l'indice dell'interfaccia, che, in caso di presenza di più interfacce dello @@ -740,13 +739,13 @@ Il campo \var{sll\_hatype} indica il tipo ARP, come definito in \file{linux/if\_arp.h}, mentre il campo \var{sll\_pkttype} indica il tipo di pacchetto; entrambi vengono impostati alla ricezione di un pacchetto ed han senso solo in questo caso. In particolare \var{sll\_pkttype} può assumere i -seguenti valori: \const{PACKET\_HOST} per un pacchetto indirizzato alla -macchina ricevente, \const{PACKET\_BROADCAST} per un pacchetto di -\textit{broadcast}, \const{PACKET\_MULTICAST} per un pacchetto inviato ad un -indirizzo fisico di \textit{multicast}, \const{PACKET\_OTHERHOST} per un -pacchetto inviato ad un'altra stazione (e ricevuto su un'interfaccia in -\index{modo~promiscuo} modo promiscuo), \const{PACKET\_OUTGOING} per un -pacchetto originato dalla propria macchina che torna indietro sul socket. +seguenti valori: \constd{PACKET\_HOST} per un pacchetto indirizzato alla +macchina ricevente, \constd{PACKET\_BROADCAST} per un pacchetto di +\textit{broadcast}, \constd{PACKET\_MULTICAST} per un pacchetto inviato ad un +indirizzo fisico di \textit{multicast}, \constd{PACKET\_OTHERHOST} per un +pacchetto inviato ad un'altra stazione (e ricevuto su un'interfaccia in modo +promiscuo), \constd{PACKET\_OUTGOING} per un pacchetto originato dalla propria +macchina che torna indietro sul socket. Si tenga presente infine che in fase di ricezione, anche se si richiede il @@ -936,8 +935,8 @@ indirizzo in una stringa; il suo prototipo è: La funzione converte la struttura dell'indirizzo puntata da \param{addr\_ptr} in una stringa che viene copiata nel buffer puntato dall'indirizzo \param{dest}; questo deve essere preallocato dall'utente e la lunghezza deve -essere almeno \const{INET\_ADDRSTRLEN} in caso di indirizzi IPv4 e -\const{INET6\_ADDRSTRLEN} per indirizzi IPv6; la lunghezza del buffer deve +essere almeno \constd{INET\_ADDRSTRLEN} in caso di indirizzi IPv4 e +\constd{INET6\_ADDRSTRLEN} per indirizzi IPv6; la lunghezza del buffer deve comunque venire specificata attraverso il parametro \param{len}. Gli indirizzi vengono convertiti da/alle rispettive strutture di indirizzo @@ -955,7 +954,6 @@ sez.~\ref{sec:IP_ipv6_notation} per IPv6. - % LocalWords: socket sez cap BSD SVr XTI Transport Interface TCP stream UDP PF % LocalWords: datagram broadcast descriptor sys int domain type protocol errno % LocalWords: EPROTONOSUPPORT ENFILE kernel EMFILE EACCES EINVAL ENOBUFS raw diff --git a/system.tex b/system.tex index ef24ac5..198832d 100644 --- a/system.tex +++ b/system.tex @@ -192,30 +192,30 @@ file, riportate in tab.~\ref{tab:sys_file_macro}. \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \constd{\_POSIX\_ARG\_MAX} & 4096& Dimensione massima degli argomenti + \macrod{\_POSIX\_ARG\_MAX} & 4096& Dimensione massima degli argomenti passati ad una funzione della famiglia \func{exec}.\\ - \constd{\_POSIX\_CHILD\_MAX} & 6& Numero massimo di processi + \macrod{\_POSIX\_CHILD\_MAX} & 6& Numero massimo di processi contemporanei che un utente può eseguire.\\ - \constd{\_POSIX\_OPEN\_MAX} & 16& Numero massimo di file che un processo + \macrod{\_POSIX\_OPEN\_MAX} & 16& Numero massimo di file che un processo può mantenere aperti in contemporanea.\\ - \constd{\_POSIX\_STREAM\_MAX}& 8& Massimo numero di stream aperti per + \macrod{\_POSIX\_STREAM\_MAX}& 8& Massimo numero di stream aperti per processo in contemporanea.\\ - \constd{\_POSIX\_TZNAME\_MAX}& 6& Dimensione massima del nome di una + \macrod{\_POSIX\_TZNAME\_MAX}& 6& Dimensione massima del nome di una \textit{timezone} (vedi sez.~\ref{sec:sys_date}). \\ - \constd{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali + \macrod{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}).\\ - \constd{\_POSIX\_NGROUPS\_MAX}& 0& Numero di gruppi supplementari per + \macrod{\_POSIX\_NGROUPS\_MAX}& 0& Numero di gruppi supplementari per processo (vedi sez.~\ref{sec:proc_access_id}).\\ - \constd{\_POSIX\_SSIZE\_MAX} &32767& Valore massimo del tipo + \macrod{\_POSIX\_SSIZE\_MAX} &32767& Valore massimo del tipo \type{ssize\_t}.\\ - % \const{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\ - % \const{\_POSIX\_AIO\_MAX} & 1& \\ + % \macrod{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\ + % \macrod{\_POSIX\_AIO\_MAX} & 1& \\ \hline \end{tabular} \caption{Macro dei valori minimi di alcune caratteristiche generali del diff --git a/tcpsock.tex b/tcpsock.tex index 9f80a46..71463a1 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -40,8 +40,9 @@ significato di alcuni dei vari \textsl{stati} ad essa associati. \label{sec:TCP_conn_cre} \itindbeg{three~way~handshake} -Il processo che porta a creare una connessione TCP è chiamato \textit{three - way handshake}; la successione tipica degli eventi (e dei + +Il processo che porta a creare una connessione TCP viene chiamato +\textit{three way handshake}; la successione tipica degli eventi (e dei \textsl{segmenti}\footnote{si ricordi che il segmento è l'unità elementare di dati trasmessa dal protocollo TCP al livello successivo; tutti i segmenti hanno un header che contiene le informazioni che servono allo \textit{stack @@ -135,11 +136,10 @@ comunicare all'altro capo una serie di parametri utili a regolare la connessione. Normalmente vengono usate le seguenti opzioni: \begin{itemize} -\item \textit{MSS option}, dove MMS sta per - \itindex{Maximum~Segment~Size~(MSS)} \textit{Maximum Segment Size}, con - questa opzione ciascun capo della connessione annuncia all'altro il massimo - ammontare di dati che vorrebbe accettare per ciascun segmento nella - connessione corrente. È possibile leggere e scrivere questo valore +\item \textit{MSS option}, con questa opzione ciascun capo della connessione + annuncia all'altro il massimo ammontare di dati (MMS sta appunto per + \textit{Maximum Segment Size}) che vorrebbe accettare per ciascun segmento + nella connessione corrente. È possibile leggere e scrivere questo valore attraverso l'opzione del socket \const{TCP\_MAXSEG} (vedi sez.~\ref{sec:sock_tcp_udp_options}). @@ -163,8 +163,7 @@ connessione. Normalmente vengono usate le seguenti opzioni: (espresso come numero di bit cui spostare a sinistra il valore della finestra annunciata inserito nel pacchetto). Con Linux è possibile indicare al kernel di far negoziare il fattore di scala in fase di creazione di una - connessione tramite la \textit{sysctl} \itindex{TCP~window~scaling} - \texttt{tcp\_window\_scaling} (vedi + connessione tramite la \textit{sysctl} \texttt{tcp\_window\_scaling} (vedi sez.~\ref{sec:sock_ipv4_sysctl}).\footnote{per poter usare questa funzionalità è comunque necessario ampliare le dimensioni dei buffer di ricezione e spedizione, cosa che può essere fatta sia a livello di sistema @@ -179,8 +178,8 @@ connessione. Normalmente vengono usate le seguenti opzioni: \end{itemize} -La MSS \itindex{Maximum~Segment~Size~(MSS)} è generalmente supportata da quasi -tutte le implementazioni del protocollo, le ultime due opzioni (trattate +La MSS è generalmente supportata da quasi tutte le implementazioni del +protocollo, le ultime due opzioni (trattate nell'\href{http://www.ietf.org/rfc/rfc1323.txt}{RFC~1323}) sono meno comuni; vengono anche dette \textit{long fat pipe options} dato che questo è il nome che viene dato alle connessioni caratterizzate da alta velocità o da ritardi @@ -239,9 +238,9 @@ deve ancora eseguire la chiusura passiva a quello che sta eseguendo la chiusura attiva. Nella sequenza indicata i dati verrebbero persi, dato che si è chiuso il socket dal lato che esegue la chiusura attiva; esistono tuttavia situazioni in cui si vuole poter sfruttare questa possibilità, usando una -procedura che è chiamata \itindex{half-close} \textit{half-close}; torneremo -su questo aspetto e su come utilizzarlo in sez.~\ref{sec:TCP_shutdown}, quando -parleremo della funzione \func{shutdown}. +procedura che è chiamata \textit{half-close}; torneremo su questo aspetto e su +come utilizzarlo in sez.~\ref{sec:TCP_shutdown}, quando parleremo della +funzione \func{shutdown}. La emissione del FIN avviene quando il socket viene chiuso, questo però non avviene solo per la chiamata esplicita della funzione \func{close}, ma anche @@ -303,10 +302,9 @@ che il protocollo viene ad assumere per i due lati, server e client. \label{fig:TCP_conn_example} \end{figure} -La connessione viene iniziata dal client che annuncia una -\itindex{Maximum~Segment~Size~(MSS)} MSS di 1460, un valore tipico con Linux -per IPv4 su Ethernet, il server risponde con lo stesso valore (ma potrebbe -essere anche un valore diverso). +La connessione viene iniziata dal client che annuncia una MSS di 1460, un +valore tipico con Linux per IPv4 su Ethernet, il server risponde con lo stesso +valore (ma potrebbe essere anche un valore diverso). Una volta che la connessione è stabilita il client scrive al server una richiesta (che assumiamo stare in un singolo segmento, cioè essere minore dei @@ -519,11 +517,11 @@ che solo l'amministratore possa allocare queste porte per far partire i relativi servizi. Le \textsl{glibc} definiscono in \headfile{netinet/in.h} -\const{IPPORT\_RESERVED} e \const{IPPORT\_USERRESERVED}, in cui la prima (che -vale 1024) indica il limite superiore delle porte riservate, e la seconda (che -vale 5000) il limite inferiore delle porte a disposizione degli utenti. La -convenzione vorrebbe che le porte \textsl{effimere} siano allocate fra questi -due valori. Nel caso di Linux questo è vero solo in uno dei due casi di +\constd{IPPORT\_RESERVED} e \constd{IPPORT\_USERRESERVED}, in cui la prima +(che vale 1024) indica il limite superiore delle porte riservate, e la seconda +(che vale 5000) il limite inferiore delle porte a disposizione degli utenti. +La convenzione vorrebbe che le porte \textsl{effimere} siano allocate fra +questi due valori. Nel caso di Linux questo è vero solo in uno dei due casi di fig.~\ref{fig:TCP_port_alloc}, e la scelta fra i due possibili intervalli viene fatta dinamicamente dal kernel a seconda della memoria disponibile per la gestione delle relative tabelle. @@ -742,11 +740,11 @@ sempre la funzione \func{htonl}. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{INADDR\_ANY} & Indirizzo generico (\texttt{0.0.0.0})\\ - \const{INADDR\_BROADCAST}& Indirizzo di \textit{broadcast}.\\ - \const{INADDR\_LOOPBACK} & Indirizzo di \textit{loopback} - (\texttt{127.0.0.1}).\\ - \const{INADDR\_NONE} & Indirizzo errato.\\ + \constd{INADDR\_ANY} & Indirizzo generico (\texttt{0.0.0.0})\\ + \constd{INADDR\_BROADCAST}& Indirizzo di \textit{broadcast}.\\ + \constd{INADDR\_LOOPBACK} & Indirizzo di \textit{loopback} + (\texttt{127.0.0.1}).\\ + \constd{INADDR\_NONE} & Indirizzo errato.\\ \hline \end{tabular} \caption{Costanti di definizione di alcuni indirizzi generici per IPv4.} @@ -760,12 +758,12 @@ con una struttura, perché il linguaggio C non consente l'uso di una struttura costante come operando a destra in una assegnazione. Per questo motivo nell'header \headfile{netinet/in.h} è definita una variabile -\macro{in6addr\_any} (dichiarata come \dirct{extern}, ed inizializzata dal -sistema al valore \const{IN6ADRR\_ANY\_INIT}) che permette di effettuare una +\var{in6addr\_any} (dichiarata come \dirct{extern}, ed inizializzata dal +sistema al valore \constd{IN6ADRR\_ANY\_INIT}) che permette di effettuare una assegnazione del tipo: \includecodesnip{listati/serv_addr_sin6_addr.c} in -maniera analoga si può utilizzare la variabile \macro{in6addr\_loopback} per +maniera analoga si può utilizzare la variabile \var{in6addr\_loopback} per indicare l'indirizzo di \textit{loopback}, che a sua volta viene inizializzata -staticamente a \const{IN6ADRR\_LOOPBACK\_INIT}. +staticamente a \constd{IN6ADRR\_LOOPBACK\_INIT}. \subsection{La funzione \func{connect}} @@ -778,8 +776,8 @@ connessione con un server TCP,\footnote{di nuovo la funzione è generica e limiterà ad impostare l'indirizzo dal quale e verso il quale saranno inviati e ricevuti i pacchetti, mentre per socket di tipo \const{SOCK\_STREAM} o \const{SOCK\_SEQPACKET}, essa attiverà la procedura di avvio (nel caso del - TCP il \itindex{three~way~handshake} \textit{three way handshake}) della - connessione.} il prototipo della funzione è il seguente: + TCP il \textit{three way handshake}) della connessione.} il prototipo della +funzione è il seguente: \begin{prototype}{sys/socket.h} {int connect(int sockfd, const struct sockaddr *servaddr, socklen\_t addrlen)} @@ -821,12 +819,12 @@ numero di porta del server a cui ci si vuole connettere, come mostrato nell'esempio sez.~\ref{sec:TCP_daytime_client}, usando le funzioni illustrate in sez.~\ref{sec:sock_addr_func}. -Nel caso di socket TCP la funzione \func{connect} avvia il -\itindex{three~way~handshake} \textit{three way handshake}, e ritorna solo -quando la connessione è stabilita o si è verificato un errore. Le possibili -cause di errore sono molteplici (ed i relativi codici riportati sopra), quelle -che però dipendono dalla situazione della rete e non da errori o problemi -nella chiamata della funzione sono le seguenti: +Nel caso di socket TCP la funzione \func{connect} avvia il \textit{three way + handshake}, e ritorna solo quando la connessione è stabilita o si è +verificato un errore. Le possibili cause di errore sono molteplici (ed i +relativi codici riportati sopra), quelle che però dipendono dalla situazione +della rete e non da errori o problemi nella chiamata della funzione sono le +seguenti: \begin{enumerate} \item Il client non riceve risposta al SYN: l'errore restituito è \errcode{ETIMEDOUT}. Stevens riporta che BSD invia un primo SYN alla @@ -921,27 +919,24 @@ infatti vengono mantenute due code: \begin{enumerate} \item La coda delle connessioni incomplete (\textit{incomplete connection queue}) che contiene un riferimento per ciascun socket per il quale è - arrivato un SYN ma il \itindex{three~way~handshake} \textit{three way - handshake} non si è ancora concluso. Questi socket sono tutti nello stato - \texttt{SYN\_RECV}. + arrivato un SYN ma il \textit{three way handshake} non si è ancora concluso. + Questi socket sono tutti nello stato \texttt{SYN\_RECV}. \item La coda delle connessioni complete (\textit{complete connection queue}) - che contiene un ingresso per ciascun socket per il quale il - \itindex{three~way~handshake} \textit{three way handshake} è stato - completato ma ancora \func{accept} non è ritornata. Questi socket sono - tutti nello stato \texttt{ESTABLISHED}. + che contiene un ingresso per ciascun socket per il quale il \textit{three + way handshake} è stato completato ma ancora \func{accept} non è ritornata. + Questi socket sono tutti nello stato \texttt{ESTABLISHED}. \end{enumerate} Lo schema di funzionamento è descritto in fig.~\ref{fig:TCP_listen_backlog}: quando arriva un SYN da un client il server crea una nuova voce nella coda delle connessioni incomplete, e poi risponde con il SYN$+$ACK. La voce resterà nella coda delle connessioni incomplete fino al ricevimento dell'ACK dal -client o fino ad un timeout. Nel caso di completamento del -\itindex{three~way~handshake} \textit{three way handshake} la voce viene -spostata nella coda delle connessioni complete. Quando il processo chiama la -funzione \func{accept} (vedi sez.~\ref{sec:TCP_func_accept}) la prima voce -nella coda delle connessioni complete è passata al programma, o, se la coda è -vuota, il processo viene posto in attesa e risvegliato all'arrivo della prima -connessione completa. +client o fino ad un timeout. Nel caso di completamento del \textit{three way + handshake} la voce viene spostata nella coda delle connessioni complete. +Quando il processo chiama la funzione \func{accept} (vedi +sez.~\ref{sec:TCP_func_accept}) la prima voce nella coda delle connessioni +complete è passata al programma, o, se la coda è vuota, il processo viene +posto in attesa e risvegliato all'arrivo della prima connessione completa. \begin{figure}[!htb] \centering \includegraphics[width=11cm]{img/tcp_listen_backlog} @@ -968,15 +963,16 @@ saturata, impedendo di fatto ulteriori connessioni. Per ovviare a questo il significato del \param{backlog} è stato cambiato a indicare la lunghezza della coda delle connessioni complete. La lunghezza della coda delle connessioni incomplete può essere ancora controllata usando -la funzione \func{sysctl} con il parametro \const{NET\_TCP\_MAX\_SYN\_BACKLOG} -o scrivendola direttamente in \sysctlfile{net/ipv4/tcp\_max\_syn\_backlog}. -Quando si attiva la protezione dei syncookies però (con l'opzione da compilare -nel kernel e da attivare usando \sysctlfile{net/ipv4/tcp\_syncookies}) questo -valore viene ignorato e non esiste più un valore massimo. In ogni caso in -Linux il valore di \param{backlog} viene troncato ad un massimo di -\const{SOMAXCONN} se è superiore a detta costante (che di default vale -128).\footnote{il valore di questa costante può essere controllato con un - altro parametro di \func{sysctl}, vedi sez.~\ref{sec:sock_ioctl_IP}.} +la funzione \func{sysctl} con il parametro +\constd{NET\_TCP\_MAX\_SYN\_BACKLOG} o scrivendola direttamente in +\sysctlfile{net/ipv4/tcp\_max\_syn\_backlog}. Quando si attiva la protezione +dei syncookies però (con l'opzione da compilare nel kernel e da attivare +usando \sysctlfile{net/ipv4/tcp\_syncookies}) questo valore viene ignorato e +non esiste più un valore massimo. In ogni caso in Linux il valore +di \param{backlog} viene troncato ad un massimo di \const{SOMAXCONN} se è +superiore a detta costante (che di default vale 128).\footnote{il valore di + questa costante può essere controllato con un altro parametro di + \func{sysctl}, vedi sez.~\ref{sec:sock_ioctl_IP}.} La scelta storica per il valore di questo parametro era di 5, e alcuni vecchi kernel non supportavano neanche valori superiori, ma la situazione corrente è @@ -993,7 +989,7 @@ che il compito principale della coda sia quello di gestire il caso in cui il server è occupato fra chiamate successive alla \func{accept} (per cui la coda più occupata sarebbe quella delle connessioni completate), ma piuttosto quello di gestire la presenza di un gran numero di SYN in attesa di concludere il -\itindex{three~way~handshake} \textit{three way handshake}. +\textit{three way handshake}. Infine va messo in evidenza che, nel caso di socket TCP, quando un SYN arriva con tutte le code piene, il pacchetto deve essere ignorato. Questo perché la @@ -1011,10 +1007,10 @@ trasparente dal protocollo TCP. \label{sec:TCP_func_accept} La funzione \funcd{accept} è chiamata da un server per gestire la connessione -una volta che sia stato completato il \itindex{three~way~handshake} -\textit{three way handshake},\footnote{la funzione è comunque generica ed è - utilizzabile su socket di tipo \const{SOCK\_STREAM}, \const{SOCK\_SEQPACKET} - e \const{SOCK\_RDM}.} la funzione restituisce un nuovo socket descriptor su +una volta che sia stato completato il \textit{three way + handshake},\footnote{la funzione è comunque generica ed è utilizzabile su + socket di tipo \const{SOCK\_STREAM}, \const{SOCK\_SEQPACKET} e + \const{SOCK\_RDM}.} la funzione restituisce un nuovo socket descriptor su cui si potrà operare per effettuare la comunicazione. Se non ci sono connessioni completate il processo viene messo in attesa. Il prototipo della funzione è il seguente: @@ -1928,13 +1924,12 @@ connessioni da qualunque indirizzo e da qualunque porta e su qualunque interfaccia locale. A questo punto si può lanciare il client, esso chiamerà \func{socket} e -\func{connect}; una volta completato il \itindex{three~way~handshake} -\textit{three way handshake} la connessione è stabilita; la \func{connect} -ritornerà nel client\footnote{si noti che è sempre la \func{connect} del - client a ritornare per prima, in quanto questo avviene alla ricezione del - secondo segmento (l'ACK del server) del \itindex{three~way~handshake} - \textit{three way handshake}, la \func{accept} del server ritorna solo dopo - un altro mezzo RTT quando il terzo segmento (l'ACK del client) viene +\func{connect}; una volta completato il \textit{three way handshake} la +connessione è stabilita; la \func{connect} ritornerà nel client\footnote{si + noti che è sempre la \func{connect} del client a ritornare per prima, in + quanto questo avviene alla ricezione del secondo segmento (l'ACK del server) + del \textit{three way handshake}, la \func{accept} del server ritorna solo + dopo un altro mezzo RTT quando il terzo segmento (l'ACK del client) viene ricevuto.} e la \func{accept} nel server, ed usando di nuovo \cmd{netstat} otterremmo che: \begin{verbatim} @@ -2183,10 +2178,10 @@ perché nel server l'unica chiamata ad una \textit{system call} lenta, che può essere interrotta dall'arrivo di \signal{SIGCHLD}, è quella ad \func{accept}, che è l'unica funzione che può mettere il processo padre in stato di sleep nel periodo in cui un figlio può terminare; si noti infatti come le altre -\index{system~call~lente} \textit{system call} lente (si ricordi la -distinzione fatta in sez.~\ref{sec:sig_gen_beha}) o sono chiamate prima di -entrare nel ciclo principale, quando ancora non esistono processi figli, o -sono chiamate dai figli stessi e non risentono di \signal{SIGCHLD}. +\textit{system call} lente (si ricordi la distinzione fatta in +sez.~\ref{sec:sig_gen_beha}) o sono chiamate prima di entrare nel ciclo +principale, quando ancora non esistono processi figli, o sono chiamate dai +figli stessi e non risentono di \signal{SIGCHLD}. Per questo l'unica modifica sostanziale nel ciclo principale (\texttt{\small 23--42}), rispetto precedente versione di fig.~\ref{fig:TCP_ServEcho_first}, @@ -2279,13 +2274,12 @@ Benché questo non sia un fatto comune, un evento simile può essere osservato con dei server molto occupati. In tal caso, con una struttura del server simile a quella del nostro esempio, in cui la gestione delle singole connessioni è demandata a processi figli, può accadere che il \textit{three - way handshake} \itindex{three~way~handshake} venga completato e la relativa -connessione abortita subito dopo, prima che il padre, per via del carico della -macchina, abbia fatto in tempo ad eseguire la chiamata ad \func{accept}. Di -nuovo si ha una situazione analoga a quella illustrata in -fig.~\ref{fig:TCP_early_abort}, in cui la connessione viene stabilita, ma -subito dopo si ha una condizione di errore che la chiude prima che essa sia -stata accettata dal programma. + way handshake} venga completato e la relativa connessione abortita subito +dopo, prima che il padre, per via del carico della macchina, abbia fatto in +tempo ad eseguire la chiamata ad \func{accept}. Di nuovo si ha una situazione +analoga a quella illustrata in fig.~\ref{fig:TCP_early_abort}, in cui la +connessione viene stabilita, ma subito dopo si ha una condizione di errore che +la chiude prima che essa sia stata accettata dal programma. Questo significa che, oltre alla interruzione da parte di un segnale, che abbiamo trattato in sez.~\ref{sec:TCP_child_hand} nel caso particolare di @@ -2389,33 +2383,32 @@ anarres.echo > gont.34559: R 511689732:511689732(0) win 0 \end{verbatim} Le prime tre righe vengono prodotte al momento in cui lanciamo il nostro -client, e corrispondono ai tre pacchetti del \itindex{three~way~handshake} -\textit{three way handshake}. L'output del comando riporta anche i numeri di -sequenza iniziali, mentre la lettera \texttt{S} indica che per quel pacchetto -si aveva il SYN flag attivo. Si noti come a partire dal secondo pacchetto sia -sempre attivo il campo \texttt{ack}, seguito dal numero di sequenza per il -quale si da il ricevuto; quest'ultimo, a partire dal terzo pacchetto, viene -espresso in forma relativa per maggiore compattezza. Il campo \texttt{win} in -ogni riga indica la \textit{advertised window} di cui parlavamo in -sez.~\ref{sec:TCP_TCP_opt}. Allora si può verificare dall'output del comando -come venga appunto realizzata la sequenza di pacchetti descritta in -sez.~\ref{sec:TCP_conn_cre}: prima viene inviato dal client un primo pacchetto -con il SYN che inizia la connessione, a cui il server risponde dando il -ricevuto con un secondo pacchetto, che a sua volta porta un SYN, cui il client -risponde con un il terzo pacchetto di ricevuto. +client, e corrispondono ai tre pacchetti del \textit{three way handshake}. +L'output del comando riporta anche i numeri di sequenza iniziali, mentre la +lettera \texttt{S} indica che per quel pacchetto si aveva il SYN flag attivo. +Si noti come a partire dal secondo pacchetto sia sempre attivo il campo +\texttt{ack}, seguito dal numero di sequenza per il quale si da il ricevuto; +quest'ultimo, a partire dal terzo pacchetto, viene espresso in forma relativa +per maggiore compattezza. Il campo \texttt{win} in ogni riga indica la +\textit{advertised window} di cui parlavamo in sez.~\ref{sec:TCP_TCP_opt}. +Allora si può verificare dall'output del comando come venga appunto realizzata +la sequenza di pacchetti descritta in sez.~\ref{sec:TCP_conn_cre}: prima viene +inviato dal client un primo pacchetto con il SYN che inizia la connessione, a +cui il server risponde dando il ricevuto con un secondo pacchetto, che a sua +volta porta un SYN, cui il client risponde con un il terzo pacchetto di +ricevuto. Ritorniamo allora alla nostra sessione con il servizio echo: dopo le tre righe -del \itindex{three~way~handshake} \textit{three way handshake} non avremo -nulla fin tanto che non scriveremo una prima riga sul client; al momento in -cui facciamo questo si genera una sequenza di altri quattro pacchetti. Il -primo, dal client al server, contraddistinto da una lettera \texttt{P} che -significa che il flag PSH è impostato, contiene la nostra riga (che è appunto -di 11 caratteri), e ad esso il server risponde immediatamente con un pacchetto -vuoto di ricevuto. Poi tocca al server riscrivere indietro quanto gli è stato -inviato, per cui sarà lui a mandare indietro un terzo pacchetto con lo stesso -contenuto appena ricevuto, e a sua volta riceverà dal client un ACK nel quarto -pacchetto. Questo causerà la ricezione dell'eco nel client che lo stamperà a -video. +del \textit{three way handshake} non avremo nulla fin tanto che non scriveremo +una prima riga sul client; al momento in cui facciamo questo si genera una +sequenza di altri quattro pacchetti. Il primo, dal client al server, +contraddistinto da una lettera \texttt{P} che significa che il flag PSH è +impostato, contiene la nostra riga (che è appunto di 11 caratteri), e ad esso +il server risponde immediatamente con un pacchetto vuoto di ricevuto. Poi +tocca al server riscrivere indietro quanto gli è stato inviato, per cui sarà +lui a mandare indietro un terzo pacchetto con lo stesso contenuto appena +ricevuto, e a sua volta riceverà dal client un ACK nel quarto pacchetto. +Questo causerà la ricezione dell'eco nel client che lo stamperà a video. A questo punto noi procediamo ad interrompere l'esecuzione del server con un \texttt{C-c} (cioè con l'invio di \signal{SIGTERM}): nel momento in cui @@ -2835,9 +2828,8 @@ pronto per la scrittura sono le seguenti: Infine c'è una sola condizione che fa si che \func{select} ritorni segnalando che un socket (che sarà riportato nel terzo insieme di file descriptor) ha una condizione di eccezione pendente, e cioè la ricezione sul socket di -\textsl{dati urgenti} (o \itindex{out-of-band} \textit{out-of-band}), una -caratteristica specifica dei socket TCP su cui torneremo in -sez.~\ref{sec:TCP_urgent_data}. +\textsl{dati urgenti} (o \textit{out-of-band}), una caratteristica specifica +dei socket TCP su cui torneremo in sez.~\ref{sec:TCP_urgent_data}. Si noti come nel caso della lettura \func{select} si applichi anche ad operazioni che non hanno nulla a che fare con l'I/O di dati come il @@ -3037,13 +3029,15 @@ capi chiuda la connessione, quando l'altro capo la lascia aperta.\footnote{abbiamo incontrato questa situazione nei vari scenari critici di sez.~\ref{sec:TCP_echo_critical}.} +\itindbeg{half-close} + È pertanto possibile avere una situazione in cui un capo della connessione non avendo più nulla da scrivere, possa chiudere il socket, segnalando così l'avvenuta terminazione della trasmissione (l'altro capo riceverà infatti un -end-of-file in lettura) mentre dall'altra parte si potrà proseguire la -trasmissione dei dati scrivendo sul socket che da quel lato è ancora aperto. -Questa è quella situazione in cui si dice che il socket è \textit{half - closed}. +\textit{end-of-file} in lettura) mentre dall'altra parte si potrà proseguire +la trasmissione dei dati scrivendo sul socket che da quel lato è ancora +aperto. Questa è quella situazione in cui si dice che il socket è +``\textit{half closed}''. Il problema che si pone è che se la chiusura del socket è effettuata con la funzione \func{close}, come spiegato in sez.~\ref{sec:TCP_func_close}, si perde @@ -3071,24 +3065,26 @@ vuole operare e come secondo argomento un valore intero \param{how} che indica la modalità di chiusura del socket, quest'ultima può prendere soltanto tre valori: \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} -\item[\const{SHUT\_RD}] chiude il lato in lettura del socket, non sarà più +\item[\constd{SHUT\_RD}] chiude il lato in lettura del socket, non sarà più possibile leggere dati da esso, tutti gli eventuali dati trasmessi dall'altro capo del socket saranno automaticamente scartati dal kernel, che, in caso di socket TCP, provvederà comunque ad inviare i relativi segmenti di ACK. -\item[\const{SHUT\_WR}] chiude il lato in scrittura del socket, non sarà più +\item[\constd{SHUT\_WR}] chiude il lato in scrittura del socket, non sarà più possibile scrivere dati su di esso. Nel caso di socket TCP la chiamata causa l'emissione di un segmento FIN, secondo la procedura chiamata - \itindex{half-close} \textit{half-close}. Tutti i dati presenti nel buffer - di scrittura prima della chiamata saranno inviati, seguiti dalla sequenza di - chiusura illustrata in sez.~\ref{sec:TCP_conn_term}. -\item[\const{SHUT\_RDWR}] chiude sia il lato in lettura che quello in + \textit{half-close}. Tutti i dati presenti nel buffer di scrittura prima + della chiamata saranno inviati, seguiti dalla sequenza di chiusura + illustrata in sez.~\ref{sec:TCP_conn_term}. +\item[\constd{SHUT\_RDWR}] chiude sia il lato in lettura che quello in scrittura del socket. È equivalente alla chiamata in sequenza con \const{SHUT\_RD} e \const{SHUT\_WR}. \end{basedescript} +\itindend{half-close} + Ci si può chiedere quale sia l'utilità di avere introdotto \const{SHUT\_RDWR} -quando questa sembra rendere \funcd{shutdown} del tutto equivalente ad una +quando questa sembra rendere \func{shutdown} del tutto equivalente ad una \func{close}. In realtà non è così, esiste infatti un'altra differenza con \func{close}, più sottile. Finora infatti non ci siamo presi la briga di sottolineare in maniera esplicita che, come per i file e le fifo, anche per i @@ -3399,18 +3395,17 @@ successiva \func{select} ritornerà immediatamente segnalando l'ulteriore disponibilità. Il nostro server comunque soffre di una vulnerabilità per un attacco di tipo -\itindex{Denial~of~Service~(DoS)} \textit{Denial of Service}. Il problema è -che in caso di blocco di una qualunque delle funzioni di I/O, non avendo usato -processi separati, tutto il server si ferma e non risponde più a nessuna -richiesta. Abbiamo scongiurato questa evenienza per l'I/O in ingresso con -l'uso di \func{select}, ma non vale altrettanto per l'I/O in uscita. Il -problema pertanto può sorgere qualora una delle chiamate a \func{write} -effettuate da \func{FullWrite} si blocchi. Con il funzionamento normale questo -non accade in quanto il server si limita a scrivere quanto riceve in ingresso, -ma qualora venga utilizzato un client malevolo che esegua solo scritture e non -legga mai indietro l'\textsl{eco} del server, si potrebbe giungere alla -saturazione del buffer di scrittura, ed al conseguente blocco del server su di -una \func{write}. +\textit{Denial of Service}. Il problema è che in caso di blocco di una +qualunque delle funzioni di I/O, non avendo usato processi separati, tutto il +server si ferma e non risponde più a nessuna richiesta. Abbiamo scongiurato +questa evenienza per l'I/O in ingresso con l'uso di \func{select}, ma non vale +altrettanto per l'I/O in uscita. Il problema pertanto può sorgere qualora una +delle chiamate a \func{write} effettuate da \func{FullWrite} si blocchi. Con +il funzionamento normale questo non accade in quanto il server si limita a +scrivere quanto riceve in ingresso, ma qualora venga utilizzato un client +malevolo che esegua solo scritture e non legga mai indietro l'\textsl{eco} del +server, si potrebbe giungere alla saturazione del buffer di scrittura, ed al +conseguente blocco del server su di una \func{write}. Le possibili soluzioni in questo caso sono quelle di ritornare ad eseguire il ciclo di risposta alle richieste all'interno di processi separati, utilizzare @@ -3442,7 +3437,7 @@ pertanto: \item i dati inviati su un socket vengono considerati traffico normale, pertanto vengono rilevati alla loro ricezione sull'altro capo da una selezione effettuata con \const{POLLIN} o \const{POLLRDNORM}; -\item i dati urgenti \itindex{out-of-band} \textit{out-of-band} (vedi +\item i dati urgenti \textit{out-of-band} (vedi sez.~\ref{sec:TCP_urgent_data}) su un socket TCP vengono considerati traffico prioritario e vengono rilevati da una condizione \const{POLLIN}, \const{POLLPRI} o \const{POLLRDBAND}. diff --git a/trasplayer.tex b/trasplayer.tex index a3fe9a3..d48daeb 100644 --- a/trasplayer.tex +++ b/trasplayer.tex @@ -65,6 +65,9 @@ comando \cmd{netstat} nel campo \textit{State}. % TODO trattare la advertised window \itindend{advertised~window} +\index{algoritmo~di~Nagle|(} +% TODO trattare l'algoritmo di Nagle +\index{algoritmo~di~Nagle|)} \section{Il protocollo UDP} -- 2.30.2