X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=tcpsock.tex;h=e55e06f87e40d08a3223d5132e49254ec743fbc6;hb=bf30b22885daaa31ef38bec56eccfb7bf33f5bd1;hp=7316b64b3f274b7a3af14125b42fe7d9ffc31eb6;hpb=1df343113e14ea885c3c3fdb985b2cb84230bd62;p=gapil.git diff --git a/tcpsock.tex b/tcpsock.tex index 7316b64..e55e06f 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -125,10 +125,14 @@ varr \subsection{Le opzioni TCP.} \label{sec:TCP_TCP_opt} -Ciascun segmento SYN contiene in genere delle opzioni per il protocollo TCP -(le cosiddette \textit{TCP options}, che vengono inserite fra l'header e i -dati) che servono a comunicare all'altro capo una serie di parametri utili a -regolare la connessione. Normalmente vengono usate le seguenti opzioni: +Ciascun segmento SYN contiene in genere delle opzioni per il protocollo TCP, +le cosiddette \textit{TCP options},\footnote{da non confondere con le opzioni + dei socket TCP che tratteremo in sez.~\ref{sec:sock_tcp_udp_options}, in + questo caso si tratta delle opzioni che vengono trasmesse come parte di un + pacchetto TCP, non delle funzioni che consentono di impostare i relativi + valori.} che vengono inserite fra l'header e i dati, e che servono a +comunicare all'altro capo una serie di parametri utili a regolare la +connessione. Normalmente vengono usate le seguenti opzioni: \begin{itemize} \item \textit{MSS option}, dove MMS sta per \itindex{Maximum~Segment~Size} @@ -136,7 +140,7 @@ regolare la connessione. Normalmente vengono usate le seguenti opzioni: connessione annuncia all'altro il massimo ammontare di dati che vorrebbe accettare per ciascun segmento nella connessione corrente. È possibile leggere e scrivere questo valore attraverso l'opzione del socket - \const{TCP\_MAXSEG} (vedi sez.~\ref{sec:TCP_TCP_opt}). + \const{TCP\_MAXSEG} (vedi sez.~\ref{sec:sock_tcp_udp_options}). \item \textit{window scale option}, il protocollo TCP implementa il controllo di flusso attraverso una \itindex{advertised~window} \textit{advertised @@ -144,20 +148,29 @@ regolare la 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{Linux usa come 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 pacchetti (come i satelliti) richiedono una finestra più grande per poter - ottenere il massimo dalla trasmissione, per questo esiste questa opzione che - indica un fattore di scala da applicare al valore della finestra - annunciata\footnote{essendo una nuova opzione per garantire la compatibilità - con delle vecchie implementazioni del protocollo la procedura che la - attiva prevede come negoziazione che l'altro capo della connessione - riconosca esplicitamente l'opzione inserendola anche lui nel suo SYN di - risposta dell'apertura della connessione.} per la connessione corrente - (espresso come numero di bit cui spostare a sinistra il valore della - finestra annunciata inserito nel pacchetto). + ottenere il massimo dalla trasmissione. Per questo esiste questa opzione che + indica un fattore di scala da applicare al valore della + \itindex{advertised~window} finestra annunciata\footnote{essendo una nuova + opzione per garantire la compatibilità con delle vecchie implementazioni + del protocollo la procedura che la attiva prevede come negoziazione che + l'altro capo della connessione riconosca esplicitamente l'opzione + inserendola anche lui nel suo SYN di risposta dell'apertura della + connessione.} per la connessione corrente (espresso come numero di bit cui + spostare a sinistra il valore della finestra annunciata inserito nel + pacchetto). Con Linux è possibile indicare al kernel di far negozioare 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 + 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{sysct} (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 per le connessioni ad alta velocità per evitare possibili corruzioni di dati