计算机网络 | 图解 DNS & HTTPDNS 原理

简介: 计算机网络 | 图解 DNS & HTTPDNS 原理

前言


  • DNS 往往是网络请求的第一步,在计算机网络面试中,DNS 也是除 HTTP、TCP 之外较重点考察的知识,其重要性可想而知。
  • 在这篇文章里,我将梳理图解 DNS & HTTPDNS 的原理知识。如果能帮上忙,请务必点赞加关注,这真的对我非常重要。


系列文章



相关文章



目录

image.png

1. DNS 原理


1.1 DNS 简介


域名(Domain Name,Domain) 是一个在互联网上标识主机或主机组的名称,相当于 IP 地址的别名,相对于晦涩难记的 IP 地址,域名更显得易于记忆。


域名系统(Domain Name System,DNS) 则是将域名解析 IP 地址的一项互联网基础服务,提供该服务的服务器称为 域名服务器(Domain Name Server)


1.2 DNS 解析过程


互联网上的域名系统是一个分布式的系统,结构上是一个四层的树状层次结构,如下图所示:

image.png


  • 本地域名服务器(Local Name Server,local DNS):如果通过 DHCP 配置,local DNS 由互联网服务提供商(ISP,如联通、电信)提供;
  • 根域名服务器(Root Name Server):当 local DNS 查询不到解析结果时,第一步会向它进行查询,并获取顶级域名服务器的IP地址。全球一共有 13 个根域名服务器(除了它们的镜像),它们并不直接用于域名解析,仅用于指出可查询的顶级域名服务器。这个网站记录了现有的 13 个根域名服务器:www.internic.net/domain/name…
  • 顶级域名服务器(Top-level Name Server):负责管理在该顶级域名服务器下注册的二级域名,例如**.com 顶级域名服务器**,而 baidu.com 权威服务器是注册在 .com 的权威域名服务器;
  • 权威域名服务器(Authoritative Name Server):在特定区域内具有唯一性,负责维护该区域内的域名与 IP 地址的映射关系。在 DNS 应答报文中,标志位 AA 标识本次 DNS 记录是否来自权威域名服务器,否则可能来自缓存。


DNS 解析分为 递归查询迭代查询 两种方式。其中,客户端与 Local DNS 之间一般采用递归查询,而 DNS 服务器之间一般采用迭代查询。


**提示:**如果 DNS 服务器之间使用递归查询,对根域名服务器的负担就太重了,而如果客户端与本地域名服务器之间使用迭代查询,DNS 服务对于客户端就显得不透明了。


  • 递归查询:


所谓递归查询,与我们经常提及的递归函数的思想是一致的,即:**如果 DNS 服务器查不到该域名,那么它将重新以客户端的身份向其他 DNS 服务器发送查询请求报文,客户端只要等待最终结果即可。**用伪代码呈现可能比较好理解,类似这样:


fun dns(client: String, server: String, domain: String): String {
    if (server 查询 domain 成功) {
        return "ip"
    }
    // server 以客户端身份递归查询
    return dns(server, "其他 DNS 服务器", domain)
}
复制代码
  • 迭代查询:


所谓迭代查询,即:**如果 DNS 服务器查不到该域名,它不会替客户端完成后续的查询工作,而是回复下一步应当向哪一个域名服务器进行查询,随后客户端重新向这个新的 DNS 服务器发送查询请求。**用伪代码呈现可能比较好理解,类似这样:


fun dns(client: String, server: String, domain: String): String {
    while (true) {
        if (server 查询 domain 成功) {
            return "ip"
        } else {
            // client 继续以客户端身份迭代查询
            server = "其他 DNS 服务器"
        }
    }
}
复制代码


下面以查询www.baidu.com为例,阐述一次 DNS 解析过程:


  • 0、首先检查 DNS 缓存,下一节我们会讲,如果缓存老化或未命中,客户端需要向 local DNS 发送查询请求报文
  • 1、客户端local DNS 发送查询报文 query www.baidu.comlocal DNS 首先检查自身缓存,如果存在记录则直接返回结果,查询结束;如果缓存老化或未命中,则:
  • 2、local DNS根域名服务器发送查询报文 query www.baidu.com,返回 .com 顶级域名服务器的地址(如果查无记录)
  • 3、local DNS.com 顶级域名服务器发送查询报文 query www.baidu.com,返回baidu.com所在的权威域名服务器的地址(如果查无记录)
  • 4、local DNSbaidu.com 权威域名服务器发送查询报文 query www.baidu.com,得到 ip 地址,存入自身缓存并返回给客户端

image.png

1.3 DNS 报文


由于下一节我们将实战抓取 DNS 包,所以这一节我们先介绍 DNS 报文格式。DNS 协议定义了三种报文,查询报文 & 应答报文 & 更新报文,它们的总体上结构是一致的。

image.png

  • 报文首部(Header)


  • 1、事务 ID(Transaction ID):用来关联 DNS 查询与应答,DNS客户端每次发送查询请求都会使用不同的 ID,而服务器在响应中重复这个 ID
  • 2、标志(Flags):报文的标志字段,详见下图
  • 3、问题数(Question Count):指定问题部分条目数
  • 4、回答资源记录数(Answer Resource Record count):指定应答部分中回答资源条目数
  • 5、权威资源记录数(Authority Resource Record count):指定权威资源记录数
  • 6、附加资源记录数(Additional Resource Record count):指定附加资源记录数

image.png

  • 问题(Question)


问题用于表达具体查询的问题,问题个数与报文首部中的 **问题数(Question Count)**字段一致。需要注意的是,按照 DNS 查询的目的,DNS 解析可以分为 正向解析反向解析 两种,正向解析将域名解析为 IP 地址,而反向解析则恰恰相反,用于将 IP 地址解析域名。问题条目中 查询类型 是比较重要的字段,这里仅列出 5 个比较常用的类型:


QTYPE 描述
A(1) 将域名解析为 IPv4 地址
NS(2) 查询域名服务
CNAME(5) 规范名称
PTR(12) IP 地址解析为域名
AAAA(28) 将域名解析为 IPv6 地址


image.png

NSCNAME 不好理解,这里解释下:


CNAME(Canonical NAME) 是规范名称或别名,用于将一个域名指向另一个域名。具体方法是:将一个域名作为 A 记录 指向 IP 地址,而其他域名作为别名指向 A 记录的域名,此时如果需要更改 IP 地址,就不需要更改每个域名的映射了,只需要修改 A 记录 ,而 CNAME 记录将自动指向新的 IP 地址。在 第 1.4 节 DNS 解析实战 中你将直接看到 CNAME 的应用。


image.png

NS(Name Server) :域名服务器记录,用来指定该域名由哪个 DNS 服务器来进行解析


  • 资源记录(Resource Record)

回答资源记录、权威资源记录和附加资源记录的格式相同,其中 TTL(Time to Live,单位秒) 表示资源记录的生存时间,也就是允许缓存的时间。0 表示该记录只能用于当前响应,不允许被缓存。


image.png

1.4 DNS 报文的传输协议


DNS 协议在传输层同时使用 TCP 和 UDP 协议,占用的是 53 端口,那么在什么情况下使用这两种协议?


  • 在区域传输时使用 TCP 协议

主辅域名服务器在进行区域传送时(主辅域名服务器用于平衡负载),需要传送的数据比简单的查询 & 应答报文的数据量要大得多了。使用 UDP 传输不可靠,所以采用应用于传输大量数据,可靠性更高的 TCP 协议。

  • 在域名解析时使用 UDP 协议

为了得到一个域名的 IP 地址,往往会向多个域名服务器查询,如果使用 TCP 协议,那么每次请求都会存在三次握手连接时延,这样使 DNS 服务变得很慢。

需要注意的是,DNS 协议规定 UDP 报文段的最大长度为 512 字节,如果 DNS 报文段过长时会被截断(此时 DNS 报文头中标志位 TC(Truncation)置为 1),多余的数据会直接丢弃。这是因为 UDP 是无连接的,无法确定哪几个 UDP 包是属于同一个 DNS 报文段的。


1.5 DNS 解析实战


计算机网络是在实践中发展起来的学科,仅停留在学习理论知识的层面是不够的,下面我们将在实践中学习 DNS 解析。在这里,我们是用 WireShark 抓取查询www.baidu.com的 DNS 请求,具体步骤如下:


  • 步骤一:设置 WireShark 过滤条件


在过滤条件栏输入条件:icmp || dns,如下图:

image.png


在终端输入ping www.baidu.com,如下图:


image.png

  • 步骤三:查看 DNS 查询 & 应答报文

返回 WireShark,查看抓取的消息,可以看到两条 DNS 报文消息,一条为查询报文,另一条为应答报文,如下图:

image.png

现在我们具体查看这两条 DNS 报文消息,有了上一节的铺垫,相信阅读这两段报文已经很简单了。先看 DNS 协议的报文段部分,下层协议的报文段后面讲:


  • 查询报文:

image.png

在这个报文里提出了一个问题,即:查询 www.baidu.com 的 IPv4 地址(A 记录),标记位指出以下信息:这是一个查询报文;这是一次正向解析;报文未截断;要求服务器执行递归查询;


  • 应答报文:

image.png


  • 传输层 & 网络层:

从图中还验证了 DNS 在进行域名解析时使用 UDP 协议,端口号为 53,与上一小节的分析一致。另外,还可以看出 IP 包的第一跳是发送给局域网路由器,而不是直接发送给 local DNS 服务器,这也合理。


1.6 DNS 缓存


一次完整的 DNS 查询过程需要访问多台 DNS 服务器才能得到最终的结果,这肯定会带来一定的时延。为了改善时延,DNS 服务并不是每次请求都要去访问 DNS 服务器,而是访问过一次后将 DNS 记录缓存在本地。具体来说,DNS 服务是一个多级的缓存:

浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> local DNS 缓存 -> DNS 查询

缓存并不是永久有效的,前面提到过 DNS 应答报文中的 TTL(Time to Live)值,它决定了 DNS 记录在缓存中的有效时间。需要注意的是,TTL 只是一个参考值,实际使用的缓存有效时间不一定等于该值,甚至是固定值。这也引发 DNS 缓存也存在一些“副作用”,我后文再说。


2. DNS 存在的问题


经过上一节的 DNS 理论知识学习和实践探索,相信大家对 DNS 已经建立起了一定的认识。那么,DNS 是一个完备的服务吗,在实践中它有存在什么问题呢?这一节我们来讨论这个问题。


2.1 DNS 查询时延


从第一节的分析可以看出,一次完整的 DNS 查询过程需要访问多台 DNS 服务器才能得到最终的结果,这肯定会带来一定的时延。从实践来看,这个时间还不容小觑。

提示: 有赞技术团队指出,DNS 解析时延的波动较大,好的情况几毫秒、十几毫秒就完成了,差的时候,可能需要花很多时间:《有赞webview加速平台探索与建设》

—— 有赞移动组


2.2 缓存一致性


DNS 缓存的存在虽然减少了时延,却是以牺牲一致性(consistency)为代价的。具体来说:Local DNS 是分地区、分运营商的,在域名解析缓存的处理上,实现策略就不统一了。有时候 Local DNS 的解析结果 可能不是最近、最优的节点,有的时候并不会遵从 TTL 的限制,而是设置一个固定时间。这就会导致域名指向新的 IP 地址后,一些客户端依然访问了缓存中 旧的 IP 地址。


除了运营商的缓存策略外,缓存投毒也是降低 DNS 可用性的原因。攻击者可以通过 DNS 劫持,利用 DNS 的缓存机制不对应答数据做检查的漏洞,诱骗 DNS 服务器缓存较大 TTL 的虚假 DNS 记录,从而长期欺骗客户端。


2.3 DNS 劫持(中间人攻击)


由于 DNS 缺乏 加密、认证、完整性保护的安全机制,容易引发网络完全问题。最常见的域名劫持攻击是针对 DNS 报文首部的 事务 ID 进行欺骗,由于事务 ID 在查询报文和应答报文中是匹配的,因此伪装 DNS 服务器可以提前将事务 ID 相同的伪造报文发送到客户端,以实现域名劫持(前提是合法的报文还未到达),把目标网站域名解析到错误的 IP 地址。


提示: 获取事务 ID 的方法主要采用 网络监听与序列号猜测,具体可翻阅《计算机网路安全原理》 (第 8 章)—— 吴礼发 著


2.4 调度不精准问题


由于存在缓存、转发、NAT 等问题,权威的 DNS 服务器可能会误判客户端所在的位置和运营商,从而导致解析出跨运营商访问的 IP 地址,用户的访问速度降低。


3. HTTPDNS 原理


虽然 DNS 存在不少问题,但也不能因噎废食放弃整套域名系统,解决方案无非是不走寻常路,换一种方式获取 IP 地址 —— HTTPDNS。


3.1 HTTPDNS 简介


与传统的 DNS 解析不同,HTTPDNS 是自己搭建基于 HTTP 协议的服务器,当客户端需要 DNS 解析的时候,不再向 local 发送 DNS 查询报文,而是直接通过请求直接访问 HTTPDNS 接口。而服务端则根据客户端的位置和所属运营商,返回就近的 IP 地址。

当然了,基于容灾考虑,当出现 HTTPDNS 不可用时会触发降级策略,使用运营商 LocalDNS 进行域名解析。

image.png

3.2 HTTPDNS 优势


相对与 DNS,HTTPDNS 的主要优点如下:


  • 降低时延缩短了查询链路,不像 DNS 查询那样需要访问多台 DNS 服务器才能得到最终的结果;
  • 域名防劫持域名解析请求直接发送至HTTPDNS服务器,绕过运营商 Local DNS,避免域名劫持问题;
  • 调度精准由于 DNS 服务器端获取的是真实客户端 IP 而非 Local DNS 的 IP,能够精确基于客户端位置、运营商信息,获得最精准的解析结果,让客户端就近接入业务节点
  • 快速生效域名解析结果变更时,HTTPDNS 服务没有传统DNS 服务多级缓存的影响,域名更新能够更快地覆盖到全量客户端。


3.3 HTTPDNS 正向效益


目前,腾讯、阿里和百度都有自己的 HTTPDNS 解决方案,笔者收集了他们公示的使用效益,具体如下:


  • 腾讯
  • 官方文档 :覆盖超4亿+用户,减少了超过60%的由于域名劫持导致的用户访问失败,减少了22%的用户平均延迟;
  • 官方博客:用户平均访问延迟下降超过10%,访问失败率下降了超过五分之一;
  • 百度
  • 官方博客:iOS劫持率由0.12%降低到0.0002%,Android劫持率由0.25%降低到0.05%,第二点的收益不明显,原因在于Feed业务主要目标群体在国内,百度在国内节点布局相对丰富,服务整体质量也较高;
  • 阿里 未查及...


4. 总结


应试方面,建议重点掌握四层 DNS 解析过程 & HTTPDNS 原理、理解知晓 DNS 存在的问题、DNS 报文格式重点理解 TTL、几种查询类型。

目录
相关文章
|
安全 算法 网络协议
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
|
监控 安全 网络安全
深入解析PDCERF:网络安全应急响应的六阶段方法
PDCERF是网络安全应急响应的六阶段方法,涵盖准备、检测、抑制、根除、恢复和跟进。本文详细解析各阶段目标与操作步骤,并附图例,助读者理解与应用,提升组织应对安全事件的能力。
1991 89
|
9月前
|
网络协议 安全 Devops
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
386 4
|
机器学习/深度学习 算法 数据挖掘
解析静态代理IP改善游戏体验的原理
静态代理IP通过提高网络稳定性和降低延迟,优化游戏体验。具体表现在加快游戏网络速度、实时玩家数据分析、优化游戏设计、简化更新流程、维护网络稳定性、提高连接可靠性、支持地区特性及提升访问速度等方面,确保更流畅、高效的游戏体验。
299 22
解析静态代理IP改善游戏体验的原理
|
11月前
|
机器学习/深度学习 数据可视化 PyTorch
深入解析图神经网络注意力机制:数学原理与可视化实现
本文深入解析了图神经网络(GNNs)中自注意力机制的内部运作原理,通过可视化和数学推导揭示其工作机制。文章采用“位置-转移图”概念框架,并使用NumPy实现代码示例,逐步拆解自注意力层的计算过程。文中详细展示了从节点特征矩阵、邻接矩阵到生成注意力权重的具体步骤,并通过四个类(GAL1至GAL4)模拟了整个计算流程。最终,结合实际PyTorch Geometric库中的代码,对比分析了核心逻辑,为理解GNN自注意力机制提供了清晰的学习路径。
763 7
深入解析图神经网络注意力机制:数学原理与可视化实现
|
11月前
|
机器学习/深度学习 缓存 自然语言处理
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
Tiktokenizer 是一款现代分词工具,旨在高效、智能地将文本转换为机器可处理的离散单元(token)。它不仅超越了传统的空格分割和正则表达式匹配方法,还结合了上下文感知能力,适应复杂语言结构。Tiktokenizer 的核心特性包括自适应 token 分割、高效编码能力和出色的可扩展性,使其适用于从聊天机器人到大规模文本分析等多种应用场景。通过模块化设计,Tiktokenizer 确保了代码的可重用性和维护性,并在分词精度、处理效率和灵活性方面表现出色。此外,它支持多语言处理、表情符号识别和领域特定文本处理,能够应对各种复杂的文本输入需求。
1400 6
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
887 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
11月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
445 15
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。
13273 46
|
11月前
|
传感器 人工智能 监控
反向寻车系统怎么做?基本原理与系统组成解析
本文通过反向寻车系统的核心组成部分与技术分析,阐述反向寻车系统的工作原理,适用于适用于商场停车场、医院停车场及火车站停车场等。如需获取智慧停车场反向寻车技术方案前往文章最下方获取,如有项目合作及技术交流欢迎私信作者。
914 2

相关产品

  • 云解析DNS
  • 推荐镜像

    更多
  • DNS