Descrição dos recursos do Windows TCP

Este artigo descreve os recursos TCP no Windows.

Aplica-se a: Windows 10 — todas as edições, Windows Server 2012 R2
Número de KB original: 224829

Resumo

Este artigo descreve os seguintes recursos TCP no Windows:

  • Tamanho da janela TCP
  • Agora há suporte para opções TCP
  • Dimensionamento do Windows – RFC 1323
  • Carimbo de data/hora – RFC 1323
  • Proteção contra números de sequência encapsulados (PAWS)
  • Reconhecimentos Seletivos (SACKS) – RFC 2018
  • Comportamento de retransmissão TCP e retransmissão rápida

Os recursos TCP podem ser alterados alterando as entradas no registro.

Importante

As seções, métodos ou tarefas a seguir contêm etapas que informam como modificar o registro. Entretanto, sérios problemas poderão ocorrer caso você modifique o Registro incorretamente. Portanto, siga essas etapas cuidadosamente. Para mais proteção, faça o backup do registro antes de modificá-lo. Em seguida, você poderá restaurar o registro se ocorrer um problema. Para obter mais informações sobre como fazer backup e restaurar o Registro, clique no número abaixo para ler o artigo na Base de Dados de Conhecimento Microsoft:
322756 Como fazer o backup e a restauração do Registro no Windows

Tamanho da janela TCP

O tamanho da janela de recebimento do TCP é a quantidade de dados de recebimento (em bytes) que podem ser buffers durante uma conexão. O host de envio pode enviar apenas essa quantidade de dados antes de aguardar um reconhecimento e uma atualização de janela do host receptor. A pilha TCP/IP do Windows foi projetada para se auto-ajustar na maioria dos ambientes e usa tamanhos de janela padrão maiores do que as versões anteriores.

Em vez de usar um tamanho de janela de recebimento padrão codificado, o TCP se ajusta até mesmo a incrementos do tamanho máximo do segmento (MSS). O MSS é negociado durante a instalação da conexão. Ajustar a janela de recebimento a incrementos uniformes do MSS aumenta o percentual de segmentos TCP de tamanho completo usados durante transmissões de dados em massa.

O tamanho da janela de recebimento é determinado da seguinte maneira:

  1. A primeira solicitação de conexão enviada a um host remoto anuncia um tamanho de janela de recebimento de 16K (16.384 bytes).
  2. Quando a conexão é estabelecida, o tamanho da janela de recebimento é arredondado para um incremento uniforme do MSS.
  3. O tamanho da janela é ajustado para quatro vezes o MSS, para um tamanho máximo de 64 K, a menos que a opção de dimensionamento de janela (RFC 1323) seja usada.

Observação

Consulte a seção "Dimensionamento do Windows".

Para conexões Ethernet, o tamanho da janela normalmente será definido como 17.520 bytes (16K arredondados até doze segmentos de 1460 bytes). O tamanho da janela pode reduzir quando uma conexão é estabelecida para um computador que dá suporte a opções de cabeça TCP estendidas, como SACKS (Reconhecimentos Seletivos) e Carimbos de Data/Hora. Essas duas opções aumentam o tamanho do cabeçalho TCP para mais de 20 bytes, o que resulta em menos espaço para dados.

Nas versões anteriores do Windows NT, o tamanho da janela para uma conexão Ethernet era de 8.760 bytes ou seis segmentos de 1460 bytes.

Para definir o tamanho da janela de recebimento como um valor específico, adicione o valor TcpWindowSize à subchave do registro específica para sua versão do Windows. Para fazer isso, siga estas etapas:

  1. Selecione Iniciar>Execução, digite Regedite, em seguida, selecione OK.

  2. Expanda a subchave do registro específica para sua versão do Windows:

    • Para Windows 2000, expanda a seguinte subchave: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

    • Para Windows Server 2003, expanda a seguinte subchave: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  3. No menu Editar , aponte para Novo e selecione Valor DWORD.

  4. Digite TcpWindowSize na caixa Novo Valor e pressione Enter

  5. Selecione Modificar no menu Editar .

  6. Digite o tamanho da janela desejada na caixa de dados Valor .

    Observação

    O intervalo válido para o tamanho da janela é hexadecimal de 0 0x3FFFC000.

Esse valor não está presente por padrão. Quando você adiciona o valor TcpWindowSize, ele substitui o algoritmo de tamanho de janela padrão discutido acima.

Observação

TcpWindowSize também pode ser adicionado à chave Parâmetros para definir o tamanho da janela globalmente para todas as interfaces.

Agora há suporte para opções TCP

Anteriormente, as opções TCP eram usadas principalmente para negociar tamanhos máximos do segmento. No Windows, as opções TCP são usadas para Dimensionamento de Janelas, Carimbo de Tempo e ACK Seletivo.

Há dois tipos de opções TCP:

  1. Uma opção TCP de octeto único, que é usada para indicar um tipo de opção específico.
  2. Uma opção TCP de vários octetos, que consiste em um tipo de opção, um comprimento de opção e uma série de octets de opção.

A lista a seguir mostra cada tipo de opção TCP, comprimento, nome e descrição.

Tipo: 0
Comprimento: 1
Opção: Fim da Lista de Opções
Descrição: usado quando o preenchimento é necessário para a última opção TCP.

Tipo: 1
Comprimento: 1
Opção: sem operação
Descrição: usado quando o preenchimento é necessário e mais opções de TCP seguem no mesmo pacote.

Tipo: 2
Comprimento: 4
Opção: Tamanho máximo do segmento
Descrição: indica o tamanho máximo de um segmento TCP que pode ser enviado por toda a rede.

Tipo: 3
Comprimento: 3
Opção: opção Dimensionamento de Janela
Descrição: identifica o fator de dimensionamento a ser usado ao usar tamanhos de janela maiores que 64k.

Tipo: 8
Comprimento: 10
Opção: opção carimbo de hora
Descrição: usado para ajudar a calcular o RTT (Tempo de Viagem de Ida e Volta) dos pacotes transmitidos.

Tipo: 4
Comprimento: 2
Opção: TCP SACK permitido
Descrição: informa a outros hosts que os Acks Seletivos são permitidos.

Tipo: 5
Comprimento: Varia
Opção: Opção TCP SACK
Descrição: usado por hosts para identificar se pacotes fora de ordem foram recebidos.

Dimensionamento do Windows

Para um uso mais eficiente de redes de alta largura de banda, um tamanho de janela TCP maior pode ser usado. O campo tamanho da janela TCP controla o fluxo de dados e é limitado a 2 bytes ou um tamanho de janela de 65.535 bytes.

Como o campo de tamanho não pode ser expandido, um fator de dimensionamento é usado. A escala da janela TCP é uma opção usada para aumentar o tamanho máximo da janela de 65.535 bytes para 1 Gigabyte.

A opção de dimensionamento de janela é usada somente durante o aperto de mão de três vias TCP. O valor de escala da janela representa o número de bits para o turno esquerdo do campo de tamanho da janela de 16 bits. O valor de escala de janela pode ser definido de 0 (sem turno) para 14.

Para calcular o tamanho da janela real, multiplique o tamanho da janela por 2^S, onde S é o valor de escala.

Por exemplo:

Se o tamanho da janela for de 65.535 bytes com um fator de escala de janela de 3.
Tamanho da janela true = 65535*2^3

Tamanho da janela true = 524280

O seguinte rastreamento do Monitor de Rede mostra como a opção de escala de janela é usada:

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  

O tamanho da janela usado no aperto de mão de três vias real não é o tamanho da janela dimensionado, por RFC 1323 seção 2.2:

"O campo Janela em um segmento SYN (por exemplo, um segmento [SYN] ou [SYN,ACK]) nunca é dimensionado."

Isso significa que o primeiro pacote de dados enviado após o aperto de mão de três vias é o tamanho real da janela. Se houver um fator de dimensionamento, o tamanho da janela inicial de 65.535 bytes será sempre usado. O tamanho da janela é então multiplicado pelo fator de dimensionamento identificado no aperto de mão de três vias. A tabela abaixo representa os limites do fator de dimensionamento para vários tamanhos de janela.

Fator Scale Valor de escala Janela Inicial Janela Dimensionada
0 1 65535 ou menos 65535 ou 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 exemplo:

Se o tamanho da janela no registro for inserido como 26900000 (269M) em decimais, o fator de dimensionamento durante o aperto de mão de três vias será 13. Um fator de dimensionamento de 12 permite apenas um tamanho de janela de até 268.431.360 bytes (268M).

O tamanho da janela inicial neste exemplo seria calculado da seguinte maneira:
65.535 bytes com um fator de escala de janela de 13.
Tamanho da janela true = 65535*2^13
Tamanho da janela true = 536.862.720

Quando o valor do tamanho da janela é adicionado ao registro e seu tamanho é maior que o valor padrão, o Windows tenta usar um valor de escala que acomode o novo tamanho da janela.

O valor Tcp1323Opts na seguinte chave de registro pode ser adicionado ao controle de janelas de dimensionamento e carimbo de data/hora:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

  1. Na barra de ferramentas, selecione Iniciar>Execução e digite Regedit para iniciar a Editor do Registro.

  2. Na Editor do Registro, selecione Editar, aponte para Novo e selecione Valor DWORD.

  3. Na caixa Novo Valor, digite Tcp1323Opts, pressione ENTER e, em seguida, no menu Editar , selecione Modificar.

    Observação

    O intervalo válido é 0, 1, 2 ou 3 em que:
    0 (desabilitar opções rfc 1323)
    1 (somente a escala de janela habilitada)
    2 (carimbos de data/hora habilitados somente)
    3 (ambas as opções habilitadas)

Essa entrada do registro controla os carimbos de data/hora RFC 1323 e as opções de dimensionamento de janela. Os carimbos de data/hora e o dimensionamento de janelas são habilitados por padrão, mas podem ser manipulados com bits de sinalizador. O Bit 0 controla o dimensionamento da janela. O Bit 1 controla carimbos de data/hora.

Timestamps

Anteriormente, a pilha TCP/IP usava um exemplo por janela de dados enviados para calcular o tempo de ida e volta (RTT). Um temporizador (temporizador de retransmissão) foi definido quando o pacote foi enviado, até que o reconhecimento fosse recebido. Por exemplo, se o tamanho da janela fosse de 64.240 bytes (44 segmentos completos) em uma rede Ethernet, apenas um de cada 44 pacotes foi usado para recalcular o tempo de ida e volta. Com um tamanho máximo de janela de 65.535 bytes, essa taxa de amostragem foi suficiente. Usando o dimensionamento da janela e um tamanho máximo de janela de 1 Gigabyte, essa taxa de amostragem RTT não é suficiente.

A opção carimbo de data/hora TCP agora pode ser usada em segmentos (dados e ACK) considerados apropriados pela pilha, para fazer operações como:

  • Computação RTT
  • PAWS marcar

Usando esses dados, o RTT pode ser calculado com precisão com grandes tamanhos de janela. O RTT é usado para calcular intervalos de retransmissão. RtT preciso e tempo limite de retransmissão são necessários para uma taxa de transferência ideal.

Quando o carimbo de hora TCP é usado em uma sessão TCP, o criador da sessão envia a opção em seu primeiro pacote do pacote SYN (aperto de mão de três vias) TCP. Em seguida, ambos os lados podem usar a opção TCP durante a sessão.

Opção TCP Timestamps (TSopt):

Tipo = 8 Comprimento = 10 Valor TS (Tsval) TS Echo Reply (Tsecr)
1 byte 1 byte 4 bytes 4 bytes

O campo de opção de carimbo de data/hora pode ser exibido em um rastreamento do Monitor de Rede expandindo o campo de opções TCP, conforme mostrado abaixo:

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

Proteção contra números de sequência encapsulados (PAWS)

O campo número de sequência TCP é limitado a 32 bits, o que limita o número de números de sequência disponíveis. Com redes de alta capacidade e uma grande transferência de dados, é possível envolver números de sequência antes que um pacote atravesse a rede. Se enviar dados em uma rede giga-byte por segundo (Gbps), os números da sequência poderão ser encapsulados em apenas 34 segundos. Se um pacote for atrasado, um pacote diferente poderá existir com o mesmo número de sequência. Para evitar confusão de números de sequência duplicados, o carimbo de data/hora TCP é usado como uma extensão para o número de sequência. Os pacotes têm carimbos de tempo atuais e em andamento. Um pacote antigo tem um carimbo de hora mais antigo e é descartado.

SACKs (Reconhecimentos Seletivos)

O Windows apresenta suporte para um recurso de desempenho conhecido como Reconhecimento Seletivo ou SACK. O SACK é especialmente importante para conexões que usam tamanhos de janela TCP grandes. Antes do SACK, um receptor só podia reconhecer o número de sequência mais recente de um fluxo de dados contíguo que havia sido recebido ou a "borda esquerda" da janela de recebimento. Com o SACK habilitado, o receptor continua a usar o número ACK para reconhecer a borda esquerda da janela de recebimento, mas também pode reconhecer outros blocos de dados recebidos individualmente. O SACK usa opções de cabeçalho TCP, conforme mostrado abaixo.

O SACK usa dois tipos de Opções TCP.

A Opção de Sack-Permitted TCP é usada apenas em um pacote SYN (durante o estabelecimento de conexão TCP) para indicar que ele pode fazer ACK seletivo.

A segunda opção TCP, TCP Sack Option, contém reconhecimento para um ou mais blocos de dados. Os blocos de dados são identificados usando o número de sequência no início e no final desse bloco de dados. Ele também é conhecido como a borda esquerda e direita do bloco de dados.

O Tipo 4 é o TCP Sack-Permitted Option. O tipo 5 é a opção TCP Sack. O comprimento é o comprimento em bytes dessa opção TCP.

Tcp SACK permitido:

Tipo = 4 Comprimento = 2
1 byte 1 byte

Opção Tcp SACK:

Tipo = 5 Comprimento = Variável
1 byte Borda esquerda do primeiro bloco para a borda direita do primeiro bloco
...
Borda esquerda do bloco Nth para a borda direita do bloco Nth

Com o SACK habilitado (padrão), um pacote ou uma série de pacotes podem ser descartados. O receptor informa ao remetente quais dados foram recebidos e onde pode haver "buracos" nos dados. Em seguida, o remetente pode retransmitir seletivamente os dados ausentes sem uma retransmissão de blocos de dados que já foram recebidos com êxito. O SACK é controlado pelo parâmetro de registro SackOpts.

O valor SackOpts na seguinte chave do registro pode ser editado para controlar o uso de reconhecimentos seletivos:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. Na barra de ferramentas, selecione Iniciar>Execução e digite Regedit para iniciar a Editor do Registro.
  2. Localize e selecione a chave acima no Editor do Registro e selecione Modificar no menu Editar.
  3. Digite o valor desejado na caixa de dados Valor .

Observação

O valor binário válido é 0 ou 1, o valor padrão é 1. Esse parâmetro controla se o suporte a SACK (SACK – RFC 2018) está habilitado ou não.

O rastreamento do Monitor de Rede a seguir ilustra um host reconhecendo todos os dados até o número de sequência 54857341, além dos dados do número da sequência 54858789-54861685. Os dados ausentes são 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)

Comportamento de retransmissão TCP e retransmissão rápida

Retransmissão TCP

Como uma revisão do comportamento normal de retransmissão, o TCP inicia um temporizador de retransmissão quando cada segmento de saída é entregue ao IP (Protocolo de Internet). Se nenhum reconhecimento tiver sido recebido para os dados em um determinado segmento antes do temporizador expirar, o segmento será retransmitido.

O tempo limite de retransmissão (RTO) é ajustado continuamente para corresponder às características da conexão usando cálculos de SRTT (Tempo de Ida e Volta Suavizada), conforme descrito no RFC 793. O temporizador de um determinado segmento é dobrado após cada retransmissão desse segmento. Usando esse algoritmo, o TCP se ajusta ao atraso normal de uma conexão.

Retransmissão rápida

O TCP retransmite dados antes que o temporizador de retransmissão expire em algumas circunstâncias. A causa mais comum é um recurso conhecido como retransmissão rápida. Quando um receptor que dá suporte a retransmissão rápida recebe dados com um número de sequência além do esperado atual, alguns dados provavelmente foram descartados. Para ajudar a informar o remetente desse evento, o receptor envia imediatamente um ACK, com o número do ACK definido como o número de sequência que ele estava esperando. Ele continuará a fazê-lo para cada segmento de TCP adicional que chegar. Quando o remetente começa a receber um fluxo de ACKs que está reconhecendo o mesmo número de sequência, um segmento pode ter sido descartado. O remetente reenviará imediatamente o segmento que o receptor está esperando, sem esperar que o temporizador de retransmissão expire. Essa otimização melhora muito o desempenho quando os pacotes são descartados com frequência.

Por padrão, o Windows reenvia um segmento nas seguintes condições:

  • Ele recebe três ACKs para o mesmo número de sequência: um ACK e duas duplicatas.
  • O número de sequência atrasa o atual.

Esse comportamento é controlável com o parâmetro do TcpMaxDupAcks registro.

O valor TcpMaxDupAcks na seguinte chave do registro pode ser editado para controlar o número de ACKs necessários para iniciar um retransmissão rápido:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. Na barra de ferramentas, selecione Iniciar>Execução e digite Regedit para iniciar a Editor do Registro.
  2. Localize e selecione a chave acima no Editor do Registro e selecione Modificar no menu Editar.
  3. Digite o valor desejado na caixa de dados Valor .

Observação

O intervalo válido é 1-3, o valor padrão é 2.

Esse parâmetro determina o número de ACKs duplicados que devem ser recebidos para o mesmo número de sequência de dados enviados antes fast retransmit de ser disparado para reenviar o segmento que foi descartado em trânsito.