%% 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",
\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)
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
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
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.
\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 è:
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
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}
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}{
è 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:
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
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]
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
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
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}
\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
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.
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
\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.
\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
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
\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