Zurück zum Inhaltsverzeichnis des Manuskripts verteilte Systeme

3.3 Domain Name System

Internet-Adressräume

Dass die Rechner im Internet eindeutige Adressen haben und dass die Internetprotokolle mit diesen Adressen arbeiten, ist in der Lehrveranstaltung schon mehrfach benutzt worden. Das Thema Internetadressen wird im Kapitel 5 (Vermittlungsprotokolle im Internet) für die Versionen 4 und 6 des Internetprotokolls (IP) ausführlich dargestellt. Es ist leider unvermeidbar, in diesem Abschnitt darauf vorzugreifen. Aber dieser Vorgriff wird so knapp wie möglich gehalten.

Die im Zusammenhang mit den Internetprotokollen entworfenen Adressen heißen IP-Adressen und bilden den IP-Adressraum. In der nach wie vor überwiegend eingesetzten Protokollversion IPv4 sind diese Adressen positive, 32 Bits große Zahlen, die üblicherweise byteweise, dezimal und mit einem Punkt als Trenner angegeben werden. So ist

141.64.55.107

eine solche Adresse. Anwendungsprotokolle, das sind die der DoD-Ebene 4, haben meistens eine Schnittstelle zu menschlichen Benutzern, und letztere empfinden die Handhabung von IP-Adressen als unhandlich und mühsam. Das ist insbesondere dann der Fall, wenn IPv6-Adressen verwendet werden, denn die haben eine Länge von 16 Bytes. Es ist deshalb für das Internet ein zweiter, benutzerfreundlicherer Adressraum geschaffen worden, der neben dem IP-Adressraum existiert. Die neuen Adressen werden Domänennamen genannt, und ihr Aufbau wird in wenigen Absätzen vorgestellt. Zunächst soll als Beispiel der Domänenname des Webservers unserer Hochschule dienen. Er lautet:

www.bht-berlin.de

Domänennamen sind Bestandteil von URLs. Beispielsweise wird der Webserver unserer Hochschule in einem Browser mit der URL

http://www.bht-berlin.de

angesprochen. Da die Protokolle der DoD-Ebenen unterhalb der Anwendungen keinerlei Kenntnis von Domänennamen haben, musste zusammen mit der Einführung dieser Namen ein Verfahren eingerichtet werden, um zu einem Domänennamen die zugehörige IP-Adresse zu ermitteln - und umgekehrt. Um bei dem Beispiel mit dem Webserver unserer Hochschule zu bleiben: Er hat die IP-Adresse

141.64.226.55

Und diese IP-Adresse muss aus dem Domänennamen abgeleitet werden können, und aus dem Domänennamen die IP-Adresse. Die Umsetzung eines Domänennamens in eine IP-Adresse wird Namensauflösung genannt. Den umgekehrten Vorgang bezeichnet man als umgekehrte Namensauflösung (reverse lookup).

Das Konzept der Domänennamen wurde bereits kurz nach dem Beginn der Internetentwicklung entworfen. Zu diesem Zeitpunkt war das Internet noch überschaubar, so dass es für ausreichend angesehen wurde, die Verbindung zwischen Domänenname und IP-Adresse durch eine Textdatei herzustellen, die auf jedem am Internet beteiligten Rechner zu installieren war. Sie hieß ursprünglich hosts.txt und wurde später ohne Extension als hosts-Datei verbreitet. Auf den Unix/Linux-Systemen ist sie unter dem Pfadnamen

/etc/hosts

zu finden. Es ist eine Textdatei, die mit einem Editor eingesehen werden kann. Gepflegt wurde sie von einer Arbeitsgruppe an der Universität in Stanford (Kalifornien) und mittels FTP verbreitet. Mit zunehmender Größe des Internet erwies sich der Einsatz einer Textdatei zur Namensauflösung als nicht mehr praktikabel und es entstand ab 1983 unter der Bezeichnung Domain Name System (DNS) eine auf viele tausend Rechner verteilte Datenbank mit hierarchisch aufgebauten Domänennamen. Das DNS ist ein Verzeichnisdienst (Namensdienst), ähnlich wie das rmiregistry-Tool, das im Abschnitt 2.3.2 (Remote Method Invocation) verwendet worden ist. Anschaulich erfüllt das DNS die Funktion eines Telefonbuchs für das Internet, wobei im Gegensatz zu einem solchen auch die umgekehrten Suchvorgänge, nämlich die Ermittlung eines Namens zu einer Nummer, möglich sind. Die hosts-Datei existiert auf den Rechnern im Internet nach wie vor und wird bei der Namensauflösung beachtet, dient heute jedoch nur noch für feste Zuordnungen in lokalen Rechnernetzen.

Domänennamen

Um neben den IP-Adressen einen zweiten Adressraum zu erzeugen, werden die Rechner im Internet zu hierarchisch (baumförmig) strukturierten, disjunkten Domänen (domains) zusammengefasst. Eine Domäne kann Rechner und Domänen enthalten. Die in einer Domäne enthaltenen Domänen werden Subdomänen (subdomains) dieser Domäne genannt. Mit einer einzigen Ausnahme ist jede Domäne Subdomäne einer anderen. Diese Ausnahme ist die Wurzeldomäne (root domain), bei der die Hierarchie beginnt. Sie ist keine Subdomäne irgendeiner anderen Domäne, und sie hat keinen Namen. (Technisch gesehen ist ihr Name die leere Zeichenfolge.) Die Domänen, die direkt in der Wurzeldomäne enthalten sind, werden Hauptdomänen (top level domains) genannt. So ist beispielsweise die Domäne namens de (das ist die Länderkennung für Deutschland) eine solche Hauptdomäne. Weitere bekannte Hauptdomänen sind com, net, gov, org usw.

Jeder Rechner und jede Domäne bekommt einen Namen. Diese Namen können im Internet mehrfach vorkommen. Aber jeder Rechner und jede Domäne ist durch eine Folge von Namen, die bei der Wurzel der Hierarchie beginnt und bei dem betreffenden Rechner bzw. der betreffenden Domäne endet, eindeutig identifizierbar. Das ist vergleichbar mit den Pfadnamen von Dateien und Verzeichnissen in einem der üblichen Dateisysteme. Die Namen der Rechner werden Rechnernamen (hostnames), die der Domänen Domänennamen (domain names) genannt. Und die identifizierenden Namensfolgen heißen vollständig qualifizierte Domänennamen (fully qualified domain names). Da diese Bezeichnung etwas unhandlich ist, hat es sich eingebürgert, dafür ebenfalls Domänenname zu sagen, so dass beim Gebrauch dieses Begriffs der jeweilige Kontext beachtet werden muss. In den vollständig qualifizierten Domänennamen werden die bei der Wurzeldomäne beginnenden Namensfolgen von rechts nach links notiert, wobei ein Punkt als Trennzeichen benutzt wird. Als Beispiel betrachte man wieder unseren Hochschul-Webserver. Er läuft auf einem Rechner mit dem Namen

www

und hat den (vollständig qualifizierten) Domänennamen

www.bht-berlin.de.

Zunächst achte man auf den Punkt ganz rechts. Das ist weder ein Satzendezeichen noch ein Schreibfehler, sondern der Trenner zwischen dem Domänennamen de und dem (leeren) Namen der Wurzeldomäne, der rechts daneben steht. Üblicherweise wird dieser Punkt weggelassen, so dass sich der schon mehrfach verwendete Domänename

www.bht-berlin.de

ergibt. Aus diesem Domänennamen ist folgenden Sachverhalt ablesbar: Die Wurzeldomäne enthält eine Hauptdomäne namens de, die eine Domäne namens bht-berlin enthält, in der sich eine Domäne oder ein Rechner namens www befindet. Im vorliegenden Fall ist Letzteres der Name eines Rechners. Für Rechnernamen, Domänennamen und vollständig qualifizierte Domänennamen gibt es Längenbeschränkungen. So sind Rechner- und Domänennamen auf 63 Bytes und vollständig qualifizierte Domänennamen samt der trennenden Punkte auf 255 Bytes beschränkt. Zwischen Groß- und Kleinschreibung wird dabei nicht unterschieden. Gepflegt wird die Domänennamen-Hierarchie von der Internet Corporation for Assigned Names and Numbers (ICANN).

Namensserver

Für die Umsetzung von Domänennamen in IP-Adressen (und umgekehrt) wurde ein dezentral verwaltetes Client/Server-System konzipiert, das mit einer verteilten Datenbank arbeitet, die die Zuordnung von Domänennamen und IP-Adressen enthält. Die Clients werden Resolvers (Auflöser) genannt und die Server Namensserver (name servers). Der im Internet am weitesten verbreitete Namensserver ist ein Open-Source-Produkt namens Berkeley Internet Name Domain Server (BIND).

Da ein einziger Server die weltweit anfallenden Namensauflösungen nicht bewältigen kann, wurde eine ganze Hierarchie von Servern aufgebaut und diese auch noch mehrfach gespiegelt, was nicht nur die Lastverteilung, sondern auch die Verfügbarkeit des DNS unterstützt. Dazu wurde die Hierarchie der Domänennamen in disjunkte Zonen eingeteilt. Eine Zone kann genau einer Domäne entsprechen, mehrere Domänen umfassen oder nur einen Teil einer Domäne enthalten. Definiert wird eine Zone dadurch, dass für sie ein Namensserver verantwortlich ist. Ein Beispiel für eine Zone ist die Wurzelzone, die die Wurzeldomäne umfasst. Der zugehörige Server verwaltet die Adressinformationen für die Hauptdomänen. Es gibt also einen Wurzel-Namensserver, allerdings ist das Wort einen hier diskussionswürdig, denn der Begriff Namensserver ist umfassender, als es den Anschein hat.

Ein Namensserver besteht aus einem primären Namensserver, dem in den öffentlich zugänglichen Domänen wenigstens ein sekundärer Namensserver zugeordnet ist. Letztere werden angesprochen, wenn kein Zugriff auf den primären Server möglich ist. Diese Server werden zusätzlich weltweit mehrfach gespiegelt. Der bereits erwähnte Wurzel-Namensserver liegt weltweit in über zehn offiziellen Ausfertigungen vor. Dazu kommt, dass die großen Internet-Provider, wie zum Beispiel die deutsche Telekom, Kopien (Spiegelungen) der Hauptdomänen-Namensserver führen. In Deutschland ist das Deutsche Network Information Center (DENIC) mit Sitz in Frankfurt/Main für die Verwaltung und den Betrieb des Namensservers für die Hauptdomäne de verantwortlich.

Die vielfachen Spiegelungen eines Datenbestands führen zu einem Replikationsproblem. Als Replikation bezeichnet man die Vervielfältigung von Daten. So ist das Kopieren einer Datei eine Replikation. Auch wenn, wie beispielsweise bei einem Web-Browser, ein Cache (ein versteckter Speicher) eingesetzt wird, liegt eine Replikation vor. Replikation dient dazu, Daten an mehreren Orten zu speichern. Das ist eine Maßnahme, um Daten zu verteilen, und genau das umgekehrte Vorgehen wie bei Datenbanksystemen. Dort werden die Daten möglichst zentral gehalten, um die Einhaltung ihrer Konsistenz zu erleichtern. Üblicherweise folgt eine Replikation einem Master/Slave-Modell. Dabei verwaltet ein Master das Original des Datenbestands, während die Slaves mit den Replikaten arbeiten. In bestimmten zeitlichen Abständen überträgt der Master die Daten an die Slaves, wobei diese Übertragung synchron oder asynchron erfolgen kann. Das Thema Replikation ist zu umfangreich, um es im Rahmen einer Einführung in das Thema verteilte Systeme angemessen behandeln zu können. Eine Vertiefung muss einer Lehrveranstaltung des Masterstudiums vorbehalten bleiben.

Der Zugriff auf solche vielfach vorhandenen Server erfolgt mit einem Anycast-Verfahren. Von Anycast spricht man, wenn eine Gruppe von Kommunikationspartnern angesprochen werden soll, von denen aber nur ein einziger tatsächlich angesprochen wird. Das wird beim DNS realisiert, indem alle gespiegelten Server die gleiche IP-Adresse erhalten wie das Original. Da in den Routing-Tabellen der Rechner keine Rechneradressen, sondern Domänenadressen aufgeführt werden (man vergleiche dazu den Abschnitt 5.2.4 (Routing)), wird ein Zugriff auf einen dieser Server durch die Routing-Tabelle zu dem Server in der aufgeführten Domäne geleitet. Das ist in der Regel der nächstgelegene. Nameserver benutzen üblicherweise UDP als Transportprotokoll, allerdings gibt es durchaus TCP-Implementierungen. Reserviert worden sind dafür die UDP- und TCP-Ports Nummer 53.

Namensauflösung

Die Clients zu den Namensservern heißen, wie eingangs bereits erwähnt, Resolvers (Auflöser), sind Teil der DNS-Software und auf jedem Rechner, der zum Internet gehört, implementiert. Eine Anwendung wie beispielsweise ein Web-Browser, die eine Namensauflösung benötigt, wendet sich an diesen rechnerlokalen Resolver. Dieser durchsucht in einem ersten Schritt die ebenfalls rechnerlokale hosts-Datei nach einem passenden Eintrag. Wird er fündig, ist die Namensauflösung abgeschlossen und die zugehörige IP-Adresse wird an die anfragende Anwendung zurückgegeben. Anderenfalls wendet sich der Resolver an den Namensserver, der für die Domäne, zu der der Rechner mit dem Resolver gehört, zuständig ist. Dazu muss er dessen IP-Adresse (nicht seinen Namen!) kennen. Diese findet er in einer rechnerlokalen Konfigurationsdatei namens resolv.conf, die auf den Unix/Linux-Systemen unter dem Pfadnamen

/etc/resolv.conf

zu finden ist. An der Beliner Hochschule für Technik stand in dieser Datei auf dem Host mit dem Domänennamen compute.bht-berlin.de am Anfang des Jahres 2019:

domain bht-berlin.de search bht-berlin.de nameserver 141.64.0.200

Die Einträge in dieser Datei sagen Folgendes aus: Der Namensserver befindet sich in der Domäne bht-berlin.de (Zeile 1: domain) und die Zone, für die er zuständig ist, besteht nur aus dieser Domäne (Zeile 2: search). Seine IP-Adresse ist direkt hinter dem Schlüsselwort nameserver in der dritten Zeile angegeben.

Findet der über die Datei resolv.conf angesprochene Namensserver in seiner Datenbank den aufzulösenden Domänennamen, dann ist die Namensauflösung beendet. Er gibt die gefundene IP-Adresse an den Resolver zurück, der sie an die anfragende Anwendung weitergibt. Kann der Namensserver den Domänennamen nicht auflösen, dann konsultiert er den nächstgelegenen Wurzel-Namensserver, von dem er die IP-Adresse des Namensservers erhält, der zu der Hauptdomäne gehört, die in dem aufzulösenden Domänennamen enthalten ist. Das heißt, dass der Domänenname von rechts nach links, Server für Server, der Namenshierarchie folgend aufgelöst wird. Das Verfahren liefert entweder die gesuchte IP-Adresse oder eine Negativmeldung, wenn der Domänenname nicht aufgelöst werden kann. Ein Beispiel soll dieses Verfahren verdeutlichen: Angenommen, ein Benutzer an dem Rechner sun65.bht-berlin.de will in seinem Web-Browser mit der URL-Eingabe

http://www.w3.org

die Leitseite des World-Wide-Web-Konsortiums laden. Dann wendet sich der Browser mit dem aufzulösenden Domänennamen www.w3.org an den rechnerlokalen Resolver, der hier sun65-Resolver genannt werden soll. Dieser sucht zunächst in der rechnerlokalen hosts-Datei und wird dort nicht fündig. Daraufhin konsultiert der sun65-Resolver den Namensserver auf dem Rechner mit der IP-Adresse 141.64.0.200, die er in der rechnerlokalen Datei resolv.conf gefunden hat. Dieser Namensserver soll hier als bht-berlin.de-Server bezeichnet werden. Dieser bht-berlin.de-Server sucht erfolglos in seiner Datenbank nach dem Eintrag www.w3.org und wendet sich daraufhin mit Hilfe seiner Routing-Tabelle an den nächstgelegenen Wurzel-Namensserver. Von ihm erhält er die IP-Adresse des für die Domäne org zuständigen Hauptdomänen-Namensserver, der hier org-Server heißen soll. Daraufhin fragt der der bht-berlin.de-Server den org-Server nach dem Namen www.w3.org und erhält von ihm die IP-Adresse des Namensservers, der für die Domäne w3.org zuständig ist. Das ist in unserer Sprechweise der w3.org-Server. Der bht-berlin.de-Server wendet sich an ihn, und dieser kann den Domänennamen www.w3.org auflösen, denn der Rechner namens www gehört in seinen Verantwortungsbereich. Er gibt das Ergebnis seiner Datenbanksuche, nämlich die IP-Adresse zu dem Domänennamen www.w3.org an den bht-berlin.de-Server zurück, der sie an den sun65-Resolver weitergibt. Dieser schließlich kann jetzt die Anfrage des Browsers beantworten, so dass dieser die Leitseite des World-Wide-Web-Konsortiums laden kann.

Java-Schnittstelle zum DNS

Java stellt in dem Paket java.net die Klasse InetAddress zur Verfügung, die unter anderem mit den beiden static-Methoden

getByName() und getByAddress()

DNS-Zugriffe erlaubt. Die Methode getByName() wird mit einem Domänennamen (einem String) parametrisiert und liefert entweder die zugehörige IP-Adresse oder wirft eine UnknownHostException, falls der Name nicht aufgelöst werden kann. Mit der Methode getByAddress() wird eine umgekehrte Namensauflösung realisiert. Parameter ist ein vierstelliges Bytearray mit der IP-Adresse, zurückgegeben wird der Domänenname als String, wobei auch hier im Falle eines Misserfolgs eine UnknownHostException geworfen wird. Das folgende Programmbeispiel zeigt einen sehr elementaren Gebrauch der beiden Methoden:

import java.net.*; class DnsZugriff { public static void main(String[] args) throws Exception { System.out.println("Zugriff auf das DNS"); // Domain name --> IP address // --------------------------------------------------------- String host = "www.tu-berlin.de"; InetAddress ipadr = InetAddress.getByName(host); String adr = ipadr.getHostAddress(); System.out.println(host + " -> " + adr); // IP address --> Domain name // --------------------------------------------------------- adr = "141.64.226.55"; byte b[] = new byte[] { (byte)141, (byte)64, (byte)226, (byte)55 }; ipadr = InetAddress.getByAddress(b); host = ipadr.getHostName(); System.out.println(adr + " -> " + host); } }

Im ersten Teil des Programms soll die IP-Adresse des Web-Servers der Technischen Universität Berlin (TUB) ermittelt und ausgegeben werden. Dazu wird der Aufruf

InetAddress.getByName()

mit dem Domänennamen www.tu-berlin.de parametrisiert. Der Aufruf liefert eine Instanz der Klasse InetAddress namens ipadr, zu der noch der Ausgabestring ermittelt werden muss. Im zweiten Teil wird eine umgekehrte Namensauflösung gezeigt. Dazu wird die IP-Adresse 141.64.226.55 (das ist eine Adresse an unserer Hochschule) zunächst in ein Bytearray überführt. Diese Überführung kann in Java deutlich eleganter vorgenommen werden als in dem Programm. Das benutzte, direkte Verfahren soll die Zuordnung der dezimal geschriebenen Bytes aus der IP-Adresse zu den Bytes des Bytearrays deutlich machen. Ein Programmlauf unter Windows lieferte anfang 2019 folgendes Ergebnis:

c:\>java Dns Zugriff auf das DNS www.tu-berlin.de -> 130.149.7.201 141.64.226.55 -> www62.bht-berlin.de c:\>

Offensichtlich ist unser Web-Server mit zwei Domänennamen ansprechbar:

www.bht-berlin.de www62.bht-berlin.de

Kommandoschnittstelle zum DNS

Zum DNS gibt es unter Linux und Windows eine Kommandoschnittstelle namens nslookup. Dieses Shell-Kommando hat eine Fülle von Parametrisierungsmöglichkeiten, von denen hier nur drei beispielhaft herausgegriffen werden sollen. Alle Beispiele wurden von einem Rechner unter Windows an der Berliner Hochschule für Technik anfang 2019 durchgeführt.

1) Wird als Parameter ein Domänenname angegeben, dann wird eine DNS-Abfrage nach der zugehörigen IP-Adresse durchgeführt:

c:\>nslookup www.bht-berlin.de Server: 141.64.0.200 Address: 141.64.0.200#53 www.bht-berlin.de canonical name = www62.bht-berlin.de Name: www62.bht-berlin.de Address: 141.64.226.55 Aliases: www.bht-berlin.de c:\>

Die Ausgabe beginnt immer mit Daten zum domänenlokalen Namensserver (IP-Adresse samt Portnummer). Dann folgen die angefragten Daten. Sie zeigen, dass der Webserver unserer Hochschule eigentlich www62 heißt, und dass www ein Aliasname für ihn ist.

2) Wird als Parameter eine IP-Adresse angegeben, dann erfolgt eine umgekehrte Namensauflösung, die zu einem Domänennamen führt:

c:\>nslookup 160.45.170.10 Server: 141.64.0.200 Address: 141.64.0.200#53 Name: www.fu-berlin.de Address: 160.45.170.10 c:\>

Die angefragte IP-Adresse gehört zu dem Web-Server der Freien Universität Berlin (FUB).

3) Die Mail-Server in einer Domäne können durch einen nslookup-Aufruf mit der mx-Option (Mail Exchange Option) und der entsprechenden Domäne ermittelt werden:

c:\>nslookup -type=mx bht-berlin.de Server: 141.64.0.200 Address: 141.64.0.200#53 bht-berlin.de MX preference = 20, mail exchanger = mx02.bht-berlin.de bht-berlin.de MX preference = 40, mail exchanger = mx01.bht-berlin.de bht-berlin.de MX preference = 10, mail exchanger = mx03.bht-berlin.de c:\>

Die Ausgabe zeigt, dass an unserer Hochschule drei Mail-Server betrieben werden. Bevorzugt soll der Rechner mx01 angesprochen werden. Um dessen IP-Adresse zu erhalten wird ein weiterer nslookup-Aufruf gestartet:

c:\>nslookup mx01.bht-berlin.de Server: 141.64.0.200 Address: 141.64.0.200#53 Name: mx01.bht-berlin.de Addresses: 2002:638:812:5::23 141.64.5.23 c:\>

Man sieht, dass der Hochschul-Mail-Server mx01 sowohl über eine IPv6-Adresse (das ist die erste) als auch über eine IPv4-Adresse erreicht werden kann. (IPv6-Adressen werden im Abschnitt 5.3.3 behandelt.)



Zurück zum Inhaltsverzeichnis des Manuskripts verteilte Systeme