DNS(域名解析协议)详解

2023-05-16

DNS协议

我们之前已经了解过ARP协议。
如果说ARP协议是用来将IP地址转换为MAC地址,那么DNS协议则是用来将域名转换为IP地址(也可以将IP地址转换为相应的域名地址)。
我们都知道,TCP/IP中使用的是IP地址和端口号来确定网络上某一台主机上的某一个程序,不免有人有疑问,为什么不用域名来直接进行通信呢?
1. 因为IP地址是固定长度的,IPv4是32位,IPv6是128位,而域名是变长的,不便于计算机处理。
2. IP地址对于用户来说不方便记忆,但域名便于用户使用,例如www.baidu.com这是百度的域名。
总结一点就是IP地址是面向主机的,而域名则是面向用户的。
hosts文件
域名和IP的对应关系保存在一个叫hosts文件中。
最初,通过互联网信息中心来管理这个文件,如果有一个新的计算机想接入网络,或者某个计算IP变更都需要到信息中心申请变更hosts文件。其他计算机也需要定期更新,才能上网。
但是这样太麻烦了,就出现了DNS系统。

DNS系统

  1. 一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系
  2. 如果新计算机接入网络,将这个信息注册到数据库中
  3. 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址
    我们可以通过命令查看自己的hosts文件:
    这里写图片描述
    在域名解析的过程中仍然会优先查找hosts文件的内容。

DNS理论知识

一、DNS域名结构

1、域名的层次结构

域名系统必须要保持唯一性。
为了达到唯一性的目的,因特网在命名的时候采用了层次结构的命名方法:
1. 每一个域名(本文只讨论英文域名)都是一个标号序列(labels),用字母(A-Z,a-z,大小写等价)、数字(0-9)和连接符(-)组成
2. 标号序列总长度不能超过255个字符,它由点号分割成一个个的标号(label)
3. 每个标号应该在63个字符之内,每个标号都可以看成一个层次的域名。
4. 级别最低的域名写在左边,级别最高的域名写在右边。
域名服务主要是基于UDP实现的,服务器的端口号为53。
关于域名的层次结构,如下图所示:
这里写图片描述
eg :我们熟悉的,www.baidu.com
1. com: 一级域名. 表示这是一个企业域名。同级的还有 “net”(网络提供商), “org”(⾮非盈利组织) 等。
2. baidu: 二级域名,指公司名。
3. www: 只是一种习惯用法。

2、域名的分级

域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。
如下图所示:
这里写图片描述
其中顶级域名分为:国家顶级域名、通用顶级域名、反向域名。

国家顶级域名中国:cn, 美国:us,英国uk…
通用顶级域名com公司企业,edu教育机构,gov政府部门,int国际组织,mil军事部门 ,net网络,org非盈利组织…
反向域名arpa,用于PTR查询(IP地址转换为域名)

二、域名服务器

域名是分层结构,域名服务器也是对应的层级结构。
有了域名结构,还需要有一个东西去解析域名,域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名系统的主机。

由高向低进行层次划分,可分为以下几大类:

分类作用
根域名服务器最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助
顶级域名服务器负责管理在该顶级域名服务器下注册的二级域名
权限域名服务器负责一个区的域名解析工作
本地域名服务器当一个主机发出DNS查询请求时,这个查询请求首先发给本地域名服务器

注:一个域名服务器所负责的范围,或者说有管理权限的范围,就称为区
我们需要注意的是:
1. 每个层的域名上都有自己的域名服务器,最顶层的是根域名服务器
2. 每一级域名服务器都知道下级域名服务器的IP地址
3. 为了容灾, 每一级至少设置两个或以上的域名服务器

三、域名解析过程

域名解析总体可分为一下过程:
(1) 输入域名后, 先查找自己主机对应的域名服务器,域名服务器先查找自己的数据库中的数据.
(2) 如果没有, 就向上级域名服务器进行查找, 依次类推
(3) 最多回溯到根域名服务器, 肯定能找到这个域名的IP地址
(4) 域名服务器自身也会进行一些缓存, 把曾经访问过的域名和对应的IP地址缓存起来, 可以加速查找过程
具体可描述如下:
1. 主机先向本地域名服务器进行递归查询
2. 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
3. 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器的IP地址
4. 本地域名服务器向顶级域名服务器进行查询
5. 顶级域名服务器告诉本地域名服务器,下一步查询权限服务器的IP地址
6. 本地域名服务器向权限服务器进行查询
7. 权限服务器告诉本地域名服务器所查询的主机的IP地址
8. 本地域名服务器最后把查询结果告诉主机
如图所示:
这里写图片描述
上文我们提出了两个概念:递归查询和迭代查询
(1)递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机
(2)迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。

通俗地说,递归就是把一件事情交给别人,如果事情没有办完,哪怕已经办了很多,都不要把结果告诉我,我要的是你的最终结果,而不是中间结果;如果你没办完,请你找别人办完。
迭代则是我交给你一件事,你能办多少就告诉我你办了多少,然后剩下的事情就由我来办。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DNS(域名解析协议)详解 的相关文章

随机推荐

  • pyinstaller打包PyQt程序 + 制作安装包

    打包发布PyQt5程序 xff0c 制作安装文件 以自己的密码管理器为例 用到的工具 xff1a 平台 xff1a Windows10python 3 7 6 xff08 安装好所需的包 xff09 pyinstallerupx xff08
  • 树莓派开机自动发送邮件脚本

    开机联网后自动获取本机内网IP xff0c 并通过邮件或者server酱发送自己的内网IP span class token keyword import span smtplib span class token keyword from
  • C++ STL Map按照value排序

    xff08 记录一下 xff09 STL的map底层实现一般是红黑树 xff0c 会自动按照key排序 xff0c 按照value排序好像也没有更好的方法了 xff0c 只能将map转成vector lt pair gt 再进行排序了 sp
  • typescript

    TypeScript TypeScript 是一种给 JavaScript 添加特性的语言扩展 支持es6 xff0c 是微软提出的一种编程语言 TypeScript 设计目标是开发大型应用 xff0c 它可以编译成纯 JavaScript
  • 串口打印中途无log出来,显示console:$字样,一段时间后才再显示

    调试时 xff0c 我们在外接串口打印log时 xff0c 发现lk打印完成后跳转到kernel阶段 xff0c 显示console 字样 xff0c 过一段时间后才重新开始打印log xff0c 这样导致我们抓取的log不全 xff0c
  • 【Hexo】域名绑定篇

    关于Hexo的一切 我的Hexo专栏 零 前言 继上篇 xff0c 本篇主要讨论购买域名以及如何绑定并进行解析 一 购买 我这里只推荐两个平台 xff1a 阿里云官网和 腾讯云官网 xff0c 选择你中意的即可 我买的是一个很辣鸡的域名ww
  • 配置一个好看的PowerShell

    工作生活中用到 PowerShell 的时刻其实有很多 xff0c 但是那深蓝色的背景实在让人想吐槽几句 今天我们就来美化一下它 xff0c 几十种花里胡哨的主题任你选择 用到的是oh my posh xff0c 跟oh my zsh类似
  • scikit-learn介绍-非常流行的python机器学习库

    scikit learn是一个建立在Scipy基础上的用于机器学习的Python模块 在不同的应用领域中 xff0c 已经大展出为数众多的基于Scipy的工具包 xff0c 他们统称为Scikits 而在所有的分支版本中 xff0c sci
  • redis

    redis Redis 是一个Key Value 数据库 xff0c 主要用于存储缓存 redis支持的数据类型 xff1a String字符串 xff1a 设置key值 xff1a set key value string类型是二进制安全
  • 多生产者——多消费者问题

    问题背景 假设有四个人 xff1a 父亲 母亲 女儿 儿子 xff0c 和一个空盘子 xff0c 里面最多放一个水果 父亲每次向盘子中放一个苹果 xff0c 女儿只会吃苹果 母亲每次向盘子中放一个橘子 xff0c 儿子只会吃橘子 这个问题可
  • Android-MVVM-Databinding的原理、用法与封装

    前言 说起 DataBinding ViewBinding 的历史 xff0c 可谓是一波三折 xff0c 甚至是比 Dagger Hilt 还要传奇 说起依赖注入框架 Dagger2 Hilt xff0c 也是比较传奇 xff0c 刚出来
  • day03 Python基础

    day03 Python基础 版权声明 xff1a 本博客转载自路飞学城Python全栈开发培训课件 xff0c 仅用于学习之用 xff0c 严禁用于商业用途 xff0c 未经授权 xff0c 严禁转载 欢迎访问路飞学城官网 xff1a h
  • 最新Spire.pdf Spire.Doc Spire.Xls等无水印使用

    Aspose与Spire功能都很强大 xff0c 为什么要选择Spire xff0c Spire支持WPF组件 xff0c Aspose默认没有 新建 net6控制台程序 xff0c 用NuGet包添加Spire PDF引用 添加代码 us
  • 使用Pyinstaller发布带界面的程序(解决找不到文件问题)

    Pyinstaller Pyinstaller可以用来打包python代码 xff0c 生成可执行文件 xff08 主流平台都可以 xff09 xff0c 介绍就不说了 xff0c 可以百度或者去官网看看 xff1a https www p
  • 动态分配内存——new/delete

    动态分配内存 1 使用new分配内存2 使用delete释放内存3 例子 xff1a 数组编译时分配内存和运行时分配内存4 动态数组补充 xff1a 程序的内存分配 1 使用new分配内存 使用格式 xff1a span class tok
  • Spring学习(一) Spring环境配置

    工具原料 xff1a JDK Eclipse IDEA 开始学Spring xff0c 应该已经安好java环境了 xff0c 这里我就不赘述了 xff0c 直接开始开始下一步的教程 配置spring环境需要导入spring相关的jar包
  • vue-lottie动画效果(进阶篇)

    vue lottie动画效果 以下是个人见解部分 个人见解 xff1a 优点 xff1a 简单高效 xff0c 动画文件小 xff0c 丝滑流畅 xff0c 动画可控性强 缺点 xff1a 依赖包非常重 xff0c 对动画要求不高的项目不太
  • Ubuntu18.04设置开机自启动自己的程序、脚本

    Ubuntu18 04设置开机自启动自己的程序 脚本 本文使用的机器是win10 43 Ubuntu18 04双系统 xff0c 虚拟机上的Ubuntu18 04操作一样 xff0c 均可参考此文 参考链接 xff0c 言简意赅 xff0c
  • 【Qt】【QDebug】【日志】实用的Qt日志打印-打印时间-线程-数据等信息

    Qt QDebug 日志 实用的Qt日志打印 打印时间 线程 数据等信息 在开发audio和video相关软件时 xff0c 收发速率很关键 xff0c 我们需要打印时间和线程等相关信息等日志 include lt QDebug gt 获取
  • DNS(域名解析协议)详解

    DNS协议 我们之前已经了解过ARP协议 如果说ARP协议是用来将IP地址转换为MAC地址 xff0c 那么DNS协议则是用来将域名转换为IP地址 xff08 也可以将IP地址转换为相应的域名地址 xff09 我们都知道 xff0c TCP