TCP/IP 原始通訊端
原始通訊端是允許存取基礎傳輸提供者的通訊端類型。 本主題僅著重于原始通訊端和 IPv4 和 IPv6 通訊協定。 這是因為除了 ATM 以外,大部分的其他通訊協定都不支援原始通訊端。 若要使用原始通訊端,應用程式必須有所使用基礎通訊協定的詳細資訊。
IP 通訊協定的 Winsock 服務提供者可能支援SOCK_RAW的通訊端類型。 Windows 上所含 TCP/IP 的 Windows Sockets 2 提供者支援此 SOCK_RAW 通訊端類型。
這類原始通訊端有兩種基本類型:
- 第一個類型會使用由 Winsock 服務提供者辨識的 IP 標頭中寫入的已知通訊協定類型。 第一種通訊端類型的範例是 ICMP 通訊協定的通訊端 (IP 通訊協定類型 = 1) 或 ICMPv6 通訊協定 (IP procotol 類型 = 58) 。
- 第二個類型允許指定任何通訊協定類型。 第二種類型的範例是 Winsock 服務提供者不支援的實驗性通訊協定,例如串流控制傳輸通訊協定 (SCTP) 。
判斷是否支援原始通訊端
如果 Winsock 服務提供者支援AF_INET或AF_INET6位址系列的SOCK_RAW通訊端,SOCK_RAW的通訊端類型應該包含在WSAEnumProtocols函式針對一或多個可用的傳輸提供者所傳回的WSAPROTOCOL_INFO結構中。
WSAPROTOCOL_INFO結構中的iAddressFamily成員應該指定AF_INET或AF_INET6,而WSAPROTOCOL_INFO結構的iSocketType成員應該為其中一個傳輸提供者指定SOCK_RAW。
WSAPROTOCOL_INFO結構的iProtocol成員可能會設定為IPROTO_IP。 如果服務提供者允許應用程式針對位址系列之網際網路通訊協定以外的其他網路通訊協定使用SOCK_RAW通訊端類型,則WSAPROTOCOL_INFO結構的iProtocol成員也可能設定為零。
WSAPROTOCOL_INFO結構中的其他成員表示SOCK_RAW通訊協定支援的其他屬性,並指出應如何處理SOCK_RAW通訊端。 SOCK_RAW的這些WSAPROTOCOL_INFO其他成員通常會指定通訊協定為無連線、訊息導向、支援廣播/多播 (XP1_CONNECTIONLESS、XP1_MESSAGE_ORIENTED、XP1_SUPPORT_BROADCAST和XP1_SUPPORT_MULTIPOINT位在 dwServiceFlags1 成員) 中,而且可以有 65,467 個位元組的最大訊息大小。
在 Windows XP 和更新版本上, 可以使用NetSh.exe 命令來判斷是否支援原始通訊端。 從 CMD 視窗執行的下列命令會顯示主控台上 Winsock 目錄的資料:
netsh winsock show catalog
輸出會包含一份清單,其中包含本機電腦上所支援 WSAPROTOCOL_INFO 結構中的一些資料。 在 [描述] 欄位中搜尋 RAW/IP 或 RAW/IPv6 一詞,以尋找支援原始通訊端的通訊協定。
建立原始通訊端
若要建立類型為 SOCK_RAW的通訊端,請使用af參數 (位址系列呼叫socket或WSASocket函式,) 設定為 AF_INET 或 AF_INET6、類型參數設定為SOCK_RAW,並將通訊協定參數設定為所需的通訊協定號碼。 通訊 協定 參數會變成 IP 標頭中的通訊協定值, (SCTP 為 132,例如) 。
原始通訊端提供操作基礎傳輸的功能,因此可用於造成安全性威脅的惡意用途。 因此,只有 Administrators 群組的成員可以在 Windows 2000 和更新版本上建立類型為 SOCK_RAW 的通訊端。
傳送和接收作業
一旦應用程式建立 類型為 SOCK_RAW的通訊端,這個通訊端就可以用來傳送和接收資料。 在 類型為 SOCK_RAW 的通訊端上傳送或接收的所有封包都會被視為未連線通訊端上的資料包。
下列規則適用于透過 SOCK_RAW 通訊端的作業:
sendto或WSASendTo函式通常用來在類型為 SOCK_RAW的通訊端上傳送資料。 目的地位址可以是通訊端位址系列中的任何有效位址,包括廣播或多播位址。 若要傳送至廣播位址,應用程式必須使用 setockopt 並啟用SO_BROADCAST。 否則, sendto 或 WSASendTo 將會失敗,並出現錯誤碼 WSAEACCES。 針對 IP,應用程式可以傳送至任何多播位址 (,而不需要成為群組成員) 。
傳送 IPv4 資料時,應用程式可以選擇是否要在封包的傳出資料包前面指定 IPv4 標頭。 如果 IPv4 通訊端 (位址系列AF_INET) 的 IP_HDRINCL 通訊端選項設為 true,則應用程式必須在傳出資料中提供 IPv4 標頭以進行傳送作業。 如果此通訊端選項為 false (預設設定) ,則 IPv4 標頭不應包含在傳送作業的傳出資料中。
傳送 IPv6 資料時,應用程式可以選擇是否要在封包的傳出資料包前面指定 IPv6 標頭。 如果 IPv6 通訊端 ( 位址系列AF_INET6) 的 IPV6_HDRINCL 通訊端選項設為 true,則應用程式必須在傳出資料中提供 IPv6 標頭以進行傳送作業。 此選項的預設設定為 false。 如果此通訊端選項為 false (預設設定) ,則傳送作業的傳出資料中不應包含 IPv6 標頭。 針對 IPv6,不需要包含 IPv6 標頭。 如果使用通訊端函式取得資訊,則不應該包含 IPv6 標頭,以避免未來發生相容性問題。 這些問題會在 IETF 發佈的 RFC 3542 中討論。 不建議使用 IPV6_HDRINCL 通訊端選項,而且未來可能已被取代。
recvfrom或WSARecvFrom函式通常用來接收類型為 SOCK_RAW的通訊端上的資料。 這兩個函式都有一個選項可傳回封包從中傳送的來源 IP 位址。 接收的資料是來自未連接通訊端的資料包。
對於AF_INET) 的 IPv4 (位址系列,應用程式會在每個接收的資料包前面接收 IP 標頭,而不論 IP_HDRINCL 通訊端選項為何。
對於AF_INET6) 的 IPv6 (位址系列,應用程式會在每個接收的資料包的最後一個 IPv6 標頭之後接收所有專案,而不論 IPV6_HDRINCL 通訊端選項為何。 應用程式不會使用原始通訊端接收任何 IPv6 標頭。
接收的資料包會複製到符合下列條件的所有 SOCK_RAW 通訊端:
- 建立通訊端時, 通訊協定 參數中指定的通訊協定號碼應該符合所接收資料包之 IP 標頭中的通訊協定編號。
- 如果為通訊端定義本機 IP 位址,它應該對應至所接收資料包之 IP 標頭中指定的目的地位址。 應用程式可以藉由呼叫 bind 函式來指定本機 IP 位址。 如果未指定通訊端的本機 IP 位址,則資料包會複製到通訊端,而不論所接收資料包之 IP 標頭中的目的地 IP 位址為何。
- 如果為通訊端定義外部地址,它應該對應至所接收資料包 IP 標頭中指定的來源位址。 應用程式可以藉由呼叫 connect 或 WSAConnect 函式來指定外部 IP 位址。 如果未為通訊端指定任何外部 IP 位址,則資料包會複製到通訊端,而不論所接收資料包之 IP 標頭中的來源 IP 位址為何。
請務必瞭解 ,某些類型的通訊端SOCK_RAW 可能會收到許多非預期的資料包。 例如,PING 程式可能會建立類型 為 SOCK_RAW 的通訊端,以傳送 ICMP 回應要求和接收回應。 雖然應用程式預期有 ICMP 回應回應,但其他所有 ICMP 訊息 (例如 ICMP HOST_UNREACHABLE) 也可能傳遞至此應用程式。 此外,如果同時在電腦上開啟數 個SOCK_RAW 通訊端,相同的資料包可能會傳遞至所有開啟的通訊端。 應用程式必須有一個機制,才能辨識感興趣的資料包,並忽略所有其他資料包。 針對 PING 程式,這類機制可能包括檢查 ICMP 標頭中收到的唯一識別碼的 IP 標頭, (應用程式的進程識別碼,例如) 。
注意
若要使用 類型的通訊端SOCK_RAW 需要系統管理許可權。 執行使用原始通訊端之 Winsock 應用程式的使用者必須是本機電腦上的 Administrators 群組成員,否則原始通訊端呼叫將會失敗,並出現 WSAEACCES的錯誤碼。 在 Windows Vista 和更新版本上,會在建立通訊端時強制執行原始通訊端的存取。 在舊版的 Windows 中,會在其他通訊端作業期間強制執行原始通訊端的存取。
原始通訊端的常見用法
原始通訊端的其中一個常見用法是針對需要詳細檢查 IP 封包和標頭的應用程式進行疑難排解。 例如,原始通訊端可以與 SIO_RCVALL IOCTL 搭配使用,讓通訊端接收通過網路介面的所有 IPv4 或 IPv6 封包。 如需詳細資訊,請參閱 SIO_RCVALL 參考。
原始通訊端的限制
在 Windows 7、Windows Vista、Windows XP with Service Pack 2 (SP2) ,以及 Windows XP with Service Pack 3 (SP3) 上,透過原始通訊端傳送流量的能力已限制數種方式:
無法透過原始通訊端傳送 TCP 資料。
具有無效來源位址的 UDP 資料包無法透過原始通訊端傳送。 任何傳出 UDP 資料包的 IP 來源位址都必須存在於網路介面上,或卸載資料包。 這項變更的目的是要限制惡意程式碼建立分散式阻斷服務攻擊的能力,並限制使用偽造來源 IP 位址傳送詐騙封包 (TCP/IP 封包的能力) 。
不允許使用原始通訊端呼叫 系結 函式以IPPROTO_TCP通訊協定。
注意
其他通訊協定 (IPPROTO_IP、IPPROTO_UDP或IPPROTO_SCTP允許系 結 函式與原始通訊端,例如) 。
上述限制不適用於 Windows Server 2008 R2、Windows Server 2008、Windows Server 2003 或 Windows XP SP2 之前的作業系統版本。
注意
Microsoft 在 Windows 上實作 TCP/IP 能夠根據上述限制來開啟原始 UDP 或 TCP 通訊端。 其他 Winsock 提供者可能不支援使用原始通訊端。
使用 類型為 SOCK_RAW通訊端的應用程式有進一步的限制。 例如,接聽特定通訊協定的所有應用程式都會接收針對此通訊協定接收的所有封包。 這可能不是使用通訊協定的多個應用程式所需的專案。 這也適用于高效能應用程式。 若要解決此問題,可能需要針對特定網路通訊協定撰寫 Windows 網路通訊協定驅動程式 (設備磁碟機) 。 在 Windows Vista 和更新版本上,Winsock 核心 (WSK) ,新的傳輸獨立核心模式網路程式設計介面可用來撰寫網路通訊協定驅動程式。 在 Windows Server 2003 和更早版本上,可以撰寫傳輸驅動程式介面 (TDI) 提供者和 Winsock 協助程式 DLL 以支援網路通訊協定。 接著,網路通訊協定會新增至 Winsock 目錄作為支援的通訊協定。 這可讓多個應用程式開啟此特定通訊協定的通訊端,而裝置驅動程式可以追蹤哪些通訊端接收特定的封包和錯誤。 如需撰寫網路通訊協定提供者的資訊,請參閱 Windows 驅動程式套件 (WDK) 中的 WSK 和 TDI 章節。
應用程式也需要注意防火牆設定在使用原始通訊端傳送和接收封包時可能會造成的影響。