Alcune correzioni ai font dei link, e una trattazione esplicita
[gapil.git] / tcpsock.tex
index 93826384aa3008d7d1f4d1786c108ba40a13e0b2..e4d45be083f6d84b79820e12934830f7189a7d58 100644 (file)
@@ -42,7 +42,7 @@ significato di alcuni dei vari \textsl{stati} ad essa associati.
 \itindbeg{three~way~handshake} 
 Il processo che porta a creare una connessione TCP è chiamato \textit{three
   way handshake}; la successione tipica degli eventi (e dei
-\textsl{segmenti}\footnote{Si ricordi che il segmento è l'unità elementare di
+\textsl{segmenti}\footnote{si ricordi che il segmento è l'unità elementare di
   dati trasmessa dal protocollo TCP al livello successivo; tutti i segmenti
   hanno un header che contiene le informazioni che servono allo \textit{stack
     TCP} (così viene di solito chiamata la parte del kernel che implementa il
@@ -149,7 +149,7 @@ connessione.  Normalmente vengono usate le seguenti opzioni:
   sez.~\ref{sec:tcp_protocol_xxx}) 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 byte;\footnote{Linux usa come massimo 32767 per evitare problemi con
+  65535 byte;\footnote{in Linux il massimo è 32767 per evitare problemi con
     alcune implementazioni che usano l'aritmetica con segno per implementare
     lo stack TCP.} ma alcuni tipi di connessione come quelle ad alta velocità
   (sopra i 45Mbit/sec) e quelle che hanno grandi ritardi nel cammino dei
@@ -165,12 +165,12 @@ connessione.  Normalmente vengono usate le seguenti opzioni:
   spostare a sinistra il valore della finestra annunciata inserito nel
   pacchetto). Con Linux è possibile indicare al kernel di far negoziare il
   fattore di scala in fase di creazione di una connessione tramite la
-  \textit{sysctl} \texttt{tcp\_window\_scaling} (vedi
-  sez.~\ref{sec:sock_ipv4_sysctl}).\footnote{per poter usare questa
+  \textit{sysctl} \itindex{TCP~window~scaling} \texttt{tcp\_window\_scaling}
+  (vedi sez.~\ref{sec:sock_ipv4_sysctl}).\footnote{per poter usare questa
     funzionalità è comunque necessario ampliare le dimensioni dei buffer di
     ricezione e spedizione, cosa che può essere fatta sia a livello di sistema
-    con le opportune \textit{sysctl} (vedi sez.~\ref{sec:sock_ipv4_sysctl}) che
-    a livello di singoli socket con le relative opzioni (vedi
+    con le opportune \textit{sysctl} (vedi sez.~\ref{sec:sock_ipv4_sysctl})
+    che a livello di singoli socket con le relative opzioni (vedi
     sez.~\ref{sec:sock_tcp_udp_options}).}
 
 \item \textit{timestamp option}, è anche questa una nuova opzione necessaria
@@ -187,6 +187,7 @@ vengono anche dette \textit{long fat pipe options} dato che questo 
 che viene dato alle connessioni caratterizzate da alta velocità o da ritardi
 elevati. In ogni caso Linux supporta pienamente entrambe le opzioni.
 
+
 \subsection{La terminazione della connessione}
 \label{sec:TCP_conn_term}
 
@@ -480,10 +481,10 @@ l'elenco delle porte assegnate dalla IANA (la \textit{Internet Assigned Number
   Authority}) ma l'elenco viene costantemente aggiornato e pubblicato su
 internet (una versione aggiornata si può trovare all'indirizzo
 \href{http://www.iana.org/assignments/port-numbers}
-{\texttt{http://www.iana.org/assignments/port-numbers}}); inoltre
-in un sistema unix-like un analogo elenco viene mantenuto nel file
-\file{/etc/services}, con la corrispondenza fra i vari numeri di porta ed il
-nome simbolico del servizio.  I numeri sono divisi in tre intervalli:
+{\textsf{http://www.iana.org/assignments/port-numbers}}); inoltre in un
+sistema unix-like un analogo elenco viene mantenuto nel file
+\conffile{/etc/services}, con la corrispondenza fra i vari numeri di porta ed
+il nome simbolico del servizio.  I numeri sono divisi in tre intervalli:
 
 \begin{enumerate*}
 \item \textsl{le porte note}. I numeri da 0 a 1023. Queste sono controllate e
@@ -684,7 +685,7 @@ ci si porr
   \item[\errcode{ENOTSOCK}] il file descriptor non è associato ad un socket.
   \item[\errcode{EACCES}] si è cercato di usare una porta riservata senza
     sufficienti privilegi.
-  \item[\errcode{EADDRNOTAVAIL}] Il tipo di indirizzo specificato non è
+  \item[\errcode{EADDRNOTAVAIL}] il tipo di indirizzo specificato non è
     disponibile.
   \item[\errcode{EADDRINUSE}] qualche altro socket sta già usando l'indirizzo.
   \end{errlist}
@@ -709,7 +710,7 @@ per il server\footnote{un'eccezione a tutto ci
   demone che deve essere contattato dai client per ottenere la porta effimera
   su cui si trova il server.} che in genere viene identificato dalla porta su
 cui risponde (l'elenco di queste porte, e dei relativi servizi, è in
-\file{/etc/services}).
+\conffile{/etc/services}).
 
 Con \func{bind} si può assegnare un indirizzo IP specifico ad un socket,
 purché questo appartenga ad una interfaccia della macchina.  Per un client TCP
@@ -842,7 +843,7 @@ nella chiamata della funzione sono le seguenti:
   secondi per un numero di volte che può essere stabilito dall'utente. Questo
   può essere fatto a livello globale con una opportuna
   \func{sysctl},\footnote{o più semplicemente scrivendo il valore voluto in
-    \file{/proc/sys/net/ipv4/tcp\_syn\_retries}, vedi
+    \procfile{/proc/sys/net/ipv4/tcp\_syn\_retries}, vedi
     sez.~\ref{sec:sock_ipv4_sysctl}.} e a livello di singolo socket con
   l'opzione \const{TCP\_SYNCNT} (vedi sez.~\ref{sec:sock_tcp_udp_options}). Il
   valore predefinito per la ripetizione dell'invio è di 5 volte, che comporta
@@ -965,24 +966,24 @@ 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 \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.
+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
+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.
 
 Per ovviare a questo il significato del \param{backlog} è stato cambiato a
 indicare la lunghezza della coda delle connessioni complete. La lunghezza
 della coda delle connessioni incomplete può essere ancora controllata usando
 la funzione \func{sysctl} con il parametro \const{NET\_TCP\_MAX\_SYN\_BACKLOG}
 o scrivendola direttamente in
-\file{/proc/sys/net/ipv4/tcp\_max\_syn\_backlog}.  Quando si attiva la
+\procfile{/proc/sys/net/ipv4/tcp\_max\_syn\_backlog}.  Quando si attiva la
 protezione dei syncookies però (con l'opzione da compilare nel kernel e da
-attivare usando \file{/proc/sys/net/ipv4/tcp\_syncookies}) questo valore viene
-ignorato e non esiste più un valore massimo.  In ogni caso in Linux il valore
-di \param{backlog} viene troncato ad un massimo di \const{SOMAXCONN} se è
-superiore a detta costante (che di default vale 128).\footnote{il valore di
+attivare usando \procfile{/proc/sys/net/ipv4/tcp\_syncookies}) questo valore
+viene ignorato e non esiste più un valore massimo.  In ogni caso in Linux il
+valore di \param{backlog} viene troncato ad un massimo di \const{SOMAXCONN} se
+è superiore a detta costante (che di default vale 128).\footnote{il valore di
   questa costante può essere controllato con un altro parametro di
   \func{sysctl}, vedi sez.~\ref{sec:sock_ioctl_IP}.}
 
@@ -1044,11 +1045,11 @@ funzione 
   \item[\errcode{EAGAIN} o \errcode{EWOULDBLOCK}] il socket è stato impostato
     come non bloccante (vedi sez.~\ref{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{EPERM}] le regole del firewall non consentono la connessione.
   \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.
-  \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale.
+  \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
   \end{errlist}
   Inoltre possono essere restituiti gli errori di rete relativi al nuovo
   socket, diversi a secondo del protocollo, come: \errval{EMFILE},
@@ -1979,7 +1980,7 @@ in sez.~\ref{sec:file_line_io} a proposito dell'I/O su terminale), solo allora
 \func{fgets} ritornerà ed il client scriverà quanto immesso sul socket, per
 poi passare a rileggere quanto gli viene inviato all'indietro dal server, che
 a sua volta sarà inviato sullo standard output, che nel caso ne provoca
-l'immediatamente stampa a video.
+l'immediata stampa a video.
 
 
 \subsection{La conclusione normale}
@@ -2622,7 +2623,8 @@ successivo, per tentare di ristabilire la connessione.
 Il risultato finale qui dipende dall'implementazione dello stack TCP, e nel
 caso di Linux anche dall'impostazione di alcuni dei parametri di sistema che
 si trovano in \file{/proc/sys/net/ipv4}, che ne controllano il comportamento:
-in questo caso in particolare da \file{tcp\_retries2} (vedi
+in questo caso in particolare da
+\procrelfile{/proc/sys/net/ipv4}{tcp\_retries2} (vedi
 sez.~\ref{sec:sock_ipv4_sysctl}). Questo parametro infatti specifica il numero
 di volte che deve essere ritentata la ritrasmissione di un pacchetto nel mezzo
 di una connessione prima di riportare un errore di timeout.  Il valore
@@ -2744,6 +2746,7 @@ impostazione speciale del socket (ci torneremo in
 sez.~\ref{sec:sock_generic_options}) che provvede all'esecuzione di questo
 controllo.
 
+
 \section{L'uso dell'I/O multiplexing}
 \label{sec:TCP_sock_multiplexing}
 
@@ -3580,6 +3583,9 @@ quanto l'uscita 
 anche a questo server le considerazioni finali di
 sez.~\ref{sec:TCP_serv_select}.
 
+% TODO fare esempio con epoll
+
+
 
 % LocalWords:  socket TCP client dell'I multiplexing stream three way handshake
 % LocalWords:  header stack kernel SYN ACK URG syncronize sez bind listen fig