X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=tcpsock.tex;h=695603e744b7bb9b3f4dc81aca2098b5acd431d6;hp=9cd9ab726b0c94f549525ab157f5c4164479230a;hb=4cbeb0e4fa1d31da798c8e68108eb6785586ab34;hpb=193d612d40c5f81f5559ea6e11e70f6b6e51fb39 diff --git a/tcpsock.tex b/tcpsock.tex index 9cd9ab7..695603e 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -95,9 +95,8 @@ stabilisce la connessione. % conoscere il numero di chi si vuole chiamare. La funzione \func{accept} è % quando si risponde al telefono. -\begin{figure}[htb] - \centering - \includegraphics[width=10cm]{img/three_way_handshake} +\begin{figure}[!htb] + \centering \includegraphics[width=10cm]{img/three_way_handshake} \caption{Il \textit{three way handshake} del TCP.} \label{fig:TCP_TWH} \end{figure} @@ -225,9 +224,8 @@ effettua la chiusura passiva, siano accorpati in un singolo segmento. In fig.~\ref{fig:TCP_close} si è rappresentato graficamente lo sequenza di scambio dei segmenti che conclude la connessione. -\begin{figure}[htb] - \centering - \includegraphics[width=10cm]{img/tcp_close} +\begin{figure}[!htb] + \centering \includegraphics[width=10cm]{img/tcp_close} \caption{La chiusura di una connessione TCP.} \label{fig:TCP_close} \end{figure} @@ -299,9 +297,8 @@ In fig.~\ref{fig:TCP_conn_example} è riportato lo schema dello scambio dei pacchetti che avviene per una un esempio di connessione, insieme ai vari stati che il protocollo viene ad assumere per i due lati, server e client. -\begin{figure}[htb] - \centering - \includegraphics[width=9cm]{img/tcp_connection} +\begin{figure}[!htb] + \centering \includegraphics[width=9cm]{img/tcp_connection} \caption{Schema dello scambio di pacchetti per un esempio di connessione.} \label{fig:TCP_conn_example} \end{figure} @@ -510,8 +507,7 @@ fatto scelte diverse per le porte effimere, in particolare in fig.~\ref{fig:TCP_port_alloc} sono riportate quelle di BSD e Linux. \begin{figure}[!htb] - \centering - \includegraphics[width=13cm]{img/port_alloc} + \centering \includegraphics[width=13cm]{img/port_alloc} \caption{Allocazione dei numeri di porta.} \label{fig:TCP_port_alloc} \end{figure} @@ -950,9 +946,8 @@ 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} +\begin{figure}[!htb] + \centering \includegraphics[width=11cm]{img/tcp_listen_backlog} \caption{Schema di funzionamento delle code delle connessioni complete ed incomplete.} \label{fig:TCP_listen_backlog} @@ -1288,9 +1283,9 @@ problema si avverte solo in lettura, quando si incontra la fine del file. In generale non è così, e con i socket questo è particolarmente evidente. -\begin{figure}[htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/FullRead.c} \end{minipage} \normalsize @@ -1315,10 +1310,10 @@ fig.~\ref{fig:sock_FullRead_code} e fig.~\ref{fig:sock_FullWrite_code} ed è disponibile fra i sorgenti allegati alla guida nei file \file{FullRead.c} e \file{FullWrite.c}. -\begin{figure}[htb] +\begin{figure}[!htbp] \centering \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/FullWrite.c} \end{minipage} \normalsize @@ -1359,9 +1354,9 @@ funzione per stampare un messaggio di aiuto) è allegato alla guida nella sezione dei codici sorgente e può essere compilato su una qualunque macchina GNU/Linux. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/TCP_daytime.c} \end{minipage} \normalsize @@ -1459,7 +1454,7 @@ esempi. \begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/TCP_iter_daytimed.c} \end{minipage} \normalsize @@ -1556,9 +1551,9 @@ riguardante l'apertura passiva del socket). Al solito il sorgente completo del server, nel file \texttt{TCP\_cunc\_daytimed.c}, è allegato insieme ai sorgenti degli altri esempi. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/TCP_cunc_daytimed.c} \end{minipage} \normalsize @@ -1696,9 +1691,9 @@ client per il servizio \textit{daytime} (vedi sez.~\ref{sec:TCP_daytime_client}), e la prima parte (\texttt{\small 10--27}) è sostanzialmente identica, a parte l'uso di una porta diversa. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6 cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/TCP_echo_first.c} \end{minipage} \normalsize @@ -1744,9 +1739,9 @@ buffer di ricezione e viene inserita (\texttt{\small 8}) la terminazione della stringa e per poter usare (\texttt{\small 9}) la funzione \func{fputs} per scriverli su \file{stdout}. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/ClientEcho_first.c} \end{minipage} \normalsize @@ -1781,7 +1776,7 @@ sez.~\ref{sec:TCP_daytime_cunc_server}, e da una funzione ausiliaria \begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/TCP_echod_first.c} \end{minipage} \normalsize @@ -1861,9 +1856,9 @@ in modalità interattiva (attivabile con l'opzione \texttt{-i}) si usa (\texttt{\small 5}) semplicemente la funzione \func{perror} per stampare sullo standard error. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/PrintErr.c} \end{minipage} \normalsize @@ -1885,9 +1880,9 @@ si incarica di tenere conto automaticamente della possibilità che non tutti i dati di cui è richiesta la scrittura vengano trasmessi con una singola \func{write}. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/ServEcho_first.c} \end{minipage} \normalsize @@ -2040,7 +2035,7 @@ quando affronteremo il comportamento in caso di conclusioni anomale: Tutto questo riguarda la connessione, c'è però da tenere conto dell'effetto del procedimento di chiusura del processo figlio nel server (si veda quanto esaminato in sez.~\ref{sec:proc_termination}). In questo caso avremo l'invio -del segnale \const{SIGCHLD} al padre, ma dato che non si è installato un +del segnale \signal{SIGCHLD} al padre, ma dato che non si è installato un gestore e che l'azione predefinita per questo segnale è quella di essere ignorato, non avendo predisposto la ricezione dello stato di terminazione, otterremo che il processo figlio entrerà nello stato di \index{zombie} zombie @@ -2053,7 +2048,7 @@ ripetendo il comando \cmd{ps}: Dato che non è il caso di lasciare processi \index{zombie} zombie, occorrerà ricevere opportunamente lo stato di terminazione del processo (si veda -sez.~\ref{sec:proc_wait}), cosa che faremo utilizzando \const{SIGCHLD} secondo +sez.~\ref{sec:proc_wait}), cosa che faremo utilizzando \signal{SIGCHLD} secondo quanto illustrato in sez.~\ref{sec:sig_sigchld}. Una prima modifica al nostro server è pertanto quella di inserire la gestione della terminazione dei processi figli attraverso l'uso di un gestore. Per questo useremo la funzione @@ -2074,7 +2069,7 @@ di \errcode{EINTR}. Vediamo allora cosa comporta tutto questo nel nostro caso: quando si chiude il client, il processo figlio che gestisce la connessione terminerà, ed il padre, -per evitare la creazione di zombie, riceverà il segnale \const{SIGCHLD} +per evitare la creazione di zombie, riceverà il segnale \signal{SIGCHLD} eseguendo il relativo gestore. Al ritorno del gestore però l'esecuzione nel padre ripartirà subito con il ritorno della funzione \func{accept} (a meno di un caso fortuito in cui il segnale arriva durante l'esecuzione del programma @@ -2098,9 +2093,9 @@ nuova funzione \func{SignalRestart}\footnote{anche questa è definita, insieme allegati.} come mostrato in fig.~\ref{fig:sig_SignalRestart_code}, ed installeremo il gestore usando quest'ultima. -\begin{figure}[!htb] - \footnotesize \centering - \begin{minipage}[c]{15.6cm} +\begin{figure}[!htbp] + \footnotesize \centering + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/SignalRestart.c} \end{minipage} \normalsize @@ -2141,7 +2136,7 @@ codice completo di quest'ultimo si trova nel file La prima modifica effettuata è stata quella di introdurre una nuova opzione a riga di comando, \texttt{-c}, che permette di richiedere il comportamento -compatibile nella gestione di \const{SIGCHLD} al posto della semantica BSD +compatibile nella gestione di \signal{SIGCHLD} al posto della semantica BSD impostando la variabile \var{compat} ad un valore non nullo. Questa è preimpostata al valore nullo, cosicché se non si usa questa opzione il comportamento di default del server è di usare la semantica BSD. @@ -2156,9 +2151,9 @@ fig.~\ref{fig:TCP_echo_server_code_second} la sezione di codice relativa alla gestione di tutte queste opzioni, che può essere trovata nel sorgente del programma. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/TCP_echod_second.c} \end{minipage} \normalsize @@ -2170,7 +2165,7 @@ programma. Vediamo allora come è cambiato il nostro server; una volta definite le variabili e trattate le opzioni il primo passo (\texttt{\small 9--13}) è -verificare la semantica scelta per la gestione di \const{SIGCHLD}, a seconda +verificare la semantica scelta per la gestione di \signal{SIGCHLD}, a seconda del valore di \var{compat} (\texttt{\small 9}) si installa il gestore con la funzione \func{Signal} (\texttt{\small 10}) o con \texttt{SignalRestart} (\texttt{\small 12}), essendo quest'ultimo il valore di default. @@ -2187,13 +2182,13 @@ numero di secondi da aspettare (il valore preimpostato è nullo). Si è potuto lasciare inalterata tutta la sezione di creazione del socket perché nel server l'unica chiamata ad una system call lenta, che può essere -interrotta dall'arrivo di \const{SIGCHLD}, è quella ad \func{accept}, che è +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{slow system call}\footnote{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 \const{SIGCHLD}. +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}, @@ -2222,9 +2217,9 @@ sia per tenere conto della nuova funzionalità di debugging, che per effettuare un controllo in caso di errore; il codice della nuova versione è mostrato in fig.~\ref{fig:TCP_ServEcho_second}. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/ServEcho_second.c} \end{minipage} \normalsize @@ -2276,9 +2271,8 @@ connessione viene abortita sul lato client per un qualche errore di rete con l'invio di un segmento RST, prima che nel server sia stata chiamata la funzione \func{accept}. -\begin{figure}[htb] - \centering - \includegraphics[width=10cm]{img/tcp_client_early_abort} +\begin{figure}[!htb] + \centering \includegraphics[width=10cm]{img/tcp_client_early_abort} \caption{Un possibile caso di terminazione precoce della connessione.} \label{fig:TCP_early_abort} \end{figure} @@ -2297,7 +2291,7 @@ 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 -\const{SIGCHLD}, si possono ricevere altri errori non fatali all'uscita di +\signal{SIGCHLD}, si possono ricevere altri errori non fatali all'uscita di \func{accept}, che come nel caso precedente, necessitano semplicemente la ripetizione della chiamata senza che si debba uscire dal programma. In questo caso anche la versione modificata del nostro server non sarebbe adatta, in @@ -2426,7 +2420,7 @@ 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 \const{SIGTERM}): nel momento in cui +\texttt{C-c} (cioè con l'invio di \signal{SIGTERM}): nel momento in cui facciamo questo vengono immediatamente generati altri due pacchetti. La terminazione del processo infatti comporta la chiusura di tutti i suoi file descriptor, il che comporta, per il socket che avevamo aperto, l'inizio della @@ -2497,7 +2491,7 @@ flusso dei dati, dal punto di vista del funzionamento nei confronti delle funzioni di lettura e scrittura, i socket sono del tutto analoghi a delle pipe. Allora, da quanto illustrato in sez.~\ref{sec:ipc_pipes}, sappiamo che tutte le volte che si cerca di scrivere su una pipe il cui altro capo non è -aperto il lettura il processo riceve un segnale di \const{SIGPIPE}, e questo è +aperto il lettura il processo riceve un segnale di \signal{SIGPIPE}, e questo è esattamente quello che avviene in questo caso, e siccome non abbiamo un gestore per questo segnale, viene eseguita l'azione preimpostata, che è quella di terminare il processo. @@ -2508,9 +2502,9 @@ di errore, per questo dovremo riscrivere la funzione \func{ClientEcho}, in modo da controllare gli stati di uscita delle varie chiamate. Si è riportata la nuova versione della funzione in fig.~\ref{fig:TCP_ClientEcho_second}. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/ClientEcho_second.c} \end{minipage} \normalsize @@ -2832,7 +2826,7 @@ pronto per la scrittura sono le seguenti: bloccherà e restituirà un valore positivo pari al numero di byte accettati dal livello di trasporto. \item il lato in scrittura della connessione è stato chiuso. In questo caso - una operazione di scrittura sul socket genererà il segnale \const{SIGPIPE}. + una operazione di scrittura sul socket genererà il segnale \signal{SIGPIPE}. \item c'è stato un errore sul socket. In questo caso una operazione di scrittura non si bloccherà ma restituirà una condizione di errore ed imposterà opportunamente la variabile \var{errno}. Vedremo in @@ -2898,9 +2892,9 @@ condizione di errore (con un segmento RST) il socket connesso sarà pronto in lettura (nell'ultimo caso anche in scrittura, ma questo non è necessario ai nostri scopi). -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/ClientEcho_third.c} \end{minipage} \normalsize @@ -3177,9 +3171,9 @@ effettuerà la chiusura dalla sua parte. Solo alla ricezione della chiusura del socket da parte del server il client potrà essere sicuro della ricezione di tutti i dati e della terminazione effettiva della connessione. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/ClientEcho.c} \end{minipage} \normalsize @@ -3255,9 +3249,8 @@ limiterà a registrare l'entrata in uso di un nuovo file descriptor ed utilizzerà \func{select} per rilevare la presenza di dati in arrivo su tutti i file descriptor attivi, operando direttamente su ciascuno di essi. -\begin{figure}[htb] - \centering - \includegraphics[width=13cm]{img/TCPechoMult} +\begin{figure}[!htb] + \centering \includegraphics[width=13cm]{img/TCPechoMult} \caption{Schema del nuovo server echo basato sull'I/O multiplexing.} \label{fig:TCP_echo_multiplex} \end{figure} @@ -3273,7 +3266,7 @@ disponibile coi sorgenti allegati nel file \texttt{select\_echod.c}. \begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/select_echod.c} \end{minipage} \normalsize @@ -3482,7 +3475,7 @@ ma la struttura del programma resta sostanzialmente la stessa. \begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/poll_echod.c} \end{minipage} \normalsize