X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=elemtcp.tex;h=effafc390a905613132ba6fac9bc933a45a56072;hp=9dce854938a115ef5667a6e68e283768290df480;hb=9c8e87c281e632b8b9be81e8f27da473d1f544cb;hpb=88fefd4ca97449596a2b8689e89de5e66d9d6758 diff --git a/elemtcp.tex b/elemtcp.tex index 9dce854..effafc3 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -85,7 +85,7 @@ la connessione. \begin{figure}[htb] \centering - \includegraphics[width=10cm]{img/three_way_handshake.eps} + \includegraphics[width=10cm]{img/three_way_handshake} \caption{Il \textit{three way handshake} del TCP} \label{fig:TCPel_TWH} \end{figure} @@ -128,7 +128,7 @@ regolare la connessione. Normalmente vengono usate le seguenti opzioni: \textsl{finestra annunciata} (\textit{advertized window}) con la quale ciascun capo della comunicazione dichiara quanto spazio disponibile ha in memoria per i dati. Questo è un numero a 16 bit dell'header, che così può - indicare un massimo di 65535 bytes (anche se Linux usa come massimo 32767 + indicare un massimo di 65535 byte (anche se Linux usa come massimo 32767 per evitare problemi con alcuni stack bacati che usano l'aritmetica con segno per implementare lo stack TCP); ma alcuni tipi di connessione come quelle ad alta velocità (sopra i 45Mbits/sec) e quelle che hanno grandi @@ -197,7 +197,7 @@ stabilisce la connessione. \begin{figure}[htb] \centering - \includegraphics[width=10cm]{img/tcp_close.eps} + \includegraphics[width=10cm]{img/tcp_close} \caption{La chiusura di una connessione TCP} \label{fig:TCPel_close} \end{figure} @@ -210,7 +210,7 @@ che si mantenga un flusso di dati dal capo della connessione che deve ancora eseguire la chiusura passiva a quello che sta eseguendo la chiusura attiva. Nella sequenza indicata i dati verrebbero persi, dato che si è chiuso il socket dal lato che esegue la chiusura attiva; esistono tuttavia situazioni in -cui si vuole poter sfuttare questa possibilità, usando una procedura che è +cui si vuole poter sfruttare questa possibilità, usando una procedura che è chiamata \textit{half-close}; torneremo su questo aspetto e su come utilizzarlo più avanti, quando parleremo della funzione \func{shutdown}. @@ -269,18 +269,18 @@ ad assumere per i due lati, server e client. \begin{figure}[htb] \centering - \includegraphics[width=9cm]{img/tcp_connection.eps} + \includegraphics[width=9cm]{img/tcp_connection} \caption{Schema dello scambio di pacchetti per un esempio di connessione} \label{fig:TPCel_conn_example} \end{figure} La connessione viene iniziata dal client che annuncia un MSS di 1460 (un -valore tipico per IPv4 su ethernet) con Linux, il server risponde con lo +valore tipico per IPv4 su Ethernet) con Linux, 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 -1460 bytes annunciati dal server), quest'ultimo riceve la richiesta e +1460 byte annunciati dal server), quest'ultimo riceve la richiesta e restituisce una risposta (che di nuovo supponiamo stare in un singolo segmento). Si noti che l'acknowledge della richiesta è mandato insieme alla risposta, questo viene chiamato \textit{piggybacking} ed avviene tutte le @@ -476,7 +476,7 @@ disposizione del kernel per gestire le relative tabelle. \begin{figure}[!htb] \centering - \includegraphics[width=10cm]{img/port_alloc.eps} + \includegraphics[width=10cm]{img/port_alloc} \caption{Allocazione dei numeri di porta} \label{fig:TCPel_port_alloc} \end{figure} @@ -935,7 +935,7 @@ funzione restituisce un nuovo socket descriptor su cui si potr effettuare la comunicazione. Se non ci sono connessioni completate il processo viene messo in attesa. Il prototipo della funzione è il seguente: \begin{prototype}{sys/socket.h} -{int listen(int sockfd, struct sockaddr *addr, socklen\_t *addrlen)} +{int accept(int sockfd, struct sockaddr *addr, socklen\_t *addrlen)} La funzione 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 @@ -955,20 +955,16 @@ viene messo in attesa. Il prototipo della funzione operazione. \item \macro{EAGAIN} o \macro{EWOULDBLOCK} il socket è stato settato come non bloccante, e non ci sono connessioni in attesa di essere accettate. - \item \macro{EFAULT} l'argomento \var{addr} . - \item \macro{EPERM} Firewall rules forbid connection. - - \item \macro{ENOBUFS, ENOMEM} Not enough free memory. This often means - that the memory allocation is limited by the socket buffer limits, not by - the system memory. - - Inoltre possono essere restituiti gli errori di rete relativi al nuovo - socket come: \macro{EMFILE}, \macro{EINVAL}, \macro{ENOSR}, - \macro{ENOBUFS}, \macro{EPERM}, \macro{ECONNABORTED}, - \macro{ESOCKTNOSUPPORT}, \macro{EPROTONOSUPPORT}, \macro{ETIMEDOUT}, - \macro{ERESTARTSYS}. - + \item \macro{EPERM} Le regole del firewall non consentono la connessione. + \item \macro{ENOBUFS, 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: \macro{EMFILE}, \macro{EINVAL}, \macro{ENOSR}, \macro{ENOBUFS}, + \macro{EFAULT}, \macro{EPERM}, \macro{ECONNABORTED}, + \macro{ESOCKTNOSUPPORT}, \macro{EPROTONOSUPPORT}, \macro{ETIMEDOUT}, + \macro{ERESTARTSYS}. \end{prototype} La funzione può essere usata solo con socket che supportino la connessione @@ -977,8 +973,8 @@ La funzione pu esplicita della connessione, (attualmente in Linux solo DECnet ha questo comportamento), la funzione opera solo l'estrazione dalla coda delle connessioni, la conferma della connessione viene fatta implicitamente dalla -prima chiamata ad una \func{read} o una \func{write} mentre il rifiuto -della connessione viene fatto con la funzione \func{close}. +prima chiamata ad una \func{read} o una \func{write} mentre il rifiuto della +connessione viene fatto con la funzione \func{close}. È da chiarire che Linux presenta un comportamento diverso nella gestione degli errori rispetto ad altre implementazioni dei socket BSD, infatti la funzione @@ -993,7 +989,7 @@ I due argomenti \var{cliaddr} e \var{addrlen} (si noti che quest'ultimo l'indirizzo del client da cui proviene la connessione. Prima della chiamata \var{addrlen} deve essere inizializzato alle dimensioni della struttura il cui indirizzo è passato come argomento in \var{cliaddr}, al ritorno della -funzione \var{addrlen} conterrà il numero di bytes scritti dentro +funzione \var{addrlen} conterrà il numero di byte scritti dentro \var{cliaddr}. Se questa informazione non interessa basterà inizializzare a \macro{NULL} detti puntatori. @@ -1246,7 +1242,7 @@ In generale per questo avviene quando il server invece di far gestire la connessione direttamente a un processo figlio, come nell'esempio precedente, lancia un opportuno programma per ciascuna connessione usando \func{exec} (questa ad -esempio è la modailità con cui opera il \textsl{super-server} \cmd{inetd} +esempio è la modalità con cui opera il \textsl{super-server} \cmd{inetd} che gestisce tutta una serie di servizi lanciando per ogni connessione l'opportuno server).