Varie correzioni, completata revisione capitolo sull'I/O su file
[gapil.git] / sockctrl.tex
index 07c657eab685eebee01dec1dbf1130b676caef58..9d5279e6ab62856b34ff617697608b440c23c03e 100644 (file)
@@ -1,6 +1,6 @@
 %% sockctrl.tex
 %%
-%% Copyright (C) 2004-2018 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2019 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 "Prefazione",
@@ -36,8 +36,8 @@ porte o altre proprietà del sistema.
 \label{sec:sock_resolver}
 
 \itindbeg{resolver} La risoluzione dei nomi è associata tradizionalmente al
-servizio del \itindex{Domain~Name~Service} \textit{Domain Name Service} che
-permette di identificare le macchine su internet invece che per numero IP
+servizio del \itindex{Domain~Name~Service~(DNS)} \textit{Domain Name Service}
+che permette di identificare le macchine su internet invece che per numero IP
 attraverso il relativo \textsl{nome a dominio}.\footnote{non staremo ad
   entrare nei dettagli della definizione di cosa è un nome a dominio, dandolo
   per noto, una introduzione alla problematica si trova in \cite{AGL} (cap.~9)
@@ -87,7 +87,7 @@ dominio, e prevedeva solo l'utilizzo del DNS e del file statico
 
 Per questo aspetto il file di configurazione principale del sistema è
 \conffile{/etc/resolv.conf} che contiene in sostanza l'elenco degli indirizzi
-IP dei server DNS da contattare; a questo si affiancava (fino alle \acr{glibc}
+IP dei server DNS da contattare; a questo si affiancava (fino alla \acr{glibc}
 2.4) il file \conffile{/etc/host.conf} il cui scopo principale era indicare
 l'ordine in cui eseguire la risoluzione dei nomi (se usare prima i valori di
 \conffile{/etc/hosts} o quelli del DNS). Tralasciamo i dettagli relativi alle
@@ -125,9 +125,9 @@ generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi
 associate chiamato \textit{Name Service Switch}, cui abbiamo accennato anche in
 sez.~\ref{sec:sys_user_group} per quanto riguarda la gestione dei dati
 associati a utenti e gruppi. Il sistema è stato introdotto la prima volta
-nelle librerie standard di Solaris e le \acr{glibc} hanno ripreso lo stesso
+nella libreria standard di Solaris e la \acr{glibc} ha ripreso lo stesso
 schema; si tenga presente che questo sistema non esiste per altre librerie
-standard come le \acr{libc5} o le \acr{uclib}.
+standard come la \acr{libc5} o la \acr{uClib}.
 
 Il \textit{Name Service Switch} (cui spesso si fa riferimento con l'acronimo
 NSS) è un sistema di librerie dinamiche che permette di definire in maniera
@@ -198,7 +198,7 @@ su cui vengono mantenuti, e che si usino o meno funzionalità aggiuntive
 fornite dal sistema del \textit{Name Service Switch}, dal punto di vista di un
 programma che deve effettuare la risoluzione di un nome a dominio, tutto
 quello che conta sono le funzioni classiche che il \textit{resolver} mette a
-disposizione (è cura delle \acr{glibc} tenere conto della presenza del
+disposizione (è cura della \acr{glibc} tenere conto della presenza del
 \textit{Name Service Switch}) e sono queste quelle che tratteremo nelle
 sezioni successive.  
 
@@ -749,7 +749,7 @@ vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare l'opzione
 \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi chiamare
 \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per modificare
 le opzioni del \textit{resolver}; dato che questo non è molto comodo è stata
-definita (è una estensione fornita dalle \acr{glibc}, disponibile anche in
+definita (è una estensione fornita dalla \acr{glibc}, disponibile anche in
 altri sistemi unix-like) un'altra funzione, \funcd{gethostbyname2}, il cui
 prototipo è:
 
@@ -853,7 +853,7 @@ chiama una \itindex{deep~copy} \textit{deep copy}.\footnote{si chiama così
   contenuti in essa (e così via se vi sono altre sotto-strutture con altri
   puntatori) e copiare anche i dati da questi referenziati.}
 
-Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
+Per ovviare a questi problemi nella \acr{glibc} sono definite anche delle
 versioni rientranti delle precedenti funzioni, al solito queste sono
 caratterizzate dall'avere un suffisso \texttt{\_r}, pertanto avremo le due
 funzioni \funcd{gethostbyname\_r} e \funcd{gethostbyname2\_r} i cui prototipi
@@ -976,7 +976,7 @@ dominio, la funzione comunque inizializza anche il primo campo della lista
 
 Dato che \func{gethostbyaddr} usa un buffer statico, anche di questa funzione
 esiste una versione rientrante \funcd{gethostbyaddr\_r} fornita come
-estensione dalle \acr{glibc}, il cui prototipo è:
+estensione dalla \acr{glibc}, il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{netdb.h}
@@ -1017,7 +1017,7 @@ del DNS. Nel caso della \acr{glibc} questa viene usata allora solo per la
 lettura delle voci presenti in quest'ultimo, come avviene anche in altri
 sistemi unix-like, ed inoltre ignora le voci relative ad indirizzi IPv6.
 
-Della stessa funzione le \acr{glibc} forniscono anche una versione rientrante
+Della stessa funzione la \acr{glibc} fornisce anche una versione rientrante
 \funcd{gethostent\_r}, il cui prototipo è:
 
 \begin{funcproto}{
@@ -1041,8 +1041,8 @@ tipo di indirizzi voluto (cosa che non è possibile con \func{gethostbyname}),
 è stata successivamente proposta,
 nell'\href{http://www.ietf.org/rfc/rfc2553.txt}{RFC~2553} un diversa
 interfaccia con l'introduzione due nuove funzioni di
-risoluzione,\footnote{dette funzioni sono presenti nelle \acr{glibc} versione
-  2.1.96, ma essendo considerate deprecate (vedi
+risoluzione,\footnote{dette funzioni sono presenti nella \acr{glibc} 2.1.96,
+  ma essendo considerate deprecate (vedi
   sez.~\ref{sec:sock_advanced_name_services}) sono state rimosse nelle
   versioni successive.} \funcd{getipnodebyname} e \funcd{getipnodebyaddr}, i
 cui prototipi sono:
@@ -1529,7 +1529,7 @@ tab.~\ref{tab:ai_flags_values}, ciascuna delle quali identifica un bit della
 maschera. 
 
 Nella seconda parte della tabella si sono riportati i valori delle costanti
-aggiunte a partire dalle \acr{glibc} 2.3.4 per gestire la
+aggiunte a partire dalla \acr{glibc} 2.3.4 per gestire la
 internazionalizazione dei nomi a dominio (IDN o \textit{Internationalized
   Domain Names}) secondo quanto specificato
 nell'\href{http://www.ietf.org/rfc/rfc3490.txt}{RFC~3490} (potendo cioè usare
@@ -1794,7 +1794,7 @@ argomento \param{flags} è una maschera binaria i cui bit consentono di
 impostare le modalità con cui viene eseguita la ricerca, e deve essere
 specificato attraverso l'OR aritmetico dei valori illustrati in
 tab.~\ref{tab:getnameinfo_flags}, nella seconda parte della tabella si sono
-aggiunti i valori introdotto con le \acr{glibc} 2.3.4 per gestire la
+aggiunti i valori introdotto con la \acr{glibc} 2.3.4 per gestire la
 internazionalizzione dei nomi a dominio.
 
 \begin{table}[!htb]
@@ -2130,7 +2130,7 @@ socket, mentre l'ultimo argomento \param{optlen},\footnote{questo argomento è
   in realtà sempre di tipo \ctyp{int}, come era nelle \acr{libc4} e
   \acr{libc5}; l'uso di \type{socklen\_t} è stato introdotto da POSIX (valgono
   le stesse considerazioni per l'uso di questo tipo di dato fatte in
-  sez.~\ref{sec:TCP_func_accept}) ed adottato dalle \acr{glibc}.} è la
+  sez.~\ref{sec:TCP_func_accept}) ed adottato dalla \acr{glibc}.} è la
 dimensione in byte dei dati presenti all'indirizzo indicato da \param{optval}.
 Dato che il tipo di dati varia a seconda dell'opzione scelta, occorrerà
 individuare qual è quello che deve essere usato, ed utilizzare le opportune
@@ -2352,12 +2352,12 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   L'opzione utilizza per \param{optval} un intero usato come valore logico.
 
   Quando viene abilitata gli errori riportati da messaggi ICMP per un socket
-  UDP non vengono passati al programma in user space. Con le versioni 2.0.x
-  del kernel erano anche abilitate altre opzioni di compatibilità per i socket
-  raw (modifiche casuali agli header, perdita del flag di \textit{broadcast})
-  che sono state rimosse con il passaggio al 2.2; è consigliato correggere i
-  programmi piuttosto che usare questa funzione. Dal kernel 2.4 viene
-  ignorata, e dal 2.6 genera un messaggio di log del kernel.
+  UDP non vengono passati al programma in \textit{user space}. Con le versioni
+  2.0.x del kernel erano anche abilitate altre opzioni di compatibilità per i
+  socket raw (modifiche casuali agli header, perdita del flag di
+  \textit{broadcast}) che sono state rimosse con il passaggio al 2.2; è
+  consigliato correggere i programmi piuttosto che usare questa funzione. Dal
+  kernel 2.4 viene ignorata, e dal 2.6 genera un messaggio di log del kernel.
 
 \item[\constd{SO\_BUSY\_POLL}] questa opzione, presente dal kernel 3.11,
   imposta un tempo approssimato in microsecondi, per cui in caso di ricezione
@@ -3315,12 +3315,11 @@ di \param{optlen} con una struttura \struct{ip\_msfilter} contenente
   questo protocollo, senza doversi curare di verificarne la
   validità.\footnote{l'attacco viene in genere portato per causare un
     \textit{Denial of Service} aumentando il consumo di CPU del router nella
-    verifica dell'autenticità di un gran numero di pacchetti di pacchetti
-    falsi; questi, arrivando da sorgenti diverse da un router adiacente, non
-    potrebbero più avere un TTL di 255 anche qualora questo fosse stato il
-    valore di partenza, e l'impostazione dell'opzione consente di scartarli
-    senza carico aggiuntivo sulla CPU (che altrimenti dovrebbe calcolare una
-    checksum).}
+    verifica dell'autenticità di un gran numero di pacchetti falsi; questi,
+    arrivando da sorgenti diverse da un router adiacente, non potrebbero più
+    avere un TTL di 255 anche qualora questo fosse stato il valore di
+    partenza, e l'impostazione dell'opzione consente di scartarli senza carico
+    aggiuntivo sulla CPU (che altrimenti dovrebbe calcolare una checksum).}
 
 \itindbeg{Path~MTU}
 \item[\constd{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU}
@@ -3805,7 +3804,7 @@ quantità di dettagli è fornita nel seguente elenco:
 
 \item[\constd{TCP\_INFO}] questa opzione, specifica di Linux, ma introdotta
   anche in altri kernel (ad esempio FreeBSD) permette di controllare lo stato
-  interno di un socket TCP direttamente da un programma in user space.
+  interno di un socket TCP direttamente da un programma in \textit{user space}.
   L'opzione restituisce in una speciale struttura \struct{tcp\_info}, la cui
   definizione è riportata in fig.~\ref{fig:tcp_info_struct}, tutta una serie
   di dati che il kernel mantiene, relativi al socket.  Anche questa opzione
@@ -3867,7 +3866,7 @@ quantità di dettagli è fornita nel seguente elenco:
     situazione.} utilizzare per il singolo socket. L'opzione è stata
   introdotta con il kernel 2.6.13,\footnote{alla data di stesura di queste
     note (Set. 2006) è pure scarsamente documentata, tanto che non è neanche
-    definita nelle intestazioni delle \acr{glibc} per cui occorre definirla a
+    definita nelle intestazioni della \acr{glibc} per cui occorre definirla a
     mano al suo valore che è 13.} e prende come per \param{optval} il
   puntatore ad un buffer contenente il nome dell'algoritmo di controllo che
   si vuole usare. 
@@ -4643,7 +4642,7 @@ di manuale accessibile con \texttt{man 7 ip}, sono i seguenti:
   disabilitare globalmente il procedimento con questo parametro ha pesanti
   ripercussioni in termini di prestazioni di rete.
 
-\item[\sysctlrelfiled{net/ipv4}{ip\_always\_defrag}] fa si che tutti i
+\item[\sysctlrelfiled{net/ipv4}{ip\_always\_defrag}] fa sì che tutti i
   pacchetti IP frammentati siano riassemblati, anche in caso in successivo
   immediato inoltro.\footnote{introdotto con il kernel 2.2.13, nelle versioni
     precedenti questo comportamento poteva essere solo stabilito un volta per
@@ -4710,7 +4709,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
 
 \item[\sysctlrelfiled{net/ipv4}{tcp\_app\_win}] indica la frazione della
   finestra TCP che viene riservata per gestire l'overhaed dovuto alla
-  bufferizzazione. Prende un valore valore intero che consente di calcolare la
+  bufferizzazione. Prende un valore intero che consente di calcolare la
   dimensione in byte come il massimo fra la MSS e
   $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che
   non viene riservato nessuno spazio; il valore di default è 31.
@@ -4736,8 +4735,8 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
 \item[\sysctlrelfiled{net/ipv4}{tcp\_ecn}] abilita il meccanismo della
   \textit{Explicit Congestion Notification} (in breve ECN) nelle connessioni
   TCP. Prende valore logico che di default è disabilitato. La \textit{Explicit
-    Congestion Notification} \itindex{Explicit~Congestion~Notification} è un
-  meccanismo che consente di notificare quando una rotta o una rete è
+    Congestion Notification} \itindex{Explicit~Congestion~Notification~(ECN)}
+  è un meccanismo che consente di notificare quando una rotta o una rete è
   congestionata da un eccesso di traffico,\footnote{il meccanismo è descritto
     in dettaglio nell'\href{http://www.ietf.org/rfc/rfc3168.txt}{RFC~3168}
     mentre gli effetti sulle prestazioni del suo utilizzo sono documentate
@@ -4789,13 +4788,12 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
   risposta prima che il kernel decida che la connessione è caduta e la
   termini. Prende un valore intero che di default è 9.
 
-\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_time}] indica il numero
-  di secondi che devono passare senza traffico sulla connessione prima che il
-  kernel inizi ad inviare pacchetti di pacchetti di
-  \textit{keepalive}.\footnote{ha effetto solo per i socket per cui si è
-    impostata l'opzione \const{SO\_KEEPALIVE} (vedi
-    sez.~\ref{sec:sock_options_main}.}  Prende un valore intero che di default
-  è 7200, pari a due ore.
+\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_time}] indica il numero di
+  secondi che devono passare senza traffico sulla connessione prima che il
+  kernel inizi ad inviare pacchetti di \textit{keepalive}.\footnote{ha effetto
+    solo per i socket per cui si è impostata l'opzione \const{SO\_KEEPALIVE}
+    (vedi sez.~\ref{sec:sock_options_main}.}  Prende un valore intero che di
+  default è 7200, pari a due ore.
 
 \item[\sysctlrelfiled{net/ipv4}{tcp\_low\_latency}] indica allo stack
   TCP del kernel di ottimizzare il comportamento per ottenere tempi di latenza
@@ -4993,11 +4991,12 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
 \item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_recycle}] abilita il riutilizzo
   rapido dei socket in stato \texttt{TIME\_WAIT}. Prende un valore logico e di
   default è disabilitato. Non è opportuno abilitare questa opzione che può
-  causare problemi con il NAT.\footnote{il
-    \itindex{Network~Address~Translation} \textit{Network Address Translation}
-    è una tecnica, impiegata nei firewall e nei router, che consente di
-    modificare al volo gli indirizzi dei pacchetti che transitano per una
-    macchina, Linux la supporta con il \textit{netfilter}.}
+  causare problemi con il NAT.\footnote{la
+    \itindex{Network~Address~Translation~(NAT)} \textit{Network Address
+      Translation} (abbreviato in NAT) è una tecnica, impiegata nei firewall e
+    nei router, che consente di modificare al volo gli indirizzi dei pacchetti
+    che transitano per una macchina, Linux la supporta con il
+    \textit{netfilter}.}
 
 \item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_reuse}] abilita il riutilizzo
   dello stato \texttt{TIME\_WAIT} quando questo è sicuro dal punto di vista