ドメインで複数のAレコードを使用する-Webブラウザーは複数のAレコードを試しますか?


94

ドメインに複数のAレコードを追加すると、DNSサーバーからラウンドロビン順に返されます。

例:

192.0.2.1 A example.com
192.0.2.2 A example.com
192.0.2.3 A example.com

しかし、最初のホスト(192.0.2.1)がダウンしている(到達できない)場合、Webブラウザーはどのように反応しますか?2番目のホスト(192.0.2.2)を試しますか、それともエラーメッセージをユーザーに返しますか?最も人気のあるブラウザーに違いはありますか?

独自のアプリケーションを実装する場合、最初のアプリケーションがダウンした場合に2番目のアプリケーションが使用されるように実装できるため、可能です。これは、フォールトトレラントWebサイトを作成するのに非常に役立ちます。

回答:


87

はい。過去5〜10年のほとんどのブラウザは、応答に失敗した場合、他のAレコードを試します。これは、「ブラウザの再試行」または「クライアントの再試行」と呼ばれることもあります。あなたはかなりのみ、この機能は、それが(参照使用していないサイトに対して有効にさまざまなブラウザクラッシャーのコンテキストでそれについて何かを見つけるのDNSリバインディングDNSピニング抗DNSピニング、抗抗DNSピニング、抗抗-anti-dns pinningなど)。悪い評判のようなものですが、それが存在することを証明します。

ほとんどすべてのブラウザーは、実際にAレコードの完全なリストを受け取り、使用しているものが失敗した場合、他のブラウザーを実際にチェックします。サーバーがダウンしているときに最初にサイトにアクセスしようとするとき、各クライアントが作業アドレスに接続するまで30秒待機することが期待できます。その後、ブラウザはどのアドレスが機能しているかをキャッシュし、失敗しない限り将来のリクエストでそのアドレスを使用し続け、リストを再度検索する必要があります。したがって、最初の要求で30秒待機し、その後は問題ありません。

しかし、これは必ずしも使用したいものではありません。ブラウザの互換性、OSの互換性、プロキシの互換性、キャッシュ制御ヘッダーについては、どのIPがダウンしているかを覚えているかどうかに奇妙な影響がありますリクエストごとに30秒待機すると、サイトのカスタムクライアントを作成するユーザーは、getaddrinfoの代わりにgethostbynameを使用することになり、あらゆる種類の潜在的な問題を処理できなくなります。

また、複数のAレコードに依存して「マスター」サーバーと「スレーブ」サーバーを許可することはできません。これは、ブラウザーがリストから選択するアドレスがわからないためです。彼らはすべて、実行中の訪問者を処理できる能力を備えている必要があります。ブラウザは、リストの3番目のサーバーが最も魅力的だと思うかもしれません。おそらく最も近いように見え、3つすべてがまだ稼働していても、そのサーバーを選択します。

ただし、制限に耐え、ブラウザとの相互作用を予測できる合理的な単純なHTTPシステムを使用できる場合は機能します。

ああ、これは存在しないと言っている多くの人にも対処する必要があります(15年前に真実だったからです)。ただし、証明する必要がある場合は、いくつかのAレコード、デッドIPのあるドメイン名、いくつかの良いレコードを含むドメイン名へのtelnet接続を試すことができます(はい、古いtelnetでもgetaddrinfoを使用し、最近は複数のAレコードを正常に処理します) -最終的に成功するまで、試行しているIPの素敵なリストを出力します。


12
ここだ Joffの答えをサポートしてい全米経済研究所からの報告が。
マルコ

3
興味深いことに、stackexchange.comは1つのIPを指しますが、Googleはいくつかを返します。$ dig google.com @ ns1.google.com ;; 回答セクション:google.com。300 IN A 74.125.226.6 google.com。300 IN A 74.125.226.7 google.com。300 IN A 74.125.226.0 google.com。300 IN A 74.125.226.4 google.com。300 IN A 74.125.226.8 google.com。300 IN A 74.125.226.2 google.com。300 IN A 74.125.226.1 google.com。300 IN A 74.125.226.3 google.com。300 IN A 74.125.226.5 google.com。300 IN A 74.125.226.14 google.com。300 IN A 74.125.226.9
ルイセントアムール

1
申し訳ありませんが、私はそれがどのように機能するとは思わない。ブラウザはIPアドレスの解決とは関係ありません。これはシステムソフトウェアで発生します。複数のAレコードを提供する場合、特定のクライアントがリストからランダムなレコードを受け取ると想定する必要があります。
ヤンスタインマン

19
これ、現代のブラウザでの動作です。システムから単一のIPアドレスを取得するのではなく、getaddrinfo()などのシステムコールを使用して複数のIPアドレスを取得し、内部でフェールオーバーを処理することを選択します。ここの他のコメント者と回答者は、Joffの最後の段落の「これは存在しないと言っている多くの人々」の一部です。
ロバートトゥペロシュネック

1
「ブラウザは5〜10年前」というJoffの声明をサポートするために、この種のシステムがIE 8まで動作することを示す国立経済調査局によって行われたテストを次に示します。:)
ジョマールセビリアジョ

5

Windows VistaはRFC3484の愚かな部分(つまり、IPV6からIPV4へのバックポート)を実装し、ランダムに1つを選択するのではなく、ほとんどのプレフィックスビットをユーザーのIPアドレスと共有するIPアドレスを優先します。ほとんどのユーザーは192.168で始まるIPアドレスを持っているので、ほとんどのプレフィックスビットを共有しているIPアドレスのいずれでも、ほとんどのVistaトラフィックを取得できます。マイクロソフトは、Windows 7以降でこの特定のイディオイを少し修正したため、以前ほど大きな問題ではなくなりました。


Vista、それは良いものです!
the0ther

3

これは、DNSロードバランシングの基本的な分散技術です。DNSラウンドロビン。これはブラウザーとは関係ありません。リゾルバーの実装と、DNSアドレスのローカル/リモートキャッシュに依存します。変更は、DNS層でのキャッシュのためにサーバーに障害が発生した場合、Webサイトにアクセスできない可能性があることです。

WikiPediaのラウンドロビンDNSに関する基本的な説明については、こちらをご覧ください。


1
さて、ブラウザーはリゾルバーであるため-私が知っているように、ブラウザーの実装に依存します。
ジョナス

2
いいえ、もちろんシステムにセットアップしたDNSネームサーバーを使用してDNSを解決するシステムライブラリがあります。この関数は、標準オペレーティングシステムライブラリの一部です。
キート

ただし、nslookup cnn.comWindowsとhost cnn.comLinuxの両方でIPアドレスのリストが返されるため、ブラウザーの実装に依存します。
ジョナス

5
@iivel:いいえ、そうではありません。Javaプログラムを作成し、InetAddress.getAllByName( "example.com")で名前を解決すると、すべてのIPアドレスのリストが取得されるため、必要に応じてすべてのIPアドレスへのTCP接続を開始できます。また、Cでgetaddrinfo()を使用する場合も同じです。したがって、オペレーティングシステムではなく、開発者が選択することは間違いありません
ジョナス

1
@ J.Moneyこの質問は、実装について正確に求めていない、我々はどのようにすることができますそれを行います。
フランクリンゆう

0

OSは、ブラウザではなく、使用するIPを決定します。Windowsは返されたリスト(DNSから返されたリスト内)をラウンドロビンしますが、DNSがフラッシュされるかタイムアウトになるまで同じアドレスを使用し続けます。* ix実装は、バンドルされたtcpスタック実装に部分的に依存しますが、通常はラウンドロビン方式も使用します。


2
いいえ、これは間違っています。Javaプログラムを作成して名前を解決するInetAddress.getAllByName("example.com")と、すべてのIPアドレスのリストが表示されるため、必要に応じてすべてのIPアドレスへのTCP接続を開始できます。またgetaddrinfo()、Cで使用する場合も同じです。したがって、オペレーティングシステムではなく、開発者が選択することは間違いありません。DNSサーバーは、IPアドレスのリストが返される順序を決定するだけです。
ジョナス

さて、スタックで好きなことを手動で行うことができます-自分でロールバックして、一緒にwinsockを忘れることもできます。ただし、アプリを作成し、OSにその処理を行わせる(抽象化する)場合、動作は前述のとおりです。あなたの質問は、具体的には従来のアプリケーションの動作に関するものであり、可能なことではありません。ほとんどの開発者は、動作を密接に結合するのではなく、未解決の名前を使用して処理し、OSが実行するようにします。
iivel

1
答えがなぜ投票されなかったのかはわかりませんが、質問はブラウザが何をするかについてです。現在、すべてのブラウザーでOSに解決を許可しています(FirefoxとChromeの一部のプラグインを除く)。プロバイダーがダウンした場合に可用性を確保する方法の詳細が必要な場合は、ロードバランサーまたはクラスタリングをご覧ください。
iivel

ブラウザはおそらくあなたの言うとおりです -OSにDNSルックアップを行わせますが、ブラウザにIPアドレスのリストを返します。問題は、最初のアドレスに到達できない場合、最も人気のあるブラウザーは何をするかということです。彼らは2番目を試しますか?
ジョナス

2
Pete Tenereilloが引用した記事は時代遅れであることが知られています(最近ではほとんどが間違っています)。Chromeでは、chrome:// net-internals /#dnsは現在のDNSキャッシュを表示します。OSが使用するIPを常に決定するとは思わない。少なくともChromeでは、AAAAが利用可能な場合は使用するか、Aのみを使用するかを選択できます。OPは....ブラウザはDNSが依存しているから、コンピュータはそのDNSサーバーが見つからない方法を選択する方法について話している
sdaffa23fdsf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.