2012-01-14 9 views
1

私は現在、Cで小型で高速なdns-resolverを実装しています。通常、dns-resolverは、ローカルネームサーバとそのルータのキャッシュなどを要求してから、ルートネームサーバに要求を送信します。私の場合は、おそらくローカルに保存されていない名前を解決したいだけです。だから、ホスト名を解決する最速の方法は何ですか?キャッシュされていないドメイン名を解決する最速の方法はありますか?

私のローカルネームサーバ(私の場合はルータ)にパケットを送信するか、ルートネームサーバに直接送信しますか?どのルートネームサーバを選択するかは重要ですか?ランダムに選択するか(13台のルートDNSサーバのリストから)

答えて

1

名前の解決は難しい業務です。最初から簡単に見えますが、それほど簡単ではないものがたくさんあります。したがって、実際には自分自身をロールするのではなく、既存の実装を使用することが最善のことです。そこには選択肢がたくさんあり、そのほとんどがかなり良いためです。あなたのローカルネームサーバ(ルータ)にリゾルバがある場合は、それが複雑さの面倒を見るので(キャッシュ自体を持つ)、それを使用してください。

自分で解決するつもりなら、ルートネームサーバーで要求を発するよりもはるかに多くのことを行う必要があります。あなたはランダムにリクエストを発し、レスポンスが得られなかった場合(別のものを試してください)に対処し、答えが返ってきたらそれがあなたが探している答えにならないようにする必要があります。 "www.example.com"のリクエストを送信すると、 "com"(NSレコード内)のすべてのネームサーバーを一覧表示して、次にそれらに問い合わせるよう指示します。それから、ask.comに行く必要があります。comには、example.comのネームサーバーに尋ねて、尋ねるように指示するメッセージが表示されます。一方、example.comのNSレコードは、実際には "dns1.example.net"のような別の場所にサーバー名を付けることを指しているかもしれません。つまり、例を得るためには、ルートから再起動する必要があります。ネットのネームサーバー。

とにかく、上記は実際には単純化されたものであり、信じられているとは限りません。だから、はい:ローカルルータやISPのリゾルバに尋ねるのではなく、それを自分で行う必要があります。アプリケーションに対してローカルで実行したい場合は、書き直すのではなく、主なC実装の1つを選択してください。あなたがたくさんのことを学びたいのでない限り(これはいつも良いことです)。

+1

よろしくお願いいたします。私は多くを学びたいと思う:) –

関連する問題