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}.
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
\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]
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
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.
& \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}
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
\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.
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
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
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}.
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.
\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
\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
\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.
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
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 è
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
& \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
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
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},
\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
\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}:
\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
\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}
}
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
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
\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
\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.
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}
\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}.}
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
\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
\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
\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.\\
\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)}
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}
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
\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
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
\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
\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
\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
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
\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
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
\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
\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}&
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
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
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ò
% 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
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
\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
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
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
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
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
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
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
\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}&
\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
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
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
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
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
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ù
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
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
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
\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
\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
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.
\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
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.
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
\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.
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
\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}&
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
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
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
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
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
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
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
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}.
\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
%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
% 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
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
\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}
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.
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
\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}
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}.
\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
\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
\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 è
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}.
% 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
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
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}.
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
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
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}
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
\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
\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.
% 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
% 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
\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,
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
\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
\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
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}).
(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
\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
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
\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
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.
\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.}
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}}
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)}
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
\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}
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 è
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
\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:
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}
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},
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
\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
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
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
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
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
\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}.