2016年7月10日 星期日

Winsock Kernel - II

Winsock Kernel Overview


本章節提供Winsock Kernel(WSK)的概觀以及下列的主題:

Winsock Kernel Architecture


下圖展示了Winsock Kernel(WSK)的架構。

WSK架構中的核心為WSK子系統。WSK 子系統為一個網路模組(network module),作為實作提供方的WSK Network Programming Interface (NPI)WSK子系統在他的下緣邊界提供各種的傳輸協議(transport protocols)


附加在WSK子系統的是WSK應用程式。WSK應用程式為核心模式的軟體模組,為了執行網路IO操作而實作客戶端的WSK NPI(這裡的”client”不應該與client-server系統中的名詞混淆)WSK子系統可以調用WSK客戶NPI來通知WSK應用程式一個異步事件發生。

WSK應用程式可以透過一組 WSK registration functions 來發現並且連接上WSK子系統。當WSK子系統為可用以及交換調度表(構成了WSK NPI的提供者和客戶端的實現)時,應用程式可以使用這些函式來動態的檢測。

WSK應用程式間可以輪流的使用 Network Module Registrar (NMR)來連接WSK子系統。更多資訊參考 Using NMR for WSK Registration and Unregistration

Winsock Kernel Objects

Winsock Kernel(WSK) Network Programming Interface (NPI)的設計是圍繞在兩個主要的對象類型: Client 以及 Socket

Client Object
客戶對象表示介於WSK應用程式與WSK子系統之間的附件(attachment)或是綁定(binding)。客戶對象透過結構 WSK_CLIENT表示。客戶對象的指標在WSK應用程式連接上WSK子系統的期間回傳。在客戶對象層級,WSK應用程式通過這個指標來操作所有的WSK函式。

Socket Object
Socket對象表示一個網路socket,可以用來使用網路I/Osocket對象透過結構WSK_SOCKET表示。當應用程式建立一個新的socket或是當應用程式接收一個連線請求時,WSK應用程式會得到一個socket對象的指標。WSK應用程式通過這個特定的指標處理所有WSK函式。


Winsock Kernel Socket Categories

Winsock Kernel(WSK) Network Programming Interface (NPI) 裡定義了四種不同的socket類型: basic sockets, listening sockets, datagram sockets以及connection-oriented sockets。每一個 WSK socket 類型擁有獨特的功能以及支援不同的 socket 功能集合。WSK 應用程式必須在它建立一個新的socket的時候指定它所屬的socket類型。每一種 WSK socket 的目的如下:

Basic Sockets
Basic sockets僅用於取得以及設定傳輸層堆疊 socket 選項或是操作socket I/O控制。Basic socket 不能綁定本地端的傳輸層位址以及不支援收發網路數據。

Listening Sockets
Listening socket用於監聽來自於遠端傳輸層位址的連線請求。Listening socket 的功能包含了 basic socket 所有的功能。

Datagram Sockets
Datagram socket用於收發數據。datagram socket 包含了 basic socket所有的功能。

Connection-Oriented Sockets
Connection-oriented socket用於在已建立的連線上收發網路數據。Connection-oriented socket包含了 basic socket 所有的功能。

Winsock Kernel Events

當某些 socket 事件發生,例如一個socket接收到新的數據或是當一個socket已經斷線時,Winsock Kernel (WSK)子系統可以異步通知 WSK 應用程式有事件發生。為了讓 socket 能夠異步的接收通知事件, WSK 應用程式必須實作對應的事件回呼函式並且激活這些事件回呼函式。

Note 對於WSK應用程式來說,實作或是使用事件回呼函式不是必需的。WSK應用程式可以透過調用合適的WSK socket函式來執行大部分的WSK socket操作。唯一有需要使用到事件回呼函式則是listening socket中的接收(conditional-accept)模式。更多有關使用WSK函式與使用事件回呼函式的優缺點參閱Using Winsock Kernel Functions vs. Event Callback Functions


Winsock Kernel Events

每一個 WSK socket category 支援不同的 socket 事件集合。

Basic sockets
Basic sockets 不支援任何的 socket 事件。

Listening sockets










* 僅適用在激活接收(conditional-accept)模式的listening socket更多有關條件接收模式的訊息參考 Listening for and Accepting Incoming Connections

Datagram sockets






Connection-oriented sockets

WSK應用程式建立一個 socket,此時 socket 的事件回呼函式預設為關閉。為了 WSK 子系統可以在事件發生的時候調用 socket 的事件回呼函式,WSK 應用程式必須致能 socket 事件回呼函式。更多有關致能與關閉事件回呼函式, Enabling and Disabling Event Callback Functions

如果 WSK 應用程式對一個 socket 註冊一個 extension interface,則擴展接口可能支援附加的事件。更多有關註冊一個擴展接口參閱 Registering an Extension Interface

WSK 子系統也可以通知 WSK 應用程式一個並沒有指定給特定socket的事件。為了讓 WSK 應用程式可以被接收這些事件,則 WSK 應用程式必須實作一個 WskClientEvent  事件回呼函式。WskClientEvent  總是致能並且不能被關閉。

WSK 應用程式的事件回呼函式不必等待其他 WSK 請求的完成或是其他WSK 事件的回呼函式。這個回呼函式可以動其他的 WSK 請求(假設它不需要花費太多時間在DISPATCH_LEVEL),但當回呼函式調用在 IRQL = PASSIVE_LEVEL 時,它絕不會等待請求事件完成。

沒有留言:

張貼留言