除非浏览器正在与中介(代理)对话,否则所讨论的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协议之上)进行。
简而言之,这是通信顺序:
运行浏览器的客户端使用UDP协议向DNS服务器请求的A
记录www.pippo.it
。
1.1。在客户端上,由操作系统负责解决问题并与浏览器进行对话---浏览器从不直接与DNS服务器对话,而是通过调用gethostbyname()或更新的getaddrinfo()通过OS与OS进行对话。在Windows上,其中OS解析地址的顺序由像很可能定义这个,而在Linux上解决优先级被定义/etc/nsswitch.conf
使用UDP协议的DNS服务器使用记录/ 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
其次是两个空行。如果请求的内容存在,Web服务器将在屏幕上打印它。如果另一侧有浏览器,则响应文本将被浏览器解析,并且所有标记,链接,脚本和图像都将在我们称为网页的页面中呈现。
实际上,还有更多细节,例如,如果您已经访问过某个域,浏览器可能会缓存IP地址,因此DNS解析变得不必要。另外,现代浏览器可能会在您真正需要解析之前尝试进行解析(DNS预提取)以加快浏览速度。
此外,您的计算机可能在hosts
文件中包含静态记录。如果记录与请求匹配,则首先使用本地静态条目,并且永远不会联系任何DNS服务器。这是可配置的,不一定正确,但这是我熟悉的操作系统上的默认设置。