DNS详细过程与ICMP协议解析
DNS详细过程与ICMP协议解析
DNS(Domain Name System)是一整套从域名映射到IP的系统。在TCP/IP协议中,通过IP地址和端口号来确定网络上的一台主机的一个程序。然而,IP地址不方便记忆,因此人们发明了主机名(hostname),这是一种字符串形式的名称。为了描述主机名和IP地址之间的关系,最初使用了hosts文件。互联网信息中心(SRI-NIC)负责管理这个hosts文件。当一台新计算机要接入网络,或者某台计算机的IP地址变更,都需要向信息中心申请更新hosts文件。其他计算机也需要定期下载更新版本的hosts文件,才能正确访问网络资源。这种管理方式非常繁琐,因此DNS系统应运而生。一个组织的系统管理机构负责维护系统内每个主机的IP地址和主机名的对应关系。当有新计算机接入网络时,将这些信息注册到数据库中。当用户输入域名时,会自动查询DNS服务器,由DNS服务器检索数据库,返回对应的IP地址。至今,我们的计算机上仍然保留了hosts文件。在域名解析过程中,系统会优先查找hosts文件的内容。
域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。例如:
- www.baidu.com:
- com:一级域名,表示这是一个企业域名。同级的还有net(网络提供商)、org(非盈利组织)等。
- baidu:二级域名,公司名。
- www:只是一种习惯用法。之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx或www.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服务器。
域名解析的工作流程:
- 客户端首先会发出一个DNS请求,问www.server.com的IP是啥,并发给本地DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址)。
- 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到www.server.com,则它直接返回IP地址。如果没有,本地DNS会去问它的根域名服务器:“老大,能告诉我www.server.com的IP地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
- 根DNS收到来自本地DNS的请求后,发现后置是.com,说:“www.server.com这个域名归.com区域管理”,我给你.com顶级域名服务器地址给你,你去问问它吧。
- 本地DNS收到顶级域名服务器的地址后,发起请求问:“老二,你能告诉我www.server.com的IP地址吗?”
- 顶级域名服务器说:“我给你负责www.server.com区域的权威DNS服务器的地址,你去问它应该能问到”。
- 本地DNS于是转向问权威DNS服务器:“老三,www.server.com对应的IP是啥呀?” server.com的权威DNS服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
- 权威DNS服务器查询后将对应的IP地址x.x.X.x告诉本地DNS。
- 本地DNS再将IP地址返回客户端,客户端和目标建立连接。
至此,我们完成了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命令的输出分为多个部分:
- 版本信息:显示dig的版本和命令参数。
- 查询状态:显示查询的状态(如NOERROR表示查询成功)。
- QUESTION SECTION:显示要查询的域名和记录类型。
- ANSWER SECTION:显示查询结果。
- 统计信息:显示查询时间、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 SECTION:www.baidu.com的查询类型为A(IPv4地址)。
- ANSWER SECTION:
- www.baidu.com被解析为www.a.shifen.com(CNAME记录)。
- www.a.shifen.com被解析为两个IP地址:183.2.172.177和183.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报文分为两类:
- 错误消息:用于通知发送方在传输过程中发生的错误,例如目标不可达、超时等。
- 查询消息:用于诊断和查询网络状态,例如ICMP Echo Request和Echo 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或其他响应,表示路径追踪完成。