Verwenden mehrerer A-Records für meine Domain - versuchen Webbrowser jemals mehr als einen?

94

Wenn ich mehrere A-Einträge für meine Domain hinzufüge, werden diese von DNS-Servern in einer Round-Robin-Reihenfolge zurückgegeben.

Beispiel:

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

Aber wie reagieren Webbrowser, wenn der erste Host ( 192.0.2.1) nicht erreichbar ist? Versuchen sie es mit dem zweiten Host ( 192.0.2.2) oder geben sie eine Fehlermeldung an den Benutzer zurück? Gibt es einen Unterschied zwischen den beliebtesten Browsern?

Wenn ich meine eigene Anwendung implementiere, kann ich sie so implementieren, dass die zweite verwendet wird, falls die erste ausfällt. Dies ist also möglich. Und dies wäre sehr hilfreich, um eine fehlertolerante Website zu erstellen.

Jonas
quelle

Antworten:

87

Ja, die meisten Browser der letzten 5 bis 10 Jahre versuchen es mit den anderen A-Datensätzen, wenn einer nicht antwortet. Dies wird anscheinend manchmal als "Browser-Neuversuch" oder "Client-Neuversuch" bezeichnet. Informationen dazu finden Sie so ziemlich nur im Kontext der verschiedenen Browser-Exploits, die diese Funktion für Websites ermöglicht, die sie nicht verwenden (siehe DNS-Rebinding und DNS-Pinning , DNS-Pinning , DNS-Pinning , Anti-Anti-Anti-Pinning, Anti-Anti -anti-dns pinning und so weiter). Irgendwie ein schlechter Ruf, aber er beweist, dass er existiert.

So ziemlich jeder Browser erhält tatsächlich die vollständige Liste der A-Datensätze und prüft tatsächlich andere, wenn derjenige, den er verwendet, ausfällt. Sie können davon ausgehen, dass jeder Client 30 Sekunden warten muss, wenn er zum ersten Mal versucht, auf eine Site zuzugreifen, wenn ein Server ausfällt, bis eine Verbindung zu einer Arbeitsadresse hergestellt wird. Der Browser speichert dann zwischen, welche Adresse funktioniert, und verwendet diese Adresse für zukünftige Anforderungen, sofern dies nicht ebenfalls fehlschlägt. Anschließend muss er die Liste erneut durchsuchen. Also 30 Sekunden auf erste Anfrage warten, danach schön.

Aber es ist nicht etwas, das Sie unbedingt verwenden möchten, es wird viele Einschränkungen in Bezug auf Browserkompatibilität, Betriebssystemkompatibilität, Proxy-Kompatibilität und Cachesteuerungs-Header geben, die seltsame Auswirkungen darauf haben, ob sie sich daran erinnern, welche IPs ausgefallen sind oder anfangen zu haben Während dieser 30 Sekunden auf jede Anfrage warten, verwenden Benutzer, die benutzerdefinierte Clients für Ihre Site schreiben, GethostByname anstelle von Getaddrinfo und sind nicht in der Lage, das Failover, alle möglichen Probleme, zu bewältigen.

Sie können sich auch nicht auf mehrere A-Datensätze verlassen, um "Master" - und "Slave" -Server zuzulassen, da Sie nie wissen, welche Adresse ein Browser aus der Liste auswählen wird. Sie müssen alle in der Lage sein, Besucher beim Laufen zu behandeln, da jeder Verkehr bekommen kann, wenn er aktiv ist. Ein Browser könnte denken, dass Ihr dritter Server aus der Liste am attraktivsten ist, vielleicht sieht er am ähnlichsten aus und wählt ihn aus, obwohl alle drei noch aktiv sind.

Aber wenn Sie mit den Einschränkungen leben und ein einigermaßen einfaches HTTP-System haben, mit dem Sie die Interaktion mit dem Browser vorhersagen können, wird es funktionieren.

Oh, du wirst auch mit vielen Leuten zu tun haben, die dir sagen, dass es das nicht gibt (da dies vor 15 Jahren der Fall war). Sie können jedoch versuchen, einen Domain-Namen mit mehreren A-Einträgen zu telneten, einige mit toten und einige mit guten IP-Adressen, wenn Sie dies nachweisen müssen (ja, selbst ein gutes altes Telnet verwendet jetzt getaddrinfo und verarbeitet heutzutage mehrere A-Einträge ordnungsgemäß). - Es wird eine schöne Liste der IPs ausgedruckt, die es versucht, bis es schließlich erfolgreich ist.

Joff
quelle
12
Hier ist ein Bericht des National Bureau of Economic Research, der Joffs Antwort unterstützt.
Marco
3
Interessanterweise gibt Google, während stackexchange.com auf eine IP verweist, mehrere zurück: $ dig google.com @ ns1.google.com ;; ANTWORT ABSCHNITT: 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
Louis St-Amour
1
Entschuldigung, aber ich glaube nicht, dass es so funktioniert. Browser haben nichts mit dem Auflösen von IP-Adressen zu tun - das passiert in der Systemsoftware. Wenn Sie mehrere A-Datensätze angeben, sollten Sie davon ausgehen, dass ein beliebiger Client einen zufälligen Datensatz aus der Liste erhält.
Jan Steinman
19
Dies ist , wie es in der heutigen Browsern funktioniert. Sie alle entscheiden sich dafür, Systemaufrufe wie getaddrinfo () zu verwenden, um mehrere IP-Adressen abzurufen und das Failover intern abzuwickeln, anstatt eine einzelne IP-Adresse vom System abzurufen. Andere Kommentatoren und Beantworter hier sind Teil der "Menge Leute, die Ihnen sagen, dass dies nicht existiert" aus Joffs letztem Absatz --- Ich nehme an, sie meinen es gut, verbreiten aber Fehlinformationen.
Robert Tupelo-Schneck
1
Um Joffs Aussage von "Browsern vor 5-10 Jahren" zu unterstützen, hier ein Test des National Bureau of Economic Research, der besagt, dass Sie ein solches System auf IE 8 bringen. :)
Jomar Sevillejo
5

Seien Sie gewarnt, dass Windows Vista die dummen Teile von RFC3484 implementiert (dh das Backportieren von IPV6 nach IPV4) und die IP-Adresse bevorzugt, die die meisten Präfixbits mit der IP-Adresse des Benutzers teilt, anstatt zufällig eine auszuwählen. Da die meisten Benutzer IP-Adressen haben, die mit 192.168 beginnen, bedeutet dies, dass die meisten Vista-Daten von jeder Ihrer IP-Adressen mit den meisten Präfix-Bits geteilt werden. Microsoft hat dieses Problem in Windows 7 und höher behoben, sodass es nicht mehr so ​​problematisch ist wie früher.

Mike Scott
quelle
Vista, das ist gut!
Uhr
3

Dies ist die grundlegende Methode zur Verteilung des DNS-Lastenausgleichs: DNS Round Robin. Dies hat nichts mit dem Browser zu tun, es hängt von der Implementierung des Resolvers und dem lokalen / Remote-Cache der DNS-Adresse ab. Änderungen sind, dass wenn ein Server ausfällt, Ihre Website aufgrund von Caching in der DNS-Schicht möglicherweise nicht erreichbar ist.

Hier finden Sie eine grundlegende Erklärung zu Round Robin DNS in WikiPedia.

keatch
quelle
1
Nun, da der Browser der Resolver ist, hängt es von der Implementierung des Browsers ab, wie ich weiß.
Jonas
2
Nein, es gibt die Systembibliothek, die die DNS mithilfe des DNS-Nameservers auflöst, den Sie im System eingerichtet haben. Die Funktionen sind Bestandteil der Standard-Betriebssystembibliothek.
Keatch
Sowohl nslookup cnn.comunter Windows als auch host cnn.comunter Linux wird jedoch eine Liste von IP-Adressen zurückgegeben, sodass dies definitiv von der Implementierung des Browsers abhängt .
Jonas
5
@iivel: Nein, das stimmt nicht. Wenn ich ein Java-Programm schreibe und einen Namen mit InetAddress.getAllByName ("example.com") auflöse, erhalte ich eine Liste mit allen IP-Adressen, damit ich eine TCP-Verbindung zu allen herstellen kann, wenn ich möchte. Und es ist dasselbe, wenn Sie getaddrinfo () in C verwenden. Es ist also definitiv eine Wahl, die die Entwickler treffen und nicht das Betriebssystem.
Jonas
1
@ J.Money Bei dieser Frage geht es genau um die Implementierung, nicht darum, wie wir das machen können.
Franklin Yu
0

Das Betriebssystem bestimmt, welche IP-Adresse verwendet werden soll, nicht der Browser. Windows führt ein Round-Robin-Verfahren für die zurückgegebene Liste durch (in der von DNS zurückgegebenen Liste), verwendet jedoch weiterhin dieselbe Adresse, bis DNS gelöscht wird oder das Zeitlimit überschritten wird. * ix-Implementierungen hängen teilweise von der Implementierung des gebündelten TCP-Stacks ab, folgen jedoch in der Regel auch einer Round-Robin-Methode.

Iivel
quelle
2
Nein, das ist falsch. Wenn ich ein Java-Programm schreibe und einen Namen mit InetAddress.getAllByName("example.com")auflöse, erhalte ich eine Liste mit allen IP-Adressen, damit ich eine TCP-Verbindung zu allen herstellen kann, wenn ich möchte. Und es ist dasselbe, wenn Sie getaddrinfo()in C verwenden. Es ist also definitiv eine Entscheidung, die die Entwickler treffen und nicht das Betriebssystem. Der DNS-Server entscheidet nur, in welcher Reihenfolge die Liste der IP-Adressen zurückgegeben wird.
Jonas
Ok, so können Sie mit dem Stapel von Hand machen, was Sie wollen - Sie könnten sogar Ihren eigenen rollen und Winsock vergessen. Wenn Sie jedoch eine App schreiben und das Betriebssystem seine Sache erledigen lassen (abstrahieren), ist das Verhalten wie angegeben. Ihre Frage bezog sich speziell auf das traditionelle Anwendungsverhalten - nicht auf das, was möglich ist. Die meisten Entwickler verwenden den ungelösten Namen und lassen das Betriebssystem das tun, was es tut, anstatt das Verhalten eng miteinander zu verknüpfen.
iivel
1
Ich bin nicht sicher, warum die Antwort abgelehnt wurde, aber die Frage ist, was Browser tun. Gegenwärtig lassen alle Browser das Betriebssystem die Auflösung vornehmen (abgesehen von einigen Plugins für Firefox und Chrome). Wenn Sie Einzelheiten darüber wünschen, wie Sie bei einem Ausfall eines Anbieters die Verfügbarkeit sicherstellen können, schauen Sie sich Load Balancer oder Clustering an.
iivel
Browser tun wahrscheinlich, was Sie sagen - lassen Sie das Betriebssystem die DNS-Suche durchführen, aber es gibt eine Liste mit IP-Adressen an den Browser zurück. Und die Frage ist: Was machen die beliebtesten Browser, wenn die erste Adresse nicht erreichbar ist? versuchen sie die zweite?
Jonas
2
Der Artikel, den Sie von Pete Tenereillo zitiert haben, ist bekanntermaßen veraltet (heutzutage meistens falsch). In Chrome zeigt chrome: // net-internals / # dns den aktuellen DNS-Cache an. Ich glaube nicht, dass das Betriebssystem immer die zu verwendende IP bestimmt. Zumindest in Chrome können Sie AAAA verwenden, falls verfügbar, oder nur A. OP spricht , wie Browser wählen Sie aus DNS beruht, nicht , wie der Computer seinen DNS - Server finden ....
sdaffa23fdsf