-\begin{basedescript}{\desclabelwidth{3.3cm}\desclabelstyle{\nextlinelabel}}
-
-\item[\const{TCP\_NODELAY}] il protocollo TCP un meccanismo di bufferizzazione
- dei pacchetti uscenti, per evitare la trasmissione di tanti pacchetti
- piccoli con un utilizzo non ottimale della banda disponibile. Questo
- meccanismo è controllato da un apposito algoritmo (detto \textsl{algoritmo
- di Nagle}, vedi sez.\ref{sez:tcp_protocol_xxx}). Il comportamento normale
- del protocollo prevede che i pacchetti siano accumulati fintanto che non si
- raggiunge una quantità di dati considerata adeguata per eseguire la
- trasmissione.
-
- Impostando questa opzione si disabilita questo meccanismo ed i pacchetti
- vengono inviati immediatamente qualunque sia la loro dimensione; l'opzione
- viene sovrascritta dall'eventuale impostazione dell'opzione
- \const{TCP\_CORK}, che blocca l'invio immediato. Tuttavia quando la si
- abilita viene sempre forzato lo scaricamento della coda di invio (con
- conseguente trasmissione di tutti i pacchetti pendenti), anche qualora si
- fosse già abilitata \const{TCP\_CORK}.\footnote{si tenga presente però che
- \const{TCP\_CORK} può essere specificata insieme a \const{TCP\_NODELAY}
- soltanto a partire dal kernel 2.5.71.}
-
-\item[\const{TCP\_MAXSEG}] permette di leggere e modificare il valore della
- \itindex{Maximum~Segment~Size} MSS (vedi sez.~\ref{sec:net_lim_dim} e
- sez.\ref{sez:tcp_protocol_xxx}) dei pacchetti uscenti, e se l'opzione è
- impostata prima di stabilire la connessione, cambia anche il valore della
- \itindex{Maximum~Segment~Size} MSS annunciata all'altro capo della
- connessione. Se si specificano valori maggiori della MTU questi verranno
- ignorati, inoltre TCP imporrà anche i suoi limiti massimo e minimo per
- questo valore.
-
-\item[\const{TCP\_CORK}] quando questa opzione viene abilitata non vengono
- inviati pacchetti di dati fintanto che essa non venga disabilitata; a quel
- punto tutti i dati rimasti in coda saranno inviati in un solo pacchetto.
- Questa opzione viene usata per gestire manualmente il flusso dei dati
- mettendo una sorta di ``\textsl{tappo}'' (da cui il nome in inglese) al
- flusso di uscita, in modo ottimizzare a mano l'uso della banda. È molto
- utile anche quando si effettua il trasferimento di dati da un file con
- \func{sendfile} (vedi sez.~\ref{sec:file_sendfile}), se si vuole inserire
- una intestazione prima della chiamata a questa funzione.
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+
+
+\item[\const{TCP\_NODELAY}] il protocollo TCP utilizza un meccanismo di
+ bufferizzazione dei dati uscenti, per evitare la trasmissione di tanti
+ piccoli segmenti con un utilizzo non ottimale della banda
+ disponibile.\footnote{il problema è chiamato anche \textit{silly window
+ syndrome}, per averne un'idea si pensi al risultato che si ottiene
+ quando un programma di terminale invia un segmento TCP per ogni tasto
+ premuto, 40 byte di intestazione di protocollo con 1 byte di dati
+ trasmessi; per evitare situazioni del genere è stato introdotto
+ l'\textsl{algoritmo di Nagle}.} Questo meccanismo è controllato da un
+ apposito algoritmo (detto \textsl{algoritmo di Nagle}, vedi
+ sez.~\ref{sez:tcp_protocol_xxx}). Il comportamento normale del protocollo
+ prevede che i dati siano accumulati fintanto che non si raggiunge una
+ quantità considerata adeguata per eseguire la trasmissione di un singolo
+ segmento.
+
+ Ci sono però delle situazioni in cui questo comportamento può non essere
+ desiderabile, ad esempio quando si sa in anticipo che l'applicazione invierà
+ soltanto un piccolo quantitativo di dati;\footnote{è il caso classico di una
+ richiesta HTTP.} in tal caso l'attesa introdotta dall'algoritmo di
+ bufferizzazione non soltanto è inutile, ma peggiora le prestazioni
+ introducendo un ritardo. Impostando questa opzione si disabilita l'uso
+ dell'\textsl{algoritmo di Nagle} ed i dati vengono inviati immediatamente in
+ singoli segmenti, qualunque sia la loro dimensione. Ovviamente l'uso di
+ questa opzione è dedicato a chi ha esigenze particolari come quella
+ illustrata, che possono essere stabilite solo per la singola applicazione.
+
+ Si tenga conto che questa opzione viene sovrascritta dall'eventuale
+ impostazione dell'opzione \const{TCP\_CORK} (il cui scopo è sostanzialmente
+ l'opposto) che blocca l'invio immediato. Tuttavia quando la si abilita viene
+ sempre forzato lo scaricamento della coda di invio (con conseguente
+ trasmissione di tutti i dati pendenti), anche qualora si fosse già abilitata
+ \const{TCP\_CORK}.\footnote{si tenga presente però che \const{TCP\_CORK} può
+ essere specificata insieme a \const{TCP\_NODELAY} soltanto a partire dal
+ kernel 2.5.71.}
+
+\item[\const{TCP\_MAXSEG}] con questa opzione si legge o si imposta il valore
+ della \itindex{Maximum~Segment~Size} MSS (\textit{Maximum~Segment~Size},
+ vedi sez.~\ref{sec:net_lim_dim} e sez.~\ref{sez:tcp_protocol_xxx}) dei
+ segmenti TCP uscenti. Se l'opzione è impostata prima di stabilire la
+ connessione, si cambia anche il valore della \itindex{Maximum~Segment~Size}
+ MSS annunciata all'altro capo della connessione. Se si specificano valori
+ maggiori della \itindex{Maximum~Transfer~Unit} MTU questi verranno ignorati,
+ inoltre TCP imporrà anche i suoi limiti massimo e minimo per questo valore.
+
+\item[\const{TCP\_CORK}] questa opzione è il complemento naturale di
+ \const{TCP\_NODELAY} e serve a gestire a livello applicativo la situazione
+ opposta, cioè quella in cui si sa fin dal principio che si dovranno inviare
+ grosse quantità di dati. Anche in questo caso l'\textsl{algoritmo di Nagle}
+ tenderà a suddividerli in dimensioni da lui ritenute
+ opportune,\footnote{l'algoritmo cerca di tenere conto di queste situazioni,
+ ma essendo un algoritmo generico tenderà comunque ad introdurre delle
+ suddivisioni in segmenti diversi, anche quando potrebbero non essere
+ necessarie, con conseguente spreco di banda.} ma sapendo fin dall'inizio
+ quale è la dimensione dei dati si potranno di nuovo ottenere delle migliori
+ prestazioni disabilitandolo, e gestendo direttamente l'invio del nostro
+ blocco di dati in soluzione unica.
+
+ Quando questa opzione viene abilitata non vengono inviati segmenti di dati
+ fintanto che essa non venga disabilitata; a quel punto tutti i dati rimasti
+ in coda saranno inviati in un solo segmento TCP. In sostanza con questa
+ opzione si può controllare il flusso dei dati mettendo una sorta di
+ ``\textsl{tappo}'' (da cui il nome in inglese) al flusso di uscita, in modo
+ ottimizzare a mano l'uso della banda. Si tenga presente che per l'effettivo
+ funzionamento ci si deve ricordare di disattivare l'opzione al termine
+ dell'invio del blocco dei dati.
+
+ Si usa molto spesso \const{TCP\_CORK} quando si effettua il trasferimento
+ diretto di un blocco di dati da un file ad un socket con \func{sendfile}
+ (vedi sez.~\ref{sec:file_sendfile}), per inserire una intestazione prima
+ della chiamata a questa funzione; senza di essa l'intestazione potrebbe
+ venire spedita in un segmento a parte, che a seconda delle condizioni
+ potrebbe richiedere anche una risposta di ACK, portando ad una notevole
+ penalizzazione delle prestazioni.