Compartilhar via


Regras para agrupar segmentos TCP/IP

Esta seção define as regras que especificam quando um driver de miniporta compatível com RSC (segmento de recebimento) deve unir um segmento para uma determinada conexão TCP. Se qualquer uma das regras for violada, uma exceção será gerada e o driver de miniporto deverá anular a união do segmento.

O driver de miniporte deve atualizar os cabeçalhos IP e TCP para a SCU (unidade única agrupada). O driver de miniporte deve recompactar as somas de verificação TCP e IPv4 sobre o SCU e encadear a carga TCP.

O primeiro dos dois fluxogramas a seguir descreve as regras para unir segmentos e atualizar os cabeçalhos TCP. Esse fluxograma refere-se a mecanismos para distinguir ACKs duplicados válidos e atualizações de janela. O segundo fluxograma descreve esses mecanismos.

Esses fluxogramas são fornecidos como uma referência para entender as regras de RSC. Uma implementação de hardware pode otimizar o fluxograma, desde que a correção seja mantida.

Os seguintes termos são usados nos fluxogramas:

Termo Descrição
SEG. SEQ Número de sequência do segmento de entrada.
H.SEQ Número de sequência do SCU rastreado no momento.
SEG. ACK Número de confirmação do segmento de entrada.
H.ACK Número de confirmação do SCU rastreado no momento.
SEG. WND A janela anunciada pelo segmento de entrada.
H.WND A janela anunciada pelo SCU rastreado no momento.
SEG. LEN Tamanho da carga TCP do segmento de entrada.
H.LEN Tamanho da carga TCP do SCU rastreado no momento.
SEG. NXT A soma do SEG. SEQ e SEG. LEN.
H.NXT A soma de H.SEQ e H.LEN.
H.DupAckCount O número de ACKs duplicadas que foram agrupadas no SCU. Esse número deve ser zero.
SEG. Tsval O valor de Carimbo de data/hora no segmento recebido no momento. O formato desse valor é definido no RFC 1323.
H.Tsval O valor carimbo de data/hora no SCU rastreado no momento.
SEG. TSecr A Resposta de Eco de Carimbo de Data/Hora no segmento recebido no momento.
H.TSecr A Resposta de Eco de Carimbo de Data/Hora no SCU rastreado no momento.

Fluxograma que mostra as regras para unir segmentos e atualizar cabeçalhos TCP.

Fluxograma que mostra mecanismos para distinguir ACKs duplicados válidos e atualizações de janela.

Os fluxogramas mostram que o driver de miniporto pode unir segmentos com diferentes números ACK. No entanto, o driver de miniporto deve obedecer às seguintes regras relativas aos números de ACK, conforme mostrado no primeiro fluxograma acima:

  • Depois de executar o número de sequência marcar, um ACK puro de entrada poderá ser unido ao SCU atualmente rastreado se atender a uma ou ambas as seguintes condições:

    • H.ACK == SEG. ACK.

    • A contagem duplicada de ACK no segmento unido que está sendo rastreado é zero. Em outras palavras, H.DupAckCount == 0.

      Em outras palavras, qualquer ACK puro que não seja um ACK duplicado ou uma atualização de janela dispara uma exceção e não deve ser agrupado. Todas essas ACKs puras devem ser indicadas como segmentos individuais. Essa regra garante que o RSC não afete o comportamento ou o desempenho dos algoritmos de controle de congestionamento TCP do Windows.

  • Um SEG (segmento de dados de entrada). ACK == H.ACK) ou um SEG (ACK) de entrada. O ACK>H.ACK) poderá ser unido ao SCU atualmente rastreado se ambas as seguintes condições forem atendidas:

    • O segmento é contíguo ao SCU no espaço de sequência. Em outras palavras, SEG. SEQ == H.NXT.
    • A contagem duplicada de ACK no segmento unido que está sendo rastreado é zero. Em outras palavras, H.DupAckCount == 0.

Notas adicionais sobre a união duplicada de ACK

Comportamento duplicado de ACK

O driver de miniporte deve tratar um segmento ACK duplicado equivalente a um ACK puro e não uni-lo. Nesse caso, ele deve finalizar o SCU atual (se houver) para indicação e indicar o segmento ACK duplicado como um segmento individual. Como os clientes do Windows usam SACK (confirmações seletivas) por padrão, um segmento ACK duplicado provavelmente gerará uma exceção. Consulte Exemplos de agrupamento de segmento de recebimento para obter um exemplo. Se um segmento com DupAckCount> 0 for indicado, o NDIS desabilitará o RSC na interface.

Manipulação de ACK duplicada ao rastrear um SCU que consiste em segmentos de dados

Ao rastrear um SCU com H.LEN> 0 (em outras palavras, um segmento unido que contém dados), se um ACK duplicado chegar em seguida, o SCU de rastreamento deverá ser finalizado da seguinte maneira:

  1. Um novo SCU deve ser rastreado, começando com o ACK duplicado.

  2. O DupAckCount para o novo SCU deve ser definido como zero.

  3. O DupAckCount deverá ser incrementado se acKs duplicados adicionais forem recebidos.

Nesse caso, DupAckCount será 1 menor que o número de ACKs duplicadas. A pilha de host manipulará a contagem corretamente.

Tratamento de ACK duplicada ao rastrear um SCU que consiste em uma ACK cumulativa pura

Ao acompanhar um SCU que consiste em um único ACK cumulativo puro (as regras proíbem a união de vários ACKs puros), se um ACK duplicado chegar em seguida, o DupAckCount para o SCU de rastreamento deverá ser incrementado. Ele também deverá ser incrementado se acks duplicados adicionais forem recebidos. Nesse caso, DupAckCount será igual ao número de ACKs duplicadas que são agrupadas.

Quando o primeiro segmento recebido em um DPC é um ACK duplicado

Nesse caso, a NIC não pode determinar se o segmento recebido é uma ACK duplicada, pois não mantém nenhum estado. Portanto, o segmento deve ser tratado como uma ACK pura, da seguinte maneira:

  1. Um novo SCU deve ser rastreado, começando com esse segmento.

  2. O DupAckCount para o novo SCU deve ser definido como zero.

  3. O DupAckCount deve ser incrementado em 1 para cada ACK duplicado adicional recebido.

Nesse caso, DupAckCount será igual a 1 menor que o número real de ACKs duplicadas. A pilha de host manipulará a contagem corretamente.

Isenção de ACK duplicada

O driver de miniporte pode tratar um segmento ACK duplicado equivalente a um ACK puro e não uni-lo. Nesse caso, ele deve finalizar o SCU atual (se houver) para indicação e indicar o segmento ACK duplicado como um segmento individual. Como os clientes windows usam SACK por padrão, um segmento ACK duplicado provavelmente gerará uma exceção. Para obter um exemplo, consulte Exemplos de agrupamento de segmento de recebimento. Essa isenção não se aplica a segmentos de atualização de janela.

Agrupar segmentos com a opção carimbo de data/hora

A opção de carimbo de data/hora TCP é a única opção que pode ser legalmente agrupada. A união de segmentos com essa opção é deixada como uma decisão específica da implementação. Se o driver de miniporta unir segmentos com a opção de carimbo de data/hora, ele deverá seguir as regras descritas no fluxograma a seguir:

Fluxograma que descreve regras para agrupar segmentos com a opção de carimbo de data/hora TCP.

Observação

O MARCAR SEG. TSval>= H.TSval deve ser executado usando a aritmética modulo-232 semelhante à usada para números de sequência TCP. Consulte RFC 793, seção 3.3.

Ao indicar um segmento unido, as seguintes informações fora de banda devem ser indicadas da seguinte maneira definindo o membro NetBufferListInfo da estrutura NET_BUFFER_LIST que descreve o segmento unido:

  • O número de segmentos que foram unidos deve ser armazenado no NetBufferListInfo[TcpRecvSegCoalesceInfo]. Membro CoalescedSegCount . Esse número representa apenas segmentos de dados que foram unidos. A união de ACK pura é proibida e os segmentos de atualização de janela não devem ser contados como parte desse campo.

  • A contagem duplicada de ACK deve ser armazenada no NetBufferListInfo[TcpRecvSegCoalesceInfo]. Membro DupAckCount . O primeiro fluxograma acima explica como esse valor é calculado.

  • Quando segmentos com a opção de carimbo de data/hora TCP são unidos, NetBufferListInfo[RscTcpTimestampDelta] deve ser preenchido com o delta absoluto entre o valor de carimbo de data/hora TCP mais recente visto na sequência de segmentos unidos que compõem o SCU. O próprio SCU deve conter o valor de carimbo de data/hora TCP mais recente visto na sequência de segmentos unidos.

Os membros DupAckCount e RscTcpTimestampDelta serão interpretados se e somente se o membro CoalescedSegCount for maior que zero. Se CoalescedSegCount for zero, o segmento será tratado como um segmento não RSC não unido.

Para obter informações sobre o conteúdo do membro NetBufferListInfo , consulte NDIS_NET_BUFFER_LIST_INFO e NDIS_RSC_NBL_INFO.

O bit PSH deve ser ORed para todos os segmentos unidos. Em outras palavras, se o bit PSH tiver sido definido em qualquer um dos segmentos individuais, o driver de miniporto deverá definir o bit PSH no SCU.

A finalização de um SCU envolve:

  • Recompilando o TCP e, se aplicável, a soma de verificação IPv4.

  • Atualizando os cabeçalhos IP conforme descrito em Atualizando os cabeçalhos ip para segmentos unidos.

  • Definindo os bits ECN e os campos ECN nos cabeçalhos TCP e IP com os mesmos valores que foram definidos nos segmentos individuais.

Manipulando segmentos IPsec TCP/IP

Uma cartão de rede pode relatar recursos de descarregamento de tarefas RSC e IPsec. (Consulte Determinando as funcionalidades de RSC de um adaptador de rede.) No entanto, se ele der suporte ao descarregamento de tarefas IPsec, ele não deverá tentar unir segmentos protegidos pelo IPsec.