DNS 详细过程 与 ICMP

发布于:2025-03-05 ⋅ 阅读:(19) ⋅ 点赞:(0)

🌈 个人主页:Zfox_
🔥 系列专栏:Linux

一:🔥 DNS (Domain Name System) 快速了解

💬 DNS 是一整套从域名映射到 IP 的系统

🦋 DNS 背景

🦈 在 TCP/IP 协议中,通过 IP 地址端口号 来确定网络上的一台主机的一个程序。然而,IP 地址不方便记忆,因此人们发明了主机名(hostname),这是一种字符串形式的名称。为了描述主机名和 IP 地址之间的关系,最初使用了 hosts 文件。

Hosts 文件示例

最初,互联网信息中心(SRI-NIC)负责管理这个 hosts 文件:

  • 如果一台新计算机要接入网络,或者某台计算机的 IP 地址变更,都需要向信息中心申请更新 hosts 文件。
  • 其他计算机也需要定期下载更新版本的 hosts 文件,才能正确访问网络资源。

🫙 这种管理方式非常繁琐,因此 DNS 系统应运而生:

  • 一个组织的系统管理机构负责维护系统内每个主机的 IP 地址 和 主机名 的对应关系。
  • 当有新计算机接入网络时,将这些信息注册到数据库中。
  • 当用户输入域名时,会自动查询 DNS 服务器,由 DNS 服务器检索数据库,返回对应的 IP 地址。

至今,我们的计算机上仍然保留了 hosts 文件。在域名解析过程中,系统会优先查找 hosts 文件的内容。

cat /etc/hosts

🦋 域名简介

🕸️ 主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。例如:

  • www.baidu.com
    • com:一级域名,表示这是一个企业域名。同级的还有 net(网络提供商)、org(非盈利组织)等。
    • baidu:二级域名,公司名。
    • www:只是一种习惯用法。之前人们在使用域名时,往往命名成类似于 ftp.xxx.xxxwww.xxx.xxx 的格式,来表示主机支持的协议。

🦋 真实地址查询 —— DNS

🌍 通过浏览器解析 URL 并生成 HTTP 消息后,需要委托操作系统将消息发送给 Web 服务器。但在发送之前,还有一项工作需要完成,那就是查询服务器域名对应的 IP 地址,因为委托操作系统发送消息时,必须提供通信对象的 IP 地址。

比如我们打电话的时候,必须要知道对方的电话号码,但由于电话号码难以记忆,所以通常我们会将对方电话号 + 姓名保存在通讯录里。

所以,有一种服务器就专门保存了 Web 服务器域名与 IP 的对应关系,它就是 DNS 服务器。

🎀 域名的层级关系

DNS 中的域名都是用句点来分隔的,比如 www.server.com,这里的句点代表了不同层次之间的界限。

在域名中,越靠右的位置表示其层级越高。

毕竟域名是外国人发明,所以思维和中国人相反,比如说一个城市地点的时候,外国喜欢从小到大的方式顺序说起(如 XX 街道 XX 区 XX 市 XX 省),而中国则喜欢从大到小的顺序(如 XX 省 XX 市 XX 区 XX 街道)。

实际上域名最后还有一个点,比如 www.server.com.,这个最后的一个点代表根域名。

也就是,. 根域是在最顶层,它的下一层就是 .com 顶级域,再下面是 server.com

所以域名的层级关系类似一个树状结构:

  • 🫧 根 DNS 服务器(.)
  • 🫧 顶级域 DNS 服务器(.com)
  • 🫧 权威 DNS 服务器(server.com)

在这里插入图片描述

根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。

这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。

因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。

🎀 域名解析的工作流程:

  1. 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
  2. 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大,能告诉我 www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
  3. DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。"
  4. 本地 DNS 收到顶级域名服务器的地址后,发起请求问:“老二,你能告诉我 www.server.com 的 IP 地址吗?”
  5. 顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
  6. 本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com 对应的 IP 是啥呀?” server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
  7. 权威 DNS 服务器查询后将对应的 IP 地址 x.x.X.x 告诉本地 DNS
  8. 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

至此,我们完成了 DNS 的解析过程。现在总结一下,整个过程我画成了一个图,

DNS 解析过程

DNS 域名解析的过程蛮有意思的,整个过程就和我们日常生活中找人问路的过程类似,只指路不带路。

那是不是每次解析域名都要经过那么多的步骤呢?

当然不是了,还有缓存这个东西的嘛。

🛸 浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。

二:🔥 使用 dig 工具分析 DNS 过程

🦋 安装 dig 工具

在 Linux 系统中,dig 是一个强大的 DNS 查询工具,通常需要手动安装。使用以下命令安装 dig

# 对于基于 Red Hat 的系统(如 CentOS)
sudo yum install bind-utils

# 对于基于 Debian 的系统(如 Ubuntu)
sudo apt-get install dnsutils

安装完成后,就可以使用 dig 命令查看域名解析过程了。

🦋 dig 命令的基本用法

🎀 1. 查询单个域名的 DNS 信息

最简单的用法是直接查询一个域名的 DNS 信息。例如,查询 www.baidu.com 的 DNS 记录:

dig www.baidu.com

🎀 2. 查询结果的结构

dig 命令的输出分为多个部分:

  1. 版本信息:显示 dig 的版本和命令参数。
  2. 查询状态:显示查询的状态(如 NOERROR 表示查询成功)。
  3. QUESTION SECTION:显示要查询的域名和记录类型。
  4. ANSWER SECTION:显示查询结果。
  5. 统计信息:显示查询时间、DNS 服务器地址等。

例如:

root@hcss-ecs-a9ee:~# dig www.baidu.com

; <<>> DiG 9.18.30-0ubuntu0.22.04.2-Ubuntu <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62911
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;www.baidu.com.			IN	A

;; ANSWER SECTION:
www.baidu.com.		52	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	50	IN	A	183.2.172.177
www.a.shifen.com.	50	IN	A	183.2.172.17

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Mon Mar 03 19:46:51 CST 2025
;; MSG SIZE  rcvd: 101

🎀 3. 解释查询结果

  • QUESTION SECTIONwww.baidu.com 的查询类型为 A(IPv4 地址)。
  • ANSWER SECTION
    • www.baidu.com 被解析为 www.a.shifen.com(CNAME 记录)。
    • www.a.shifen.com 被解析为两个 IP 地址:183.2.172.177183.2.172.17
  • 统计信息:查询时间、使用的 DNS 服务器等。

🦋 高级用法

🎀 1. 查询特定类型的 DNS 记录

dig 支持查询多种 DNS 记录类型。例如,查询 CNAME 记录:

dig www.baidu.com CNAME

查询 MX 记录(邮件交换记录):

dig baidu.com MX

🎀 2. 指定 DNS 服务器

默认情况下,dig 会使用系统配置的 DNS 服务器(如 /etc/resolv.conf 中的服务器)。如果需要指定一个特定的 DNS 服务器,可以使用 @ 符号:

dig @8.8.8.8 www.baidu.com

🎀 3. 反向查询(IP 到域名)

使用 -x 选项可以进行反向查询,将 IP 地址解析为域名:

dig -x 8.8.8.8 +short

🎀 4. 控制输出结果

dig 提供了多种选项来控制输出内容:

  • 精简输出+short,只显示查询结果。
  • 完整输出:默认显示所有信息。
  • 自定义输出:例如,只显示 ANSWER SECTION
dig www.baidu.com +noall +answer

🎀 5. 查看 TTL(生存时间)

TTL 表示 DNS 记录在缓存中的有效时间(单位:秒)。可以通过以下命令查看:

dig www.baidu.com +ttlid

🎀 6. 跟踪查询过程

使用 +trace 选项可以跟踪 DNS 查询的完整过程,从根域到最终结果:

dig www.baidu.com +trace

🦋 DNS 缓存

DNS 缓存可以提高查询效率,减少对外部 DNS 服务器的请求。以下是查看 DNS 缓存的方法:

🎀 1. 系统级 DNS 缓存

在 Windows 系统中,可以使用以下命令查看系统级 DNS 缓存:

ipconfig /displaydns

🎀 2. 浏览器级 DNS 缓存

浏览器也会缓存 DNS 记录。清除浏览器缓存的方法因浏览器而异,可以自行搜索相关操作。

三:🔥 ICMP 协议快速了解

🦋 ICMP 协议简介

✍️ ICMP(Internet Control Message Protocol ,互联网控制消息协议)是一个网络层协议,主要用于在网络中发送 控制消息 和 错误报告。它为 IP 协议提供了必要的补充功能,尤其是在网络调试和故障排查方面。

一个新搭建好的网络,往往需要先进行一个简单的测试来验证网络是否畅通。然而,IP 协议本身并不提供可靠传输机制。如果数据包在传输过程中丢失,IP 协议无法通知传输层丢包的原因。ICMP 正是为了解决这一问题而设计的。

🦋 ICMP 的主要功能

ICMP 的主要功能包括:

  • 确认 IP 包是否成功到达目标地址:通过发送 ICMP Echo Request 和接收 ICMP Echo Reply,可以验证网络连通性。
  • 通知 IP 包在发送过程中被丢弃的原因:例如,目标不可达、超时、数据包过大等。
  • 辅助网络诊断ICMP 提供了多种报文类型,用于诊断网络问题。

在这里插入图片描述

ICMP 是基于 IP 协议工作的,但它并不是传输层的功能,因此仍然被归结为网络层协议。需要注意的是,ICMP 只能搭配 IPv4 使用。如果是 Pv6 的情况,则需要使用 ICMPv6

🦋 ICMP 的报文格式(选学)

📰 关于报文格式, 我们并不打算重点关注, 大家稍微有个了解即可
在这里插入图片描述

ICMP 报文分为两类:

  1. 错误消息:用于通知发送方在传输过程中发生的错误,例如目标不可达、超时等。
  2. 查询消息:用于诊断和查询网络状态,例如 ICMP Echo RequestEcho Reply
    在这里插入图片描述

🦋 ping 命令

ping 是一个基于 ICMP 协议的常用网络工具,用于测试网络连通性。

ping www.example.com
  • ping 命令的作用

    • 验证网络连通性:通过发送 ICMP Echo Request 和接收 ICMP Echo Reply 来确认目标主机是否可达。
    • 统计响应时间:测量从发送请求到接收回复的时间,单位为毫秒。
    • 显示 TTL(Time To Live):IP 数据包的生存周期,表示数据包在网络中可以经过的最大跳数。
  • 工作原理

    • ping 命令会先发送一个 ICMP Echo Request 给目标主机。
    • 目标主机接收到请求后,会返回一个 ICMP Echo Reply
    • 如果目标主机不可达,中间的路由器可能会返回一个 ICMP 错误消息,例如“目标不可达”。
      在这里插入图片描述

🦋 一个值得注意的坑

  • 在面试中,面试官可能会问:“telnet 是 23 端口,ssh 是 22 端口,那么 ping 是什么端口?”

请注意,这是一个常见的陷阱问题 !

ping 命令基于 ICMP 协议,工作在网络层,而端口号是传输层的概念。ICMP 并不使用端口号,因此 ping 不涉及端口号。

🦋 traceroute 命令

traceroute 是另一个基于 ICMP 协议的工具,用于显示数据包从源主机到目标主机所经过的路径。

traceroute www.example.com

在这里插入图片描述

  • 工作原理
    • traceroute 通过发送一系列带有递增 TTL 的 ICMP Echo Request 或 UDP 数据包,记录每个跳数的路由器地址。
    • 每个中间路由器在 TTL 超时时会返回一个 ICMP Time Exceeded 消息,从而揭示路径上的路由器。
    • 最终目标主机返回一个 ICMP Echo Reply 或其他响应,表示路径追踪完成。

四:🔥 浏览器上输入网址域名后点击回车,到底发生了什么?

五:🔥 共勉

😋 以上就是我对 DNS 与 ICMP 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述