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

Единая объединяемая единица (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 в сегменте.

Драйвер сетевого адаптера и минипорта всегда должен устанавливать флаги IpChecksumSucceeded и TcpChecksumSucceeded в структуре NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO перед индикацией объединённого сегмента.

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

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

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

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

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

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

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

  • Драйвер сетевого адаптера и минипорта не должен сигнализировать о свёрнутых сегментах до тех пор, пока драйвер протокола не активирует RSC, как описано в разделе Запрос состояния и изменение состояния RSC.

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

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

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