Descripción de las características de Windows TCP

En este artículo se describen las características de TCP en Windows.

Se aplica a: Windows 10: todas las ediciones, Windows Server 2012 R2
Número de KB original: 224829

Resumen

En este artículo se describen las siguientes características TCP en Windows:

  • Tamaño de ventana TCP
  • Ahora se admiten las opciones TCP
  • Escalado de Windows: RFC 1323
  • Marca de tiempo: RFC 1323
  • Protección contra números de secuencia encapsulados (PAWS)
  • Confirmaciones selectivas (SACKS): RFC 2018
  • Comportamiento de retransmisión TCP y retransmisión rápida

Las características TCP se pueden cambiar cambiando las entradas en el Registro.

Importante

Las secciones, métodos o tareas siguientes contienen pasos que le indican cómo modificar el Registro. No obstante, pueden producirse problemas graves si modifica el registro de manera incorrecta. En consecuencia, asegúrese de seguir estos pasos cuidadosamente. Para mayor protección, cree una copia de seguridad del registro antes de modificarlo. Después, puede restaurar el registro si se produce un problema. Para obtener más información acerca de cómo realizar una copia de seguridad y restaurar el Registro, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
322756 Hacer una copia de seguridad del Registro y restaurarlo en Windows

Tamaño de ventana TCP

El tamaño de la ventana de recepción TCP es la cantidad de datos de recepción (en bytes) que se pueden almacenar en búfer durante una conexión. El host de envío solo puede enviar esa cantidad de datos antes de que deba esperar una confirmación y una actualización de ventana desde el host receptor. La pila TCP/IP de Windows está diseñada para autoafinarse en la mayoría de los entornos y usa tamaños de ventana predeterminados mayores que las versiones anteriores.

En lugar de usar un tamaño de ventana de recepción predeterminado codificado de forma rígida, TCP se ajusta a incrementos pares del tamaño máximo de segmento (MSS). El MSS se negocia durante la configuración de la conexión. Ajustar la ventana de recepción a incrementos pares del MSS aumenta el porcentaje de segmentos TCP de tamaño completo utilizados durante las transmisiones masivas de datos.

El tamaño de la ventana de recepción se determina de la siguiente manera:

  1. La primera solicitud de conexión enviada a un host remoto anuncia un tamaño de ventana de recepción de 16 000 (16 384 bytes).
  2. Cuando se establece la conexión, el tamaño de la ventana de recepción se redondea hasta un incremento par del MSS.
  3. El tamaño de la ventana se ajusta a cuatro veces el MSS, hasta un tamaño máximo de 64 K, a menos que se use la opción de escalado de ventanas (RFC 1323).

Nota:

Consulta la sección "Escalado de Windows".

En el caso de las conexiones Ethernet, el tamaño de la ventana se establecerá normalmente en 17 520 bytes (16 000 bytes redondeados hasta doce segmentos de 1460 bytes). El tamaño de la ventana puede reducirse cuando se establece una conexión a un equipo que admite opciones de encabezado TCP extendidas, como confirmaciones selectivas (SACKS) y marcas de tiempo. Estas dos opciones aumentan el tamaño del encabezado TCP a más de 20 bytes, lo que da como resultado menos espacio para los datos.

En versiones anteriores de Windows NT, el tamaño de la ventana de una conexión Ethernet era de 8.760 bytes o seis segmentos de 1460 bytes.

Para establecer el tamaño de la ventana de recepción en un valor específico, agregue el valor TcpWindowSize a la subclave del Registro específica de la versión de Windows. Para hacerlo, siga estos pasos:

  1. Seleccione Iniciar>ejecución, escriba Regedity, a continuación, seleccione Aceptar.

  2. Expanda la subclave del Registro específica de la versión de Windows:

    • Para Windows 2000, expanda la subclave siguiente: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

    • Para Windows Server 2003, expanda la subclave siguiente: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  3. En el menú Editar , seleccione Nuevo y, a continuación, seleccione Valor DWORD.

  4. Escriba TcpWindowSize en el cuadro Nuevo valor y presione Entrar.

  5. Seleccione Modificar en el menú Editar .

  6. Escriba el tamaño de ventana deseado en el cuadro Datos de valor .

    Nota:

    El intervalo válido para el tamaño de la ventana es hexadecimal de 0 0x3FFFC000.

Este valor no está presente de forma predeterminada. Cuando se agrega el valor TcpWindowSize, se invalida el algoritmo de tamaño de ventana predeterminado descrito anteriormente.

Nota:

TcpWindowSize también se puede agregar a la clave Parameters para establecer el tamaño de la ventana globalmente para todas las interfaces.

Ahora se admiten las opciones TCP

Anteriormente, las opciones TCP se usaban principalmente para negociar los tamaños máximos de segmento. En Windows, las opciones TCP se usan para el escalado de ventanas, la marca de tiempo y el ACK selectivo.

Hay dos tipos de opciones TCP:

  1. Una opción TCP de octeto único, que se usa para indicar un tipo de opción específico.
  2. Una opción TCP de varios octetos, que consta de un tipo de opción, una longitud de opción y una serie de octetos de opciones.

En la lista siguiente se muestra cada tipo de opción TCP, longitud, nombre y descripción.

Tipo: 0
Longitud: 1
Opción: Fin de la lista de opciones
Descripción: se usa cuando se necesita relleno para la última opción TCP.

Tipo: 1
Longitud: 1
Opción: Sin operación
Descripción: se usa cuando se necesita relleno y se siguen más opciones TCP dentro del mismo paquete.

Tipo: 2
Longitud: 4
Opción: Tamaño máximo de segmento
Descripción: indica el tamaño máximo de un segmento TCP que se puede enviar a través de la red.

Tipo: 3
Longitud: 3
Opción: Opción de escala de ventana
Descripción: identifica el factor de escalado que se va a usar al usar tamaños de ventana mayores que 64 k.

Tipo: 8
Longitud: 10
Opción: Opción marca de tiempo
Descripción: se usa para ayudar a calcular el tiempo de ida y vuelta (RTT) de los paquetes transmitidos.

Tipo: 4
Longitud: 2
Opción: TCP SACK permitido
Descripción: informa a otros hosts de que se permiten las confirmaciones selectivas.

Tipo: 5
Longitud: varía
Opción: Opción TCP SACK
Descripción: usado por los hosts para identificar si se recibieron paquetes desordenados.

Escalado de Windows

Para un uso más eficaz de las redes de ancho de banda alto, se puede usar un tamaño de ventana TCP mayor. El campo Tamaño de ventana TCP controla el flujo de datos y está limitado a 2 bytes, o un tamaño de ventana de 65 535 bytes.

Dado que el campo de tamaño no se puede expandir, se usa un factor de escalado. La escala de ventanas TCP es una opción que se usa para aumentar el tamaño máximo de la ventana de 65 535 bytes a 1 Gigabyte.

La opción de escala de ventana solo se usa durante el protocolo de enlace triple TCP. El valor de escala de la ventana representa el número de bits para desplazar a la izquierda el campo de tamaño de ventana de 16 bits. El valor de escala de la ventana se puede establecer de 0 (sin desplazamiento) a 14.

Para calcular el tamaño real de la ventana, multiplique el tamaño de la ventana por 2^S, donde S es el valor de escala.

Por ejemplo:

Si el tamaño de la ventana es de 65 535 bytes con un factor de escala de ventana de 3.
Tamaño de ventana verdadero = 65535*2^3

Tamaño de ventana verdadero = 524280

El siguiente seguimiento del Monitor de red muestra cómo se usa la opción de escala de ventana:

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  

El tamaño de ventana usado en el protocolo de enlace triple real no es el tamaño de ventana que se escala, según la sección 2.2 de RFC 1323:

"El campo Ventana de un syn (por ejemplo, un segmento [SYN] o [SYN,ACK]) nunca se escala."

Significa que el primer paquete de datos enviado después del protocolo de enlace triple es el tamaño real de la ventana. Si hay un factor de escalado, siempre se usa el tamaño inicial de la ventana de 65 535 bytes. A continuación, el tamaño de la ventana se multiplica por el factor de escalado identificado en el protocolo de enlace triple. La tabla siguiente representa los límites del factor de escalado para varios tamaños de ventana.

Factor de escala Valor de escala Ventana inicial Ventana escalada
0 1 65535 o menos 65535 o menos
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

Por ejemplo:

Si el tamaño de la ventana en el Registro se especifica como 2690000000 (269M) en decimal, el factor de escalado durante el protocolo de enlace triple es 13. Un factor de escalado de 12 solo permite un tamaño de ventana de hasta 268 431 360 bytes (268 M).

El tamaño inicial de la ventana de este ejemplo se calcularía de la siguiente manera:
65 535 bytes con un factor de escala de ventana de 13.
Tamaño de ventana verdadero = 65535*2^13
Tamaño de ventana verdadero = 536 862 720

Cuando el valor del tamaño de la ventana se agrega al Registro y su tamaño es mayor que el valor predeterminado, Windows intenta usar un valor de escala que se adapte al nuevo tamaño de ventana.

El valor Tcp1323Opts de la siguiente clave del Registro se puede agregar para controlar las ventanas de escalado y la marca de tiempo:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

  1. En la barra de herramientas, seleccione Iniciar>ejecución y Regedit escriba para iniciar la Editor del Registro.

  2. En la Editor del Registro, seleccione Editar, seleccione Nuevo y, a continuación, seleccione Valor DWORD.

  3. En el cuadro Nuevo valor, escriba Tcp1323Opts, presione ENTRAR y, a continuación, en el menú Editar , seleccione Modificar.

    Nota:

    El intervalo válido es 0, 1, 2 o 3, donde:
    0 (deshabilitar las opciones de RFC 1323)
    1 (solo se habilita la escala de ventanas)
    2 (solo marcas de tiempo habilitadas)
    3 (ambas opciones habilitadas)

Esta entrada del Registro controla las marcas de tiempo RFC 1323 y las opciones de escalado de ventanas. Las marcas de tiempo y el escalado de ventana están habilitados de forma predeterminada, pero se pueden manipular con bits de marca. Bit 0 controla el escalado de ventana. Bit 1 controla las marcas de tiempo.

Marcas de tiempo

Anteriormente, la pila TCP/IP usaba un ejemplo por ventana de datos enviados para calcular el tiempo de ida y vuelta (RTT). Se estableció un temporizador (temporizador de retransmisión) cuando se envió el paquete, hasta que se recibió la confirmación. Por ejemplo, si el tamaño de la ventana era de 64 240 bytes (44 segmentos completos) en una red Ethernet, solo se usó uno de cada 44 paquetes para recalcular el tiempo de ida y vuelta. Con un tamaño máximo de ventana de 65 535 bytes, esta velocidad de muestreo era suficiente. Con el escalado de ventanas y un tamaño máximo de ventana de 1 Gigabyte, esta velocidad de muestreo RTT no es suficiente.

La opción Marca de tiempo TCP ahora se puede usar en segmentos (datos y ACK) que la pila considere adecuados para realizar operaciones como:

  • Cálculo rtt
  • Comprobación de PAWS

Con estos datos, el RTT se puede calcular con precisión con tamaños de ventana grandes. RTT se usa para calcular los intervalos de retransmisión. Se necesitan tiempos de espera precisos de RTT y retransmisión para un rendimiento óptimo.

Cuando se usa la marca de tiempo TCP en una sesión TCP, el originador de la sesión envía la opción en su primer paquete del protocolo de enlace de tres vías TCP (paquete SYN). A continuación, ambos lados pueden usar la opción TCP durante la sesión.

Opción Tcp Timestamps (TSopt):

Tipo = 8 Longitud = 10 Valor de TS (Tsval) Respuesta de eco de TS (Tsecr)
1 byte 1 byte 4 bytes 4 bytes

El campo de opción timestamp se puede ver en un seguimiento de Monitor de red expandiendo el campo opciones tcp, como se muestra a continuación:

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

Protección contra números de secuencia encapsulados (PAWS)

El campo Número de secuencia TCP está limitado a 32 bits, lo que limita el número de números de secuencia disponibles. Con redes de alta capacidad y una transferencia de datos de gran tamaño, es posible encapsular los números de secuencia antes de que un paquete atraviesa la red. Si se envían datos en una red de un Giga byte por segundo (Gbps), los números de secuencia podrían envolverse en tan solo 34 segundos. Si se retrasa un paquete, podría existir un paquete diferente con el mismo número de secuencia. Para evitar la confusión de números de secuencia duplicados, la marca de tiempo TCP se usa como una extensión del número de secuencia. Los paquetes tienen marcas de tiempo actuales y de progreso. Un paquete antiguo tiene una marca de tiempo anterior y se descarta.

Confirmaciones selectivas (SACK)

Windows presenta compatibilidad con una característica de rendimiento conocida como Confirmación selectiva o SACK. SACK es especialmente importante para las conexiones que usan tamaños de ventana TCP grandes. Antes de SACK, un receptor solo podía confirmar el número de secuencia más reciente de un flujo de datos contiguo que se había recibido o el "borde izquierdo" de la ventana de recepción. Con SACK habilitado, el receptor sigue usando el número ACK para confirmar el borde izquierdo de la ventana de recepción, pero también puede reconocer otros bloques de datos recibidos individualmente. SACK usa opciones de encabezado TCP, como se muestra a continuación.

SACK usa dos tipos de opciones TCP.

La opción tcp Sack-Permitted solo se usa en un paquete SYN (durante el establecimiento de la conexión TCP) para indicar que puede hacer ACK selectivo.

La segunda opción TCP, opción de saco TCP, contiene confirmación para uno o varios bloques de datos. Los bloques de datos se identifican mediante el número de secuencia al principio y al final de ese bloque de datos. También se conoce como el borde izquierdo y derecho del bloque de datos.

El tipo 4 es tcp Sack-Permitted opción. El tipo 5 es la opción de saco TCP. Longitud es la longitud en bytes de esta opción TCP.

Tcp SACK permitido:

Tipo = 4 Longitud = 2
1 byte 1 byte

Opción TCP SACK:

Tipo = 5 Length = Variable
1 byte Borde izquierdo del primer bloque al borde derecho del primer bloque
...
Borde izquierdo del nº bloque al borde derecho del nº bloque

Con SACK habilitado (valor predeterminado), se puede quitar un paquete o una serie de paquetes. El receptor informa al remitente qué datos se han recibido y dónde puede haber "agujeros" en los datos. A continuación, el remitente puede retransmitir selectivamente los datos que faltan sin una retransmisión de bloques de datos que ya se han recibido correctamente. SACK se controla mediante el parámetro del Registro SackOpts.

El valor de SackOpts en la siguiente clave del Registro se puede editar para controlar el uso de confirmaciones selectivas:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. En la barra de herramientas, seleccione Iniciar>ejecución y Regedit escriba para iniciar la Editor del Registro.
  2. Busque y seleccione la tecla anterior en la Editor del Registro y, a continuación, seleccione Modificar en el menú Editar.
  3. Escriba el valor deseado en el cuadro Datos de valor .

Nota:

El valor binario válido es 0 o 1, el valor predeterminado es 1. Este parámetro controla si está habilitada o no la compatibilidad con ACK selectivo (SACK - RFC 2018).

El siguiente seguimiento del Monitor de red muestra un host que confirma todos los datos hasta el número de secuencia 54857341, además de los datos del número de secuencia 54858789-54861685. Los datos que faltan son de 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)

Comportamiento de retransmisión TCP y retransmisión rápida

Retransmisión tcp

Como revisión del comportamiento de retransmisión normal, TCP inicia un temporizador de retransmisión cuando cada segmento saliente se entrega al Protocolo de Internet (IP). Si no se ha recibido ninguna confirmación para los datos de un segmento determinado antes de que expire el temporizador, se retransmite el segmento.

El tiempo de espera de retransmisión (RTO) se ajusta continuamente para que coincida con las características de la conexión mediante cálculos de tiempo de ida y vuelta suavizado (SRTT), como se describe en RFC 793. El temporizador de un segmento determinado se duplica después de cada retransmisión de ese segmento. Con este algoritmo, TCP se ajusta al retraso normal de una conexión.

Retransmisión rápida

TCP retransmite los datos antes de que expire el temporizador de retransmisión en algunas circunstancias. La causa más común es una característica conocida como retransmisión rápida. Cuando un receptor que admite la retransmisión rápida recibe datos con un número de secuencia más allá del esperado actual, es probable que se quiten algunos datos. Para ayudar a informar al remitente de este evento, el receptor envía inmediatamente un ACK, con el número ACK establecido en el número de secuencia que esperaba. Seguirá haciéndolo para cada segmento TCP adicional que llegue. Cuando el remitente comienza a recibir un flujo de ACL que confirma el mismo número de secuencia, es posible que se haya quitado un segmento. El remitente volverá a enviar inmediatamente el segmento que espera el receptor, sin esperar a que expire el temporizador de retransmisión. Esta optimización mejora considerablemente el rendimiento cuando los paquetes se quitan con frecuencia.

De forma predeterminada, Windows vuelve a enviar un segmento en las condiciones siguientes:

  • Recibe tres ACL para el mismo número de secuencia: un ACK y dos duplicados.
  • El número de secuencia retrasa el actual.

Este comportamiento se puede controlar con el parámetro del TcpMaxDupAcks Registro.

El valor TcpMaxDupAcks de la siguiente clave del Registro se puede editar para controlar el número de ACL necesarias para iniciar una retransmisión rápida:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. En la barra de herramientas, seleccione Iniciar>ejecución y Regedit escriba para iniciar la Editor del Registro.
  2. Busque y seleccione la tecla anterior en la Editor del Registro y, a continuación, seleccione Modificar en el menú Editar.
  3. Escriba el valor deseado en el cuadro Datos de valor .

Nota:

El intervalo válido es 1-3, el valor predeterminado es 2.

Este parámetro determina el número de ACL duplicadas que se deben recibir para el mismo número de secuencia de datos enviados antes fast retransmit de que se desencadene para volver a enviar el segmento que se ha quitado en tránsito.