Введение в теорию сетевых колец
обзор NET_RING
NET_RING — это кольцевой буфер сетевых данных, который разделяется между NetAdapterCx и драйвером клиента. Каждая очередь пакетов в драйвере клиента имеет два кольца: кольцо пакетов для основных дескрипторов пакетов, а кольцо фрагмента для дескрипторов фрагментов каждого пакета.
Дополнительные сведения о дескрипторах пакетов и расширениях см. в разделе и.
Каждый основной дескриптор в кольце пакетов содержит индексы в кольце фрагментов для поиска дескрипторов фрагментов пакета. Другая структура данных, 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 автоматически обрабатывает оболочку значений индекса вокруг кольца, когда драйвер клиента вызывает соответствующий метод.
Дополнительную информацию об управлении элементами в сетевых кольцах см. в Управление элементами сетевых колец.
Отправка и получение сетевых данных с помощью сетевых кругов
Дополнительные сведения и примеры кода по отправке и получению сетевых данных в кругах сети см. в следующих разделах.