Общие сведения о чистых кольцах
обзор NET_RING
NET_RING — это циклический буфер сетевых данных, общий доступ между NetAdapterCx и драйвером клиента. Каждая очередь пакетов в драйвере клиента имеет два кольца: кольцо пакетов для дескрипторов основных пакетов и кольцо фрагмента для дескрипторов фрагментов каждого пакета.
Дополнительные сведения о дескрипторах пакетов см. в разделе "Дескрипторы пакетов" и расширения.
Каждый дескриптор ядра в круге пакетов содержит индексы в кольцо фрагмента для определения дескрипторов фрагмента пакета. Другая структура данных, NET_RING_COLLECTION, группируйте кольцо пакетов и кольцо фрагментов для заданной очереди пакетов, как показано на следующей схеме.
Каждая очередь пакетов имеет собственную структуру NET_RING_COLLECTION , а следовательно, собственный круг пакетов, кольцо фрагмента и дескрипторы в этих кольцах. Поэтому операция передачи сетевых данных каждой очереди пакетов полностью не зависит. Дополнительные сведения о очередях пакетов см. в статье "Передача и получение очередей".
владение элементом NET_RING
Каждый элемент в NET_RING принадлежит драйверу клиента или NetAdapterCx. Владение контролируется тремя индексами, которые помечают разделы NET_RING. Эти индексы описаны в следующей таблице. Действие перемещения этих индексов описывается семантикой записи и очистки .
имя индекса NET_RING | Description | Требуется для передачи сетевых данных | Кто изменил |
---|---|---|---|
Beginindex | Начало диапазона элементов в NET_RING , принадлежащих драйверу клиента сетевого адаптера. BeginIndex также является началом подраздела сливаNET_RING. Когда BeginIndex увеличивается, драйвер очищает элементы из кольца и передает их в ОС. | Да | Драйвер клиента сетевого адаптера |
NextIndex | Начало подраздела должностиNET_RING. NextIndex делит раздел кольца, принадлежащий драйверу клиента, в подразделы post и drain. При добавочном добавлении NextIndex драйвер помещает буферы в оборудование и передает буферы в раздел очистки кольца. | No | Драйвер клиента сетевого адаптера |
Endindex | Конец диапазона элементов в NET_RING , принадлежащих драйверу клиента сетевого адаптера. Клиентские драйверы имеют собственные элементы до EndIndex — 1 включительно. | Да | NetAdapterCx |
Управление этими индексами во время обратного вызова очереди пакетов EvtPacketQueueAdvance заключается в том, как драйверы клиента передают сетевые данные между системой и оборудованием сетевого интерфейса карта (сетевой адаптер).
Клиентские драйверы принадлежат каждому элементу из BeginIndex в EndIndex — 1 включительно. Например, если BeginIndex имеет значение 2 и EndIndex равно 5, драйвер клиента владеет тремя элементами: элементами с значениями индекса 2, 3 и 4.
Если BeginIndex равно EndIndex, драйвер клиента не владеет элементами.
NetAdapterCx публикует элементы в кольцевой буфер, добавив EndIndex. Драйвер клиента очищает буферы и возвращает владение элементами путем продвижения BeginIndex.
NextIndex является необязательным для использования драйверов клиентов и предоставляется для удобства разделения подразделов пост и очистки раздела драйвера клиента кольца.
Элементы со значениями индекса между NextIndex и EndIndex — 1 включительно принадлежат клиенту, но еще не были размещены на оборудовании. Если NextIndex равно BeginIndex, драйвер клиента не имеет завершенных буферов для передачи в ОС. Если NextIndex равен EndIndex, драйвер клиента не имеет буферов для отправки в оборудование.
Так как сетевое кольцо циклическое, в конечном итоге значения индекса обтекаются вокруг конца буфера и возвращаются к началу. NetAdapterCx автоматически обрабатывает оболочку значений индекса вокруг кольца, когда драйвер клиента вызывает соответствующий метод.
Дополнительные сведения об управлении элементами в чистых кольцах см. в разделе Net Ring Management.
Отправка и получение сетевых данных с помощью сетевых кругов
Дополнительные сведения и примеры кода по отправке и получению сетевых данных в кругах сети см. в следующих разделах.