Sistemato un conflitto con un correzione applicata due volte ed indicizzato
[gapil.git] / tcpsock.tex
index 66d677fcfd8e7beb449ebe5816e7c0a8927b941e..54b9e0a93c17decdb52a84be861b38f7817a5f28 100644 (file)
@@ -1,6 +1,6 @@
 %% tcpsock.tex
 %%
-%% Copyright (C) 2000-2005 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2006 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -731,7 +731,8 @@ buona norma usare sempre la funzione \func{htonl}.
     \hline
     \hline
     \const{INADDR\_ANY}      & Indirizzo generico (\texttt{0.0.0.0})\\
-    \const{INADDR\_BROADCAST}& Indirizzo di \textit{broadcast}.\\
+    \const{INADDR\_BROADCAST}& Indirizzo di \itindex{broadcast}
+                               \textit{broadcast}.\\ 
     \const{INADDR\_LOOPBACK} & Indirizzo di \textit{loopback}
                                (\texttt{127.0.0.1}).\\ 
     \const{INADDR\_NONE}     & Indirizzo errato.\\
@@ -793,8 +794,9 @@ connessione con un server TCP,\footnote{di nuovo la funzione 
   \item[\errcode{EAFNOSUPPORT}] l'indirizzo non ha una famiglia di indirizzi
     corretta nel relativo campo.
   \item[\errcode{EACCES}, \errcode{EPERM}] si è tentato di eseguire una
-    connessione ad un indirizzo broadcast senza che il socket fosse stato
-    abilitato per il broadcast.
+    connessione ad un indirizzo \itindex{broadcast} \textit{broadcast} senza
+    che il socket fosse stato abilitato per il \itindex{broadcast}
+    \textit{broadcast}.
   \end{errlist}
   altri errori possibili sono: \errval{EFAULT}, \errval{EBADF},
   \errval{ENOTSOCK}, \errval{EISCONN} e \errval{EADDRINUSE}.}
@@ -911,9 +913,10 @@ infatti vengono mantenute due code:
     handshake} non si è ancora concluso.  Questi socket sono tutti nello stato
   \texttt{SYN\_RECV}.
 \item La coda delle connessioni complete (\textit{complete connection queue}
-  che contiene un ingresso per ciascun socket per il quale il \textit{three
-    way handshake} è stato completato ma ancora \func{accept} non è ritornata.
-  Questi socket sono tutti nello stato \texttt{ESTABLISHED}.
+  che contiene un ingresso per ciascun socket per il quale il
+  \itindex{three~way~handshake} \textit{three way handshake} è stato
+  completato ma ancora \func{accept} non è ritornata.  Questi socket sono
+  tutti nello stato \texttt{ESTABLISHED}.
 \end{enumerate}
 
 Lo schema di funzionamento è descritto in fig.~\ref{fig:TCP_listen_backlog}:
@@ -921,7 +924,7 @@ quando arriva un SYN da un client il server crea una nuova voce nella coda
 delle connessioni incomplete, e poi risponde con il SYN$+$ACK. La voce resterà
 nella coda delle connessioni incomplete fino al ricevimento dell'ACK dal
 client o fino ad un timeout. Nel caso di completamento del
-\itindex{three~way~handshake}\textit{three way handshake} la voce viene
+\itindex{three~way~handshake} \textit{three way handshake} la voce viene
 spostata nella coda delle connessioni complete.  Quando il processo chiama la
 funzione \func{accept} (vedi sez.~\ref{sec:TCP_func_accept}) la prima voce
 nella coda delle connessioni complete è passata al programma, o, se la coda è
@@ -978,7 +981,7 @@ che il compito principale della coda sia quello di gestire il caso in cui il
 server è occupato fra chiamate successive alla \func{accept} (per cui la coda
 più occupata sarebbe quella delle connessioni completate), ma piuttosto quello
 di gestire la presenza di un gran numero di SYN in attesa di concludere il
-\textit{three way handshake}\itindex{three~way~handshake}.
+\itindex{three~way~handshake} \textit{three way handshake}.
 
 Infine va messo in evidenza che, nel caso di socket TCP, quando un SYN arriva
 con tutte le code piene, il pacchetto deve essere ignorato. Questo perché la
@@ -1463,13 +1466,14 @@ delle interfacce di rete locali. In caso di errore si stampa (\texttt{\small
   31}) un messaggio, e si termina (\texttt{\small 32}) immediatamente il
 programma.
 
-Il passo successivo (\texttt{\small 35--39}) è quello di mettere ``in
-ascolto'' il socket; questo viene fatto (\texttt{\small 36}) con la funzione
-\func{listen} che dice al kernel di accettare connessioni per il socket che
-abbiamo creato; la funzione indica inoltre, con il secondo argomento, il
-numero massimo di connessioni che il kernel accetterà di mettere in coda per
-il suddetto socket. Di nuovo in caso di errore si stampa (\texttt{\small 37})
-un messaggio, e si esce (\texttt{\small 38}) immediatamente.
+Il passo successivo (\texttt{\small 35--39}) è quello di mettere ``\textsl{in
+  ascolto}'' il socket; questo viene fatto (\texttt{\small 36}) con la
+funzione \func{listen} che dice al kernel di accettare connessioni per il
+socket che abbiamo creato; la funzione indica inoltre, con il secondo
+argomento, il numero massimo di connessioni che il kernel accetterà di mettere
+in coda per il suddetto socket. Di nuovo in caso di errore si stampa
+(\texttt{\small 37}) un messaggio, e si esce (\texttt{\small 38})
+immediatamente.
 
 La chiamata a \func{listen} completa la preparazione del socket per l'ascolto
 (che viene chiamato anche \textit{listening descriptor}) a questo punto si può
@@ -1914,10 +1918,11 @@ A questo punto si pu
 \textit{three way handshake} la connessione è stabilita; la \func{connect}
 ritornerà nel client\footnote{si noti che è sempre la \func{connect} del
   client a ritornare per prima, in quanto questo avviene alla ricezione del
-  secondo segmento (l'ACK del server) del \textit{three way handshake}, la
-  \func{accept} del server ritorna solo dopo un altro mezzo RTT quando il
-  terzo segmento (l'ACK del client) viene ricevuto.}  e la \func{accept} nel
-server, ed usando di nuovo \cmd{netstat} otterremmo che:
+  secondo segmento (l'ACK del server) del \itindex{three~way~handshake}
+  \textit{three way handshake}, la \func{accept} del server ritorna solo dopo
+  un altro mezzo RTT quando il terzo segmento (l'ACK del client) viene
+  ricevuto.}  e la \func{accept} nel server, ed usando di nuovo \cmd{netstat}
+otterremmo che:
 \begin{verbatim}
 Active Internet connections (servers and established)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
@@ -2261,7 +2266,7 @@ Bench
 con dei server molto occupati. In tal caso, con una struttura del server
 simile a quella del nostro esempio, in cui la gestione delle singole
 connessioni è demandata a processi figli, può accadere che il \textit{three
-  way handshake}\itindex{three~way~handshake} venga completato e la relativa
+  way handshake} \itindex{three~way~handshake} venga completato e la relativa
 connessione abortita subito dopo, prima che il padre, per via del carico della
 macchina, abbia fatto in tempo ad eseguire la chiamata ad \func{accept}. Di
 nuovo si ha una situazione analoga a quella illustrata in
@@ -2371,23 +2376,23 @@ anarres.echo > gont.34559: R 511689732:511689732(0) win 0
 \end{verbatim}
 
 Le prime tre righe vengono prodotte al momento in cui lanciamo il nostro
-client, e corrispondono ai tre pacchetti del
-\itindex{three~way~handshake}\textit{three way handshake}.  L'output del
-comando riporta anche i numeri di sequenza iniziali, mentre la lettera
-\texttt{S} indica che per quel pacchetto si aveva il SYN flag attivo.  Si noti
-come a partire dal secondo pacchetto sia sempre attivo il campo \texttt{ack},
-seguito dal numero di sequenza per il quale si da il ricevuto; quest'ultimo, a
-partire dal terzo pacchetto, viene espresso in forma relativa per maggiore
-compattezza.  Il campo \texttt{win} in ogni riga indica la \textit{advertising
-  window} di cui parlavamo in sez.~\ref{sec:TCP_TCP_opt}.  Allora si può
-verificare dall'output del comando come venga appunto realizzata la sequenza
-di pacchetti descritta in sez.~\ref{sec:TCP_conn_cre}: prima viene inviato dal
-client un primo pacchetto con il SYN che inizia la connessione, a cui il
-server risponde dando il ricevuto con un secondo pacchetto, che a sua volta
-porta un SYN, cui il client risponde con un il terzo pacchetto di ricevuto.
+client, e corrispondono ai tre pacchetti del \itindex{three~way~handshake}
+\textit{three way handshake}.  L'output del comando riporta anche i numeri di
+sequenza iniziali, mentre la lettera \texttt{S} indica che per quel pacchetto
+si aveva il SYN flag attivo.  Si noti come a partire dal secondo pacchetto sia
+sempre attivo il campo \texttt{ack}, seguito dal numero di sequenza per il
+quale si da il ricevuto; quest'ultimo, a partire dal terzo pacchetto, viene
+espresso in forma relativa per maggiore compattezza.  Il campo \texttt{win} in
+ogni riga indica la \textit{advertising window} di cui parlavamo in
+sez.~\ref{sec:TCP_TCP_opt}.  Allora si può verificare dall'output del comando
+come venga appunto realizzata la sequenza di pacchetti descritta in
+sez.~\ref{sec:TCP_conn_cre}: prima viene inviato dal client un primo pacchetto
+con il SYN che inizia la connessione, a cui il server risponde dando il
+ricevuto con un secondo pacchetto, che a sua volta porta un SYN, cui il client
+risponde con un il terzo pacchetto di ricevuto.
 
 Ritorniamo allora alla nostra sessione con il servizio echo: dopo le tre righe
-del \textit{three way handshake}\itindex{three~way~handshake} non avremo nulla
+del \textit{three way handshake} \itindex{three~way~handshake} non avremo nulla
 fin tanto che non scriveremo una prima riga sul client; al momento in cui
 facciamo questo si genera una sequenza di altri quattro pacchetti. Il primo,
 dal client al server, contraddistinto da una lettera \texttt{P} che significa
@@ -2588,7 +2593,7 @@ arp who-has anarres tell gont
 
 In questo caso l'andamento dei primi sette pacchetti è esattamente lo stesso
 di prima. Solo che stavolta, non appena inviata la seconda riga, il programma
-si bloccherà nella successiva chiamata a \func{read}, non ottendo nessuna
+si bloccherà nella successiva chiamata a \func{read}, non ottenendo nessuna
 risposta. Quello che succede è che nel frattempo il kernel provvede, come
 richiesto dal protocollo TCP, a tentare la ritrasmissione della nostra riga un
 certo numero di volte, con tempi di attesa crescente fra un tentativo ed il
@@ -2616,7 +2621,7 @@ Come abbiamo accennato in sez.~\ref{sec:net_tcpip_general} ARP 
 che si incarica di trovare le corrispondenze fra indirizzo IP e indirizzo
 hardware sulla scheda di rete. È evidente allora che nel nostro caso, essendo
 client e server sulla stessa rete, è scaduta la voce nella \textit{ARP
-  cache}\footnote{la \textit{ARP chache} è una tabella mantenuta internamente
+  cache}\footnote{la \textit{ARP cache} è una tabella mantenuta internamente
   dal kernel che contiene tutte le corrispondenze fra indirizzi IP e indirizzi
   fisici, ottenute appunto attraverso il protocollo ARP; le voci della tabella
   hanno un tempo di vita limitato, passato il quale scadono e devono essere
@@ -3121,8 +3126,9 @@ velocit
 una macchina remota occorre un certo tempo perché i pacchetti vi arrivino,
 vengano processati, e poi tornino indietro. Considerando trascurabile il tempo
 di processo, questo tempo è quello impiegato nella trasmissione via rete, che
-viene detto RTT (dalla denominazione inglese \textit{Round Trip Time}) ed è
-quello che viene stimato con l'uso del comando \cmd{ping}.
+viene detto RTT (dalla denominazione inglese \itindex{Round~Trip~Time}
+\textit{Round Trip Time}) ed è quello che viene stimato con l'uso del comando
+\cmd{ping}.
 
 A questo punto, se torniamo al codice mostrato in
 fig.~\ref{fig:TCP_ClientEcho_third}, possiamo vedere che mentre i pacchetti
@@ -3530,7 +3536,7 @@ notificher
 di end-of-file (\texttt{\small 38--47}) si provvederà a chiudere
 (\texttt{\small 39}) anche il nostro capo del socket e a marcarlo
 (\texttt{\small 40}) nella struttura ad esso associata come inutilizzato.
-Infine dovrà essere ricalcolato (\texttt{\small 41--45}) un eventiale nuovo
+Infine dovrà essere ricalcolato (\texttt{\small 41--45}) un eventuale nuovo
 valore di \var{max\_fd}. L'ultimo passo è (\texttt{\small 46}) chiudere il
 ciclo in quanto in questo caso non c'è più niente da riscrivere all'indietro
 sul socket.
@@ -3552,3 +3558,43 @@ di sez.~\ref{sec:TCP_serv_select}.
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
+
+% LocalWords:  socket TCP client dell'I multiplexing stream three way handshake
+% LocalWords:  header stack kernel SYN ACK URG syncronize sez bind listen fig
+% LocalWords:  accept connect active acknowledge l'acknowledge nell'header MSS
+% LocalWords:  sequence number l'acknowledgement dell'header options l'header
+% LocalWords:  option MMS segment size MAXSEG window advertized Mbit sec nell'
+% LocalWords:  timestamp RFC long fat close of l'end l'ACK half shutdown CLOSED
+% LocalWords:  netstat SENT ESTABLISHED WAIT IPv Ethernet piggybacking UDP MSL
+% LocalWords:  l'overhead Stevens Lifetime router hop limit TTL to live RST SSH
+% LocalWords:  routing dell'MSL l'IP multitasking well known port ephemeral BSD
+% LocalWords:  ports dall' IANA Assigned Authority like glibc netinet IPPORT AF
+% LocalWords:  RESERVED USERRESERVED rsh rlogin pair socketpair Local Address
+% LocalWords:  Foreing DNS caching INADDR ANY multihoming loopback ssh fuser ip
+% LocalWords:  lsof SOCK sys int sockfd const struct sockaddr serv addr socklen
+% LocalWords:  addrlen errno EBADF descriptor EINVAL ENOTSOCK EACCES EADDRINUSE
+% LocalWords:  EADDRNOTAVAIL EFAULT ENOTDIR ENOENT ENOMEM ELOOP ENOSR EROFS RPC
+% LocalWords:  portmapper htonl tab endianess BROADCAST broadcast any extern fd
+% LocalWords:  ADRR INIT DGRAM SEQPACKET servaddr ECONNREFUSED ETIMEDOUT EAGAIN
+% LocalWords:  ENETUNREACH EINPROGRESS EALREADY EAFNOSUPPORT EPERM EISCONN proc
+% LocalWords:  sysctl filesystem syn retries reset ICMP backlog EOPNOTSUPP RECV
+% LocalWords:  connection queue dell'ACK flood spoofing syncookies SOMAXCONN CR
+% LocalWords:  RDM EWOULDBLOCK firewall ENOBUFS EINTR EMFILE ECONNABORTED NULL
+% LocalWords:  ESOCKTNOSUPPORT EPROTONOSUPPORT ERESTARTSYS connected listening
+% LocalWords:  DECnet read write NONBLOCK fcntl getsockname getpeername name ps
+% LocalWords:  namelen namlen ENOTCONN exec inetd POSIX daytime FullRead count
+% LocalWords:  BUF FullWrite system call INET perror htons inet pton ctime FTP
+% LocalWords:  fputs carriage return line feed superdemone daytimed sleep fork
+% LocalWords:  daemon cunc logging list conn sock exit snprintf ntop ntohs echo
+% LocalWords:  crash superserver L'RFC first ClientEcho stdin stdout fgets main
+% LocalWords:  MAXLINE initd echod ServEcho setgid short nogroup nobody setuid
+% LocalWords:  demonize PrintErr syslog wrapper log error root RTT EOF ctrl ack
+% LocalWords:  while SIGCHLD Signal RESTART sigaction SignalRestart SigHand win
+% LocalWords:  flags select recvfrom debug second compat waiting Nsec ENETDOWN
+% LocalWords:  EPROTO ENOPROTOOPT EHOSTDOWN ENONET EHOSTUNREACH LINGER tcpdump
+% LocalWords:  ECONNRESET advertising PSH SIGTERM strace SIGPIPE gets tcp ARP
+% LocalWords:  cache anarres destination unreachable l'I low watermark RCVLOWAT
+% LocalWords:  SNDLOWAT third fset maxfd fileno ISSET closed how SHUT RD WR eof
+% LocalWords:  RDWR fifo Trip ping fourth CLR sull'I SETSIZE nread break Denial
+% LocalWords:  Service poll POLLIN POLLRDNORM POLLPRI POLLRDBAND POLLOUT events
+% LocalWords:  POLLHUP POLLERR revents pollfd