baby sword‘s blog baby sword‘s blog
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)

zhengjian

不敢承担失去的风险,是不可能抓住梦想的
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)
  • 计算机网络

    • 字节网络问题
    • https详解
    • 三次握手四次挥手
    • HTTP相应状态码
    • cookie、session、token
    • ICMP
    • 什么是网桥
    • ARP协议
    • DHCP协议
    • NAT协议
    • 代理服务器
    • TCP特性
    • 什么是SDN
    • 负载均衡
    • CDN
    • DNS详细过程
      • DNS 是什么
      • DNS 分层
      • DNS流程
      • 迭代和递归的区别
      • 关于dig命令
      • DNS解析为什么使用UDP
        • DNS在进行区域传输的时候使用TCP协议,其它时候则使用UDP协议;
        • 为什么既使用TCP又使用UDP?
        • 区域传送时使用TCP,主要有一下两点考虑
        • 域名解析时使用UDP协议
      • 总结
    • HTTP3
    • http如何实现长链接
    • 家用路由器原理
  • 操作系统

  • 算法

  • 计算机基础
  • 计算机网络
xugaoyi
2023-02-13
目录

DNS详细过程

# DNS 是什么

使用域名,人们可以将复杂的IP地址通过域名来记忆。DNS可以将域名网址自动转换为具体的ip地址。

DNS以逗号进行分割,代表了不同层次之间的界限。其中越靠右边的位置所表示的层级越高

# DNS 分层

域名层级呈现一个树的结构。最高处叫做根域名。根域名的下一次就是顶级域名(eg:com)

具体如下:

  • 根 DNS 服务器
  • 顶级域 DNS 服务器(com)
  • 权威 DNS 服务器(server.com)

image-20230406210949582

image-20230406205443623

根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。

因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。

# DNS流程

浏览器首先看一下自己的缓存里有没有域名与地址的映射关系,如果没有就向操作系统的缓存要,还没有就检查本机域名解析文件 hosts,如果还是没有,就会 DNS 服务器进行查询,查询的过程如下:

  1. 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
  2. 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
  3. 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”
  4. 本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的 IP 地址吗?”
  5. 顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
  6. 本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?” server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
  7. 权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
  8. 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

以上流程是以迭代的方式进行的。

image-20230406210617385

还有一种方式是通过递归的方式进行的。

​ 当局部DNS服务器自己不能回答客户机的DNS查询时,它就需要向其他DNS服务器进行查询。此时有两种方式,如图所示的是递归方式。局部DNS服务器自己负责向其他DNS服务器进行查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端。

# 迭代和递归的区别

递归:客户端只发一次请求,要求对方给出最终结果。返回的结果只有两种:查询成功或查询失败。 迭代:又称为“重指引”。客户端发出一次请求,对方如果没有授权回答(向dns服务器查询一个域名,刚好这个域名是本服务器负责,返回的结果就是授权回答),它就会返回一个能解答这个查询的其它名称服务器列表,客户端会再向返回的列表中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。 客户端-本地dns服务端:这部分属于递归查询。 本地dns服务端-外网:这部分属于迭代查询。(不启用转发模式)

# 关于dig命令

dig @server name type

@server: 指定域名服务器 name:指定查询请求资源的域名 type:指定查询类型,如A、CNAME、SRV、MX、SIG等,如果不指定type,默认为A

查询某个域名解析的全过程:(此时为迭代查询) $ dig @8.8.8.8 163.com +trace

https://developer.aliyun.com/article/418787 (opens new window)

# DNS解析为什么使用UDP

# DNS在进行区域传输的时候使用TCP协议,其它时候则使用UDP协议;

DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器。在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,这就叫做区传送(zone transfer)。

区域传输是DNS的事务,对准确性要求比较高,而且会产生大于512字节的数据包,因此使用TCP协议。

# 为什么既使用TCP又使用UDP?

首先了解一下TCP与UDP传送字节的长度限制。

UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送。通常传统的UDP报文一般不会大于512字节。

# 区域传送时使用TCP,主要有一下两点考虑

  1. 辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。
  2. TCP是一种可靠的连接,保证了数据的准确性。

# 域名解析时使用UDP协议

客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过TCP三次握手,这样DNS服务器负载更低,响应更快。虽然从理论上说,客户端也可以指定向DNS服务器查询的时候使用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。

# 总结

大多数情况下,DNS解析请求和响应都很小,使用UDP协议更加高效,虽然没有TCP可靠,但是速度快,消耗的系统资源更少,非常适合少量数据包的传输。 一些DNS事务,比如区域传输或其他附加查询,可能会产生大于512字节的数据包,因此使用TCP更加可靠,使用TCP会减少丢包和重新发包的情况,因此更加可靠与高效。

编辑 (opens new window)
上次更新: 2024/02/22, 14:03:19
CDN
HTTP3

← CDN HTTP3→

最近更新
01
spark基础
02-22
02
mysql读写分离和分库分表
02-22
03
数据库迁移
02-22
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式