放肆青春的博客
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)

放肆青春

一个前端菜鸟的技术成长之路
首页
前端
算法
网络
面试
技术
后端
运维
杂项
数据库
工具
网址
电脑
个人
文章
  • 分类
  • 标签
  • 归档
github (opens new window)
gitee (opens new window)
  • 计算机网络
  • http
  • https
  • 缓存
  • TCP
  • UDP
  • DNS
    • DNS
      • DNS 协议和端口
      • 域名
      • 前端优化中的 DNS
      • DNS 预解析
      • 浏览器 DNS 缓存
      • DNS 劫持
    • DNS 查询类型
      • DNS 递归查询
      • DNS 迭代查询
    • DNS 解析的基本流程
    • DNS 问题
  • CDN
  • 跨域
  • 请求

    • ajax
    • axios
    • fetch
    • websocket
  • 前端本地存储
  • 代理
  • 加密
  • 从输入URL到页面加载的过程
  • network
放肆青春
2021-06-10

DNS

# DNS

DNS,英文全称 Domain Name System,域名系统,其实是域名和 ip 地址相互映射的分布式数据库

DNS 是应用层协议,client 端(一般指浏览器)构建 DNS 查询请求,依次被传输层,网络层,数据链路层等封装传送到达 DNS 服务器端,最终 client 端接收到 DNS 响应消息

# DNS 协议和端口

DNS 占用 53 号端口,同时使用 TCP 和 UDP 协议

DNS 在区域传输的时候使用 TCP 协议,其他时候使用 UDP 协议。一个 UDP 报文的有效负载(payload)也就 512 个字节

DNS 区域传输的时候使用 TCP 协议:

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

  2. TCP 是一种可靠连接,保证了数据的准确性。

域名解析时使用 UDP 协议:

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

# 域名

域名解析:域名映射为 IP 地址的过程就称为“域名解析”

TLD 全称为 Top Level Domain,也可以叫顶级域,就是域名最后的.com、.cn、.net 等。

域名必须对应一个 IP 地址,一个域名只能对应一个 IP 地址(比如访问一个域名不可能向两个 ip 地址请求)而 IP 地址不一定有域名且可以对应多个域名。

为什么要用域名?

  1. 容易记

  2. 固定性好,公网 IP 地址输入都是独一无二的,但都是分给服务器上的,如果服务器换了,IP 也就变了,访客就找不到了。

  3. 品牌意识,每一个企业,或者网站都应该都突出企业自身的域名,而不是 IP

# 前端优化中的 DNS

  1. 是减少 DNS 的请求次数

  2. DNS 预解析

# DNS 预解析

DNS 预解析是让具有此属性的域名不需要用户点击链接就在后台解析,而域名解析和内容载入是串行的网络操作,所以这个方式能减少用户的等待时间,提升用户体验 。

默认情况下浏览器会对页面中和当前域名(正在浏览网页的域名)不在同一个域的域名进行预获取,并且缓存结果,这就是隐式的 DNS 预解析

手动设置 DNS 预解析具体用法:

(1) 用 meta 信息来告知浏览器, 当前页面要做 DNS 预解析 <meta http-equiv="x-dns-prefetch-control" content="on">

(2) 在页面 header 中使用 link 标签来强制对 DNS 预解析: <link rel="dns-prefetch" href="//www.zhix.net">

注意:dns-prefetch 需慎用,多页面重复 DNS 预解析会增加重复 DNS 查询次数,因为有开发者指出 禁用 DNS 预读取能节省每月 100 亿的 DNS 查询 。

如果需要禁止隐式的 DNS Prefetch <meta http-equiv="x-dns-prefetch-control" content="off">

# 浏览器 DNS 缓存

浏览器在获取网站域名的实际 IP 地址后会对其 IP 进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的 DNS 缓存时间,其中 Chrome 的过期时间是 1 分钟,在这个期限内不会重新请求 DNS

缓存时间长:减少 DNS 的重复查找,节省时间。

缓存时间短:及时检测服务器的 IP 变化,保证访问的正确性。

# DNS 劫持

DNS 劫持有这三种情况:

  1. 错误域名解析到纠错导航页面

导航页面存在广告。判断方法:访问的域名是错误的,而且跳转的导航页面也是官方的,如电信的 114,联通移网域名纠错导航页面。

  1. 错误域名解析到非正常页面,

对错误的域名解析到导航页的基础上,有一定几率解析到一些恶意站点,这些恶意站点通过判断你访问的目标 HOST、URI、 referrer 等来确定是否跳转广告页面,这种情况就有可能导致跳转广告页面(域名输错)或者访问页面被加广告(页面加载时有些元素的域名错误而触发)这种劫持会对用户访问的目标 HOST、URI、 referrer 等会进行判定来确定是否解析恶意站点地址,不易被发现。

  1. 直接将特点站点解析到恶意或者广告页面,

这种情况比较恶劣,而且出现这种情况未必就是运营商所为,家里路由器被黑,或者系统被入侵,甚至运营商的某些节点被第三方恶意控制都有可能。具体情况要具体分析,这里就不展开了。

# DNS 查询类型

# DNS 递归查询

# DNS 迭代查询


参考:迭代 DNS 查询和递归 DNS 查询的区别 (opens new window)

# DNS 解析的基本流程

解析顺序:

  1. 浏览器缓存

当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的 IP 地址(若曾经访问过该域名且没有清空缓存便存在);

  1. 系统缓存

当浏览器缓存中无域名对应 IP 则会自动检查用户计算机系统 Hosts 文件 DNS 缓存是否有该域名对应 IP;

  1. 路由器缓存

当浏览器及系统缓存中均无域名对应 IP 则进入路由器缓存中检查,以上三步均为客服端的 DNS 缓存;

  1. ISP(互联网服务提供商)DNS 缓存

当在用户客服端查找不到域名对应 IP 地址,则将进入 ISP DNS 缓存中进行查询。比如你用的是电信的网络,则会进入电信的 DNS 缓存服务器中进行查找;

  1. 根域名服务器

当以上均未完成,则进入根服务器进行查询。全球仅有 13 台根域名服务器,1 个主根域名服务器,其余 12 为辅根域名服务器。根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如.com)服务器 IP 告诉本地 DNS 服务器;

  1. 顶级域名服务器

顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的 IP 地址告诉本地 DNS 服务器;

  1. 主域名服务器

主域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确纪录;

  1. 保存结果至缓存

本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个 IP 地址与 web 服务器建立链接。

DNS 查询的详细过程

image

  1. 在浏览器中输入 www.qq.com 域名,操作系统会先检查自己本地的 hosts 文件是否有这个网址映射关系,如果有,就先调用这个 IP 地址映射,完成域名解析。

  2. 如果 hosts 里没有这个域名的映射,则查找本地 DNS 解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

  3. 如果 hosts 与本地 DNS 解析器缓存都没有相应的网址映射关系,首先会找 TCP/ip 参数中设置的首选 DNS 服务器,在此我们叫它本地 DNS 服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

  4. 如果要查询的域名,不由本地 DNS 服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析,此解析不具有权威性。

  5. 如果本地 DNS 服务器本地区域文件与缓存解析都失效,则根据本地 DNS 服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地 DNS 就把请求发至 13 台根 DNS,根 DNS 服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个 IP。本地 DNS 服务器收到 IP 信息后,将会联系负责.com 域的这台服务器。这台负责.com 域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com 域的下一级 DNS 服务器地址(http://qq.com)给本地 DNS 服务器。当本地 DNS 服务器收到这个地址后,就会找http://qq.com域服务器,重复上面的动作,进行查询,直至找到www . qq .com 主机。

  6. 如果用的是转发模式,此 DNS 服务器就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环。不管是本地 DNS 服务器用是是转发,还是根提示,最后都是把结果返回给本地 DNS 服务器,由此 DNS 服务器再返回给客户机。

从客户端到本地 DNS 服务器是属于 递归查询,而 DNS 服务器之间就是的交互查询就是 迭代查询。

# DNS 问题

  1. DNS 解析的基本流程?
  2. DNS 的根域名是什么,有几个 Server?TLD DNS 是什么?
  3. DNS 的优化策略是什么?在各个环节怎么做的?Chrome 和各个操作系统怎么做的?
  4. DNS 负载均衡是什么,为什么要用?
  5. DNS 的记录类型有哪些?CNAME 一般用在哪些场合?举例子说明一下。
  6. DNS 的常用工具和命令有哪些?
  7. DNS 查询是用 TCP 还是 UDP?一般用哪个端口?
  8. DNS 抓包抓过吗?Wireshark 有用过吗?
  9. 请说明一下 www.google.com 和 google.com 的区别,如何设置它们的 DNS?

答案参考地址:https://www.cnblogs.com/confach/p/10050013.html (opens new window)


参考地址:DNS 原理及其解析过程https://www.cnblogs.com/gopark/p/8430916.html (opens new window)

更新时间: 1/17/2022, 8:54:37 PM
UDP
CDN

← UDP CDN→

最近更新
01
前端权限管理
02-24
02
vue2指令
02-24
03
vue2 hook
02-24
更多文章>
Theme by Vdoing | Copyright © 2019-2022 放肆青春
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式