In particolare ci concentreremo sulle modalità con le quali il protocollo dà
inizio e conclude una connessione; faremo inoltre anche un breve accenno al
significato di alcuni dei vari stati che il protocollo assume durante la vita
-di una connessione, che possono essere osservati per ciascun socket attivo con
-l'uso del programma \cmd{netstat}.
+di una connessione, che possono essere osservati per ciascun
+socket\index{socket} attivo con l'uso del programma \cmd{netstat}.
\subsection{La creazione della connessione: il \textit{three way handshake}}
\label{sec:TCPel_conn_cre}
Una descrizione completa del funzionamento del protocollo va al di là degli
obiettivi di questo libro; un approfondimento sugli aspetti principali si
trova in \capref{cha:tcp_protocol}, ma per una trattazione esauriente il
-miglior riferimento resta (FIXME citare lo Stevens); qui ci limiteremo a
-descrivere brevemente un semplice esempio di connessione e le transizioni che
-avvengono nei due casi appena citati (creazione e terminazione della
-connessione).
+miglior riferimento resta \cite{TCPIll1}; qui ci limiteremo a descrivere
+brevemente un semplice esempio di connessione e le transizioni che avvengono
+nei due casi appena citati (creazione e terminazione della connessione).
In assenza di connessione lo stato del TCP è \texttt{CLOSED}; quando una
applicazione esegue una apertura attiva il TCP emette un SYN e lo stato
funzione \func{rresvport} assegnando al socket una porta libera
nell'intervallo fra 512 e 1023.
-Data una connessione TCP si suole chiamare \textit{socket pair} la
-combinazione dei quattro numeri che definiscono i due capi della connessione e
-cioè l'indirizzo IP locale e la porta TCP locale, e l'indirizzo IP remoto e la
-porta TCP remota; questa combinazione, che scriveremo usando una notazione del
-tipo (195.110.112.152:22, 192.84.146.100:20100), identifica univocamente una
-connessione su internet. Questo concetto viene di solito esteso anche a UDP,
+Data una connessione TCP si suole chiamare \textit{socket pair}\footnote{da
+ non confondere con la coppia di socket della omonima funzione
+ \func{socketpair} che fanno riferimento ad una coppia di socket sulla stessa
+ macchina, non ai capi di una connessione TCP.} la combinazione dei quattro
+numeri che definiscono i due capi della connessione e cioè l'indirizzo IP
+locale e la porta TCP locale, e l'indirizzo IP remoto e la porta TCP remota;
+questa combinazione, che scriveremo usando una notazione del tipo
+(195.110.112.152:22, 192.84.146.100:20100), identifica univocamente una
+connessione su internet. Questo concetto viene di solito esteso anche a UDP,
benché in questo caso non abbia senso parlare di connessione. L'utilizzo del
programma \cmd{netstat} permette di visualizzare queste informazioni nei campi
\textit{Local Address} e \textit{Foreing Address}.
\item[\errcode{EBADF}] il file descriptor non è valido.
\item[\errcode{EINVAL}] il socket ha già un indirizzo assegnato.
\item[\errcode{ENOTSOCK}] il file descriptor non è associato ad un socket.
- \item[\errcode{EACCESS}] si è cercato di usare una porta riservata senza
+ \item[\errcode{EACCES}] si è cercato di usare una porta riservata senza
sufficienti privilegi.
\end{errlist}}
\end{prototype}
\item[\errcode{EAGAIN}] non ci sono più porte locali libere.
\item[\errcode{EAFNOSUPPORT}] l'indirizzo non ha una famiglia di indirizzi
corretta nel relativo campo.
- \item[\errcode{EACCESS, EPERM}] si è tentato di eseguire una connessione ad
- un indirizzo broadcast senza che il socket fosse stato abilitato per il
- broadcast.
+ \item[\errcode{EACCES}, \errcode{EPERM}] si è tentato di eseguire una
+ connessione ad un indirizzo broadcast senza che il socket fosse stato
+ abilitato per il broadcast.
\end{errlist}
altri errori possibili sono: \errval{EFAULT}, \errval{EBADF},
\errval{ENOTSOCK}, \errval{EISCONN} e \errval{EADDRINUSE}.}
viene messo in attesa. Il prototipo della funzione è il seguente:
\begin{prototype}{sys/socket.h}
{int accept(int sockfd, struct sockaddr *addr, socklen\_t *addrlen)}
- Estrae la prima connessione relativa al socket \var{sockfd}
- in attesa sulla coda delle connessioni complete, che associa ad nuovo socket
- con le stesse caratteristiche di \var{sockfd} (restituito dalla funzione
- stessa). Il socket originale non viene toccato. Nella struttura
- \var{addr} e nella variabile \var{addrlen} vengono restituiti
- indirizzo e relativa lunghezza del client che si è connesso.
+ Accetta una connessione sul socket specificato.
+
\bodydesc{La funzione restituisce un numero di socket descriptor positivo in
caso di successo e -1 in caso di errore, nel qual caso la variabile
\var{errno} viene impostata ai seguenti valori:
come non bloccante (vedi \secref{sec:file_noblocking}), e non ci sono
connessioni in attesa di essere accettate.
\item[\errcode{EPERM}] Le regole del firewall non consentono la connessione.
- \item[\errcode{ENOBUFS, ENOMEM}] questo spesso significa che l'allocazione
- della memoria è limitata dai limiti sui buffer dei socket, non dalla
- memoria di sistema.
+ \item[\errcode{ENOBUFS}, \errcode{ENOMEM}] questo spesso significa che
+ l'allocazione della memoria è limitata dai limiti sui buffer dei socket,
+ non dalla memoria di sistema.
\end{errlist}
Inoltre possono essere restituiti gli errori di rete relativi al nuovo
socket come: \errval{EMFILE}, \errval{EINVAL}, \errval{ENOSR},
\errval{ERESTARTSYS}.}
\end{prototype}
+Estrae la prima connessione relativa al socket \var{sockfd} in attesa sulla
+coda delle connessioni complete, che associa ad nuovo socket con le stesse
+caratteristiche di \var{sockfd} (restituito dalla funzione stessa). Il socket
+originale non viene toccato. Nella struttura \var{addr} e nella variabile
+\var{addrlen} vengono restituiti indirizzo e relativa lunghezza del client che
+si è connesso.
+
La funzione può essere usata solo con socket che supportino la connessione
(cioè di tipo \const{SOCK\_STREAM}, \const{SOCK\_SEQPACKET} o
\const{SOCK\_RDM}). Per alcuni protocolli che richiedono una conferma