pingとnslookupの違い
戸根先生へ
いつも丁寧な回答ありがとうございます。
ネットワークの診断ツールについて質問です。
ping コマンド(※)はICMPのプロトコルで動作しているにもかかわらず、ホスト名にpingを打つとあたかも名前解決しているようにみえます。これもリゾルバを呼び出しているのでしょうか?(Winsockプログラミングの教則本に載っているpingコマンドはgethostbyname関数を使って実装していますね)。
名前解決できるかを診断するには一般にnslookupを使います。
pingよりもnslookupを使ったほうがよいと聞いたことがあるのですが、DNSサーバを明示的に指定できるほかに違いがあるのでしょうか?(たとえばリゾルバを使わずに自前で機能を持っている等)。
ご教示いただければ幸いです。
※pingコマンドは各種OSで用意されていますが、ここではWindowsのpingとします。
日時:
04/10/13 22:15
コメント
nslookupは名前解決以外の問い合わせも可能
福光さん,こんばんわ。
返事遅くなりました。ゴメンナサイ。
> これもリゾルバを呼び出しているのでしょうか?
そうですね。
> (Winsockプログラミングの教則本に載っているpingコマンドはgethostbyname関数を使って実装していますね)。
gethostbynameがリゾルバを呼び出すための関数ですから,
それを使っているっていうことはリゾルバを呼び出している
っていうことになりますね。
> pingコマンド(※)はICMPのプロトコルで動作しているにもかかわらず、
ICMPのパケットを扱うっていうことと,
リゾルバを呼び出すことはまったく別のことなので,
ICMPを使うプログラムがリゾルバを呼び出しても,何もおかしくありません。
リゾルバを呼び出して名前解決するっていうことは,
ホスト名からIPアドレスを調べるっていうだけのことですから。
>名前解決できるかを診断するには一般にnslookupを使います。
pingでホスト名を指定することによって
名前解決できるかどうか判断する方法もあるでしょう。
単に名前解決ができるかどうかだけ調べるだけなら,
それでも十分だからです。
一方,nslookupの方は名前解決の可否だけでなく,
もっといろいろな事を調べることができます。
もう少し詳しく言うと,名前解決が可能かどうかは,
DNSのAレコードに対する問い合わせができるか否かということになりますが,
nslookupを使えばAレコードの問い合わせだけでなく,
PTRレコードを調べたり(いわゆる逆引きですね),
MXレコードを調べたり,その他のレコードを調べたり,
TCP/IPの設定項目に指定されたものと異なるDNSサーバにを指定できたり,
というようにいろいろな問い合わせができる,っていうことです。
nslookupを使う意義は,そちらの方にあるんじゃないかしら。
>pingよりもnslookupを使ったほうがよいと聞いたことがあるのですが、
これは,上に書いたようにいろいろなことができるから,
そちらの方がよい,という話なんじゃないかしら。
nslookupはDB関数を使用せずに書かれている?
回答ありがとうございました。
>pingでホスト名を指定することによって
>名前解決できるかどうか判断する方法もあるでしょう。
>単に名前解決ができるかどうかだけ調べるだけなら,
>それでも十分だからです。
>一方,nslookupの方は名前解決の可否だけでなく,
>もっといろいろな事を調べることができます。
>もう少し詳しく言うと,名前解決が可能かどうかは,
>DNSのAレコードに対する問い合わせができるか否かということになりますが,
>nslookupを使えばAレコードの問い合わせだけでなく,
>PTRレコードを調べたり(いわゆる逆引きですね),
>MXレコードを調べたり,その他のレコードを調べたり,
>TCP/IPの設定項目に指定されたものと異なるDNSサーバにを指定できたり,
>というようにいろいろな問い合わせができる,っていうことです。
>nslookupを使う意義は,そちらの方にあるんじゃないかしら。
きめ細かな「診断」ができるというだけでもnslookupを使う理由としては十分なのですが。
人づてに「pingはDB関数を引いてるにすぎない(暗にnslookupはそうではないと言っている風にとれます)」と聞いたのがこの質問を投稿したきっかけです。
上記のDB関数がgethostbynameを指しているとすると、nslookupの場合はこの関数を使わずに作られているのかなぁ?と...。
もうちょっと勉強してきます。
nslookupはgethostbynameを使っていないでしょう
>上記のDB関数がgethostbynameを指しているとすると、
>nslookupの場合はこの関数を使わずに作られているのかなぁ?と...。
nslookupのソースを見ていませんが,多分そうでしょう。
gethostbynameじゃnslookupのようなことはできませんから。
ただ,名前解決の可否を調べるだけなら,
gethostbynameを使う方法でも,
使わずに自分でDNSの問い合わせメッセージを作ってDNSサーバに送る方法でも,
結果は同じことです。
要するに,既存のライブラリ関数を利用するか,
自分で関数を作るかという違いがあるだけです。
Re nslookupはgethostbynameを使っていないでしょう
回答ありがとうございました。
どうアプローチすればいいか糸口がつかめてきました。
>nslookupのソースを見ていませんが,多分そうでしょう。
>gethostbynameじゃnslookupのようなことはできませんから。
nslookupのソースコードがんばって探してきて読んでみます。
(MicrosoftのWindowsのソースコードは一時期大学などに出していたもの以外はないはず...なのでオープンソースのもので。)
気分は少しだけ『Lion' Commentary on UNIX』です。