Descrizione delle funzionalità TCP di Windows

Questo articolo descrive le funzionalità TCP in Windows.

Si applica a: Windows 10: tutte le edizioni, Windows Server 2012 R2
Numero KB originale: 224829

Riepilogo

Questo articolo descrive le funzionalità TCP seguenti in Windows:

  • Dimensioni della finestra TCP
  • Opzioni TCP ora supportate
  • Ridimensionamento di Windows - RFC 1323
  • Timestamp - RFC 1323
  • Protezione dai numeri di sequenza incapsulati (PAWS)
  • Riconoscimenti selettivi (SACKS) - RFC 2018
  • Comportamento di ritrasmissione TCP e ritrasmissione rapida

Le funzionalità TCP possono essere modificate modificando le voci nel Registro di sistema.

Importante

Le sezioni, i metodi o le attività seguenti contengono passaggi che indicano come modificare il Registro di sistema. Poiché l'errata modifica del Registro di sistema può causare seri problemi, Di conseguenza, attenersi scrupolosamente alla procedura indicata. Per una maggiore protezione, eseguire il backup del Registro di sistema prima di modificarlo. In questo modo sarà possibile ripristinare il Registro di sistema se si verifica un problema. Per ulteriori informazioni sull'esecuzione del backup e del ripristino del Registro di sistema, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
322756 Come eseguire il backup e il ripristino del Registro di sistema in Windows

Dimensioni della finestra TCP

Le dimensioni della finestra di ricezione TCP sono la quantità di dati di ricezione (in byte) che possono essere memorizzati nel buffer durante una connessione. L'host di invio può inviare solo la quantità di dati prima di attendere il riconoscimento e l'aggiornamento della finestra dall'host ricevente. Lo stack TCP/IP di Windows è progettato per auto-ottimizzazione nella maggior parte degli ambienti e usa dimensioni di finestra predefinite maggiori rispetto alle versioni precedenti.

Invece di usare le dimensioni predefinite della finestra di ricezione hardcoded, TCP viene regolato in base a incrementi pari delle dimensioni massime del segmento (MSS). Il servizio gestito viene negoziato durante l'installazione della connessione. La regolazione della finestra di ricezione in base a incrementi pari del servizio gestito aumenta la percentuale di segmenti TCP di dimensioni complete usati durante le trasmissioni di dati bulk.

Le dimensioni della finestra di ricezione sono determinate nel modo seguente:

  1. La prima richiesta di connessione inviata a un host remoto annuncia una dimensione della finestra di ricezione di 16K (16.384 byte).
  2. Quando viene stabilita la connessione, le dimensioni della finestra di ricezione vengono arrotondate per eccesso a un incremento pari del servizio gestito.
  3. Le dimensioni della finestra vengono modificate quattro volte il servizio gestito, fino a una dimensione massima di 64 K, a meno che non venga usata l'opzione di ridimensionamento della finestra (RFC 1323).

Nota

Vedere la sezione "Ridimensionamento di Windows".

Per le connessioni Ethernet, le dimensioni della finestra vengono in genere impostate su 17.520 byte (16.000 arrotondate fino a dodici segmenti da 1460 byte). Le dimensioni della finestra possono ridursi quando viene stabilita una connessione a un computer che supporta le opzioni head TCP estese, ad esempio Sacks (Selective Acknowledgments) e Timestamp. Queste due opzioni aumentano le dimensioni dell'intestazione TCP a più di 20 byte, con conseguente minore spazio per i dati.

Nelle versioni precedenti di Windows NT, le dimensioni della finestra per una connessione Ethernet erano di 8.760 byte o sei segmenti da 1460 byte.

Per impostare le dimensioni della finestra di ricezione su un valore specifico, aggiungere il valore TcpWindowSize alla sottochiave del Registro di sistema specifica della versione di Windows. A tale scopo, seguire questa procedura:

  1. Selezionare Avvia>esecuzione, digitare Regedite quindi selezionare OK.

  2. Espandere la sottochiave del Registro di sistema specifica della versione di Windows:

    • Per Windows 2000 espandere la sottochiave seguente: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

    • Per Windows Server 2003 espandere la sottochiave seguente: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  3. Scegliere Nuovo dal menu Modifica, quindi selezionare Valore DWORD.

  4. Digitare TcpWindowSize nella casella Nuovo valore e quindi premere INVIO

  5. Selezionare Modifica dal menu Modifica .

  6. Digitare le dimensioni della finestra desiderate nella casella Dati valore .

    Nota

    L'intervallo valido per le dimensioni della finestra è 0-0x3FFFC000 esadecimale.

Questo valore non è presente per impostazione predefinita. Quando si aggiunge il valore TcpWindowSize, esegue l'override dell'algoritmo predefinito delle dimensioni della finestra descritto in precedenza.

Nota

TcpWindowSize può anche essere aggiunto alla chiave Parameters per impostare le dimensioni della finestra a livello globale per tutte le interfacce.

Opzioni TCP ora supportate

In precedenza, le opzioni TCP venivano usate principalmente per negoziare le dimensioni massime dei segmenti. In Windows, le opzioni TCP vengono usate per Ridimensionamento finestra, Timestamp e ACK selettivo.

Esistono due tipi di opzioni TCP:

  1. Un'opzione TCP con ottetto singolo, usata per indicare un tipo di opzione specifico.
  2. Un'opzione TCP con più ottetti, costituita da un tipo di opzione, una lunghezza dell'opzione e una serie di ottetti di opzioni.

L'elenco seguente mostra ogni tipo di opzione TCP, lunghezza, nome e descrizione.

Tipo: 0
Lunghezza: 1
Opzione: Fine elenco opzioni
Descrizione: usato quando è necessaria la spaziatura interna per l'ultima opzione TCP.

Tipo: 1
Lunghezza: 1
Opzione: Nessuna operazione
Descrizione: usato quando è necessaria la spaziatura interna e più opzioni TCP seguono all'interno dello stesso pacchetto.

Tipo: 2
Lunghezza: 4
Opzione: Dimensioni massime segmento
Descrizione: indica le dimensioni massime per un segmento TCP che può essere inviato attraverso la rete.

Tipo: 3
Lunghezza: 3
Opzione: Opzione di scala della finestra
Descrizione: identifica il fattore di ridimensionamento da usare quando si usano dimensioni di finestra superiori a 64k.

Tipo: 8
Lunghezza: 10
Opzione: Opzione timestamp
Descrizione: usato per calcolare il round trip time (RTT) dei pacchetti trasmessi.

Tipo: 4
Lunghezza: 2
Opzione: TCP SACK consentito
Descrizione: informa gli altri host che sono consentiti ack selettivi.

Tipo: 5
Lunghezza: varia
Opzione: opzione TCP SACK
Descrizione: usato dagli host per identificare se sono stati ricevuti pacchetti non ordinati.

Ridimensionamento di Windows

Per un uso più efficiente delle reti a larghezza di banda elevata, è possibile usare una finestra TCP di dimensioni maggiori. Il campo Dimensioni finestra TCP controlla il flusso di dati ed è limitato a 2 byte o a una dimensione della finestra di 65.535 byte.

Poiché il campo delle dimensioni non può essere espanso, viene usato un fattore di ridimensionamento. La scalabilità delle finestre TCP è un'opzione usata per aumentare le dimensioni massime della finestra da 65.535 byte a 1 Gigabyte.

L'opzione di scalabilità della finestra viene usata solo durante l'handshake a tre vie TCP. Il valore di scala della finestra rappresenta il numero di bit da spostare a sinistra nel campo delle dimensioni della finestra a 16 bit. Il valore di scala della finestra può essere impostato da 0 (senza spostamento) a 14.

Per calcolare le dimensioni reali della finestra, moltiplicare le dimensioni della finestra per 2^S, dove S è il valore di scala.

Ad esempio:

Se la dimensione della finestra è di 65.535 byte con un fattore di scala della finestra pari a 3.
True window size = 65535*2^3

True window size = 524280

La traccia di Monitoraggio di rete seguente mostra come viene usata l'opzione di scalabilità della finestra:

TCP: ....S., len:0, seq:725163-725163, ack:0, win:65535, src:1217 dst:139(NBT Session)  
TCP: Source Port = 0x04C1  
TCP: Destination Port = NETBIOS Session Service  
TCP: Sequence Number = 725163 (0xB10AB)  
TCP: Acknowledgement Number = 0 (0x0)  
TCP: Data Offset = 44 (0x2C)  
TCP: Reserved = 0 (0x0000)  
+ TCP: Flags = 0x02 : ....S.  
TCP: Window = 65535 (0xFFFF)  
TCP: Checksum = 0x8565  
TCP: Urgent Pointer = 0 (0x0)  
TCP: Options  
+ TCP: Maximum Segment Size Option  
TCP: Option Nop = 1 (0x1)  
TCP: Window Scale Option  
TCP: Option Type = Window Scale  
TCP: Option Length = 3 (0x3)  
TCP: Window Scale = 3 (0x3)  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: Timestamps Option  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: SACK Permitted Option  

Le dimensioni della finestra usate nell'handshake effettivo a tre vie non sono le dimensioni della finestra ridimensionate, in base alla sezione 2.2 rfc 1323:

"Il campo Finestra in un segmento SYN (ad esempio, un segmento [SYN] o [SYN,ACK]) non viene mai ridimensionato."

Significa che il primo pacchetto di dati inviato dopo l'handshake a tre vie è la dimensione effettiva della finestra. Se è presente un fattore di ridimensionamento, viene sempre usata la dimensione iniziale della finestra di 65.535 byte. Le dimensioni della finestra vengono quindi moltiplicate per il fattore di ridimensionamento identificato nell'handshake a tre vie. La tabella seguente rappresenta i limiti del fattore di ridimensionamento per varie dimensioni delle finestre.

Fattore di scala Valore di scala Finestra iniziale Finestra ridimensionata
0 1 65535 o inferiore 65535 o inferiore
1 2 65535 131,070
2 4 65535 262,140
3 8 65535 524,280
4 16 65535 1,048,560
5 32 65535 2,097,120
6 64 65535 4,194,240
7 128 65535 8,388,480
8 256 65535 16,776,960
9 512 65535 33,553,920
10 1024 65535 67,107,840
11 2048 65535 134,215,680
12 4096 65535 268,431,360
13 8192 65535 536,862,720
14 16384 65535 1,073,725,440

Ad esempio:

Se le dimensioni della finestra nel Registro di sistema vengono immesse come 2690000000 (269M) in formato decimale, il fattore di ridimensionamento durante l'handshake a tre vie è 13. Un fattore di ridimensionamento di 12 consente solo una dimensione della finestra fino a 268.431.360 byte (268M).

Le dimensioni iniziali della finestra in questo esempio verranno calcolate come segue:
65.535 byte con un fattore di scala della finestra pari a 13.
True window size = 65535*2^13
Dimensioni della finestra true = 536.862.720

Quando il valore per le dimensioni della finestra viene aggiunto al Registro di sistema e le relative dimensioni sono maggiori del valore predefinito, Windows tenta di usare un valore di scala che supporta le nuove dimensioni della finestra.

Il valore Tcp1323Opts nella chiave del Registro di sistema seguente può essere aggiunto per controllare le finestre di ridimensionamento e il timestamp:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

  1. Sulla barra degli strumenti selezionare Avvia>esecuzione e quindi digitare Regedit per avviare la Editor del Registro di sistema.

  2. Nella Editor Registro di sistema selezionare Modifica, scegliere Nuovo e quindi valore DWORD.

  3. Nella casella Nuovo valore digitare Tcp1323Opts, premere INVIO e quindi scegliere Modifica dal menu Modifica.

    Nota

    L'intervallo valido è 0, 1, 2 o 3, dove:
    0 (disabilitare le opzioni RFC 1323)
    1 (solo la scalabilità delle finestre è abilitata)
    2 (timestamp abilitati solo)
    3 (entrambe le opzioni sono abilitate)

Questa voce del Registro di sistema controlla i timestamp RFC 1323 e le opzioni di ridimensionamento delle finestre. I timestamp e il ridimensionamento della finestra sono abilitati per impostazione predefinita, ma possono essere modificati con bit di flag. Bit 0 controlla il ridimensionamento della finestra. Bit 1 controlla i timestamp.

Timestamp

In precedenza, lo stack TCP/IP usava un esempio per finestra di dati inviati per calcolare il tempo di round trip (RTT). Al momento dell'invio del pacchetto è stato impostato un timer (timer di ritrasmissione) fino alla ricezione del riconoscimento. Ad esempio, se la dimensione della finestra era di 64.240 byte (44 segmenti completi) in una rete Ethernet, solo uno dei 44 pacchetti è stato usato per ricalcolare il tempo di andata e ritorno. Con una dimensione massima della finestra di 65.535 byte, questa frequenza di campionamento era sufficiente. Usando il ridimensionamento della finestra e una dimensione massima della finestra di 1 Gigabyte, questa frequenza di campionamento RTT non è sufficiente.

L'opzione TCP Timestamp può ora essere usata nei segmenti (dati e ACK) considerati appropriati dallo stack per eseguire operazioni come:

  • Calcolo RTT
  • Controllo PAWS

Usando questi dati, il valore RTT può essere calcolato in modo accurato con finestre di grandi dimensioni. RTT viene usato per calcolare gli intervalli di ritrasmissione. I timeout di RTT e ritrasmissione accurati sono necessari per una velocità effettiva ottimale.

Quando viene usato il timestamp TCP in una sessione TCP, l'originatore della sessione invia l'opzione nel primo pacchetto dell'handshake a tre vie TCP (pacchetto SYN). Entrambi i lati possono quindi usare l'opzione TCP durante la sessione.

Opzione timestamp TCP (TSopt):

Tipo = 8 Lunghezza = 10 Valore TS (Tsval) TS Echo Reply (Tsecr)
1 byte 1 byte 4 byte 4 byte

Il campo dell'opzione timestamp può essere visualizzato in una traccia di Monitoraggio di rete espandendo il campo opzioni TCP, come illustrato di seguito:

TCP: Timestamps Option  
TCP: Option Type = Timestamps  
TCP: Option Length = 10 (0xA)  
TCP: Timestamp = 2525186 (0x268802)  
TCP: Reply Timestamp = 1823192 (0x1BD1D8)

Protezione dai numeri di sequenza incapsulati (PAWS)

Il campo numero di sequenza TCP è limitato a 32 bit, il che limita il numero di numeri di sequenza disponibili. Con reti a capacità elevata e un trasferimento di dati di grandi dimensioni, è possibile eseguire il wrapping dei numeri di sequenza prima che un pacchetto attraversi la rete. Se si inviano dati in una rete giga-byte al secondo (Gbps), il wrapping dei numeri di sequenza potrebbe essere di 34 secondi. Se un pacchetto viene ritardato, potrebbe esistere un pacchetto diverso con lo stesso numero di sequenza. Per evitare confusione di numeri di sequenza duplicati, il timestamp TCP viene usato come estensione del numero di sequenza. I pacchetti hanno timestamp correnti e in corso. Un pacchetto precedente ha un timestamp precedente e viene eliminato.

Riconoscimenti selettivi (SACK)

Windows introduce il supporto per una funzionalità di prestazioni nota come riconoscimento selettivo o SACK. SACK è particolarmente importante per le connessioni che usano finestre TCP di grandi dimensioni. Prima di SACK, un ricevitore poteva riconoscere solo il numero di sequenza più recente di un flusso di dati contiguo ricevuto o il "bordo sinistro" della finestra di ricezione. Con SACK abilitato, il ricevitore continua a usare il numero ACK per confermare il bordo sinistro della finestra di ricezione, ma può anche riconoscere singolarmente altri blocchi di dati ricevuti. SACK usa le opzioni di intestazione TCP, come illustrato di seguito.

SACK usa due tipi di opzioni TCP.

L'opzione tcp Sack-Permitted viene usata solo in un pacchetto SYN (durante la definizione della connessione TCP) per indicare che può eseguire ACK selettivo.

La seconda opzione TCP, TCP Sack Option, contiene il riconoscimento per uno o più blocchi di dati. I blocchi di dati vengono identificati usando il numero di sequenza all'inizio e alla fine di tale blocco di dati. È noto anche come bordo sinistro e destro del blocco di dati.

Il tipo 4 è l'opzione tcp Sack-Permitted. Il tipo 5 è TCP Sack Option. La lunghezza è la lunghezza in byte di questa opzione TCP.

TCP SACK consentito:

Tipo = 4 Lunghezza = 2
1 byte 1 byte

Opzione SACK TCP:

Tipo = 5 Length = Variable
1 byte Bordo sinistro del primo blocco al bordo destro del primo blocco
...
Bordo sinistro dell'ennesimo blocco al bordo destro del blocco Nth

Con SACK abilitato (impostazione predefinita), è possibile eliminare un pacchetto o una serie di pacchetti. Il ricevitore informa il mittente quali dati sono stati ricevuti e dove potrebbero essere presenti "buchi" nei dati. Il mittente può quindi ritrasmettere in modo selettivo i dati mancanti senza una ritrasmissione di blocchi di dati che sono già stati ricevuti correttamente. SACK è controllato dal parametro del Registro di sistema SackOpts.

Il valore SackOpts nella chiave del Registro di sistema seguente può essere modificato per controllare l'uso di riconoscimenti selettivi:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. Sulla barra degli strumenti selezionare Avvia>esecuzione e quindi digitare Regedit per avviare la Editor del Registro di sistema.
  2. Individuare e selezionare la chiave precedente nella Editor Registro di sistema e quindi selezionare Modifica dal menu Modifica.
  3. Digitare il valore desiderato nella casella Dati valore .

Nota

Il valore binario valido è 0 o 1, il valore predefinito è 1. Questo parametro controlla se il supporto di ACK selettivo (SACK - RFC 2018) è abilitato.

La traccia di Monitoraggio di rete seguente illustra un host che riconosce tutti i dati fino al numero di sequenza 54857341, oltre ai dati dal numero di sequenza 54858789-54861685. I dati mancanti sono da 54857341 a 54858788.

TCP: .A...., len:0, seq:925104-925104, ack:54857341, win:32722, src:1242 dst:139  
TCP: Source Port = 0x04DA  
TCP: Destination Port = NETBIOS Session Service  
TCP: Sequence Number = 925104 (0xE1DB0)  
TCP: Acknowledgement Number = 54857341 (0x3450E7D)  
TCP: Data Offset = 44 (0x2C)  
TCP: Reserved = 0 (0x0000)  
+ TCP: Flags = 0x10 : .A....  
TCP: Window = 32722 (0x7FD2)  
TCP: Checksum = 0x4A72  
TCP: Urgent Pointer = 0 (0x0)  
TCP: Options  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: Timestamps Option  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
TCP: SACK Option  
TCP: Option Type = 0x05  
TCP: Option Length = 10 (0xA)  
TCP: Left Edge of Block = 54858789 (0x3451425)  
TCP: Right Edge of Block = 54861685 (0x3451F75)

Comportamento di ritrasmissione TCP e ritrasmissione rapida

Ritrasmissione TCP

Come revisione del normale comportamento di ritrasmissione, TCP avvia un timer di ritrasmissione quando ogni segmento in uscita viene distribuito al protocollo IP (Internet Protocol). Se non è stato ricevuto alcun riconoscimento per i dati in un determinato segmento prima della scadenza del timer, il segmento viene ritrasmesso.

Il timeout di ritrasmissione (RTO) viene regolato continuamente in modo da corrispondere alle caratteristiche della connessione usando i calcoli SRTT (Smoothed Round Trip Time), come descritto in RFC 793. Il timer per un determinato segmento viene raddoppiato dopo ogni ritrasmissione di tale segmento. Usando questo algoritmo, TCP si sintonizza sul normale ritardo di una connessione.

Ritrasmissione rapida

TCP ritrasmette i dati prima della scadenza del timer di ritrasmissione in alcune circostanze. La causa più comune è una funzionalità nota come ritrasmissione rapida. Quando un ricevitore che supporta la ritrasmissione rapida riceve dati con un numero di sequenza superiore a quello previsto corrente, è probabile che alcuni dati siano stati eliminati. Per informare il mittente di questo evento, il ricevitore invia immediatamente un ACK, con il numero ACK impostato sul numero di sequenza previsto. Continuerà a farlo per ogni segmento TCP aggiuntivo che arriva. Quando il mittente inizia a ricevere un flusso di APK che riconosce lo stesso numero di sequenza, potrebbe essere stato eliminato un segmento. Il mittente invierà immediatamente il segmento previsto dal ricevitore, senza attendere la scadenza del timer di ritrasmissione. Questa ottimizzazione migliora notevolmente le prestazioni quando i pacchetti vengono eliminati di frequente.

Per impostazione predefinita, Windows invia nuovamente un segmento nelle condizioni seguenti:

  • Riceve tre ACK per lo stesso numero di sequenza: un ACK e due duplicati.
  • Il numero di sequenza è in ritardo su quello corrente.

Questo comportamento è controllabile con il parametro del TcpMaxDupAcks Registro di sistema.

Il valore TcpMaxDupAcks nella chiave del Registro di sistema seguente può essere modificato per controllare il numero di ACL necessari per avviare una ritrasmissione rapida:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. Sulla barra degli strumenti selezionare Avvia>esecuzione e quindi digitare Regedit per avviare la Editor del Registro di sistema.
  2. Individuare e selezionare la chiave precedente nella Editor Registro di sistema e quindi selezionare Modifica dal menu Modifica.
  3. Digitare il valore desiderato nella casella Dati valore .

Nota

L'intervallo valido è 1-3, il valore predefinito è 2.

Questo parametro determina il numero di APK duplicati che devono essere ricevuti per lo stesso numero di sequenza di dati inviati prima fast retransmit che venga attivato per inviare nuovamente il segmento eliminato in transito.