session 设置中的什么时候“调用”DNS

At what point in session set up is DNS “called”

我不是在问 DNS 如何将域名转换为 IP 地址的“事情”——我可以找到大量关于这方面的非常好的信息。我似乎找不到关于应用程序如何以及何时与 DNS 交互以在两方之间建立连接的描述。我的误解将在我写这个问题的方式中变得清晰 - 这不是故意的,我只是无法理解这个 "DNS interaction".

如果有网站 link(我还没有找到)可以解释我的问题的答案,请提供。

让我举一个简单的场景。我想访问我最喜欢的网站,fruity-pies。

所以我在网络浏览器中输入:http://www.fruity-pies.com

现在,在“连接过程”的早期,地址需要转换为 IP 地址——这就是 DNS 为我所做的。 DNS,或者更准确地说是 BIND(?),与 HTTP 一样在应用程序层“工作”。所以我认为 HTTP(或我正在使用的任何服务,例如 ftp)以某种方式“知道”需要调用 DNS/BIND (?)。发送的是域名,fruity-pies.com,返回的是资源的IP地址,213.1.19.34?。这是怎么回事?如果这是正确的,那么每个应用程序层进程都必须具有 "call" DNS 的代码,而这种重复对我来说似乎不正确。

虽然应用程序已经从 DNS 接收到 IP 地址,但这只在网络层变得重要。那么 IP 地址是否从应用层传递到传输层,但被忽略了,因为它与传输层无关?传输层将原始消息拆分为数据包,并添加端口号以标识哪个进程在目的地处理该消息。然后数据包与 IP 地址(来自与 DNS/BIND 的应用层交互)一起传递到网络层,网络层将 IP 地址作为 header?对吗?

抱歉,如果这是一种误解,但要强调我目前的主要问题是 DNS/BIND 如何适应通信设置。我可以看到,一旦 IP 地址已解析,DNS/BIND 就不再需要此特定通信。

我想我已经解决了我的 IPv4 连接问题。来自 https://wiki.python.org/moin/TcpCommunication

的原始 Python 来源

我相信当应用程序尝试使用 套接字 与某些 "remote" 进程通信时,是否需要 DNS 服务取决于参数传递给应用程序套接字。因此,在以下摘录自 Python 3 中编码的客户端,该客户端正在尝试连接到远程位置

import socket  

<< 这告诉 Python 程序将要建立网络连接,因此包含必要的代码

TCP_IP = 'www.fruity-pies.com'  

<< 这是应用程序要连接的位置

TCP_PORT = 40375  

<< 这是客户端应用程序想要连接到 fruity-pies 的端口

BUFFER_SIZE = .....
MESSAGE = .......

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  

<< 这会创建(?)一个套接字并表明我想使用 IPv4(AF_INET)和 TCP(SOCK_STREAM)协议进行通信

s.connect((TCP_IP, TCP_PORT))  

<< 这是连接到远程位置的尝试。由于远程地址是一个字符串 'www.fruity-pies.com' ,它会被截获并通过本地主机文件或 DNS 进行名称解析,尝试找到一条记录以将 www.fruity-pies.com 转换为一个 IP 地址。

.... rest of code

我认为我的误解是基于这样一种想法,即 TCP/IP 处理的工作方式与 OSI 层相同,并且每个 "call" 都将参数 "down" 传递给下一层。因此,如果 OSI 应用程序运行在第 7 层,则某些第 6 层进程会收到连接请求。同样,我认为从试图与远程进程通信的应用程序进行套接字调用,其中目标地址表示为字符串,比如 www.fruity-pies.com,某些传输层进程将负责用于将其转换为 IP 地址。这不是它看起来的工作方式。