次の方法で共有


名前解決モデル

名前空間とは、ネットワーク サービスのプロトコルとアドレス指定属性を 1 つ以上のフレンドリ名に関連付ける (最小限の) 機能を指します。 現在、インターネットのドメイン ネーム システム (DNS)、Active Directory Domain Services、バインダー、Novell の NetWare Directory Services (NDS)、X.500 など、多くの名前空間が広く使用されています。 これらの名前空間は、それらが編成および実装される方法によって大きく異なります。 これらのプロパティの一部は、Winsock の名前解決の観点から理解することが特に重要です。

名前空間の種類

サービスを登録できる名前空間には、次の 3 種類があります。

  • 動的
  • 静的
  • 永続的

動的名前空間を使用すると、サービスは名前空間にすぐに登録でき、クライアントは実行時に使用可能なサービスを検出できます。 動的名前空間は、ネットワーク サービスの継続的な可用性を示すためにブロードキャストに依存することが多い。 動的名前空間の古い例としては、NetWare 環境内で使用される Service Advertising Protocol (SAP) 名前空間や、AppleTalk で使用される名前バインディング プロトコル (NBP) 名前空間などがあります。 Windows で使用されるピア名解決プロトコル (PNRP) 名前空間は、動的名前空間のより新しい例です。

静的名前空間では、すべてのサービスを事前に登録する必要があります。つまり、名前空間の作成時に登録する必要があります。 静的名前空間の例としては、ほとんどの TCP/IP 実装で使用される ホストプロトコルおよびサービス ファイルがあります。 Windows では、通常、これらのファイルは C:\windows\system32\drivers\etc フォルダーにあります。

永続的な名前空間を使用すると、サービスは即座に名前空間に登録できます。 ただし、動的名前空間とは異なり、永続的な名前空間は、登録情報を不揮発性ストレージに保持します。このストレージは、サービスが削除を要求するまで保持されます。 永続的な名前空間は、X.500 や NDS (NetWare ディレクトリ サービス) などのディレクトリ サービスに代表されます。 これらの環境では、サービス プロパティの追加、削除、変更を行うことができます。 さらに、ディレクトリ サービス内のサービスを表すサービス オブジェクトには、サービスに関連付けられているさまざまな属性が含まれる場合があります。 クライアント アプリケーションの最も重要な属性は、サービスのアドレス指定情報です。 DNS は、永続的な名前空間のもう 1 つの例です。 Windows ソケットを使用して DNS 名を解決するプログラムによる方法がありますが、Windows の DNS 名前空間プロバイダーでは Winsock を使用した新しい DNS 名の登録はサポートされていません。 DNS 名を登録するには、DNS 関数を直接使用する必要があります。 詳細については、「 DNS リファレンス」を参照してください

名前空間の組織

多くの名前空間は階層的に配置されています。 X.500 や NDS などの一部では、無制限の入れ子が可能です。 他のユーザーは、サービスを単一レベルの階層またはグループに組み合わせることができます。 これは通常、 ワークグループと呼ばれます。 クエリを作成するときは、多くの場合、検索の開始元となる名前空間階層内にコンテキスト ポイントを確立する必要があります。

名前空間プロバイダーのアーキテクチャ

当然ながら、さまざまな種類の名前空間のクエリや名前空間内の情報の登録に使用されるプログラム インターフェイスは、大きく異なります。 名前空間プロバイダーは、Winsock 名前空間 SPI と既存の名前空間 (ローカルに実装することも、ネットワーク経由でアクセスすることもできます) の間でマップする方法を認識する、ローカルに常駐するソフトウェアです。 名前空間プロバイダーのアーキテクチャを次に示します。

名前空間プロバイダーのアーキテクチャ

特定の名前空間 (DNS など) で、特定のコンピューターに複数の名前空間プロバイダーがインストールされている可能性があることに注意してください。

前述のように、一般的な用語 サービス は、クライアント/サーバー アプリケーションのサーバーの半分を指します。 Winsock では、サービスは サービス クラスに関連付けられます。特定のサービスの各インスタンスには、サービス クラス内で一意である必要がある サービス名 があります。 サービス クラスの例としては、FTP Server、SQL Server、XYZ Corp. Employee Info Server などがあります。例が示すように、一部のサービス クラスはよく知られていますが、他のクラスは一意であり、特定の垂直アプリケーションに固有です。 どちらの場合も、すべてのサービス クラスはクラス名とクラス識別子の両方で表されます。 クラス名は必ずしも一意である必要はありませんが、クラス識別子は である必要があります。 グローバル一意識別子 (GUID) は、サービス クラス識別子を表すために使用されます。 既知のサービスでは、クラス名とクラス識別子 (GUID) が事前に割り当てられており、マクロを使用して TCP ポート番号 (ホスト バイト順) と対応するクラス識別子 GUID の間で変換できます。 その他のサービスの場合、開発者はクラス名を選択し、Uuidgen.exe ユーティリティを使用してクラス識別子の GUID を生成します。

サービス クラスの概念は、特定のサービスのすべてのインスタンスで共通に保持される一連の属性を確立できるようにするために存在します。 この属性のセットは、サービス クラスが Winsock に定義されている時点で提供され、サービス クラス スキーマ情報と呼ばれます。 サービスがホスト コンピューターにインストールされ、使用可能になると、そのサービスは インスタンス化されたと見なされ、そのサービス名を使用して、サービスの特定のインスタンスが名前空間に認識される可能性がある他のインスタンスと区別されます。

サービス クラスのインストールは、サービスを利用できるすべてのクライアントではなく、サービスが実行されるコンピューターでのみ行う必要があることに注意してください。 可能な場合、Ws2_32.dllは、サービスのインスタンス化が登録されるか、サービス クエリが開始されるときに、名前空間プロバイダーにサービス クラス スキーマ情報を提供します。 Ws2_32.dllは、この情報自体を格納するのではなく、このデータを提供する機能を示している名前空間プロバイダーから取得しようとします。 Ws2_32.dllがサービス クラス スキーマを提供できる保証がないため、この情報を必要とする名前空間プロバイダーには、名前空間固有の方法で取得するためのフォールバック メカニズムが必要です。

前述のように、インターネットはホスト中心のサービス モデルと呼ばれるものを採用しています。 通常、サービスのトランスポート アドレスを見つける必要があるアプリケーションは、まず、サービスをホストすることが知られている特定のホストのアドレスを解決する必要があります。 このアドレスに既知のポート番号を追加し、完全なトランスポート アドレスを作成します。 ホスト名の解決を容易にするために、特別なサービス クラス識別子が事前割り当て済み (SVCID_HOSTNAME)。 SVCID_HOSTNAMEをサービス クラスとして指定し、サービス インスタンス名のホスト名を指定するクエリは、クエリが成功した場合にホスト アドレス情報を返します。

Windows ソケット 2 では、プロトコルに依存しないアプリケーションでは、トランスポート アドレスの内部詳細を理解する必要がなくなります。 したがって、最初にホスト アドレスを取得してからポートにを追加する必要は問題です。 これを回避するために、クエリには、特定のサービスの既知の名前と、サービスが動作するプロトコル (TCP 経由の FTP など) も含まれる場合があります。 この場合、クエリが成功すると、指定されたホスト上の指定されたサービスの完全なトランスポート アドレスが返され、 アプリケーションは sockaddr 構造体の内部を検査する必要はありません。

インターネットのドメイン ネーム システムには、サービス クラススキーマ情報を格納するための明確に定義された手段がありません。 その結果、Winsock の DNS 名前空間プロバイダーは、サービス クラス GUID が事前に割り当てられている既知の TCP/IP サービスにのみ対応できます。

実際には、サービス クラス GUID は TCP ポートと UDP ポートのセット全体に対して事前に割り当てられているため、これは重大な制限ではありません。マクロは、ホスト バイト順で表されるポートを使用して TCP または UDP ポートに関連付けられている GUID を取得するために使用できます。 したがって、HTTP、FTP、Telnet、Whois などの使い慣れたサービスはすべてです。は十分にサポートされています。

このサービス クラスの例を続けると、FTP サービスのインスタンス名は "alder.intel.com" または "ftp.microsoft.com" になることがありますが、XYZ Corp. Employee Info Server のインスタンスには "XYZ Corp. Employee Info Server Version 3.5" という名前を付けることができます。

最初の 2 つのケースでは、FTP のサービス クラス GUID とコンピューター名 (サービス インスタンス名として指定) の組み合わせによって、目的のサービスが一意に識別されます。 3 番目のケースでは、サービスが存在するホスト名をサービス クエリ時に検出できるため、サービス インスタンス名にホスト名を含める必要はありません。

DNS リファレンス

名前解決データ構造

プロトコルに依存しない名前解決

登録と名前解決

Sockaddr

名前解決関数の概要