一、写在开头

在OSI七层协议模型中应用层是距离我们最近,且日后开发使用到最多的一层,在上一篇博文中我们已经学习了应用层中的HTTP协议,在本文中我们再一起来学一下DNS。啥?DNS不是很了解?那还不快往下看!

其实早几年和一个朋友聊天,当时,他是一个网络条线的技术经理,向我吐槽说,现在来面试的很多都是学不好编程语言的,转来搞网络了,结果问一个DNS,他都整不明白,就这还好意思干网络?我当时吓得不敢说话,因为我自己对于网络编程也是那种浅尝辄止的心态,生怕他回头问我一个问题,哈哈。

二、DNS的定义

DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题。

DNS是一个联机的分布式数据库系统,它具有分布式、层次化、模块化等特点,它属于应用层的协议,基于UDP传输,端口为53。

三、DNS服务器类别

我们上面说到DNS具有层次化结构,而这个层次化主要体现在它的服务器部署之上,DNS的域名层次结构是一棵树,从「根域名服务器」「顶级域名服务器」「权威域名服务器」,再到「本地域名服务器」,而我们所有遇到的DNS服务器,都囊括在这四类之中。

  • 「根域名DNS服务器」:是为提供TLD服务器的IP地址,目前世界上仅有13组根服务器,我国境内仍然没有,不过后来任播应用后,DNS分解出1089个根域名服务器节点,而在我国便有了26个根域名服务器节点。
  • 「顶级域名服务器(TLD服务器)」:顶级域名指的域名的后缀,像com、org、net等都是,不同国家也有自己的域名,如uk、ca、fr这些,我国的是cn。而顶级域名系统则是提供权威DNS服务器IP地址的。

  • 「权威域名DNS服务器」:所有在因特网上具有公共可访问主机的组织机构,必须提供可访问的DNS记录,而这些记录里则保存着域名与IP映射等信息,而这些记录则存储在权威DNS服务器上。
  • 「本地域名服务器」:每个 ISP(互联网服务提供商)都有一个自己的本地 DNS 服务器。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 层次结构中。

那么了解了DNS的底层服务器结构,它们是如何合作的,或者说是通过怎样的机制,达到解析域名,响应到对应的IP上的呢?继续往下看!

四、DNS的解析过程

开局先上一张图:





现在假设我们用浏览器去访问“www.baidu.com.cn” 的IP地址,那么DNS解析系统的整个解析过程大致可以分为如下这几步:

  1. 第一步:客户端向本地DNS服务器发送DNS请求报文,报文中包含域名 www.baidu.com.cn ,若本地DNS中有相应的记录,直接反馈客户端,若没有则访问根DNS服务器,继续处理请求;
  2. 第二步:本地DNS服务器向根域名服务器发送请求,根域名服务器是域名系统的最顶层,它负责管理所有顶级域名(如.com、.net、.org以及国家和地区代码如.cn)。根域名服务器会返回所查询域(在这个例子中是“.cn”域)的主域名服务器的地址;
  3. 第三步:本地DNS在接收到根服务器返回的地址后,便向cn顶级域名服务器发送请求,一般到这里是有可能找到了对应的域名映射的IP地址的,但若还没有,它会查询自己的记录以找到“.com.cn”域的主域名服务器(权威DNS服务器)地址返回;
  4. 第四步:本地DNS服务器只得继续向权威DNS服务器发去请求,终于,www.baidu.com.cn已经向权威域名DNS备案过了,在这里找到了它对应的记录,便把记录返回给本地DNS;
  5. 第五步:本地dns服务器将收到的返回地址发给客户端,同时写入自己的缓存,以便下次查询;

「需要注意的是:」 从请求主机到本地 DNS 服务器的查询是递归的,其余的查询时迭代的;当找不到相应记录,会返回空结果,而不是超时信息。

五、DNS报文格式

DNS报文格式是DNS协议中用于客户端和服务器之间通信的一种结构化数据格式。DNS报文主要分为两种:查询报文和回答报文,它们具有相同的格式。

DNS(Domain Name System,域名系统)报文是在域名解析过程中,DNS客户端和DNS服务器之间传输的消息,其报文格式主要包括以下几个部分:

「我们可以将其分成三个部分来看:」

报文头部

  • 「标识」:16位的标识符,用于标识该DNS报文,客户端发送请求时会生成一个随机的标识,服务器在响应时会使用相同的标识,以便客户端能够将响应与请求对应起来。
  • 「标志」:16位的标志字段,包含多个标志位,用于表示报文的类型、操作码、响应状态等信息。例如,QR位表示是查询报文(0)还是响应报文(1);OPCODE位表示操作码,通常为标准查询(0)等。
  • 「问题数量」:16位的字段,指明报文中包含的问题记录数量。
  • 「回答数量」:16位的字段,指明报文中包含的回答记录数量。
  • 「权威机构数量」:16位的字段,指明报文中包含的权威机构记录数量。
  • 「附加信息数量」:16位的字段,指明报文中包含的附加信息记录数量。

问题部分

  • 「查询名称」:可变长度字段,包含要查询的域名,域名采用一种特殊的编码方式,将域名的各个部分以标签的形式表示,每个标签前面有一个字节表示该标签的长度,最后以一个字节的0结束。
  • 「查询类型」:16位的字段,指定查询的资源记录类型,如A记录(表示主机地址)、NS记录(表示域名服务器)、CNAME记录(表示别名)等。
  • 「查询类」:通常为1,表示Internet类。

回答部分、权威机构部分和附加信息部分

这三个部分的格式基本相同,每个部分都可以包含多个资源记录,每个资源记录的格式如下:

  • 「域名」:与问题部分的查询名称格式相同,通常是被查询域名或相关域名。
  • 「类型」:16位的字段,与问题部分的查询类型相对应,表示该资源记录的类型。
  • 「类」:通常为1,表示Internet类。
  • 「生存时间」:32位的字段,以秒为单位,表示该资源记录在缓存中的有效时间。
  • 「资源数据长度」:16位的字段,指明后面的资源数据的长度。
  • 「资源数据」:可变长度字段,包含与该资源记录类型相关的具体数据,如A记录的IP地址、NS记录的域名服务器名称等。

总结

以上就是DNS域名管理系统涉及到的知识点啦,虽然很多后端程序员吗,在日后的工作中几乎不再深追DNS的底层原理,但初期,我们还是有必要了解一些网络上的内容的,毕竟企业内转岗比较常见。

面试官:DNS解析都整不明白,敢说你懂网络?我:嘤嘤嘤!的更多相关文章

  1. 【长文】Google面试官分步解析自己泄漏前的面试题,超多干货和建议

    本文翻译自Google工程师/面试官Alex Golec的文章:Google Interview Questions Deconstructed: The Knight's Dialer:翻译:实验楼 ...

  2. 硬核解析MySQL的MVCC实现原理,面试官看了都直呼内行

    1. 什么是MVCC MVCC全称是Multi-Version Concurrency Control(多版本并发控制),是一种并发控制的方法,通过维护一个数据的多个版本,减少读写操作的冲突. 如果没 ...

  3. 你都这么拼了,面试官TM怎么还是无动于衷

    面试,对于每个人而然并不陌生,可以说是必须经历的一个过程了,小到一场考试,大到企业面试,甚至大型选秀...... 有时自己明明很努力了,但偏偏会在面试环节出了插曲,比如,紧张就是最容易出现的了. 我相 ...

  4. 你都这么拼了,面试官TM怎么还是无动于衷?

    前言 面试,对于每个人而然并不陌生,可以说是必须经历的一个过程了,小到一场考试,大到企业面试,甚至大型选秀...... 有时自己明明很努力了,但偏偏会在面试环节出了插曲,比如,紧张就是最容易出现的了. ...

  5. 面试官:Java中对象都存放在堆中吗?你知道逃逸分析?

    面试官:Java虚拟机的内存分为哪几个区域? 我(微笑着):程序计数器.虚拟机栈.本地方法栈.堆.方法区 面试官:对象一般存放在哪个区域? 我:堆. 面试官:对象都存放在堆中吗? 我:是的. 面试官: ...

  6. 美团面试官问我: ZGC 的 Z 是什么意思

    本文的阅读有一定的门槛,请先了解 GC 的基本只知识. 现代垃圾收集器的演进大部分都是往减少停顿方向发展. 像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行 ...

  7. 互联网公司的面试官是如何360°无死角考察候选人的?[z]

    [z]https://juejin.im/post/5c0e47ebf265da614e2be9a7 一.写在前面 最近收到不少读者反馈,说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不 ...

  8. 面试官:讲讲redis的过期策略如何实现?

    时隔多日,小菜鸡终于接到阿里的面试通知,屁颠屁颠的从上海赶到了杭州. 经过半个小时的厮杀: 自我介绍 hashMap和ConcurrentHashMap区别 jdk中锁的实现原理 volatile的使 ...

  9. 阿里面试Java程序员都问些什么?

    刚开始也是小白,也是一步步成成起来的.需要提的一点是,你将来是需要靠这个吃饭的,所以请对找工作保持十二分的热情,而且越早准备越好. 阿里一面 一面是在上午9点多接到支付宝的面试电话的,因为很期望能够尽 ...

  10. 阿里二面,面试官居然把 TCP 三次握手问的这么细致

    TCP 的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度.看似是简单的面试问题,如果你的回答不符合面试官期待的水准,有可能就直接凉凉了. 本文 ...

随机推荐

  1. Python技术书示例代码相关内容

    二维码用微信扫,按提示填写你的邮箱,转到电脑上打开邮箱下载.清华国企网盘,比较快速.安全.放心下载. 百度网盘链接 用Edge/Chrome浏览器下载. <Python自动化运维快速入门> ...

  2. 《Vue.js 设计与实现》读书笔记 - 第11章、快速 Diff 算法

    第11章.快速 Diff 算法 11.1 相同的前置元素和后置元素 快速 Diff 算法包含预处理步骤,这借鉴了纯文本 Diff 算法的思路. 先把相同的前缀后缀进行处理,然后再比较中间部分. fun ...

  3. 在Windows平台使用源码编译和安装PyTorch3D指定版本

    最近在部署 SyncTalk 虚拟数字人项目时,需要安装很多依赖项,在执行到pip install --no-index --no-cache-dir pytorch3d -f https://dl. ...

  4. USB ncm虚拟网卡

    NCM介绍 1 功能 USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Dev ...

  5. USB分析仪USB3.2日志分析

    1.简介 USB2.0总线采用轮询模式,即总线事务开始时,都要先发送IN或者OUT令牌包,以通知端点或者查询端点是否准备好.而USB3.2采用了异步通知模式,若端点没有准备好,则主机无需轮询,端点准备 ...

  6. 进程切换分析(2):TLB处理

    一.前言 进程切换是一个复杂的过程,本文不准备详细描述整个进程切换的方方面面,而是关注进程切换中一个小小的知识点:TLB的处理.为了能够讲清楚这个问题,我们在第二章描述在单CPU场景下一些和TLB相关 ...

  7. kotlin更多语言结构——>选择加入要求

    1.3.70 中引入了 @RequireOptIn 与 @OptIn 注解以取代先前使用的 @Experimental 与 @UseExperimental;同时 -Xopt-in 编译器选项也取代了 ...

  8. 【2022noip多校】异或

    [题目描述] 对于一个元素介于 \([0,2^m)\) 且互不相同的长度为 \(n\) 的序列 \(a_1, a_2 ...,a_n\) ,定义它的特征序列为 \(p_0,p_1,...,p_{2^m ...

  9. leetcode 740 删除并获得点数

    740 删除并获得点数 题意 给你一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数.之后,你必须删除 所有 等于 n ...

  10. “应用程序无法正常启动(0xc000007)”处理办法

    前几天使用非静态方式编译了一个程序,在部分系统上运行提示缺少msvcp140.dll,就从VS2019安装目录找了一个同名文件放在了程序同级目录,程序也可以正常运行了.今天重新打开虚拟机,突然就报了这 ...