我不是在询问DNS如何将域名转换为IP地址的“事” - 我可以找到大量非常好的信息。我似乎无法找到的描述是应用程序如何以及何时与DNS交互以在双方之间建立连接。我写这个问题的方式会让我的误解变得清晰 - 这不是故意的,我只是无法理解这个" DNS互动"。
如果有一个网络链接(我没有找到)解释了我的问题的答案,请提供。
让我举一个简单的场景。我想访问我最喜欢的网站,果味馅饼。
所以我输入我的网络浏览器:http://www.fruity-pies.com
现在,在“连接过程”的早期,该地址需要转换为IP地址 - 这就是DNS为我所做的事情。 DNS,或者更准确地说BIND(?),“在应用层工作”和HTTP一样。所以我认为HTTP(或我正在使用的任何服务,如ftp)“知道”需要调用DNS / BIND(?)。发送的是域名fruity-pies.com,返回的是资源的IP地址,213.1.19.34?这是怎么回事?如果这是正确的,那么每个应用程序层进程都必须有代码来调用" DNS和复制对我来说似乎不正确。
虽然应用程序已从DNS收到IP地址,但这只在网络层变得很重要。从应用层传递到传输层的IP地址也是如此,但是被忽略了,因为它与传输层无关?传输层将原始消息拆分为数据包,并添加端口号以标识哪个进程处理目标上的消息。然后数据包通过IP地址(来自应用层与DNS / BIND的交互)传递到将IP地址作为标题打开的网络层?这是对的吗?
很抱歉,如果这是一个误解,但是为了强调我目前的主要问题是DNS / BIND如何适合通信的设置。我可以看到,一旦解析了IP地址,就不再需要DNS / BIND进行此特定通信。
答案 0 :(得分:0)
我想我已经找到了解决我的IPv4连接问题的方法。来自https://wiki.python.org/moin/TcpCommunication
的原始Python源代码我相信当应用程序尝试使用套接字与某个“远程”进程通信时,无论是否需要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层的工作方式相同,并且每个“调用”都将参数“向下”传递到下一层。因此,如果OSI应用程序在级别7运行,则某个级别6进程会收到连接请求。类似地,我认为从试图与远程进程通信的应用程序进行套接字调用,其中目标地址表示为字符串,例如www.fruity-pies.com,某些传输层进程将负责将其转换为一个IP地址。这不是它的工作方式。