問題のHTTP要求は、ブラウザが仲介者(プロキシ)と通信していない限り、実際には無効です。
ブラウザーがWebサーバーと直接通信している場合、例は次のようになります。
GET /hello.htm HTTP/1.1
Host: www.pippo.it
次に、これを理解するために、OSIモデルを検討します。
動作中のシステムは3つあります。
- クライアントブラウザを実行しています
- サイトを提供するWebサーバー
- DNSサーバーサイトのIPアドレスを知ります
関連するプロトコルは、下から上(OPに関連する最小限のセット)です。
HTTP通信はTCPプロトコル(TCPはIPプロトコルの上)で行われますが、この場合、DNS通信はUDPプロトコル(UDPもIPプロトコルの上)で行われます。
短い通信シーケンスを次に示します。
クライアントは、ブラウザを実行し、要求するDNSサーバー用A
のレコードをwww.pippo.it
UDPプロトコルを使用して、。
1.1。クライアントでは、解決部分を実行してブラウザに戻るオペレーティングシステムです。ブラウザは、gethostbyname()または新しいgetaddrinfo()を呼び出してOSを介してDNSサーバーと直接通信することはありません。Windowsでは、OSがアドレスを解決するためには、おそらくのようなものによって定義され、この Linux上で解決の優先順位がで定義されている間、/etc/nsswitch.conf
DNSサーバーに、応答をUDPプロトコルを使用して、クライアントが存在する場合、記録/ IPアドレスで
クライアントは、ポート80上のTCPコネクションオープンし、Webサーバを、次のテキストを書き込みます。
HTTPリクエスト:
GET /hello.htm HTTP/1.1
Host: www.pippo.it
コンソールまたはコマンドプロンプトで次のような操作を行うことで、同じことを模倣できます。
> telnet www.pippo.it 80
Trying 195.128.235.49...
Connected to www.pippo.it.
Escape character is '^]'.
GET /hello.htm HTTP/1.1
Host: www.pippo.it
2行の空行が続きます。要求されたコンテンツが存在する場合、Webサーバーはそれを画面に印刷します。反対側にブラウザがある場合、応答テキストはブラウザによって解析され、すべてのタグ、リンク、スクリプト、および画像がWebページと呼ばれるものにレンダリングされます。
実際には、さらに詳細があります。たとえば、すでにドメインにアクセスしている場合、ブラウザはIPアドレスをキャッシュするため、DNS解決は不要になります。また、最新のブラウザは、実際に必要になる前に解決を試み(DNSプリフェッチ)、ブラウジングを高速化する場合があります。
さらに、コンピューターのhosts
ファイルに静的レコードがある場合があります。レコードが要求と一致する場合、ローカルの静的エントリが最初に使用され、DNSサーバーは一切接続されません。これは構成可能であり、必ずしも真実ではありませんが、私が使い慣れているオペレーティングシステムのデフォルトです。