HTTP GET方法相对于DNS协议如何工作?


18

我正在尝试了解TCP / IP堆栈中的应用程序层协议。我知道HTTP和DNS协议都位于顶层(应用程序层)。因此,当浏览器想要访问资源时,它必须向HTTP服务器发送请求,例如:

GET www.pippo.it/hello.htm HTTP/1.1

根据HTTP协议的规则发出此请求,它使用页面URL,而不是IP地址。

我知道DNS请求是将URL转换为IP所必需的。所以我的问题是:HTTP是否调用DNS协议?在我看来,这是不可能的,因为两者都是高层协议(因此DNS无法为HTTP提供服务)。同样,即使TCP(位于较低级别)也无法要求更高级别协议(例如DNS)的服务。

那么DNS请求何时发生?谁来执行这样的请求?


1
您可以接受其中一个答案来阐明问题中的哪个答案吗?
030 2014年

Answers:


38

除非浏览器正在与中介(代理)对话,否则所讨论的HTTP请求实际上是无效的。

如果浏览器直接与Web服务器通信,则您的示例看起来更像以下示例:

GET /hello.htm HTTP/1.1
Host: www.pippo.it

现在,从一个角度来看,考虑一下OSI模型:

OSI模型

我们有3个系统在起作用:

  • 一个客户端运行的浏览器
  • 一个Web服务器服务的网站
  • 一个DNS服务器知道该网站的IP地址

涉及的协议自下而上(与OP的最小相关设置):

  • 知识产权
  • TCP,UDP
  • HTTP,DNS

HTTP通信通过TCP协议(TCP在IP协议之上)进行,而DNS通信(在这种情况下)通过UDP协议(UDP也在IP协议之上)进行。

简而言之,这是通信顺序:

  1. 运行浏览器的客户端使用UDP协议向DNS服务器请求的A记录www.pippo.it

    1.1。在客户端上,由操作系统负责解决问题并与浏览器进行对话---浏览器从不直接与DNS服务器对话,而是通过调用gethostbyname()或更新的getaddrinfo()通过OS与OS进行对话。在Windows上,其中OS解析地址的顺序由像很可能定义这个,而在Linux上解决优先级被定义/etc/nsswitch.conf

  2. 使用UDP协议的DNS服务器使用记录/ IP地址(如果存在)响应客户端

  3. 客户端打开的端口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服务器。这是可配置的,不一定正确,但这是我熟悉的操作系统上的默认设置。


4
@trikly:这就是“主机”标头的用途。没有它,每个IP地址只能有一个网站。这是HTTP / 1.0和HTTP / 1.1之间的主要区别。幸运的是,HTTP / 1.0浏览器现在很少见了-但是,如果您想迎合它们,那么每个站点都需要一个不同的IP地址(它们仍可以托管在同一服务器上)。
AE

1
@AE谢谢。我想我的问题不清楚,这就是为什么赫尔沃耶不明白我在说什么。(我应该说的是域名而不是URL)。很高兴您仍然了解。
2014年

1
您说“ 这不是正确的HTTP请求 ”,这几乎是正确的,但它比您暗示的更近:“ 为了允许在将来版本的HTTP中的所有请求中转换为absoluteURI,所有HTTP / 1.1服务器必须在其中接受absoluteURI形式。请求 ”。(RFC 2616§5.1.2)因此GET http://www.pippo.it/hello.htm HTTP/1.1是有效的请求(如果有异常的话)。这也是对HTTP代理的有效且通常的请求。
wfaulk 2014年

1
gethostbyname()有点过时了。一个人最好使用getaddrinfo()...
glglgl 2014年

1
@Utku不幸的是,否,因为SSH假定另一端使用SSH协议,而telnet是纯文本协议,并且可以用于与其他任何普通协议(例如POP3,IMAP)进行对话,只要它们不使用SSL / TLS,在这种情况下,需要使用sslwrap之类的辅助工具来包装telnet会话。
HrvojeŠpoljar'16

12

HTTP通过TCP传输,TCP是IP协议。要发出HTTP请求,浏览器必须打开一个TCP连接,并且这样做,它需要目标IP地址(即服务器的IP地址)。为了解析服务器的主机名,它必须发出DNS请求(通常,当程序调用其名称解析功能时,DNS请求本身是由操作系统发送的;但是,没有什么阻止程序将自身的DNS请求发送给DNS服务器)。建立连接后,它可以发送其HTTP请求,该请求包含到所请求资源的路径,以及带有服务器主机名的Host字段(例如Host: www.pippo.it)。主机名不在请求行上(实际上是GET /hello.htm HTTP/1.1),除非将请求发送到HTTP代理(在这种情况下,存在完整的URL,包括协议部分,例如GET http://www.pippo.it/hello.htm HTTP/1.1),


谢谢,现在更清楚了,但还不完全清楚。您编写该浏览器必须发出DNS请求。好的,但是从DNS服务器收到IP后,如何使用它?我的意思是,这样的IP不会出现在HTTP请求中。因此,我认为在发出HTTP请求之前还有一步,并且我认为这是连接的打开。这一点对我来说不是很清楚...再次感谢!
Giancarlo Perlo 2014年

5
实际上,需要IP来打开TCP连接,在其中传输HTTP请求。实际上,客户端和服务器的IP地址都与连接的所有数据包一起发送。了解其工作方式的最佳方法可能是安装一个数据包捕获工具(Wireshark是一款出色的多平台和开放源代码工具),捕获一个简单的HTTP请求,将其从网络活动的其余部分中过滤掉,然后看看如何所有数据包都通过网络发送。您实际上也应该能够在TCP连接之前看到DNS请求。
Ale 2014年

1
代理请求应使用Host标头,而不是将完整URL放在GET行中。
OrangeDog 2014年

1
@OrangeDog:不,相反。RFC 7230(第5.3.2节)明确指出,向代理发出请求的客户端务必在请求行中使用绝对URI。(仍然必须有一个Host标头,它从请求行复制信息;第5.4节)。
hmakholm在Monica

8

该过程如下:

  1. 用户(您)为浏览器提供了一个URL,例如 http://www.pippo.it/hello.htm
  2. 浏览器将其分为三个部分:

    • 协议 http
    • 主机名 www.pippo.it
    • 网址路径 /hello.htm

    (一个更复杂的URL也可能包含其他部分,我暂时将其忽略)

  3. 浏览器知道要创建IP连接,它需要一个IP地址。要获取IP地址,它需要使用DNS(除非已缓存该地址)。

    1. 浏览器向操作系统询问DNS服务器的IP地址。假设它得到了8.8.8.8
    2. 浏览器构造以下多层连接:

      • IP层:连接 8.8.8.8
      • UDP层:设置目标端口53的数据包
      • DNS层:A为主机名记录创建DNS请求www.pippo.it

      当然,我省略了很多细节,例如涉及的数据包的确切格式。

    3. 浏览器收到一个DNS响应(位于UDP之上,位于IP等之上),该响应给出了的IP地址www.pippo.it,例如10.11.12.13
  4. 浏览器知道要创建TCP连接,它需要一个端口号。为了获得端口号,它http在其内部表中查找协议,并得知它应该使用端口80。
  5. 浏览器构造以下多层连接:

    • IP层:连接 10.11.12.13
    • TCP层:将数据包设置为目标端口80
    • HTTP层:为/hello.htm主机上的URL创建一个HTTP请求www.pippo.it(因为处的计算机10.11.12.13可能托管多个域,因此它需要知道需要哪个域)

      GET /hello.htm HTTP/1.1
      Host: www.pippo.it
      ...
      

    当然,我省略了TCP握手等所有细节。

  6. 浏览器收到一个HTTP响应(位于TCP之上,位于IP等之上),包含以下内容: hello.htm

很好地讲,我将提到浏览器现在检查该响应的内容,并标识所需的任何其他资源:图像,CSS,Javascript等。然后,它将对每个此类资源重复整个过程。


4
步骤3确实不是应用程序本身要做的。该应用程序仅使用类似于getaddrinfogethostbyname的要求操作系统来解析其地址。另外,操作系统通常使用多种机制来尝试查找名称,而不仅仅是DNS。(通常,除了DNS之外,至少还有主机文件。)
HåkanLindqvist 2014年

谢谢!这是一个非常令人印象深刻且详细的答案,也非常有用!
Giancarlo Perlo 2014年

这是最好的答案。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.