DNS 如何工作

简介: 在 TCP/IP 协议套件 中, DNS 是一个应用层协议。 DNS 协议默认基于用户数据电报协议(UDP, User Datagram, Protocol),但是也可以工作于传输控制协议(TCP, Transmission Control Protocol),当防火墙禁用 UDP 时作为备用方案。

在之前的文章,我们讨论了 递归查询过程概述,在我们进一步讨论 DNS 如何影响性能之前,我们需要理解 DNS 协议如何工作。

在 TCP/IP 协议套件 中, DNS 是一个应用层协议。 DNS 协议默认基于用户数据电报协议(UDP, User Datagram, Protocol),但是也可以工作于传输控制协议(TCP, Transmission Control Protocol),当防火墙禁用 UDP 时作为备用方案。

UDP 和 TCP 都是传输层协议。UDP 是轻量协议,它不要握手来建立连接或传输确认,因此减少了需要传输的数据包数量,时间流逝,来回往返。UDP 协议最大的骗局是,它不保证另一方能收到数据包,因此,应用程序必须处理没有收到响应的情况。

另一方面,TCP 需要通过三次握手建立连接 并且有传输错误检测,但是需要更多的数据往返次数,当然也需要更多时间。

因为我们正在讨论 TCP/IP 协议,我们将在某些领域深入到比特级别。但是不用担心 - 你不需要学习如何处理标志位来理解 DNS。在 Catchpoint 我们使用并强烈建议使用抓包工具,比如:WireShark 来提高数据包的可读性以及更方便调试。

协议

DNS 协议有 3 种类型的信息组成:请求,响应,更新。我们将不会讨论 “更新”,因为它不会影响最终用户。DNS 信息有 5 个部分: DNS 头,Question, 应答资源记录,权威资源记录,额外资源记录。

DNS 头

包头包含识别信息,以及关于消息其余部分包含什么的提示(摘要)。包头由 6 个字段组成,每个字段 16 位,一共 12 个字节。最前的 16 是传输 ID,用于匹配查询和响应,由客户端创建于查询信息,服务端在响应中返回。

下一个字段是标记。这是 DNS 数据包最重要的部分,因为这些标记用于区分请求和响应,以及迭代查询和递归查询。他们按以下顺序排列:

Bit 1: QR, 请求/响应标记(query/response),为 0 时信息为请求,为 1 时信息为响应。
Bits 2-5: Opcode,操作代码(operation code),告知接收主机消息意图。通常 0 意味着普通请求, 1 为反向请求,2 为 服务器状态。
Bit 6: AA,权威应答(authoritative answer)。只有响应主机是请求域名的权威名称服务器时设置该标记。
Bit 7: TC,截断(truncated)。如果数据包超出 UDP 最大 512 字节限制,则设置该标记。
Bit 8: RD,预期递归(recursion desired),若为 0 则为迭代查询,为 1 则为递归查询。更多递归内容见 文章。
Bit 9: RA,递归可用,若服务器支持递归时设置。
Bit 10: Z,保留为未来使用,所有的请求和响应中都必须设置为 0。
Bit 11: AD,真实数据(authentic data)。在域名系统安全扩展(DNSSEC)中使用,在老机器中被认为是 Z 的一部分。
Bit 12: CD,检测可用(checking disabled)。在域名系统安全扩展(DNSSEC)中使用。在老机器中被认为是 Z 的一部分。
Bit 13-16: Rcode 反馈代码(return code)。通常情况下,没有错误为 0 ,名称不存在则为 3。
头部保留的 4 个字段为问询数,应答资源记录,权威资源记录,和额外的资源记录。这些数字取决于是查询还是响应,以及响应类型。通常情况下,至少有一个请求。

查询

查询在请求和响应里都会展示,并且应该是完全相同的。有些工具,比如 WireShark 管他叫做请求,如上图。

通常情况下,每个数据包只有一个查询或请求。问题有 3 部分组成:请求名称,应该是一个主机名,比如:www.google.com ,查询类型和一个查询类别,对于互联网来说,几乎总是 1 或者 IN。查询类型是资源记录类型。以下列出了一些主要的类型,这里 有一个完整列表。

A, IPv4 地址:IPv4 是域名映射的类型。每个网站域名至少有 1 个 A 记录,否则最终用户将访问不到你的网站。
AAAA, Quad-A, IPv6 地址记录:IPv6 地址是域名映射的类型。由于IPv4 地址不再可用,目前正在大力支持 IPv6 -- 然而,还不是每个 网络运营商(ISP)和网站都支持它。
MX,Mail eXchange 记录:指定由那个邮件服务器代表域名拥有者接收邮件信息。
NS,Name Server 记录:映射域名到它的权威名称服务器。每个域名必须由至少 1 个 NS 记录。

目录
相关文章
|
存储 JavaScript 前端开发
JS篇(Array、Object)
JS篇(Array、Object)
197 1
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
机器学习/深度学习 数据采集 监控
基于深度学习的图像识别在智能监控系统中的应用
【7月更文挑战第37天】 随着人工智能技术的突飞猛进,特别是深度学习在图像处理领域的应用日益成熟,智能监控系统得到了空前的发展。本文旨在探讨基于深度学习模型的图像识别技术如何被集成到智能监控系统中,以提高监控效率和准确性。文中首先介绍了深度学习的基本概念及其在图像识别中的优势,随后详细阐述了构建一个端到端的智能监控系统所需考虑的关键要素,包括数据预处理、模型选择与训练、系统集成及性能评估等。最后,通过案例分析,展示了该技术在实际场景中的应用效果,并对其未来的发展趋势进行了展望。
|
网络协议 Docker Python
|
Kubernetes 网络协议 容器
Kubernetes 探针使用介绍
当我们在 K8s 上运行应用时,应用是否运行正常这是我们比较关心的,但是如果我们只是通过查看应用的运行状态,这是很难判断出应用是否处于运行状态的;因为在某些时候,容器正常运行并不能代表应用健康,所以我们可以通过 Kubernetes 提供的探针。
1318 0
Kubernetes 探针使用介绍
|
小程序 算法 数据安全/隐私保护
小程序获取用户手机号
小程序获取用户手机号
322 0
|
XML 存储 前端开发
Spring事务传播行为实战
Spring框架提供了事务管理的标准实现,且可以通过注解或者XML文件的方式声明和配置事务。 通过异步事件的方式解耦服务调用,可以提高程序的响应速度,并且避免因为事务传播行为而导致的事务问题。 本文以一个电商平台包裹出库的业务为实际背景,通过异步事件与线程池的方式解耦嵌套事务,提高程序并发性能;为了便于问题的分析和方案的理解,同时还讲解了Spring的事务管理,并着重介绍了几种不同的事务传播行为。
389 0
Spring事务传播行为实战
|
SQL JSON 分布式计算
MaxCompute与DataWorks权限介绍和示例
该篇文章的主要内容是MaxCompute与DataWork权限的经典知识点汇总,MaxCompute常使用的权限分类以及经典使用语句,以及MaxCompute基于policy策略的生产环境和开发环境为用户做权限管理的示例。
2345 0
|
JavaScript 前端开发 开发者
loader - 分析 webpack 调用第三方 loader 的过程| 学习笔记
快速学习 loader - 分析 webpack 调用第三方 loader 的过程
loader  - 分析 webpack 调用第三方 loader 的过程| 学习笔记
|
C语言
细讲qsort函数用法
qsort函数是C语言提供一个库函数,主要用于排序各种类型的数据,是一个通用的排序函数,排序内核思想使用的是快速排序
276 0
细讲qsort函数用法