-%% tcpsock.tex
+bg%% tcpsock.tex
%%
%% Copyright (C) 2000-2015 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
associati alle interfacce locali. La notazione \texttt{0.0.0.0} usata da
\cmd{netstat} è equivalente all'asterisco utilizzato per il numero di porta,
indica il valore generico, e corrisponde al valore \const{INADDR\_ANY}
-definito in \headfile{arpa/inet.h} (vedi \ref{tab:TCP_ipv4_addr}).
+definito in \headfiled{arpa/inet.h} (vedi \ref{tab:TCP_ipv4_addr}).
Inoltre si noti come la porta e l'indirizzo di ogni eventuale connessione
esterna non sono specificati; in questo caso la \textit{socket pair} associata
\hline
\hline
\const{INADDR\_ANY} & Indirizzo generico (\texttt{0.0.0.0})\\
- \const{INADDR\_BROADCAST}& Indirizzo di \itindex{broadcast}
- \textit{broadcast}.\\
+ \const{INADDR\_BROADCAST}& Indirizzo di \textit{broadcast}.\\
\const{INADDR\_LOOPBACK} & Indirizzo di \textit{loopback}
(\texttt{127.0.0.1}).\\
\const{INADDR\_NONE} & Indirizzo errato.\\
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 \direct{extern}, ed inizializzata dal
+\macro{in6addr\_any} (dichiarata come \dirct{extern}, ed inizializzata dal
sistema al valore \const{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
\item[\errcode{EAFNOSUPPORT}] l'indirizzo non ha una famiglia di indirizzi
corretta nel relativo campo.
\item[\errcode{EACCES}, \errcode{EPERM}] si è tentato di eseguire una
- connessione ad un indirizzo \itindex{broadcast} \textit{broadcast} senza
- che il socket fosse stato abilitato per il \itindex{broadcast}
- \textit{broadcast}.
+ connessione ad un indirizzo \textit{broadcast} senza che il socket fosse
+ stato abilitato per il \textit{broadcast}.
\end{errlist}
altri errori possibili sono: \errval{EFAULT}, \errval{EBADF},
\errval{ENOTSOCK}, \errval{EISCONN} e \errval{EADDRINUSE}.}
implementazioni.
In Linux il significato di questo valore è cambiato a partire dal kernel 2.2
-per prevenire l'attacco chiamato \index{SYN~flood} \textit{SYN flood}. Questo
-si basa sull'emissione da parte dell'attaccante di un grande numero di
-pacchetti SYN indirizzati verso una porta, forgiati con indirizzo IP
+per prevenire l'attacco chiamato \itindex{SYN~flood} \textit{SYN
+ flood}. Questo si basa sull'emissione da parte dell'attaccante di un grande
+numero di pacchetti SYN indirizzati verso una porta, forgiati con indirizzo IP
fasullo\footnote{con la tecnica che viene detta \textit{ip spoofing}.} così
che i SYN$+$ACK vanno perduti e la coda delle connessioni incomplete viene
saturata, impedendo di fatto ulteriori connessioni.
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}.}
+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 è
Il risultato finale qui dipende dall'implementazione dello stack TCP, e nel
caso di Linux anche dall'impostazione di alcuni dei parametri di sistema che
si trovano in \file{/proc/sys/net/ipv4}, che ne controllano il comportamento:
-in questo caso in particolare da
-\sysctlrelfile{net/ipv4}{tcp\_retries2} (vedi
+in questo caso in particolare da \sysctlrelfile{net/ipv4}{tcp\_retries2} (vedi
sez.~\ref{sec:sock_ipv4_sysctl}). Questo parametro infatti specifica il numero
di volte che deve essere ritentata la ritrasmissione di un pacchetto nel mezzo
di una connessione prima di riportare un errore di timeout. Il valore
possibili condizioni di errore dovute alla rete. Occorre allora specificare
chiaramente quali sono le condizioni per cui un socket risulta essere
``\textsl{pronto}'' quando viene passato come membro di uno dei tre
-\itindex{file~descriptor~set} \textit{file descriptor set} usati da
-\func{select}.
+\textit{file descriptor set} usati da \func{select}.
Le condizioni che fanno si che la funzione \func{select} ritorni segnalando
che un socket (che sarà riportato nel primo insieme di file descriptor) è
allegati alla guida.
In questo caso la funzione comincia (\texttt{\small 8--9}) con l'azzeramento
-del \itindex{file~descriptor~set} \textit{file descriptor set} \var{fset} e
-l'impostazione del valore \var{maxfd}, da passare a \func{select} come massimo
-per il numero di file descriptor. Per determinare quest'ultimo si usa la macro
-\code{max} definita nel nostro file \file{macro.h} che raccoglie una
-collezione di macro di preprocessore di varia utilità.
+del \textit{file descriptor set} \var{fset} e l'impostazione del valore
+\var{maxfd}, da passare a \func{select} come massimo per il numero di file
+descriptor. Per determinare quest'ultimo si usa la macro \code{max} definita
+nel nostro file \file{macro.h} che raccoglie una collezione di macro di
+preprocessore di varia utilità.
La funzione prosegue poi (\texttt{\small 10--41}) con il ciclo principale, che
viene ripetuto indefinitamente. Per ogni ciclo si reinizializza
-(\texttt{\small 11--12}) il \itindex{file~descriptor~set} \textit{file
- descriptor set}, impostando i valori per il file descriptor associato al
-socket \var{socket} e per lo standard input (il cui valore si recupera con la
-funzione \func{fileno}). Questo è necessario in quanto la successiva
-(\texttt{\small 13}) chiamata a \func{select} comporta una modifica dei due
-bit relativi, che quindi devono essere reimpostati all'inizio di ogni ciclo.
+(\texttt{\small 11--12}) il \textit{file descriptor set}, impostando i valori
+per il file descriptor associato al socket \var{socket} e per lo standard
+input (il cui valore si recupera con la funzione \func{fileno}). Questo è
+necessario in quanto la successiva (\texttt{\small 13}) chiamata a
+\func{select} comporta una modifica dei due bit relativi, che quindi devono
+essere reimpostati all'inizio di ogni ciclo.
Si noti come la chiamata a \func{select} venga eseguita usando come primo
argomento il valore di \var{maxfd}, precedentemente calcolato, e passando poi
-il solo \itindex{file~descriptor~set} \textit{file descriptor set} per il
-controllo dell'attività in lettura, negli altri argomenti sono passati tutti
-puntatori nulli, non interessando né il controllo delle altre attività, né
-l'impostazione di un valore di timeout.
+il solo \textit{file descriptor set} per il controllo dell'attività in
+lettura, negli altri argomenti sono passati tutti puntatori nulli, non
+interessando né il controllo delle altre attività, né l'impostazione di un
+valore di timeout.
Al ritorno di \func{select} si provvede a controllare quale dei due file
descriptor presenta attività in lettura, cominciando (\texttt{\small 14--24})
prima (\texttt{\small 19}) si imposta opportunamente \var{eof} ad un valore
non nullo, dopo di che (\texttt{\small 20}) si effettua la chiusura del lato
in scrittura del socket con \func{shutdown}. Infine (\texttt{\small 21}) si
-usa la macro \macro{FD\_CLR} per togliere lo standard input dal
-\itindex{file~descriptor~set} \textit{file descriptor set}.
+usa la macro \macro{FD\_CLR} per togliere lo standard input dal \textit{file
+ descriptor set}.
In questo modo anche se la lettura del file in ingresso è conclusa, la
funzione non esce dal ciclo principale (\texttt{\small 11--50}), ma continua
alto.} che verrà anche (\texttt{\small 4}) inserito nella tabella.
La prima sezione (\texttt{\small 7--10}) del ciclo principale esegue la
-costruzione del \itindex{file~descriptor~set} \textit{file descriptor set}
-\var{fset} in base ai socket connessi in un certo momento; all'inizio ci sarà
-soltanto il socket in ascolto, ma nel prosieguo delle operazioni, verranno
-utilizzati anche tutti i socket connessi registrati nella tabella
-\var{fd\_open}. Dato che la chiamata di \func{select} modifica il valore del
-\itindex{file~descriptor~set} \textit{file descriptor set}, è necessario
-ripetere (\texttt{\small 7}) ogni volta il suo azzeramento, per poi procedere
-con il ciclo (\texttt{\small 8--10}) in cui si impostano i socket trovati
-attivi.
+costruzione del \textit{file descriptor set} \var{fset} in base ai socket
+connessi in un certo momento; all'inizio ci sarà soltanto il socket in
+ascolto, ma nel prosieguo delle operazioni, verranno utilizzati anche tutti i
+socket connessi registrati nella tabella \var{fd\_open}. Dato che la chiamata
+di \func{select} modifica il valore del \textit{file descriptor set}, è
+necessario ripetere (\texttt{\small 7}) ogni volta il suo azzeramento, per poi
+procedere con il ciclo (\texttt{\small 8--10}) in cui si impostano i socket
+trovati attivi.
Per far questo si usa la caratteristica dei file descriptor, descritta in
sez.~\ref{sec:file_open_close}, per cui il kernel associa sempre ad ogni nuovo
diverso da zero; in questo modo se l'unico socket con attività era quello
connesso, avendo opportunamente decrementato il contatore, il ciclo verrà
saltato, e si ritornerà immediatamente (ripetuta l'inizializzazione del
-\itindex{file~descriptor~set} \textit{file descriptor set} con i nuovi valori
-nella tabella) alla chiamata di \func{accept}. Se il socket attivo non è
-quello in ascolto, o ce ne sono comunque anche altri, il valore di \var{n} non
-sarà nullo ed il controllo sarà eseguito. Prima di entrare nel ciclo comunque
-si inizializza (\texttt{\small 28}) il valore della variabile \var{i} che
-useremo come indice nella tabella \var{fd\_open} al valore minimo,
-corrispondente al file descriptor del socket in ascolto.
+\textit{file descriptor set} con i nuovi valori nella tabella) alla chiamata
+di \func{accept}. Se il socket attivo non è quello in ascolto, o ce ne sono
+comunque anche altri, il valore di \var{n} non sarà nullo ed il controllo sarà
+eseguito. Prima di entrare nel ciclo comunque si inizializza (\texttt{\small
+ 28}) il valore della variabile \var{i} che useremo come indice nella tabella
+\var{fd\_open} al valore minimo, corrispondente al file descriptor del socket
+in ascolto.
Il primo passo (\texttt{\small 30}) nella verifica è incrementare il valore
dell'indice \var{i} per posizionarsi sul primo valore possibile per un file
queste problematiche con i socket. Abbiamo però visto in
sez.~\ref{sec:file_multiplexing} come la funzione \func{poll} possa costituire
una alternativa a \func{select}, con alcuni vantaggi.\footnote{non soffrendo
- delle limitazioni dovute all'uso dei \itindex{file~descriptor~set}
- \textit{file descriptor set}.}
+ delle limitazioni dovute all'uso dei \textit{file descriptor set}.}
Ancora una volta in sez.~\ref{sec:file_poll} abbiamo trattato la funzione in
maniera generica, parlando di file descriptor, ma come per \func{select}
Come si può notare la logica del programma è identica a quella vista in
fig.~\ref{fig:TCP_SelectEchod} per l'analogo server basato su \func{select};
la sola differenza significativa è che in questo caso non c'è bisogno di
-rigenerare i \itindex{file~descriptor~set} \textit{file descriptor set} in
-quanto l'uscita è indipendente dai dati in ingresso. Si applicano comunque
-anche a questo server le considerazioni finali di
-sez.~\ref{sec:TCP_serv_select}.
-
+rigenerare i \textit{file descriptor set} in quanto l'uscita è indipendente
+dai dati in ingresso. Si applicano comunque anche a questo server le
+considerazioni finali di sez.~\ref{sec:TCP_serv_select}.