域名解析:如何从浏览器到服务器
脚本之家
为什么域名和IP地址要共存
域名与IP地址的共存,主要出于两个方面的考虑:一是提升用户体验,二是提高运行效率。具体来说, IP地址是一串32位的数字,使用十进制表示时,长度可能达到192.168.1.0这样的长度。想象一下,如果每次访问网站都需要输入这样一长串数字,用户体验会相当糟糕。不仅记忆这些数字对许多人来说是个难题,而且我们常用的网站肯定不止一个,每次都要输入这么长的地址,显然非常不便捷。
与此同时,如果我们在推广网站时使用这样的长串数字地址,显然也不利于传播。因此,域名应运而生,它的存在使得人们可以更容易地记忆和推广网站地址。
然而,仅仅依靠域名还不够高效。 IP地址在计算机网络中扮演着至关重要的角色。 IPv4中的IP地址仅需4个字节,而域名则可能需要几十到几百个字节来表示。这种差异使得底层路由器在处理域名时负担加重。因此,尽管域名方便了人类使用,但IP地址在计算机网络的底层运行中仍然发挥着不可或缺的作用。


域名是如何被解析为IP地址的呢?
这就要涉及到 DNS(域名系统)的解析过程。当我们在浏览器中输入一个域名时,浏览器会向DNS服务器发送请求,查询该域名对应的IP地址。DNS服务器会根据预先存储的域名与IP地址的映射关系,返回相应的IP地址信息。这样,我们就能够通过域名来访问网站,而底层路由器则继续使用IP地址进行高效的网络传输。

答案是,这种映射关系是提前配置好的。当然,这并非唯一的可能性, DNS有时也会通过动态主机配置协议(DHCP)进行分配。例如,在MacOS系统中,DNS的配置就如同以下示例所示。

当然,除了图形界面配置,你还可以选择通过命令行来查看和修改DNS设置。在MacOS系统中,相关的配置文件位于“/etc/resolv.conf”路径下。一旦你拥有了DNS服务器,接下来的配置步骤可能会显得相对简单。
我给你一个域名,你能迅速返回其对应的IP地址吗?当然,互联网上有数以万计的DNS服务器,我们不可能逐一查询。

DNS查询优化
那么,浏览器在输入域名到页面展示的过程中,究竟是如何高效完成这一任务的呢?这背后其实涉及到了 DNS的分层优化。
要理解这一优化机制,我们首先得探究域名的构成。域名并非简单的字符串堆砌,而是由多个域组成,每个域之间以点号分隔。例如,www.google.com这个域名,从直观上看,我们可能会认为www是主域,google是次级域,而实际上,根域(即最左边的点号)才是域名的起点。
为了更清晰地展示这种层次结构,我们可以将其分为几个层级:根域、一级级域、二级域名(或子域名)、以及主机名。通过这种分层设计, DNS能够高效地定位和解析域名,从而实现快速的网络连接。

NS服务器采用分布式存储方式,将域名的数据分散存储在多台DNS服务器上。然而,同一域的数据总是被集中存储在同一台DNS服务器上,且同一台服务器能同时存储多个域的数据。这种设计方式,用图表来展示,就是这样的:
关于如何获取根服务器的信息,我们的设备或上网设备都会内置根服务器列表。总共有13台根DNS服务器,其地址可以直接获取而无需查询。当然,这13台服务器难以应对全球互联网用户的请求,因此实际上存在许多镜像服务器来分担负载。
接下来,我们将通过实际操作来验证这些概念。
在DNS查询中,QUESTION SECTION下的完整域名www.google.com包含了根域。而紧随其后的IN和A,分别代表网络类型和网络地址类型。 网络类型IN表明当前查询针对的是互联网,这是默认的网络类型。而类型A则明确指出我们正在查询的是IP地址。
在ANSWER SECTION中,DNS服务器的响应结果得以展示。通常,响应结果会包含多条DNS记录,每条记录都对应一个IP地址。此外,69的TTL值以秒为单位,表示在接下来的69秒内无需再次发送请求。
最下方的统计信息提供了本次DNS查询的耗时,以及请求的DNS服务器的地址和端口。值得注意的是,由于某些命令行工具可能省略了对根服务器的请求显示,我们可以通过添加+trace参数来查看详细的分级查询过程。以www.36kr.com为例,我们可以进一步探索DNS查询的详细步骤。
在DNS查询过程中,首先会向根域名服务器发起请求,随后它会指引我们找到负责com域的DNS服务器。接着,我们会进一步向负责36kr.com域的DNS服务器请求。最终,通过这一系列的查询,我们成功地获取到了www.36kr.com的IP地址。
然而,如果每次查询都从根服务器开始,显然是不高效的。由于域名和IP地址的对应关系通常变动不大,因此DNS服务器会采用 缓存机制来存储查询结果,以避免不必要的重复查询。
虽然我在描述时仅提及一个DNS服务器中存储同级别域信息的情况,但实际上,同一台DNS服务器可能也保存着不同层级的域信息。例如,com域和google.com域的信息可能就存储在同一台机器上。然而,值得注意的是, 这些缓存数据并非永久有效。倘若在缓存有效期内DNS数据发生了变更,那么缓存中的数据将不再准确。此时,为了确保数据的最新性,我们需要手动清除旧的DNS缓存。

