pingとnslookupの違い

戸根先生へ

いつも丁寧な回答ありがとうございます。

ネットワークの診断ツールについて質問です。

ping コマンド(※)はICMPのプロトコルで動作しているにもかかわらず、ホスト名にpingを打つとあたかも名前解決しているようにみえます。これもリゾルバを呼び出しているのでしょうか?(Winsockプログラミングの教則本に載っているpingコマンドはgethostbyname関数を使って実装していますね)。

名前解決できるかを診断するには一般にnslookupを使います。

pingよりもnslookupを使ったほうがよいと聞いたことがあるのですが、DNSサーバを明示的に指定できるほかに違いがあるのでしょうか?(たとえばリゾルバを使わずに自前で機能を持っている等)。

ご教示いただければ幸いです。

※pingコマンドは各種OSで用意されていますが、ここではWindowsのpingとします。

名前: 
福光
日時: 
04/10/13 22:15

コメント

福光さん,こんばんわ。
返事遅くなりました。ゴメンナサイ。

> これもリゾルバを呼び出しているのでしょうか?

そうですね。

> (Winsockプログラミングの教則本に載っているpingコマンドはgethostbyname関数を使って実装していますね)。

gethostbynameがリゾルバを呼び出すための関数ですから,
それを使っているっていうことはリゾルバを呼び出している
っていうことになりますね。

> pingコマンド(※)はICMPのプロトコルで動作しているにもかかわらず、

ICMPのパケットを扱うっていうことと,
リゾルバを呼び出すことはまったく別のことなので,
ICMPを使うプログラムがリゾルバを呼び出しても,何もおかしくありません。
リゾルバを呼び出して名前解決するっていうことは,
ホスト名からIPアドレスを調べるっていうだけのことですから。

>名前解決できるかを診断するには一般にnslookupを使います。

pingでホスト名を指定することによって
名前解決できるかどうか判断する方法もあるでしょう。
単に名前解決ができるかどうかだけ調べるだけなら,
それでも十分だからです。
一方,nslookupの方は名前解決の可否だけでなく,
もっといろいろな事を調べることができます。
もう少し詳しく言うと,名前解決が可能かどうかは,
DNSのAレコードに対する問い合わせができるか否かということになりますが,
nslookupを使えばAレコードの問い合わせだけでなく,
PTRレコードを調べたり(いわゆる逆引きですね),
MXレコードを調べたり,その他のレコードを調べたり,
TCP/IPの設定項目に指定されたものと異なるDNSサーバにを指定できたり,
というようにいろいろな問い合わせができる,っていうことです。
nslookupを使う意義は,そちらの方にあるんじゃないかしら。

>pingよりもnslookupを使ったほうがよいと聞いたことがあるのですが、

これは,上に書いたようにいろいろなことができるから,
そちらの方がよい,という話なんじゃないかしら。

回答ありがとうございました。

>pingでホスト名を指定することによって
>名前解決できるかどうか判断する方法もあるでしょう。
>単に名前解決ができるかどうかだけ調べるだけなら,
>それでも十分だからです。
>一方,nslookupの方は名前解決の可否だけでなく,
>もっといろいろな事を調べることができます。
>もう少し詳しく言うと,名前解決が可能かどうかは,
>DNSのAレコードに対する問い合わせができるか否かということになりますが,
>nslookupを使えばAレコードの問い合わせだけでなく,
>PTRレコードを調べたり(いわゆる逆引きですね),
>MXレコードを調べたり,その他のレコードを調べたり,
>TCP/IPの設定項目に指定されたものと異なるDNSサーバにを指定できたり,
>というようにいろいろな問い合わせができる,っていうことです。
>nslookupを使う意義は,そちらの方にあるんじゃないかしら。

きめ細かな「診断」ができるというだけでもnslookupを使う理由としては十分なのですが。

人づてに「pingはDB関数を引いてるにすぎない(暗にnslookupはそうではないと言っている風にとれます)」と聞いたのがこの質問を投稿したきっかけです。

上記のDB関数がgethostbynameを指しているとすると、nslookupの場合はこの関数を使わずに作られているのかなぁ?と...。

もうちょっと勉強してきます。

>上記のDB関数がgethostbynameを指しているとすると、
>nslookupの場合はこの関数を使わずに作られているのかなぁ?と...。

nslookupのソースを見ていませんが,多分そうでしょう。
gethostbynameじゃnslookupのようなことはできませんから。

ただ,名前解決の可否を調べるだけなら,
gethostbynameを使う方法でも,
使わずに自分でDNSの問い合わせメッセージを作ってDNSサーバに送る方法でも,
結果は同じことです。
要するに,既存のライブラリ関数を利用するか,
自分で関数を作るかという違いがあるだけです。

回答ありがとうございました。
どうアプローチすればいいか糸口がつかめてきました。

>nslookupのソースを見ていませんが,多分そうでしょう。
>gethostbynameじゃnslookupのようなことはできませんから。

nslookupのソースコードがんばって探してきて読んでみます。
(MicrosoftのWindowsのソースコードは一時期大学などに出していたもの以外はないはず...なのでオープンソースのもので。)

気分は少しだけ『Lion' Commentary on UNIX』です。