X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=elemtcp.tex;h=5e5a69cd3c782f2cda80f1e40a864c79352e8d58;hp=d3178839f56981b5b2cb2403be16ae75b37e9d97;hb=dfa5facee2cc3dd4d66f2397911526770df7cb22;hpb=4826742c87d76af810c8a30e5495135fb43b8091;ds=sidebyside diff --git a/elemtcp.tex b/elemtcp.tex index d317883..5e5a69c 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -35,7 +35,7 @@ verifica utilizzando il codice dei due precedenti esempi elementari \figref{fig:net_cli_code} e \figref{fig:net_serv_code}) che porta alla creazione di una connessione è la seguente: -\begin{itemize} +\begin{enumerate} \item Il server deve essere preparato per accettare le connessioni in arrivo; il procedimento si chiama \textsl{apertura passiva} del socket (in inglese \textit{passive open}); questo viene fatto chiamando la sequenza di funzioni @@ -71,7 +71,7 @@ creazione di una connessione \texttt{SYN} del server inviando un \texttt{ACK}. Alla ricezione di quest'ultimo la funzione \texttt{accept} del server ritorna e la connessione è stabilita. -\end{itemize} +\end{enumerate} Il procedimento viene chiamato \textit{three way handshake} dato che per realizzarlo devono essere scambiati tre segmenti. In \nfig\ si è @@ -186,7 +186,7 @@ seguente: \item Dopo un certo tempo anche il secondo processo chiamerà la funzione \texttt{close} sul proprio socket, causando l'emissione di un altro segmento FIN. - + \item L'altro capo della connessione riceverà il FIN conclusivo e risponderà con un ACK. \end{enumerate} @@ -248,21 +248,21 @@ 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). -In assenza di connessione lo stato del TCP è \textsl{CLOSED}; quando una +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 -diventa \textsl{SYN\_SENT}; quando il TCP riceve la risposta del SYN$+$ACK -emette un ACK e passa allo stato \textsl{ESTABLISHED}; questo è lo stato +diventa \texttt{SYN\_SENT}; quando il TCP riceve la risposta del SYN$+$ACK +emette un ACK e passa allo stato \texttt{ESTABLISHED}; questo è lo stato finale in cui avviene la gran parte del trasferimento dei dati. Dal lato server in genere invece il passaggio che si opera con l'apertura -passiva è quello di portare il socket dallo stato \textsl{CLOSED} allo -stato \textsl{LISTEN} in cui vengono accettate le connessioni. +passiva è quello di portare il socket dallo stato \texttt{CLOSED} allo +stato \texttt{LISTEN} in cui vengono accettate le connessioni. -Dallo stato \textsl{ESTABLISHED} si può uscire in due modi; se un'applicazione +Dallo stato \texttt{ESTABLISHED} si può uscire in due modi; se un'applicazione chiama la \texttt{close} prima di aver ricevuto un end of file (chiusura -attiva) la transizione è verso lo stato \textsl{FIN\_WAIT\_1}; se invece -l'applicazione riceve un FIN nello stato \textsl{ESTABLISHED} (chiusura -passiva) la transizione è verso lo stato \textsl{CLOSE\_WAIT}. +attiva) la transizione è verso lo stato \texttt{FIN\_WAIT\_1}; se invece +l'applicazione riceve un FIN nello stato \texttt{ESTABLISHED} (chiusura +passiva) la transizione è verso lo stato \texttt{CLOSE\_WAIT}. In \nfig\ è riportato lo schema dello scambio dei pacchetti che avviene per una un esempio di connessione, insieme ai vari stati che il protocollo viene @@ -292,7 +292,7 @@ risposta. Infine si ha lo scambio dei quattro segmenti che terminano la connessione secondo quanto visto in \secref{sec:TCPel_conn_term}; si noti che il capo della connessione che esegue la chiusura attiva entra nello stato -\textsl{TIME\_WAIT} su cui torneremo fra poco. +\texttt{TIME\_WAIT} su cui torneremo fra poco. È da notare come per effettuare uno scambio di due pacchetti (uno di richiesta e uno di risposta) il TCP necessiti di ulteriori otto segmenti, se invece si @@ -339,16 +339,16 @@ pi Ogni implementazione del TCP deve scegliere un valore per la MSL (l'RFC1122 raccomanda 2 minuti, linux usa 30 secondi), questo comporta una durata dello -stato \textsl{TIME\_WAIT} che a seconda delle implementazioni può variare fra +stato \texttt{TIME\_WAIT} che a seconda delle implementazioni può variare fra 1 a 4 minuti. Lo stato \texttt{TIME\_WAIT} viene utilizzato dal protocollo per due motivi principali: -\begin{itemize} +\begin{enumerate} \item implementare in maniera affidabile la terminazione della connessione in entrambe le direzioni. \item consentire l'eliminazione dei segmenti duplicati dalla rete. -\end{itemize} +\end{enumerate} Il punto è che entrambe le ragioni sono importanti, anche se spesso si fa riferimento solo alla prima; ma è solo se si tiene conto della seconda che si @@ -636,8 +636,7 @@ ci si porr Il prototipo della funzione, definito in \texttt{sys/socket.h}, è il seguente: -\begin{itemize} -\item \texttt{int bind(int sockfd, const struct sockaddr *serv\_addr, +\begin{prototype}{int bind(int sockfd, const struct sockaddr *serv\_addr, socklen\_t addrlen) } Il primo argomento è un file descriptor ottenuto da una precedente chiamata @@ -648,15 +647,14 @@ Il prototipo della funzione, definito in \texttt{sys/socket.h}, La funzione restituisce zero in caso di successo e -1 per un errore, in caso di errore. La variabile \texttt{errno} viene settata secondo i seguenti codici di errore: - \begin{itemize} + \begin{errlist} \item \texttt{EBADF} Il file descriptor non è valido. \item \texttt{EINVAL} Il socket ha già un indirizzo assegnato. \item \texttt{ENOTSOCK} Il file descriptor non è associato ad un socket. \item \texttt{EACCESS} Si è cercato di usare un indirizzo riservato senza essere root. - \end{itemize} - -\end{itemize} + \end{errlist} +\end{prototype} Con il TCP la chiamata \texttt{bind} permette di specificare l'indirizzo, la porta, entrambi o nessuno dei due. In genere i server utilizzano una porta @@ -718,8 +716,7 @@ La funzione \texttt{connect} connessione con un server TCP, il prototipo della funzione, definito in \texttt{sys/socket.h}, è il seguente: -\begin{itemize} -\item \texttt{int connect(int sockfd, const struct sockaddr *serv\_addr, +\begin{prototype}{int connect(int sockfd, const struct sockaddr *serv\_addr, socklen\_t addrlen) } Il primo argomento è un file descriptor ottenuto da una precedente chiamata @@ -730,7 +727,7 @@ connessione con un server TCP, il prototipo della funzione, definito in La funzione restituisce zero in caso di successo e -1 per un errore, in caso di errore. La variabile \texttt{errno} viene settata secondo i seguenti codici di errore: - \begin{itemize} + \begin{errlist} \item \texttt{EBADF} Il file descriptor non è valido. \item \texttt{EFAULT} L'indirizzo della struttura di indirizzi è al di fuori dello spazio di indirizzi dell'utente. @@ -751,8 +748,8 @@ connessione con un server TCP, il prototipo della funzione, definito in \item \texttt{EACCESS, EPERM} Si è tentato di eseguire una connessione ad un indirizzo broacast senza che il socket fosse stato abilitato per il broadcast. - \end{itemize} -\end{itemize} + \end{errlist} +\end{prototype} La struttura dell'indirizzo deve essere inizializzata con l'indirizzo IP e il numero di porta del server a cui ci si vuole connettere, come mostrato