Поделиться через


Указание объединенных сегментов

Одна объединенная единица (SCU) — это последовательность сегментов TCP, объединенных в один сегмент TCP в соответствии с правилами, определенными в разделе Правила объединения сегментов TCP/IP. В этом разделе описывается, как указать итоговые объединенные сегменты.

SCU должен:

  • На это указывает вызов NdisMIndicateReceiveNetBufferLists.

  • Выглядеть как обычный сегмент TCP, который получается по проводу.

  • Значение не должно превышать максимальную длину допустимой ip-датаграммы, как определено в разделе 3.1 RFC 791.

    Примечание Так как сегменты с заголовками расширения IPv6 не могут быть объединены (см . раздел Условия исключения, которые завершают объединение), размер SCU для датаграмм IPv6 также ограничен максимальной законной длиной датаграмм.

Сетевой адаптер или драйвер мини-порта должен повторно вычислить контрольные суммы TCP и IPv4, если это применимо, прежде чем указывать объединенный сегмент. Если сетевой адаптер или драйвер мини-порта проверяет контрольные суммы TCP и IPv4, но не пересылает их для объединенного сегмента, он должен установить флаги TcpChecksumValueInvalid и IpChecksumValueInvalid в структуре NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO . Кроме того, в этом случае сетевой адаптер или драйвер мини-порта может при необходимости обнулять значения контрольной суммы заголовков TCP и IPv4 в сегменте.

Сетевой адаптер и драйвер мини-порта всегда должны устанавливать флаги IpChecksumSucceededed и TcpChecksumSucceededed в структуре NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO , прежде чем указывать объединенный сегмент.

Дополнительные сведения о правилах объединения см. в статье Правила объединения сегментов TCP/IP.

Дополнительные сведения об исключениях см. в разделе Условия исключений, которые завершают объединение.

Ожидается, что объединение будет выполняться на основе наилучших усилий. В некоторых случаях оборудование может быть не в состоянии выполнить объединение, например из-за нехватки ресурсов. Требования, изложенные здесь, прежде всего, указывают, когда не следует объединять и как это сделать.

На высоком уровне сетевой адаптер и драйвер мини-порта должны обрабатывать получение сегмента TCP по проводу следующим образом:

  • Проверьте входящий сегмент на наличие исключения следующим образом:

    1. Если исключение не было обнаружено, проверка, можно ли объединить сегмент с последним сегментом, полученным для того же TCP-подключения в зависимости от правил.

    2. Если сегмент вызвал исключение или его объединение с ранее полученным сегментом невозможно, укажите сегмент по отдельности.

  • Сетевой адаптер и драйвер мини-порта не должны указывать объединенные сегменты, пока драйвер протокола не включит RSC, как описано в разделе Запросы и изменение состояния RSC.

  • Для заданного TCP-подключения указание данных от адаптера мини-порта к стеку TCP/IP узла может состоять из одного или нескольких объединенных сегментов, разделенных одним или несколькими отдельными сегментами, которые не могут быть объединены.

  • Сетевой адаптер и драйвер мини-порта не должны задерживать указание сегментов TCP, независимо от того, слились они или нет. В частности, сетевой адаптер и драйвер мини-порта не должны откладывать указание сегментов от одного отложенного вызова процедуры (DPC) к следующему, чтобы попытаться сцепление сегментов.

  • Сетевой адаптер и драйвер мини-порта могут использовать таймеры для определения окончания объединения. Однако обработка рабочих нагрузок с учетом задержки должна быть столь же эффективной, как и требование границ DPC.