ネットワーク インターフェイス

このトピックでは、コード内でネットワーク インターフェイスを識別する方法やそのプロパティなど、Windows 上のネットワーク インターフェイスの高レベルな概念について説明します。

重要

このトピックは、Windows デスクトップ ネットワーク アプリとカーネル モード ネットワーク ドライバーの両方の開発者を対象としています。 ただし、ここで紹介する情報の一部は、PowerShell コマンドレットを通じてネットワーク インターフェイスを管理するシステム管理者にとっても役立ちます。

概要

ネットワーク インターフェイス は、2 つのネットワーク機器またはプロトコル層が接続されるポイントです。 通常、これは、コンピューターとプライベート ネットワークまたはパブリック ネットワーク間の接続に使用される物理的なネットワーク インターフェイス カード (NIC) によって表されます。 ただし、ループバック インターフェイス (IPv4 の場合は 127.0.0.1、IPv6 の場合は ::1) などのソフトウェアのみのコンポーネントの形をとることもできます。

ネットワーク インターフェイスは、インターネット技術タスク フォース (IETF) によって RFC 2863 で定義されており、Windows によって定義されるものではありません。 ifIndex などのネットワーク インターフェイス識別子の意味に関する詳細な質問については、IETF の定義を参照してください。 このトピックの残りの部分では、Windows 固有の実装の詳細について説明します。

ネットワーク インターフェイスの識別子とプロパティ

Windows では、ネットワーク インターフェイスはさまざまな方法で識別できます。 これらの識別子の一部は、ネットワーク インターフェイスを相互に区別するために使用されますが、その特性が異なるため、すべての識別子がそのタスクに等しく適しているわけではありません。 通常、ネットワーク インターフェイスは外部コンポーネントへのネットワーク アドレスによって識別されます。 たとえば、これはノード ID とポート番号、または単純に一意のノード ID である場合があります。

コードでは、ネットワーク インターフェイスはさまざまな方法で識別できます。 次の表は、ネットワーク インターフェイスを識別する方法と関連するプロパティの詳細を示しています。 特定の API で異なるネットワーク インターフェイス識別子が必要な場合を除き、プログラミングにはインターフェイス GUID (ifGuid) を使用することをお勧めします。

Note

次の表では、 太字 のセルは、ネットワーク プログラマーにとって望ましい特性を表します。

Identifier サイズ システム上でユニーク 世界でもユニークな 予測可能 NICが取り外されるとリサイクルされます 再起動後も持続 エンドユーザーはいつでも変更可能 ドライバーはいつでも変更できます エンドユーザーに関する一般的な知識 常に存在します
ifIndex 4 バイト はい いいえ 番号 はい 不可1 いいえ いいえ 一部2 はい
NetLuid 8 バイト はい いいえ 番号 イエス はい いいえ いいえ 番号 はい
ifGuid 16 バイト はい 通常3 いいえ いいえ はい いいえ いいえ 番号 はい
ifAlias 514 バイト NICの場合ははい4 いいえ ときどき5 はい あり はい 無効 はい 常に4
ifDescr 514 バイト 常に6 いいえ 番号 イエス はい 無効 イエス はい 通常
ifPhysAddress (MAC ADDRESS) 0 から 32 バイト 通常、NICの場合 通常、NICの場合 はい ハードウェアに結びつく はい いいえ いいえ はい 通常 7
PnP インスタンス ID 最大400バイト はい いいえ 番号 イエス はい いいえ いいえ いいえ 通常、NICの場合8
PnP の場所 (PCI スロット番号) 最大400バイト はい いいえ はい イエス はい いいえ いいえ 場合によります ときどき8,9

上の表に関する注記:

  1. IfIndexes は、前回の起動と同じ値を受け取ることが多いにもかかわらず、再起動後も安定しているとは限りません。 したがって、API で要求される場合を除き、ドライバーが ifIndex を使用することは推奨されません。
  2. 一部の netsh コマンドは、入力として ifIndexまたは indexを受け取ります。 したがって、管理ユーザーの中には、 netsh コマンドを頻繁に使用する場合、 ifIndex プロパティをよく知っている人もいます。
  3. マシンがクローンまたはイメージ化されている場合、一部の GUID が同じになる可能性があります。 また、組み込みの Teredo インターフェイスなどの特定の特殊なネットワーク インターフェイスは、すべてのマシンで同じ GUID を持つ場合があります。
  4. NetCfg は、 ifAlias が空でない文字列であり、すべての NIC 間で一意であることを強制します。 ただし、NDIS インターフェイス プロバイダーはそうではありません。 したがって、重複した名前や空の名前を持つ特殊なネットワーク インターフェイスが見つかる可能性があります。 これは LBFO チームで最もよく見られます。
  5. ファームウェアが Consistent Device Naming をサポートしている場合のみ。 通常、サーバーにはこの機能があります。
  6. NetCfg は、すべてのネットワーク インターフェイスに一意の ifDescrs を割り当てます。 ただし、ドライバーは API を呼び出して、 ifDescr を、一意でない値も含め、任意の値に変更できます。 一部のサードパーティ製ソフトウェア パッケージではこれを実行します。
  7. すべてのメディア タイプに「MAC アドレス」があるわけではありません。たとえば、一部のトンネルにはこの概念がなく、ネットワーク アドレスとして長さゼロのバイト配列を単純にアドバタイズします。
  8. PnP デバイスによってサポートされているネットワーク インターフェイスにのみ存在します。 たとえば、ループバック インターフェイス、軽量フィルター インターフェイス、NDIS インターフェイス プロバイダーによって提供されるインターフェイス、および特定の特殊な組み込み NIC には、PnP デバイスがサポートされていません。
  9. 一部の PnP バスのみが PnP ロケーション ID をサポートします。 組み込みの PCI バスと USB バスはそれをサポートしますが、ルート列挙デバイスはそれをサポートします。

開発者への可視性

上の表では、プラグ アンド プレイ (PnP) プロパティを除くすべてのプロパティは、共有ヘッダー (Netioapi.h) を介してユーザー モード デスクトップ アプリとカーネル モード ドライバーに表示されます。 PnP プロパティは Devpkey.h ヘッダーを介して表示され、ユーザー モードのデスクトップ アプリとカーネル モード ドライバーの両方で使用されます。 たとえば、 DEVPKEY のドキュメントを参照してください。

IP Helper API は、ユーザー モード デスクトップ アプリとカーネル モード ドライバーの両方で使用できます。

UWP API サーフェスは、 ifGuid プロパティのみを直接公開します。 ただし、他のネットワーク インターフェイス プロパティにアクセスする必要がある場合、UWP アプリ開発者は P/Invoke を使用して GetIfTable2 関数をインポートできます。

ネットワーク インターフェイスの管理情報ベース (MIB) 定義については、 RFC 2863を参照してください。

ネットワーク ドライバーの NDIS ネットワーク インターフェイスについては、 NDIS ネットワーク インターフェイス を参照してください。

Netioapi.h API リファレンスについては、 netioapi.h ヘッダー を参照してください。