Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os drivers de miniporta NDIS (Network Driver Interface Specification) podem descarregar a segmentação de pacotes TCP grandes que são maiores do que a unidade de transmissão máxima (MTU) do meio de rede. Uma NIC que suporte a segmentação de pacotes TCP grandes também deve ser capaz de:
Calcule somas de verificação IP para enviar pacotes que contenham opções de IP.
Calcule somas de verificação TCP ao enviar pacotes que contenham opções TCP.
As versões 6.0 e posteriores do NDIS suportam o alívio de envio de grande volume versão 1 (LSOv1), que é similar ao alívio de envio de grande volume (LSO) no NDIS 5.x. As versões 6.0 e posteriores do NDIS também suportam LSOv2 (large send offload) versão 2, que fornece serviços aprimorados de segmentação de pacotes grandes, incluindo suporte para IPv6.
Um driver de miniporta que suporta LSOv2 e LSOv1 deve determinar o tipo de descarregamento a partir das informações fora de banda (OOB) da estrutura de NET_BUFFER_LIST. O driver pode usar o Tipo membro da estrutura de NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO para determinar se a pilha de drivers está usando LSOv2 ou LSOv1 e executar os serviços de descarga apropriados. Qualquer estrutura NET_BUFFER_LIST que contenha os dados OOB LSOv1 ou LSOv2 também contém uma única estrutura NET_BUFFER. Para obter mais informações sobre NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO, consulte Aceder às informações sobre o Offload de TCP/IP NET_BUFFER_LIST.
No entanto, no caso em que a miniporta tenha recebido OID_TCP_OFFLOAD_PARAMETERS para desativar o recurso LSO na miniporta e depois que a miniporta tiver concluído o OID com êxito, a miniporta deve descartar todas as NET_BUFFER_LIST que contenham quaisquer dados OOB LSOv1 ou LSOv2 diferentes de zero (NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO).
O transporte TCP/IP descarrega apenas os pacotes TCP grandes que atendem aos seguintes critérios:
O pacote é um pacote TCP. O transporte TCP/IP não descarrega pacotes UDP grandes para segmentação.
O pacote deve ser divisível pelo menos pelo número mínimo de segmentos especificado pelo driver de miniporta. Para obter mais informações, consulte Relatório das capacidades TCP-LSOv1 de uma NICPacket-Segmentation e Relatório das capacidades TCP-LSOv2 de uma NICPacket-Segmentation.
O pacote não é um pacote de loopback.
O pacote não será enviado através de um túnel.
Antes de descarregar um pacote TCP grande para segmentação, o transporte TCP/IP:
- Atualiza as informações de segmentação de pacotes grandes associadas à estrutura NET_BUFFER_LIST. Esta informação é uma estrutura NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO que faz parte das informações NET_BUFFER_LIST associadas à estrutura NET_BUFFER_LIST. Para obter mais informações sobre informações da NET_BUFFER_LIST, consulte Aceder às Informações de Descarregamento de TCP/IP da NET_BUFFER_LIST. O transporte TCP/IP define o valor MSS para o tamanho máximo do segmento.
Para LSOv1, regista o comprimento total do grande pacote TCP no campo
Total Lengthdo cabeçalho IP do pacote. O comprimento total inclui o comprimento do cabeçalho IP, o comprimento das opções IP, se estiverem presentes, o comprimento do cabeçalho TCP, o comprimento das opções TCP, se estiverem presentes, e o comprimento da carga útil TCP. Para LSOv2, define o campoTotal Lengthdo cabeçalho IP do pacote como 0. Os drivers de miniporta devem determinar o comprimento do pacote a partir do comprimento da estrutura do primeiro NET_BUFFER na estrutura NET_BUFFER_LIST.Calcula soma do complemento para o pseudocabeçalho TCP e grava essa soma no campo
Checksumdo cabeçalho TCP. O transporte TCP/IP calcula a soma de complemento de um sobre os seguintes campos no pseudocabeçalho:Source IP Address,Destination IP AddresseProtocol. A soma de complemento de um para o pseudocabeçalho fornecido pelo transporte TCP/IP permite à NIC começar mais cedo no cálculo da soma de verificação TCP real para cada pacote que a NIC deriva do pacote TCP grande, sem ter que examinar o cabeçalho IP. Observe que a RFC 793 estipula que a soma de verificação do pseudocabeçalho é calculada sobre osSource IP Address,Destination IP Address,ProtocoleTCP Length. (O comprimento TCP é o comprimento do cabeçalho TCP mais o comprimento da carga útil TCP. O comprimento TCP não inclui o comprimento do pseudo-cabeçalho.) No entanto, como o driver de miniporta subjacente e a NIC geram segmentos TCP a partir do pacote grande que é transmitido pelo transporte TCP/IP, o transporte não sabe o tamanho da carga TCP para cada segmento TCP e, portanto, não pode incluir o comprimento TCP no pseudocabeçalho. Em vez disso, conforme descrito abaixo, a NIC estende o checksum do pseudocabeçalho fornecido pelo transporte TCP/IP para abranger o comprimento TCP de cada segmento TCP gerado.Grava o número de sequência correto no campo
Sequence Numberdo cabeçalho TCP. O número de sequência identifica o primeiro byte da carga TCP.
Depois que o driver de miniporta obtém a estrutura de NET_BUFFER_LIST em sua função MiniportSendNetBufferLists ou MiniportCoSendNetBufferLists, ele pode chamar a macro NET_BUFFER_LIST_INFO com um _Id de TcpLargeSendNetBufferListInfo para obter o valor MSS gravado pelo transporte TCP/IP.
O driver de miniporta obtém o comprimento total do pacote grande do cabeçalho IP do pacote e usa o valor MSS para dividir o pacote TCP grande em pacotes menores. Cada um dos pacotes menores contém MSS ou menos bytes de dados do usuário. Somente o último pacote que foi criado a partir do pacote grande segmentado deve conter menos de bytes de dados do usuário MSS. Todos os outros pacotes que foram criados a partir do pacote segmentado devem conter bytes de dados do usuário MSS. Se você não seguir essa regra, a criação e a transmissão de pacotes extras desnecessários podem prejudicar o desempenho.
O driver de miniporta afixa cabeçalhos MAC, IP e TCP para cada segmento derivado do pacote grande. O driver de miniporta deve calcular as somas de verificação IP e TCP para esses pacotes derivados. Para calcular a soma de verificação TCP para cada pacote derivado do pacote TCP grande, a NIC calcula a parte variável da soma de verificação TCP (para o cabeçalho TCP e a carga útil TCP), adiciona essa soma de verificação à soma do complemento de um para o pseudocabeçalho calculado pelo transporte TCP/IP e, em seguida, calcula o complemento de um de 16 bits da soma de verificação. Para obter mais informações sobre como calcular essas somas de verificação, consulte RFC 793 e RFC 1122.
A figura a seguir mostra a segmentação de um pacote grande.
O comprimento dos dados do usuário TCP no pacote TCP grande deve ser igual ou menor do que o valor que o driver de miniporta atribui ao valor MaxOffLoadSize. Para obter mais informações sobre o valor MaxOffLoadSize, consulte Relatório das Capacidades LSOv1 TCP-Packet-Segmentation e Relatório das Capacidades LSOv2 TCP-Packet-Segmentation de uma NIC.
Após um driver emitir uma indicação de status para indicar uma alteração no valor MaxOffLoadSize, o driver não deve entrar em falha se receber uma solicitação de envio LSO que utilize o valor anterior MaxOffLoadSize. Em vez disso, o driver pode não efetuar a solicitação de envio.
Um driver intermediário que emite independentemente indicações de status que relatam uma alteração no valor MaxOffLoadSize deve garantir que o adaptador de miniporta subjacente que não emitiu uma indicação de status não obtenha nenhum pacote maior em tamanho do que o valor de MaxOffLoadSize relatado pelo adaptador de miniporta.
Um driver intermediário de miniporta que responde a OID_TCP_OFFLOAD_PARAMETERS para desativar os serviços LSO deve estar preparado para um breve período de tempo em que as solicitações de envio de LSO ainda podem chegar ao driver de miniporta.
O comprimento dos dados do usuário TCP em um pacote de segmento deve ser menor ou igual ao MSS. MSS é o valor ULONG que o transporte TCP transmite utilizando as informações de LSO NET_BUFFER_LIST associadas à estrutura NET_BUFFER_LIST. Somente o último pacote que foi criado a partir do pacote grande segmentado deve conter menos de bytes de dados do usuário MSS. Todos os outros pacotes que foram criados a partir do pacote segmentado devem conter bytes de dados do usuário MSS. Se você não seguir essa regra, a criação e a transmissão de pacotes extras desnecessários podem prejudicar o desempenho.
O número de pacotes de segmento que foram derivados do pacote TCP grande deve ser igual ou superior ao valor MinSegmentCount especificado pelo driver de miniport. Para obter mais informações sobre o valor MinSegmentCount, consulte Relatório das Capacidades LSOv1 TCP-Packet-Segmentation e Relatório das Capacidades LSOv2 TCP-Packet-Segmentation de uma NIC.
As seguintes suposições e restrições se aplicam ao processamento de cabeçalhos IP e TCP para qualquer driver de miniporta compatível com LSO, independentemente da versão:
O bit MF no cabeçalho IP do grande pacote TCP que foi descarregado pelo transporte TCP/IP não será ativado, e o deslocamento do fragmento no cabeçalho IP será zero.
Os flags URG, RSTe SYN no cabeçalho TCP do grande pacote TCP não serão definidos e o deslocamento urgente (ponteiro) no cabeçalho TCP será zero.
Se o FIN bit no cabeçalho TCP do pacote grande estiver definido, o driver de miniporta deverá definir esse bit no cabeçalho TCP do último pacote que ele cria a partir do pacote TCP grande.
Se o PSH bit no cabeçalho TCP do pacote TCP grande estiver definido, o driver de miniporta deverá definir esse bit no cabeçalho TCP do último pacote que ele cria a partir do pacote TCP grande.
Se o CWR bit no cabeçalho TCP do pacote TCP grande estiver definido, o driver de miniporta deverá definir esse bit no cabeçalho TCP do primeiro pacote que ele cria a partir do pacote TCP grande. O driver de miniporta pode optar por definir esse bit no cabeçalho TCP do último pacote que ele cria a partir do pacote TCP grande, embora isso seja menos desejável.
Se o pacote TCP grande contiver opções IP ou opções TCP (ou ambas), o driver de miniporta copiará essas opções, inalteradas, para cada pacote derivado do pacote TCP grande. Especificamente, a NIC não incrementará a opção de marca temporal .
Todos os cabeçalhos de pacote (ethernet, IP, TCP) estarão no primeiro MDL do pacote. Os cabeçalhos não serão divididos em várias MDLs.
Dica
Esta suposição é válida quando o LSO está habilitado. Caso contrário, quando o LSO não está habilitado, os drivers de miniporta não podem assumir que os cabeçalhos IP estão no mesmo MDL que os cabeçalhos ethernet.
O driver de miniporta deve enviar os pacotes em estruturas NET_BUFFER_LIST na ordem em que recebe as estruturas NET_BUFFER_LIST do transporte TCP/IP.
Ao processar um pacote TCP grande, o adaptador de miniporta é responsável apenas por segmentar o pacote e afixar cabeçalhos MAC, IP e TCP nos pacotes derivados do pacote TCP grande. O transporte TCP/IP executa todas as outras tarefas (como ajustar o tamanho da janela de envio com base no tamanho da janela de recebimento do host remoto).
Antes de concluir a operação de envio para o pacote grande (como com NdisMSendNetBufferListsComplete ou NdisMCoSendNetBufferListsComplete), o driver de miniporta grava o valor NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO (informações deNET_BUFFER_LIST para descarregamentos de envio grande) com o número total de bytes de dados do usuário TCP enviados com êxito em todos os pacotes criados a partir do pacote TCP grande.
Além dos requisitos LSO anteriores, os drivers de miniporta compatíveis com LSOv2 também devem:
Suporta IPv4 ou IPv6, ou ambos IPv4 e IPv6.
Suporte à replicação das opções IPv4, a partir do pacote grande, em cada pacote de segmento gerado pela placa de interface de rede (NIC).
Suporte à replicação do cabeçalho de extensão IPv6, do pacote TCP de grande dimensão, em cada pacote de segmento TCP.
Ofereça suporte à replicação de opções TCP em cada pacote de segmento TCP gerado pelo driver de miniporta.
Use o cabeçalho IP e TCP na estrutura NET_BUFFER_LIST como um modelo para gerar cabeçalhos TCP/IP para cada pacote de segmento.
Use valores de identificação IP (ID IP) no intervalo de 0x0000 a 0x7FFF. (O intervalo de 0x8000 a 0xFFFF está reservado para dispositivos com capacidade de descarga de chaminé TCP.) Por exemplo, se o cabeçalho IP do modelo começar com um valor de campo Identificação de 0x7FFE, o primeiro pacote de segmento TCP deverá ter um valor de ID IP de 0x7FFE, seguido por 0x7FFF, 0x0000, 0x0001 e assim por diante.
Utilize o deslocamento de bytes no TcpHeaderOffset membro do NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO para identificar a localização do cabeçalho TCP, a partir do primeiro byte do pacote.
Limite o número de estruturas de NET_BUFFER associadas a cada estrutura de NET_BUFFER_LIST LSOv2 a uma.
Observação
Este é um novo requisito para drivers de miniporta compatíveis com LSOv2. Esta regra não é aplicada aos drivers de miniporta LSOv1 de forma explícita, embora seja recomendada.
Determine o comprimento total do pacote a partir do comprimento da primeira estrutura
NET_BUFFERna estruturaNET_BUFFER_LIST. Isso é diferente dos drivers do método para LSOv1.Suporta opções TCP, opções IP e cabeçalhos de extensão IP.
Quando uma operação de envio é concluída, o driver de miniporta deve definir o membro
LsoV2TransmitComplete.Reservedda estrutura NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO como zero e o membroLsoV2TransmitComplete.TypecomoNDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE.