计算机网络:DNS总结

DNS协议概述

在互联网中,每台主机通常通过 IP 地址进行唯一标识,例如 192.168.1.1002408:xxxx::1。但是 IP 地址由数字组成,不方便人们记忆和使用。因此,互联网设计了域名系统(Domain Name System,DNS) ,用于实现域名与 IP 地址之间的映射

例如,用户访问:

复制代码
www.example.com

实际上浏览器最终需要获得类似:

复制代码
93.184.216.34

的 IP 地址,然后才能与目标服务器建立网络连接。

因此,可以简单理解为:

DNS 是互联网中的"电话簿",负责将容易记忆的域名转换为计算机能够识别的 IP 地址。

DNS 不仅能够完成"域名 → IP 地址"的解析,也能够完成反向解析、邮件服务器查询、服务发现等功能。

DNS的主要作用

DNS最基本的功能是完成域名解析

例如:

复制代码
www.baidu.com
       ↓ DNS解析
110.242.xxx.xxx

当用户在浏览器输入域名后,通常会经历以下过程:

复制代码
用户
 ↓
浏览器
 ↓
操作系统DNS缓存
 ↓
本地DNS服务器
 ↓
根DNS服务器
 ↓
顶级域DNS服务器
 ↓
权威DNS服务器
 ↓
获得IP地址
 ↓
浏览器访问目标服务器

DNS的作用并不仅仅是将域名转换为 IPv4 地址,它还支持多种资源记录,例如:

记录类型 作用
A 域名映射到 IPv4 地址
AAAA 域名映射到 IPv6 地址
CNAME 域名别名
MX 指定邮件服务器
NS 指定权威DNS服务器
PTR IP地址反向解析域名
TXT 保存文本信息,常用于验证、安全策略等
SRV 服务发现

DNS的层次化域名结构

DNS采用分层的树形结构,整个域名系统从根开始向下划分。

例如:

复制代码
                    .
                    │
        ┌───────────┼───────────┐
       com         cn          org
        │           │
     example      baidu
        │
      www

以:

复制代码
www.example.com

为例:

  • .:根域
  • com:顶级域(TLD)
  • example:二级域
  • www:主机名/子域名

因此,完整域名实际上是一个层次化结构。

常见顶级域包括:

复制代码
.com    商业组织
.org    组织机构
.net    网络相关组织
.cn     中国国家顶级域
.jp     日本国家顶级域
.uk     英国国家顶级域

这种层次化设计具有很大的优势。

如果所有域名都由一个DNS服务器管理,那么互联网规模扩大后,单个服务器将无法承受巨大的查询压力。

通过分层管理,可以将不同域名划分到不同的DNS服务器中,从而实现:

分布式管理 + 分布式查询 + 提高系统可靠性和扩展性。

DNS服务器的分类

DNS系统中存在多种类型的服务器。

根DNS服务器

根服务器位于DNS层级结构的最顶层。

它通常不会直接告诉客户端:

复制代码
www.example.com = 93.184.216.34

而是告诉查询者:

.com 域应该去哪些DNS服务器查询。

也就是说,根服务器主要负责顶级域的定位

顶级域DNS服务器

顶级域服务器负责管理某一个顶级域。

例如:

复制代码
.com
.cn
.org
.net

当根服务器告诉DNS客户端去查询 .com 后,客户端就可以向 .com 顶级域服务器发起查询。

顶级域服务器继续告诉客户端:

example.com 对应的权威DNS服务器是谁。

权威DNS服务器

权威DNS服务器保存某个域名的最终解析信息。

例如:

复制代码
example.com

对应的权威DNS服务器可能保存:

复制代码
www.example.com → 93.184.216.34
mail.example.com → 93.184.216.35

因此:

权威DNS服务器是最终能够给出域名解析结果的服务器。

DNS域名解析过程

假设用户在浏览器中访问:

复制代码
www.example.com

下面分析一次典型的DNS解析过程。

第一步:浏览器缓存查询

浏览器首先检查自己的DNS缓存。

如果之前已经解析过:

复制代码
www.example.com
→ 93.184.216.34

并且缓存还没有过期,就可以直接使用该结果。

这样可以避免产生网络DNS请求。

第二步:操作系统缓存查询

如果浏览器没有找到结果,操作系统可能继续检查本地DNS缓存。

例如:

复制代码
浏览器
  ↓
操作系统DNS缓存

如果操作系统已经缓存了对应IP地址,同样可以直接返回。

第三步:查询递归DNS服务器

如果本地没有缓存,操作系统会向配置的DNS服务器发送DNS请求。

例如:

复制代码
PC
 ↓
192.168.1.1

或者:

复制代码
PC
 ↓
8.8.8.8

第四步:递归DNS服务器查询根服务器

如果递归DNS服务器也没有缓存结果,它会向根DNS服务器查询:

复制代码
www.example.com

根服务器发现:

复制代码
.com

属于顶级域,因此返回 .com 顶级域服务器的信息。

第五步:查询TLD服务器

递归DNS服务器继续向 .com 顶级域服务器查询:

复制代码
www.example.com

.com服务器知道:

复制代码
example.com

由哪些权威DNS服务器负责,因此返回权威DNS服务器地址。

第六步:查询权威DNS服务器

递归DNS服务器继续向权威DNS服务器发送请求。

权威服务器查询自己的DNS记录:

复制代码
www.example.com
→ 93.184.216.34

然后把结果返回给递归DNS服务器。

第七步:返回客户端

递归DNS服务器将最终结果返回给用户:

复制代码
www.example.com
        ↓
93.184.216.34

浏览器拿到IP地址之后,就可以进一步进行TCP/TLS/HTTP等通信。

整个过程可以简化为:

复制代码
                DNS解析

客户端
  │
  │  www.example.com
  ↓
递归DNS服务器
  │
  ↓
根DNS服务器
  │
  │ .com服务器地址
  ↓
.com顶级域服务器
  │
  │ example.com权威服务器地址
  ↓
权威DNS服务器
  │
  │ 93.184.216.34
  ↓
递归DNS服务器
  │
  ↓
客户端

递归查询与迭代查询

DNS查询过程中经常涉及两个重要概念:

递归查询(Recursive Query)和迭代查询(Iterative Query)。

1. 递归查询

客户端向DNS服务器提出请求:

复制代码
请帮我找到 www.example.com 的IP地址。

DNS服务器需要负责把完整的查询过程完成。

最终直接返回:

复制代码
93.184.216.34

即:

复制代码
客户端 → DNS服务器
DNS服务器 → 最终结果

2. 迭代查询

DNS服务器之间通常采用迭代方式。

例如根服务器不会直接完成所有查询,而是告诉DNS服务器:

复制代码
我不知道具体IP,
但是你可以去.com服务器查询。

然后DNS服务器继续查询 .com

因此:

复制代码
递归:

客户端
  ↓
递归DNS
  ↓
最终IP


迭代:

递归DNS
  ↓
根服务器
  ↓
.com服务器
  ↓
权威DNS服务器
  ↓
最终IP

实际DNS解析通常是:

客户端与递归DNS之间采用递归查询,递归DNS与其他DNS服务器之间主要采用迭代查询。

DNS缓存机制

如果每一次访问网站都从根服务器开始查询,那么DNS系统的压力会非常大。

因此DNS设计了非常重要的缓存机制

例如第一次查询:

复制代码
www.example.com
        ↓
93.184.216.34

DNS服务器会把结果缓存起来。

下一次用户再次查询:

复制代码
www.example.com

DNS服务器可以直接返回:

复制代码
93.184.216.34

而无需再次访问根服务器。

DNS记录通常包含一个:

TTL(Time To Live)

TTL表示DNS缓存允许保存多长时间。

例如:

复制代码
www.example.com
A
93.184.216.34
TTL = 300

表示该记录可以缓存约300秒。

缓存机制能够:

  • 降低DNS服务器压力
  • 减少网络流量
  • 提高DNS查询速度
  • 降低域名解析延迟

DNS使用的网络协议

DNS属于应用层协议

传统DNS主要使用:

复制代码
UDP 53端口

进行查询。

典型结构:

复制代码
应用层:DNS
传输层:UDP
网络层:IP
数据链路层:Ethernet/Wi-Fi

例如:

复制代码
客户端
192.168.1.100:随机端口
        │
        │ UDP
        ↓
DNS服务器
8.8.8.8:53

DNS使用UDP的主要原因是:

DNS请求通常数据量较小,而且UDP无需建立连接,能够降低查询延迟。

但是DNS并不是只能使用UDP。

在一些情况下会使用:

复制代码
TCP 53

例如:

  • DNS响应数据较大
  • DNS区域传送
  • DNSSEC等场景
  • UDP响应被截断后需要重新通过TCP查询

现代DNS体系中还出现了:

复制代码
DoH(DNS over HTTPS)
DoT(DNS over TLS)

用于提高DNS查询过程中的隐私和安全性。

DNS报文基本结构

DNS报文通常由以下几个部分组成:

复制代码
┌──────────────────────┐
│ Header               │
├──────────────────────┤
│ Question             │
├──────────────────────┤
│ Answer               │
├──────────────────────┤
│ Authority            │
├──────────────────────┤
│ Additional            │
└──────────────────────┘

其中:

保存DNS报文的基本控制信息,例如:

  • Transaction ID
  • 查询/响应标志
  • Opcode
  • 状态码
  • Question数量
  • Answer数量

Question

表示客户端希望查询什么。

例如:

复制代码
Name = www.example.com
Type = A

表示:

查询 www.example.com 的IPv4地址。

Answer

保存最终查询结果:

复制代码
www.example.com
A
93.184.216.34

Authority

表示具有权威性的DNS服务器信息。

Additional

提供额外的DNS信息。

DNS中的重要资源记录

DNS服务器通过资源记录(Resource Record,RR)保存域名信息。

例如:

复制代码
www.example.com  A     93.184.216.34

其中:

复制代码
域名          类型       数据
www.example.com  A       93.184.216.34

比较常见的记录有:

A记录

复制代码
www.example.com → 192.168.1.100

负责IPv4地址解析。

AAAA记录

复制代码
www.example.com → IPv6地址

负责IPv6地址解析。

CNAME记录

复制代码
www.example.com → server.example.com

表示域名别名。

MX记录

用于指定邮件服务器。

NS记录

用于指定域名对应的权威DNS服务器。

PTR记录

用于反向解析:

复制代码
IP地址 → 域名

DNS的安全问题

DNS作为互联网基础设施,也面临一些安全问题。

例如:

DNS缓存投毒

攻击者向DNS缓存中注入错误记录:

复制代码
www.example.com
        ↓
恶意服务器IP

用户访问正常域名时,可能被引导到攻击者服务器。

DNS劫持

攻击者或者网络设备篡改DNS请求,使用户访问错误的服务器。

DNS欺骗

攻击者伪造DNS响应,使客户端相信错误的解析结果。

为了提高DNS安全性,可以采用:

DNSSEC

DNSSEC通过数字签名等机制提高DNS数据的真实性和完整性。

另外:

复制代码
DoH
DoT

可以对DNS查询过程进行加密,降低DNS请求被窃听和篡改的风险。

总结

DNS是互联网中非常重要的应用层协议,其核心功能是完成域名与IP地址之间的映射。DNS采用分层、分布式的树形结构,将域名空间划分为根域、顶级域、权威域等多个层次,从而解决了互联网规模不断扩大带来的管理和查询压力。

一次典型的DNS解析过程通常包括浏览器缓存、操作系统缓存、递归DNS缓存以及根服务器、顶级域服务器和权威DNS服务器等多个环节。DNS查询过程中,客户端通常向递归DNS服务器发起递归查询,而递归DNS服务器则通过迭代查询逐级寻找最终的权威DNS服务器。

DNS主要使用UDP 53端口进行通信,在特定情况下也会使用TCP 53端口。为了提高查询效率,DNS通过TTL和缓存机制减少重复查询。同时,DNS通过A、AAAA、CNAME、MX、NS、PTR等资源记录支持不同类型的域名解析。

从整个计算机网络体系来看,DNS虽然只是一个应用层协议,但它承担着连接"人类可读的域名 "和"计算机使用的IP地址"的重要作用。现代互联网中的网站访问、CDN、云服务、负载均衡以及服务发现等大量功能都离不开DNS。因此,理解DNS的层次结构、解析流程、递归与迭代查询、缓存机制以及安全机制,是学习计算机网络和理解互联网工作原理的重要基础。

相关推荐
SDWAN_Cheap40 分钟前
数据包在网络中是怎么一步步传输的?
网络·数据包
新时代牛马1 小时前
CFS调度源码:从 schedule() 到pick_next_entity 的vruntime 公平
linux·运维·网络
@insist1231 小时前
系统集成项目管理工程师-采购、风险与干系人管理
网络·软考·系统集成项目管理工程师·软考中项·软件水平考试
Syc1102g1 小时前
在 Linux CentOS 系统中设置静态 IP
linux·网络·计算机网络·个人开发
Shadow(⊙o⊙)2 小时前
CMake实战Http+编译、链接选项的使用
网络·网络协议·http
十正2 小时前
用 HTTP 条件请求把“强一致“和“低成本
网络·后端·http
Horn Still Sounds2 小时前
Linux进程间通信:信号、消息队列、共享内存完整笔记
linux·网络·笔记
路弥行至2 小时前
ROS2 通信避坑实录:从 topic/msg 底层原理到一次内存错位复盘
网络·经验分享·笔记·其他·内存·topic·ros2
Alan CGH2 小时前
一次非寻常的压测优化经历
java·网络·压力测试