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


Введение в теорию сетевых колец

обзор NET_RING

NET_RING — это кольцевой буфер сетевых данных, который разделяется между NetAdapterCx и драйвером клиента. Каждая очередь пакетов в драйвере клиента имеет два кольца: кольцо пакетов для основных дескрипторов пакетов, а кольцо фрагмента для дескрипторов фрагментов каждого пакета.

Дополнительные сведения о дескрипторах пакетов и расширениях см. в разделе и.

Каждый основной дескриптор в кольце пакетов содержит индексы в кольце фрагментов для поиска дескрипторов фрагментов пакета. Другая структура данных, NET_RING_COLLECTION, объединяет кольцо пакетов и кольцо фрагментов для заданной очереди пакетов, как показано на следующей схеме.

схема, показывающая многокольцевую структуру NET_RING_COLLECTION, включая кольцо пакета и кольцо фрагмента.

Каждая очередь пакетов имеет собственную структуру NET_RING_COLLECTION, и, следовательно, собственное кольцо пакетов, кольцо фрагментов и дескрипторы в этих кольцах. Поэтому операция передачи сетевых данных каждой очереди пакетов является полностью независимой. Чтобы узнать больше о очередях пакетов, см. в разделе Очереди передачи и приема.

владение элементом NET_RING

Каждый элемент в NET_RING принадлежит драйверу клиента или NetAdapterCx. Владение контролируется тремя индексами, которые помечают разделы NET_RING. Эти индексы описаны в следующей таблице. Действие перемещения этих индексов описывается статьей и семантикой.

NET_RING имя индекса Описание Требуется для передачи сетевых данных Изменено пользователем
BeginIndex Начало диапазона элементов в NET_RING, которым владеет драйвер клиента NIC. BeginIndex также является началом подраздела drain в NET_RING. Когда BeginIndex увеличивается, драйвер извлекает элементы из кольца и передает управление ими ОС. Да Драйвер клиента сетевого адаптера
NextIndex Начало публикации подраздела NET_RING. NextIndex делит раздел кольца, принадлежащий драйверу клиента, в подразделы post и очистки. При добавочном NextIndex драйвер буферов в оборудование и передает буферы в раздел стека кольца. Нет Драйвер клиента сетевого интерфейса
КонечныйИндекс Конец диапазона элементов в NET_RING, принадлежащих драйверу клиента сетевого адаптера. Клиентские драйверы владеют элементами до EndIndex - 1 включительно. Да NetAdapterCx

Управление этими индексами во время обратного вызова EvtPacketQueueAdvance для очереди пакетов — это способ, которым клиентские драйверы передают сетевые данные между системой и аппаратным обеспечением сетевого адаптера (NIC).

Клиентские драйверы управляют каждым элементом от BeginIndex до EndIndex - 1 включительно. Например, если BeginIndex равно 2, а EndIndex равно 5, драйвер клиента владеет тремя элементами: элементами с значениями индекса 2, 3 и 4.

Если BeginIndex равно EndIndex, драйвер клиента не владеет элементами.

NetAdapterCx публикует элементы в кольцевой буфер, увеличивая EndIndex. Драйвер клиента очищает буферы и возвращает владение элементами путем продвижения BeginIndex.

NextIndex является необязательным для использования драйверами клиентов и предоставляется для удобства при разделении подразделов публикации и опустошения раздела кольца драйвера клиента.

Элементы с значениями индекса между NextIndex и EndIndex - 1 включительно принадлежат клиенту, но еще не были размещены на оборудовании. Если NextIndex равно BeginIndex, драйвер клиента не имеет завершенных буферов для передачи в ОС. Если NextIndex равно EndIndex, драйвер клиента не имеет буферов для отправки на оборудование.

Так как сетевое кольцо циклическое, в конечном итоге значения индекса обтекаются вокруг конца буфера и возвращаются к началу. NetAdapterCx автоматически обрабатывает оболочку значений индекса вокруг кольца, когда драйвер клиента вызывает соответствующий метод.

Дополнительную информацию об управлении элементами в сетевых кольцах см. в Управление элементами сетевых колец.

Отправка и получение сетевых данных с помощью сетевых кругов

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

Отправка сетевых данных с сетевыми кольцами

получение сетевых данных с сетевыми кольцами