web-dev-qa-db-ja.com

Bonjourの使用方法

  1. 最初に、Bonjourは正確に何をしますか(以下の私の推測を読んでください)?
    ここ Bonjourを使用すると、IPネットワーク上のコンピュータ、デバイス、およびサービスを自動検出できることがわかりました。しかし、「IPネットワーク上のデバイスを検出する」だけでなく、Bonjourが実行されているデバイスにIPアドレスを割り当てることによってIPネットワークを作成することもできると思いました。 そうですか?

  2. そして、私はまだ本質を逃しています。次のように機能しますか?まず、デバイス(ラップトップなど)を物理的に接続して、デバイスが相互に通信できるようにします。次に、一部のラップトップでBonjourを実行しているとしましょう。その結果、これらのラップトップは自動的にIPアドレスを自分に割り当てます。したがって、ラップトップ(Bonjourが実行されている場所)はIPネットワークを構築します。 それはこのように機能しますか?

  3. または、Bonjourを実行しているコンピュータがサービスと見なされておらず、Bonjourがこのコンピュータで実行されているという理由だけでは、ブロードキャストしない。つまり、コンピューターで実行されているアプリケーションは、Bonjourを使用してそれらをブロードキャストする必要があります。したがって、自分自身をブロードキャストするのは(コンピュータではなく)アプリケーションであり、自動的には行われません(アプリケーションは自分自身を明示的にブロードキャストする必要があります)。 それでよろしいですか?

  4. 私のアプリケーションはどれだけ正確にそれ自体をブロードキャストできますか?コマンドラインを使用してサービスを登録できますか(Bonjourを使用するすべてのアプリケーションが新しいサービスが出現したことを認識できるようにするため)?

  5. また、Bonjourで作成したIPネットワークを利用したアプリケーションが欲しいです。そのため、私のアプリケーションは、ネットワークに存在するデバイス/サービスを知る必要があります。さらに詳しく言えば、私のアプリケーションにはサービスのリストが必要です。リスト内の各サービスには、名前、サービスが実行されているIPアドレス、およびアプリケーションが使用するポートが必要です。 Bonjourはこの情報を何らかの方法で提供できますか?その場合、正確にどのように機能するか。私のプログラムはどのようにしてBonjourからこの情報を取得できますか?私のプログラムは、Bonjourによって作成され、上記の情報を含むファイルを読み取ることができますか?コマンドラインでいくつかのコマンドを使用して、この情報を取得できますか?

  6. ファイル、環境変数、またはコマンドラインのコマンドからサービスに関する情報にアクセスすることに特別な関心があります。これらのオプションは私には最も簡単なようです!これらのケースでは、特定のプログラミング言語からBonjourと通信するために追加のライブラリを使用する必要がないためです。

追伸私の質問で何かが明確でない場合は、喜んで質問してください。私は私の質問をより明確な方法で定式化しようとします。

P.P.S. Windows 7を使用しています。

追加:アプリケーションをPHPで作成する予定です。すべてのコンピューターでApache Webサーバーを実行する必要があります。また、Bonjourを使用して、コンピューターがお互いを検出できるようにしたいと考えています(コンピューターはローカルネットワークで動作しています)。

27
Roman
  1. はい。 IETF ZeroConfワーキンググループの共同議長を務め、Zero Configuration Networkingに関するO'Reillyの本を執筆したAppleのRendezvous/Bonjourの主なメンテナーであるStuart Cheshireは、Bonjourを「3つの脚のあるスツール」。

    1. IPv4(およびIPv6)リンクローカルアドレス指定
    2. マルチキャスト名前解決(mDNS)
    3. DNSサービス検出(DNS-SD)

    IETF ZeroConfワーキンググループとAppleはどちらも、リンクローカルアドレッシング、特にIPv4リンクローカルアドレッシング(169.254.0.0/16アドレス)をZeroConf/Bonjourの一部と見なしています。 「便の脚」。

    WindowsはすでにAppleのBonjour for Windowsソフトウェアがインストールされていなくても自動リンクローカルアドレス指定をサポートしているため、多くのWindowsユーザーはIPv4リンクローカルアドレス指定がBonjour/ZeroConfの一部であるとは考えていません。

  2. はい。 MacおよびWindowsマシンは、デフォルトでIPv4リンクローカルアドレッシングを実行します。これらはDHCP用に構成されていますが、利用可能なDHCPサーバーがない場合です。 Avahi(またはおそらく他のZeroConf実装)がインストールされたLinuxおよびBSDマシンもこれを行います。

  3. コンピューターがBonjourを実行している場合、そのホスト名はmDNS経由でLANに公開されます。マシンの名前が「Alice」の場合、mDNS経由のAlice.localになります。同じLAN(具体的には、同じリンクローカルマルチキャストドメイン)上の別のコンピューター(「Bob」と呼びましょう)からは、単にping Alice.localと入力でき、ボブはAlice.localのmDNSルックアップを実行して、アリスのIPを検出する必要がありますアドレス、およびそれが取得したアドレス(の1つ)に対してpingを実行します。

    ただし、Bonjourはホスト名とサービス名を区別することに注意してください。たとえば、2つの別々のUSBプリンターがあり、たとえば「HP」と「Canon」がAliceに接続されていて、Aliceが両方のlprプリントサーバーとして機能している場合、それぞれが独自のサービスとして表示され、ホストとしてAlice.localにマップされます。

    それらのサービス名は、アリスについて言及せずに、「HP」および「Canon」としてユーザーに表示されます。舞台裏では、それらはHP._printer._tcp.localおよびCanon._printer._tcp.localとして知られており、これらのサービス名のDNS-SDルックアップは、これらのサービスが2つの異なるTCPポートのAlice.localで使用できることを示します。

    つまり、アプリケーションはBonjourデーモン(Appleの実装ではmDNSResponderと呼ばれます)に、宣伝したいサービスがあることを通知する必要があります。 macOSには、本来Bonjourに対応していないレガシーサービスのサービスアドバタイズを自動的に処理するメカニズムがあります。たとえば、macOSのsshdはOpenSSHであり、Bonjourを直接サポートしていませんが、macOSがBonjourを介してsshサービスをアドバタイズするため、LAN上の他のマシンからssh [email protected]を実行できます。

  4. MacOSには、次の構文を使用してサービスを登録できる「dns-sd」コマンドラインツールがあります。

    dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]  
    # (Register a service)
    

    だから例えば:

    dns-sd -R MyWebsite _http._tcp local 80
    

    Bonjour for WindowsやBonjour SDK for Windowsに含まれていたり、Appleの mDNSResponder オープンソースプロジェクトからWindows用にコンパイルできたりしても、驚かないでしょう。 dns-sd.exeをグーグルで検索すると、そのようなものが存在することがわかります。バイナリをダウンロードするだけだとは思いません。代わりに、上記のパッケージの1つから取得するか、mDNSResponderプロジェクトソースから自分でコンパイルしようとします。

  5. dns-sdコマンドラインツールを使用してサービスを参照し、検索することもできます。ローカルWebサービスを検索する例を次に示します。

    -Bを使用してローカルWebサービスを参照します。

    $ dns-sd -B _http._tcp local  
    Browsing for _http._tcp.local  
    Timestamp     A/R Flags if Domain                    Service Type              Instance Name  
    16:30:59.870  Add     3  6 local.                    _http._tcp.               My Cool Web App  
    16:30:59.871  Add     3  6 local.                    _http._tcp.               Someone Else's Web Service  
    16:30:59.871  Add     3  6 local.                    _http._tcp.               A Third One  
    ^C
    

    -Lを使用して、必要なもの「My Cool Web App」を検索します。

    $ dns-sd -L "My Cool Web App" _http._tcp local  
    Lookup My Cool Web App._http._tcp.local  
    16:31:52.678  My\032Cool\032Web\032App._http._tcp.local. can be reached at MyWebServer.local.:80 (interface 6)  
    ^C  
    

    -Qを使用して、MyWebServer.localのIPアドレスをクエリします。

    $ dns-sd -Q MyWebServer.local  
    Timestamp     A/R Flags if Name                             T   C Rdata  
    16:32:40.786  Add     2  6 MyWebServer.local.               1   1 169.254.45.209  
    ^C  
    

    これらの例では、Ctrl-Cツールからdns-sdを除外する必要があることに注意してください。それ以外の場合は、いつまでも開いたままで、ネットワークを継続的に監視し、発行したクエリの結果の変化を報告します(-Bブラウズクエリを開いたまま、ネットワーク上で送受信されるWebサーバーなど)。これやその他の理由により、dns-sdツールはスクリプトからの呼び出しにはあまり適していません。結局のところ、希望する言語のZeroConfライブラリを確認したい場合があります。

他の質問の1つに答えるために、ファイルの読み取り/書き込みだけでクエリを実行して結果を取得できるZeroConf実装については知りません。 Bonjourを使用するほとんどのアプリは、直接(C/C++/Obj-C/Swiftアプリ)、または言語に固有のライブラリー(解釈済み/スクリプト言語)を介して、APIを呼び出すことでこれを行います。

54
Spiff

最初に、Bonjourは正確に何をしますか(以下に書かれた私の推測を読んでください)?ここで私は、BonjourがIPネットワーク上のコンピューター、デバイス、およびサービスの自動検出を可能にすることを発見しました。しかし、「IPネットワーク上のデバイスを検出する」だけでなく、Bonjourが実行されているデバイスにIPアドレスを割り当てることによってIPネットワークを作成することもできると思いました。私は正しいですか?

結構です。 Jonが指摘したように、IPアドレスの割り当てにはDHCP(通常)が使用されます。通常のDNSがドメイン名をIPアドレスに変換するのと同じように、Bonjourは一時的なドメイン名(ローカルネットワーク内)を提供するIPアドレスに変換するために使用されます。

そして、私はまだ本質を逃しています。次のように機能しますか?まず、デバイス(ラップトップなど)を物理的に接続して、デバイスが相互に通信できるようにします。次に、一部のラップトップでBonjourを実行しているとしましょう。その結果、これらのラップトップは自動的にIPアドレスを自分に割り当てます。したがって、ラップトップ(Bonjourが実行されている場所)はIPネットワークを構築します。このように機能しますか?

いいえ。ほとんどの場合、ラップトップはローカルDHCPサーバーからIPアドレスを取得しています。 Bonjourは、各サービスが他のユーザーに提供できるサービスを理解するのに役立ちます。

または、Bonjourを実行しているコンピュータがサービスと見なされておらず、Bonjourがこのコンピュータで実行されているという理由だけでは、ブロードキャストしない。つまり、コンピューターで実行されているアプリケーションは、Bonjourを使用してそれらをブロードキャストする必要があります。したがって、自分自身をブロードキャストするのは(コンピュータではなく)アプリケーションであり、自動的には行われません(アプリケーションは自分自身を明示的にブロードキャストする必要があります)。正しいですか?

はい。通常、アプリケーションはその存在を明示的に通知する必要があります。これは多くの場合、システムが提供するライブラリ(OS Xでは一般的)またはカスタムライブラリ(PerlのNet :: Bonjourなど)を使用して実行できます。

アプリケーションはどの程度正確にブロードキャストできますか?コマンドラインを使用してサービスを登録できますか(Bonjourを使用するすべてのアプリケーションが新しいサービスが出現したことを認識できるようにするため)

これを行うコマンドラインツールについては知りませんが、多くの主要なプログラミング言語では、これを行うために利用できるライブラリがあります。

また、Bonjourで作成したIPネットワークを利用したアプリケーションが欲しいです。そのため、私のアプリケーションは、ネットワークに存在するデバイス/サービスを知る必要があります。さらに詳しく言えば、私のアプリケーションにはサービスのリストが必要です。リスト内の各サービスには、名前、サービスが実行されているIPアドレス、およびアプリケーションが使用するポートが必要です。 Bonjourはこの情報を何らかの方法で提供できますか?

Bonjourライブラリのほとんどは、これを行うことができるはずです。 http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm の最初の例を参照してください

その場合は、正確にどのように機能するか。私のプログラムはどのようにしてBonjourからこの情報を取得できますか?私のプログラムは、Bonjourによって作成され、上記の情報を含むファイルを読み取ることができますか?コマンドラインでいくつかのコマンドを使用して、この情報を取得できますか?

プログラムは適切なライブラリを使用して、Bonjourプロトコルを使用して、ローカルネットワーク内の他のすべてのコンピューターに、利用可能なサービスを通知するように依頼します。そのライブラリーは、応答を解析し、より有用な形式でそれらをユーザーに提示します。

ファイル、環境変数、またはコマンドラインのコマンドからサービスに関する情報にアクセスすることに特別な関心があります。これらのオプションは私には最も簡単なようです!これらのケースでは、特定のプログラミング言語からBonjourと通信するために追加のライブラリを使用する必要がないためです。

これを行うツールは知りませんが、存在する可能性があります。

追伸私の質問で何かが明確でない場合は、喜んで質問してください。私は私の質問をより明確な方法で定式化しようとします。

あなたが書いているプログラムが何をするか、そしてあなたがそれを書いている言語についてのいくつかのより多くの情報は、助けを容易にするでしょう。

導入情報の詳細については、次の両方を試してください。

4
caelyx

BonjourはIPアドレスを割り当てません-これは検出プロトコルです-それが機能するにはDHCP /静的/リンクローカル(APIPA)IPアドレスが必要です。

マルチキャストDNS(mDNS)を使用して、自分自身と同じブロードキャストドメイン上にあるホストを検出し、基本的には独自のDNSサーバーになります。

詳細は BonjourZeroconf を参照してください。

アプリケーションがホーム/管理されていないネットワーク用でない限り、つまり、ローカルDNSサーバーがなければ、必要はありません。

3
Jon Rhoades