X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=tcpsock.tex;h=32075ed8474604b4a80a0bbc2e1f091f071517d1;hp=e1390a11ac211f155e0d706fa6154adaf8d00aed;hb=5afbcf1d6a84ab2a527859d8fd05b75a31e39736;hpb=be0113897fdc6774f0dcc3f9c91fe5e76c5dd0a5 diff --git a/tcpsock.tex b/tcpsock.tex index e1390a1..32075ed 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -1,4 +1,4 @@ -%% 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 @@ -958,9 +958,9 @@ kernel, compreso Linux 2.0, che mostrano le differenze fra diverse 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. @@ -2776,8 +2776,7 @@ nel caso dei socket, visto che possono intervenire tutte una serie di 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) è @@ -2915,27 +2914,27 @@ codice completo si trova nel file \file{TCP\_echo\_third.c} dei sorgenti 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}) @@ -3211,8 +3210,8 @@ precedente versione causava l'immediato ritorno della funzione; in questo caso 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 @@ -3293,15 +3292,14 @@ aperti viene impostato a quello del socket in ascolto,\footnote{in quanto esso 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 @@ -3351,13 +3349,13 @@ vi sono dati sui socket connessi, per questo si ripete un ciclo 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 @@ -3433,8 +3431,7 @@ maggior parte dei casi, in quanto essa è nata sotto BSD proprio per affrontare 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} @@ -3570,11 +3567,9 @@ uscita e notifica in caso si errore (\texttt{\small 49--52}). 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}.