DNS详细介绍

本文详细介绍了DNS的工作原理,包括域名系统的作用、DNS报文格式、DNS服务器类型(权威DNS、递归DNS和公共DNS)以及DNS解析过程。通过实例展示了DNS查询和回答报文的内容,帮助读者深入理解DNS的运作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在研究DNS,总结出来一些内容给大家分享,有解释不清或者内容有误的地方,还请各位博友指出,谢谢!

        1. 什么是DNS?


      网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名。我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。

      DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。


   2.DNS域名称

    域名系统作为一个层次结构和分布式数据库,包含各种类型的数据,包括主机名和域名。DNS数据库中的名称形成一个分层树状结构称为域命名空间。域名包含单个标签分隔点,例如:im.qq.com。

完全限定的域名 (FQDN) 唯一地标识在 DNS 分层树中的主机的位置,通过指定的路径中点分隔从根引用的主机的名称列表。下图显示与主机称为 im 内 qq.com DNS 树的示例。主机的 FQDN 是 im.qq.com。

 DNS域的名称层次结构



根域、顶级域、二级域

DNS系统一般采用树状结构进行组织,以ru.wikipedia.org为例,org为顶级域名,wikipedia为二级域名,ru为三级域名,域名树状组织结构如下图所示。

52e57c5c96885ac93fe63ee949fc6068a996949a

3.DNS资源记录
    DNS
数据库中包含的资源记录 (RR)。 每个 RR 标识数据库中的特定资源。我们在建立DNS服务器时,经常会用到SOA,NS,A之类的记录,在维护DNS服务器时,会用到MX,CNAME记录。
   常见的RR见下图:

4. DNS服务器类型

权威DNS

权威DNS即最终决定域名解析结果的服务器,开发者可以在权威DNS上配置、变更、删除具体域名的对应解析结果信息。阿里云云解析( https://wanwang.aliyun.com/domain/dns )即权威DNS服务提供商。

递归DNS

递归DNS又称为Local DNS,它没有域名解析结果的决定权,但代理了用户向权威DNS获取域名解析结果的过程。递归DNS上有缓存模块,当目标域名存在缓存解析结果并且TTL未过期时(每个域名都有TTL时间,即有效生存时间,若域名解析结果缓存的时间超过TTL,需要重新向权威DNS获取解析结果),递归DNS会返回缓存结果,否则,递归DNS会一级一级地查询各个层级域名的权威DNS直至获取最终完整域名的解析结果。关于域名解析的具体流程下文会举例说明。

公共DNS

公共DNS是递归DNS的一种特例,它是一种全网开放的递归DNS服务,而传统的递归DNS信息一般由运营商分发给用户。一个比较典型的公共DNS即Google的8.8.8.8,我们可以通过在操作系统配置文件中配置公共DNS来代替Local DNS完成域名解析流程。

在实际的使用过程中,我们通常不需要手工指定自己的Local DNS地址。运营商会通过DHCP协议在系统网络初始化阶段将Local DNS地址分配给我们的计算机。当我们需要使用公共DNS服务时,我们就必须手工指定这些服务的地址。以Linux为例,我们可以通过在'/etc/resolv.conf'中添加Local DNS地址项来改变本机Local DNS的地址。

5. DNS解析过程

那么我们的DNS是怎么解析一个域名的呢?

1.现在我有一台计算机,通过ISP接入了互联网,那么ISP就会给我分配一个DNS服务器,这个DNS服务器不是权威服务器,而是相当于一个代理的dns解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到IP返回给你。

<think>嗯,用户现在想了解DNS报文的结构。我之前已经回答了关于grep命令的问题,现在需要转向网络协议方面的内容。首先,我得确认自己对DNS报文的理解是否正确。DNS报文分为请求和响应,结构上应该包括头部、问题部分、回答部分、授权部分和额外部分。 用户可能是个刚开始学习网络的学生,或者是个开发者,需要调试DNS相关的问题。他们需要详细的报文结构信息,可能包括每个字段的含义和长度。要确保解释清晰,结构分明,可能还需要例子来帮助理解。 接下来,我需要回忆DNS报文的具体结构。头部有12字节,包含事务ID、标志、问题数、回答数等。标志字段又分为QR、Opcode、AA、TC、RD、RA、Z和RCODE。每个部分需要详细说明,比如QR表示请求或响应,Opcode定义查询类型等。 问题部分包含查询的域名、类型和类。域名需要转换为标签序列,比如将www.example.com变成3www7example3com0。类型和类通常是A记录和IN,但还有其他可能的值,需要简要提及。 回答部分、授权部分和额外部分的结构类似,包括域名、类型、类、TTL、数据长度和资源数据。这里可能需要解释每个字段的作用,比如TTL是生存时间,资源数据根据类型不同而不同,如A记录是IPv4地址。 还要考虑用户可能的深层需求,比如他们是否想了解DNS的工作原理,或者如何分析抓包数据。可能需要提到工具如Wireshark,以及实际应用中的例子,如解析响应时的资源数据格式。 需要确保使用中文,避免专业术语过多,但也要准确。结构要清晰,分部分说明,可能用列表或表格来展示字段。检查是否有遗漏的部分,比如Z字段保留位,或者RCODE的错误类型。 最后,总结一下DNS报文的结构,帮助用户形成整体认识。可能还要提醒一些注意事项,比如报文大小限制,或者常见问题如截断标志TC的处理方法。确保回答准确可靠,参考RFC文档,但用通俗易懂的语言表达。</think>以下是 DNS 报文结构的详细解析(基于 **RFC 1035** 标准): --- ### **DNS 报文整体结构** DNS 报文分为 **请求报文**(Query)和 **响应报文**(Response),均由以下 **5 个部分**组成: ``` +----------+----------+----------+----------+----------+ | 头部 | 问题 | 回答 | 授权 | 额外 | | Header | Question | Answer | Authority| Additional| | (12字节) | | | | | +----------+----------+----------+----------+----------+ ``` --- ### **1. 头部(Header)** 固定 **12 字节**,结构如下: | 字段名 | 长度 | 说明 | |--------------------|-------|----------------------------------------------------------------------| | **事务ID** | 2字节 | 随机生成,用于匹配请求与响应 | | **Flags(标志位)**| 2字节 | 关键控制字段,详细分解如下: | | - QR | 1bit | `0=请求`,`1=响应` | | - Opcode | 4bit | 操作类型:`0=标准查询`,`1=反向查询`,`2=服务器状态请求` | | - AA | 1bit | 授权应答(仅响应有效) | | - TC | 1bit | 截断标志(报文过长被截断时置1) | | - RD | 1bit | 递归查询请求(客户端要求服务器递归查询) | | - RA | 1bit | 递归可用(服务器表示是否支持递归查询) | | - Z | 3bit | 保留位,固定为0 | | - RCODE | 4bit | 响应状态:`0=无错误`,`1=格式错误`,`2=服务器故障`,`3=域名不存在`等 | | **问题数** | 2字节 | 问题部分的记录数(通常为1) | | **回答数** | 2字节 | 回答部分的记录数(响应报文中有效) | | **授权数** | 2字节 | 授权部分的记录数(指向权威域名服务器) | | **额外数** | 2字节 | 额外部分的记录数(如附加的IP地址) | --- ### **2. 问题部分(Question)** 定义查询内容,结构如下: | 字段名 | 长度 | 说明 | |--------------|----------------|----------------------------------------------------------------------| | **查询域名** | 可变长度 | 域名以标签序列表示(如 `www.example.com` 转换为 `3www7example3com0`)| | **类型** | 2字节 | 查询的资源类型:<br>`A=1`(IPv4地址),`AAAA=28`(IPv6),`MX=15`等 | | **类** | 2字节 | 通常为 `IN=1`(Internet) | **域名编码示例**: `www.example.com` → 转换为 `\x03www\x07example\x03com\x00`(每个标签前加长度字节,结尾用`0`) --- ### **3. 回答/授权/额外部分(Answer/Authority/Additional)** 这三个部分结构相同,包含 **资源记录(Resource Record, RR)**: | 字段名 | 长度 | 说明 | |--------------|----------------|----------------------------------------------------------------------| | **域名** | 可变长度 | 同问题部分的域名编码 | | **类型** | 2字节 | 资源记录类型(如 `A`, `CNAME`, `NS` 等) | | **类** | 2字节 | 通常为 `IN=1` | | **TTL** | 4字节 | 生存时间(秒),决定缓存有效期 | | **数据长度** | 2字节 | 后续资源数据的长度 | | **资源数据** | 可变长度 | 根据类型不同而不同:<br> - `A` 记录:4字节IPv4地址<br> - `CNAME` 记录:域名编码 | --- ### **4. 报文示例** #### **DNS 请求报文(查询 `www.example.com` 的A记录)** ``` Header: Transaction ID: 0x1234 Flags: 0x0100 (标准查询,RD=1) Questions: 1 Answer/Authority/Additional: 0 Question: Name: www.example.com → \x03www\x07example\x03com\x00 Type: 1 (A) Class: 1 (IN) ``` #### **DNS 响应报文** ``` Header: Transaction ID: 0x1234 Flags: 0x8180 (QR=1, RA=1, RCODE=0) Questions: 1 Answers: 1 Authority/Additional: 0 Answer: Name: www.example.com → \x03www\x07example\x03com\x00 Type: 1 (A) Class: 1 (IN) TTL: 86400 Data Length: 4 Data: 93.184.216.34 → 0x5db8d822 ``` --- ### **5. 常见工具** - **`dig` 命令**:直接查看DNS报文内容 ```bash dig +noall +answer www.example.com ``` - **Wireshark**:抓包分析完整的DNS报文结构 --- ### **关键注意事项** 1. **域名压缩**:为避免重复,DNS响应可能使用偏移指针压缩域名(如 `0xc00c` 表示从报文第12字节开始引用) 2. **UDP限制**:默认使用UDP协议,最大报文长度512字节(超过则TC标志置1,需改用TCP) 3. **扩展机制**:EDNS(Extension Mechanisms for DNS)支持更大报文和附加选项
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值