Ich versuche, Anwendungsschichtprotokolle im TCP / IP-Stapel zu verstehen. Ich weiß, dass sowohl das HTTP- als auch das DNS-Protokoll auf der obersten Ebene (Application Layer) verbleiben. Wenn ein Browser auf eine Ressource zugreifen möchte, muss er eine Anfrage an den HTTP-Server senden, wie zum Beispiel:
GET www.pippo.it/hello.htm HTTP/1.1
Bei dieser Anforderung gemäß den Regeln des HTTP-Protokolls wird die Seiten-URL und nicht die IP-Adresse verwendet.
Ich weiß, dass eine DNS-Anfrage erforderlich ist, um eine URL in eine IP zu konvertieren. Meine Frage lautet also: Ruft HTTP das DNS-Protokoll auf? Es scheint mir unmöglich, da beide Protokolle der obersten Ebene sind (DNS kann also keinen Dienst für HTTP bereitstellen). Auf die gleiche Weise kann auch TCP (das auf einer niedrigeren Ebene bleibt) keinen Dienst auf einem höheren Protokoll wie DNS anfordern.
Wann kommt die DNS-Anfrage? Und wer führt eine solche Anfrage durch?
quelle
Antworten:
Die betreffende HTTP-Anfrage ist tatsächlich nur gültig, wenn der Browser mit einem Vermittler (Proxy) spricht.
Ihr Beispiel sieht ungefähr so aus, wenn der Browser direkt mit einem Webserver kommuniziert:
Betrachten Sie nun das OSI-Modell, um dies in die richtige Perspektive zu rücken:
Wir haben 3 Systeme in Aktion:
Die beteiligten Protokolle sind von unten nach oben (Mindestrelevanz auf OP gesetzt):
Die HTTP-Kommunikation erfolgt über das TCP-Protokoll (TCP steht über dem IP-Protokoll), während die DNS-Kommunikation in diesem Fall über das UDP-Protokoll erfolgt (UDP steht auch über dem IP-Protokoll).
Hier ist die Kommunikationssequenz in Kürze:
Der Client , auf dem der Browser ausgeführt wird, fragt den DNS-Server nach einem
A
Eintragwww.pippo.it
unter Verwendung des UDP-Protokolls.1.1. Auf dem Client übernimmt das Betriebssystem die Lösung und kommuniziert mit dem Browser. Der Browser kommuniziert nie direkt mit dem DNS-Server, sondern über das Betriebssystem, indem er gethostbyname () oder das neuere Programm getaddrinfo () aufruft . Unter Windows , in dem die Reihenfolge der OS - Adressen aufgelöst wird durch so etwas wie wahrscheinlich definiert dies , während auf Linux die Lösung Vorrang definiert ist durch
/etc/nsswitch.conf
Der DNS-Server , der das UDP-Protokoll verwendet, antwortet dem Client mit einer Datensatz- / IP-Adresse, falls vorhanden
Der Client öffnet eine TCP-Verbindung auf dem Port 80 des Webservers und schreibt den folgenden Text:
HTTP-Anfrage:
Sie können dasselbe nachahmen, indem Sie in Ihrer Konsole oder Eingabeaufforderung Folgendes ausführen:
gefolgt von zwei leeren Zeilen. Wenn der angeforderte Inhalt vorhanden ist, druckt der Webserver ihn auf dem Bildschirm aus. Wenn sich auf der anderen Seite ein Browser befindet, wird der Antworttext vom Browser analysiert, und alle Tags, Links, Skripte und Bilder werden auf einer so genannten Webseite gerendert.
In der Realität gibt es einige Details, z. B. können Browser IP-Adressen zwischenspeichern, wenn Sie bereits eine Domain besucht haben, sodass eine DNS-Auflösung nicht mehr erforderlich ist. Moderne Browser versuchen möglicherweise auch, das Auflösen durchzuführen, bevor Sie es tatsächlich benötigen ( DNS-Prefetching ), um das Surfen zu beschleunigen.
Darüber hinaus verfügt Ihr Computer möglicherweise über statische Datensätze in einer
hosts
Datei. Wenn ein Datensatz mit der Anforderung übereinstimmt, wird zuerst der lokale statische Eintrag verwendet und es wird nie ein DNS-Server kontaktiert. Dies ist konfigurierbar und nicht unbedingt wahr, aber es ist die Standardeinstellung für die mir vertrauten Betriebssysteme.quelle
GET http://www.pippo.it/hello.htm HTTP/1.1
also eine gültige, wenn auch ungewöhnliche Anfrage. Es wäre auch eine gültige und übliche Anfrage an einen HTTP-Proxy.gethostbyname()
ist etwas veraltet. Man sollte bessergetaddrinfo()
...HTTP wird über TCP transportiert, ein IP-Protokoll. Um eine HTTP-Anfrage zu stellen, muss der Browser eine TCP-Verbindung herstellen und benötigt dazu die Ziel-IP-Adresse (dh die IP-Adresse des Servers). Um den Hostnamen des Servers aufzulösen , muss er daher eine DNS-Anfrage stellen (im Allgemeinen wird die DNS-Anfrage selbst vom Betriebssystem gesendet, wenn ein Programm seine Funktionen zur Namensauflösung aufruft; nichts hindert ein Programm jedoch daran, DNS-Anfragen selbst an das DNS zu senden Server). Sobald die Verbindung hergestellt ist, kann sie ihre HTTP-Anfrage senden, die den Pfad zur angeforderten Ressource und ein Host- Feld mit dem Hostnamen des Servers enthält (z
Host: www.pippo.it
. B. ). Der Hostname steht nicht in der Anforderungszeile (das wäre tatsächlich der Fall)GET /hello.htm HTTP/1.1
), es sei denn, die Anforderung wird an einen HTTP-Proxy gesendet (und in diesem Fall ist die vollständige URL einschließlich des Protokollteils vorhanden, z. B.GET http://www.pippo.it/hello.htm HTTP/1.1
).quelle
Die Prozedur geht so:
http://www.pippo.it/hello.htm
Der Browser teilt das in drei Teile:
http
www.pippo.it
/hello.htm
(Eine kompliziertere URL könnte auch andere Teile haben. Diese Möglichkeit werde ich vorerst ignorieren.)
Der Browser weiß, dass er zum Herstellen einer IP-Verbindung eine IP-Adresse benötigt. Um eine IP-Adresse zu erhalten, muss DNS verwendet werden (sofern die Adresse nicht zwischengespeichert ist).
8.8.8.8
.Der Browser baut die folgende mehrschichtige Verbindung auf:
8.8.8.8
A
Eintrag für den Hostnamenwww.pippo.it
Natürlich verzichte ich auf viele Details, z. B. zum genauen Format der betroffenen Pakete.
www.pippo.it
angibt, sagen wir, dass dies der Fall ist10.11.12.13
http
in seiner internen Tabelle nach und erfährt, dass es Port 80 verwenden sollte.Der Browser baut die folgende mehrschichtige Verbindung auf:
10.11.12.13
HTTP-Ebene: Erstellen Sie eine HTTP-Anforderung für die URL
/hello.htm
auf dem Hostwww.pippo.it
(da der Computer10.11.12.13
möglicherweise mehrere Domains hostet, muss er wissen, welche gewünscht wird).Natürlich verzichte ich auf alle Details des TCP-Handshakes und so weiter.
hello.htm
Und zum guten Teil möchte ich erwähnen, dass der Browser jetzt den Inhalt dieser Antwort untersucht und alle zusätzlichen Ressourcen identifiziert, die benötigt werden: Bilder, CSS, Javascript usw. Anschließend wird der gesamte Vorgang für jede dieser Ressourcen wiederholt.
quelle
getaddrinfo
odergethostbyname
, um das Betriebssystem zu bitten, die Adresse dafür aufzulösen. Außerdem verwendet das Betriebssystem in der Regel mehrere Mechanismen, um nach Namen zu suchen, nicht nur nach DNS. (In der Regel mindestens die Hosts-Datei zusätzlich zu DNS.)