Net 通道簡介
NET_RING概觀
NET_RING是 NetAdapterCx 與用戶端驅動程式之間共用之網路數據的循環緩衝區。 客戶端驅動程式中的每個封包佇列都有兩個 通道:核心封包描述元的封包 通道,以及 每個封包片段描述元的片段通道 。
如需封包描述元的詳細資訊,請參閱 封包描述元和延伸模組。
封包通道中的每個核心描述項都有索引到片段通道,以尋找該封包的片段描述元。 另一個數據結構 ,NET_RING_COLLECTION,將封包通道和片段通道分組在一起,供指定的封包佇列使用,如下圖所示。
每個封包佇列都有自己的 NET_RING_COLLECTION 結構,因此,每個封包佇列都會在這些通道中有自己的封包通道、片段通道和描述項。 因此,每個封包佇列的網路數據傳輸作業完全獨立。 若要深入瞭解封包佇列,請參閱 傳輸和接收佇列。
NET_RING項目擁有權
NET_RING中的每個元素都是由用戶端驅動程式或 NetAdapterCx 所擁有。 擁有權是由三個索引所控制,這些索引會標示NET_RING的區段。 下表說明這些索引。 移動這些索引的動作是由 後置 和 清空 語意所描述。
NET_RING索引名稱 | 描述 | 傳輸網路數據的必要專案 | 修改者 |
---|---|---|---|
BeginIndex | NIC 用戶端驅動程式擁有之NET_RING元素範圍的開頭。 BeginIndex 也是NET_RING的清空子區段的開頭。 當 BeginIndex 遞增時,驅動程式會從通道清空元素,並將專案的擁有權轉移至 OS。 | Yes | NIC 用戶端驅動程式 |
NextIndex | NET_RING之 post 子區段的開頭。 NextIndex 會將用戶端驅動程式擁有的通道區段分割成 post 和 drain 子區段。 當 NextIndex 遞增時,驅動程式會將緩衝區張貼至硬體,並將緩衝區傳輸至環形的清空區段。 | No | NIC 用戶端驅動程式 |
EndIndex | NIC 用戶端驅動程式擁有之NET_RING元素範圍的結尾。 用戶端驅動程式最多擁有 EndIndex - 1 個包含的專案。 | Yes | NetAdapterCx |
在封包佇列的 EvtPacketQueueAdvance 回呼期間操作這些索引,就是用戶端驅動程式如何在系統與網路適配器 (NIC) 硬體之間傳輸網路數據。
用戶端驅動程式擁有 BeginIndex 到 EndIndex - 1 的每個元素。 例如,如果 BeginIndex 為 2 且 EndIndex 為 5,則用戶端驅動程式會擁有三個元素:索引值為 2、3 和 4 的元素。
如果 BeginIndex 等於 EndIndex,則客戶端驅動程式不會擁有任何元素。
NetAdapterCx 會藉由遞 增 EndIndex 將元素張貼至環形緩衝區。 用戶端驅動程式會藉由推進 BeginIndex 來清空緩衝區並傳回元素的擁有權。
NextIndex 是可供用戶端驅動程式使用的選用專案,而且為了方便分隔通道中客戶端驅動程式區段的 post 和 drain 子區段。
在 NextIndex 和 EndIndex 之間具有索引值的元素 - 1 包含的專案是由客戶端擁有,但尚未張貼到硬體。 如果 NextIndex 等於 BeginIndex,則用戶端驅動程式沒有任何已完成的緩衝區要傳送至 OS。 如果 NextIndex 等於 EndIndex,則客戶端驅動程式沒有任何要張貼至硬體的緩衝區。
因為 net ring 是迴圈的,因此索引值最終會繞在緩衝區結尾,然後回到開頭。 當客戶端驅動程式呼叫適當的方法時,NetAdapterCx 會自動處理圍繞環形的索引值。
如需在 net ring 中管理元素的特定資訊,請參閱 Net ring 元素管理。
使用網路通道傳送和接收網路數據
如需在 net 通道中傳送和接收網路數據的詳細資訊和程式代碼範例,請參閱下列主題。