首页 > 编程语言 >作为程序员对 DNS了解到这个程度就够了,别再深入了!

作为程序员对 DNS了解到这个程度就够了,别再深入了!

时间:2023-08-29 13:35:27浏览次数:42  
标签:IP 报文 地址 就够 程序员 域名 DNS 服务器

作为程序员对 DNS了解到这个程度就够了,别再深入了!

网管叨bi叨 2023-08-29 12:17 发表于北京

编者荐语:

分享一篇DNS科普文,作为程序员我觉得如果能了解到这个程度就已经很可以了,再深入就属于浪费自己时间了,你还能上手设计电路咋地?

以下文章来源于一枫说码 ,作者一枫说码

一枫说码.

字节跳动程序猿一枚,分享计算机基础、后端编程,助你少走弯路,上岸大厂!

本文详细介绍了 DNS 相关知识,包括 DNS 工作原理、如何提升域名解析速度、以及 DNS 记录与报文等内容。



1. 域名与域名服务器

在日常上网过程中,出于好记的原因,人们更喜欢在浏览器中输入网站的域名,而不是 IP 地址。比如想要访问百度,则会输入 www.baidu.com,而不是 202.108.22.5(或者百度网站的其他 IP)。

然而计算机网络通信中所识别的标识并不是域名,而是 IP 地址,因为其可以提供主机在互联网中的位置信息,而且是定长的,路由器等设备更容易处理。图片

为了折中人类和计算机不同的偏好,就出现了 DNS(Domain Name System,域名系统),其主要任务是根据域名查出对应的 IP 地址。

下面先介绍一下域名和域名服务器,之后再介绍 DNS 的工作原理。

域名由若干个英文字符串组成(不区分大小写),各字符串之间用点号『.』分隔连接,其中越靠右的表示域名级别越高。

网管叨bi叨 分享软件开发和系统架构设计基础、Go 语言和Kubernetes。 247篇原创内容 公众号

举个例子,百度的域名为 www.baidu.com,其中 com 是顶级域名(一级域名),baidu 是二级域名,www 是三级域名。图片

域名服务器(也称为 DNS 服务器)负责存储域名和 IP 地址的映射关系,当我们需要获取某个域名对应的 IP 地址时,只需要从域名服务器中查询即可。

图片

由于域名非常非常多,如果都存放在一台域名服务器中,那么不仅查询速度慢,服务器压力大,而且难以保证服务的可靠性。因此,DNS 采用了分布式的设计方案,大量的域名服务器之间通过层次方式组织,分布在全世界范围内。

一般而言,域名服务器可以分为以下四类:

  • 根域名服务器:最高层级的域名服务器,因特网上一共有 13 个根域名服务器(以英文字母 A 到 M 依序命名,格式为[a~m].root-servers.net),每个根域名服务器都知道所有顶级域名服务器的 IP 地址,比如知道负责 com 域的顶级域名服务器的 IP 地址。

  • 顶级域名服务器:对于每个顶级域名,如 com、org、edu 等,都有对应的顶级域名服务器。顶级域名服务器知道其所管理的所有权威域名服务器的 IP 地址,比如负责 com 域的顶级域名服务器知道负责 baidu.com 域的权威域名服务器的 IP 地址。

  • 权威域名服务器:一个网站需要将其域名和 IP 地址注册到相应的权威域名服务器中,比如网站 www.baidu.com 的域名和 IP 地址就存储在负责 baidu.com 域的权威域名服务器中。

  • 本地域名服务器:本地域名服务器不属于上述域名服务器的层次结构,但是它对域名系统非常重要。每个 ISP(如一个大学、一个公司)都有一个本地域名服务器(也叫默认域名服务器)。具体在下一节中介绍。

图片



2. 域名解析流程

知道了域名和域名服务器的基础知识后,我们来了解一下域名解析的具体流程,以输入百度域名为例,看看我们的主机是如何得到 www.baidu.com 的 IP 地址的。

图片

  1. 请求主机向本地域名服务器发送 DNS 查询报文,询问 www.baidu.com 的 IP 地址是什么;

  2. 本地域名服务器转发此查询报文到根域名服务器

  3. 根域名服务器发现要查询的顶级域名为 com,于是向本地域名服务器发送响应报文,报文中封装了负责 com 域的顶级域名服务器的 IP 地址列表;

  4. 本地域名服务器收到根域名服务器响应的报文后,选择其中一个顶级域名服务器的 IP 地址,并向其发送查询报文;

  5. 顶级域名服务器发现要查询的二级域名为 baidu,于是向本地域名服务器发送响应报文,报文中封装了负责baidu.com 域的权威域名服务器的 IP 地址列表;

  6. 本地域名服务器收到顶级域名服务器响应的报文后,选择其中一个权威域名服务器的 IP 地址,并向其发送查询报文;

  7. 权威域名服务器通过查询数据库,找到 www.baidau.com 的 IP 地址,并将此信息封装为一个响应报文,发送给本地域名服务器;

  8. 本地域名服务器将响应报文发送给原请求主机。我们的主机就知道了百度的 IP 地址,DNS 查询过程结束。

在此过程中,请求主机与本地域名服务器之间的交互称为递归查询,而本地域名服务器与域名服务器层次结构中相关服务器的交互称为迭代查询

请求主机是如何知道本地域名服务器的 IP 地址的?

当用户插上网线或者连上 WIFI 后,电脑会通过 DHCP 协议分配一个 IP 地址,与此同时,也会获取到本地域名服务器的 IP 地址!

本地域名服务器是如何知道根域名服务器的 IP 地址的?

因特网上一共有 13 个根域名服务器,它们的 IP 地址是固定不变的,因此被集成在了操作系统中,每台电脑都知道!

为了解析出百度域名的 IP 地址,一共发送了 8 份 DNS 报文。用户本来只是想和百度的服务器进行交互,却耗费了大量的时间进行域名解析,如果每次都这样搞,岂不是得慢死?因此就需要有一些提升域名解析速度的方式。



3.  提升域名解析速度

(1)TCP or UDP

我们都知道,TCP 相较于 UDP 更可靠,但是速度更慢图片

DNS 应该采用哪个传输层协议呢?

  • 如果采用 TCP 协议,不仅需要三次握手建立连接,而且需要进行拥塞控制等,那么域名解析速度将慢成龟速,不利于用户体验。

  • 如果采用 UDP 协议,万一丢包了怎么办?如果解析不出来 IP,怎么访问目标网站?不利于用户体验。

实际上,DNS 主要使用 UDP,在特殊情况下,也会使用 TCP,端口号都是 53

一般情况下,DNS 报文都比较小,只需要一个包就能承载所有信息。既然只有一个包,就无需考虑哪个包未送达,直接重发一个包即可,因此无需使用 TCP 那样复杂的协议,直接使用 UDP 协议,DNS 协议自己处理超时和重传问题,以提供可靠性服务。

当然有的时候 DNS 报文比较大,比如响应报文中可能一个域名包含有很多 IP 记录。当服务器响应时,会将报文中的 TC 标志位设置为 1,表示响应长度超过了 512 字节,此报文仅仅返回前 512 字节。当我们的主机收到响应后,就会使用 TCP 协议重发原来的查询请求,以获取完整报文。

此外,为了防止本地域名服务器(主域名服务器)宕机而导致无法对域名进行解析,本机还需要设置一个辅助域名服务器。当主域名服务器宕机后,由辅助域名服务器继续提供域名解析的服务。辅助域名服务器会定时(通常是每隔 3小时)向主服务器发送查询请求以实现同步,此时传输数据较多,因而使用 TCP 协议。

(2)DNS 缓存

即使采用 UDP 协议,但是如果每次都需要从根服务器开始一层一层的查询,仍然很慢,且处于层级结构中的域名服务器将会接收到大量的请求,处理速度进一步降低!

为了提升域名解析速度并减轻域名服务器的压力,DNS 广泛使用了缓存技术。

当用户访问了某个网站后,本地域名服务器会将解析出的域名和 IP 地址的映射关系缓存一定时间。在缓存过期前,用户再访问相同网站时,本地域名服务器就可以直接返回查询结果,而无需再去询问根域名服务器、顶级域名服务器等,这样就能大大减少传输的 DNS 报文数量!

实际上,不仅在本地域名服务器中设置了高度缓存,用户主机也有缓存。对于 Windows 电脑,可以通过命令ipconfig/displaydns查询当前 DNS 缓存,比如当我访问了百度后,本机就会缓存以下信息:图片

缓存虽然提升了 DNS 解析速度,但并不能保证一致性,因为一个网站的域名和 IP 地址的映射关系并不是永久不变的,可能缓存的解析结果已失效,因而 DNS 缓存时间不能设置太大!

Windows 电脑也可以通过命令ipconfig/flushdns清空本机缓存。

(3)切换本地域名服务器

前面提到,在进行域名解析时,主机会向本地域名服务器发起递归查询,如果本地域名服务器的性能较差,或者未正确配置缓存,那么我们上网的速度将会变得非常慢,因此选择一个好的本地域名服务器将有助于提升冲浪速度

默认情况下,本机在联网时会通过 DHCP 协议自动获得一个 DNS 服务器地址,那么如果此服务器性能不好,该如何更换呢?

以 Windows 为例,可以通过控制面板—>网络和 Internet—>网络连接—>Internet 协议版本4(TCP/IPv4)修改本地域名服务器的 IP 地址。

图片

互联网上常见的公共 DNS 服务器的 IP 地址如下:

  首选 DNS 服务器地址
备用 DNS 服务器地址
阿里
223.5.5.5 223.6.6.6
腾讯
119.29.29.29 182.254.116.116
百度
180.76.76.76 114.114.114.114
谷歌
8.8.8.8 8.8.4.4
114DNS
114.114.114.114 114.114.115.115

一般情况下,自动获取的本地域名服务器与主机位于同一个子网中,速度都挺快的。但是如果在上网过程中,发现打开网页的速度很慢,也可以尝试使用上面的公共 DNS 服务器,说不定速度会有所改善。



4. DNS 记录和报文

实际上,域名服务器中保存并不仅仅是域名和 IP 地址,而是保存了一个资源记录(Resource Record,RR)。

一个资源记录包含四部分内容,分别是 NameValueTypeTTL

TTL 指的是记录的生存时间,以秒为单位,它决定了缓存此记录的过期时间。

Name 和 Value 的含义随着 Type 的不同而不同,举几个常见例子:

  • 当 Type = A 时(A 是 Address 缩写,也可用编号 1 表示),Name 表示域名,Value 表示对应的 IP 地址,如(www.example.com,93.184.216.34,A,86400)。

  • 当 Type = NS 时(NS 是 Name Server 缩写,也可用编号 2 表示),Name 表示一个域,Value 为负责该域解析的域名服务器的域名,如(baidu.com,ns1.baidu.com,NS,172800),此记录用于沿着层级结构查询链来路由 DNS 查询。

如果一台域名服务器是用于某特定域名的权威域名服务器,那么其将会有一条包含该域名的 A 记录。

如果一台域名服务器不是用于某特定域名的权威域名服务器,那么其将包含一条 NS 记录,该记录用来指定该域名由哪个域名服务器来进行解析;除此之外,它还将包含一条 A 记录,该记录提供了在 NS 记录中 Value 字段中的域名服务器的 IP 地址。

图片

接下来介绍一下 DNS 报文的具体内容。DNS 报文分为两类:查询报文回答报文,二者有着相同的格式,如下图所示:图片

  • 事务 ID:用于标识 DNS 查询的标识符。查询报文和其对应的回答报文有着相同的事务 ID,因此通过它可以区分 DNS 回答报文是对哪个请求进行响应的。

  • 标志:此字段中含有若干标志,比如有一个『QR』标志位用于指出此报文是查询报文(0)还是回答报文(1),再比如有一个『TC』标志位用于指出此报文长度是否大于 512 字节。

  • 问题数:对应于下面查询问题的数量(支持同时查询多个域名,通常为一个)。

  • 回答资源记录数:对应于下面回答问题相关资源记录的数量(一个域名可能有多个 IP 对应,那么将会有多个回答记录)。

  • 权威资源记录数:对应于下面权威域名服务器相关资源记录的数量。

  • 附加资源记录数:对应于下面附加信息相关资源记录的数量。

  • 查询问题:此区域为查询内容,包含查询域名和查询类型(如  www.example.com,A)。

  • 回答问题:此区域为查询结果,包含一到多条资源记录(如 www.example.com,93.184.216.34, A,300)。

  • 权威域名服务器:此区域为其他权威域名服务器的记录,即含有指向权威域名服务器的资源记录,用以继续解析过程。(如 baidu.com,ns1.baidu.com,NS,172800)。

  • 附加信息:此区域为其他有帮助的信息,比如提供权威域名服务器所对应的 IP 地址。

最后,使用 Wireshark 抓一个 DNS 查询报文和回答报文:

查询报文:图片

回答报文:

网管叨bi叨 分享软件开发和系统架构设计基础、Go 语言和Kubernetes。 247篇原创内容 公众号 - END -

 

扫码关注公众号「网管叨bi叨」

给网管个星标,第一时间吸我的知识 

标签:IP,报文,地址,就够,程序员,域名,DNS,服务器
From: https://www.cnblogs.com/cheyunhua/p/17664492.html

相关文章

  • linux(ubuntu)能ping ip,不能ping域名。无法解析域名DNS指向127.0.0.53问题处理
    故障现象:无法上网。ping互联网ip地址能通信,ping域名无法解析。用nslookupwww.qq.com返回127.0.0.53无法解析的问题。重启无法解决。编辑/etc/resolved.conf配置文件dns写的127.0.0.53.直接添加新的dns,果reboot重启之后,还是原来的内容不变首先修改/etc/systemd/resolved.conf文件......
  • 《程序员面试宝典》中的一些面试题
    文章目录面试题1--->编程风格问题面试题2--->不用if等判断语句找出两个数中间较大的那个面试题3--->写一个交换两个数据的宏面试题4--->写一个宏返回两个数据中较小的那个面试题5--->char*和char[]的区别面试题6--->临界区,互斥量,信号量的区别面试题7--->网络中常见的ping命令属......
  • Karmada 结合 coreDNS 插件实现跨集群统一域名访问
    本文分享自华为云社区《Karmada结合coreDNS插件实现跨集群统一域名访问》,作者:云容器大未来。在多云与混合云越来越成为企业标配的今天,服务的部署和访问往往不在一个K8s集群中。如何做到服务访问与集群无关,成为了各个云服务提供商必须要面对的问题。本文基于Karmadav1.6.1版......
  • coredns.yaml
    apiVersion:v1kind:ServiceAccountmetadata:name:corednsnamespace:kube-system---apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRolemetadata:labels:kubernetes.io/bootstrapping:rbac-defaultsname:system:corednsrules:-apiG......
  • 程序员要学会交流
    拥有东西还不足够,还要考虑如何包装它。即使你拥有最好的想法、优雅的代码和实用的思考,如果你不能与他人进行有效沟通,这些都将不会结出果实。没有有效的沟通,好的想法就会变成孤儿。作为开发人员,我们必须在多个层面上进行沟通。我们在会议中花费数小时,倾听和交谈。我们与最终用户合......
  • 每个程序员都应该读的最有影响力的书
    StackOverflow网站上有用户问了一个问题,让大家推荐一些每个程序员都应该读的最有影响力的书。这个问题非常热门,下面是得票最高的回答。 CodeComplete (2ndedition)bySteveMcConnellThePragmaticProgrammerStructureandInterpretationofComputerProgramsThe......
  • 程序员要学会“投资知识”
    啊,富兰克林,那家伙总是说些深刻的道理。嗯,我们真的可以通过早睡早起变成优秀的程序员吗?早起的鸟儿可能抓住虫子,但早起的虫子会怎么样呢?然而,富兰克林的开场白确实击中了要害-知识和经验确实是你最有价值的职业资产。不幸的是,它们是有限的资产。随着新技术的出现和语言环境的发展......
  • 程序员应该专注技术还是转管理?
    只要有得选,专注技术或是转管理。都可以。但对于大部分程序员来说,都没得选。专注技术,你得有基础,基础太差,技术发展的天花板很低;想转管理,虽然门槛没有专注技术那么高,但是,公司里的管理岗位非常少,凭什么轮得到你?喜欢技术,自己也有能力去研究,那么做一名技术专家非常好。真没有什么比每天做......
  • 程序员的职业发展思考
    转眼之间,已入程序员将近十年,惶惶然过了这么多年,回头看,向前往,仍是一片茫然。努力地埋头苦干,做了一个项目再做下一个项目,做完一个需求,还有下一个需求。一直在被赶着走,抬起头,发现仍是一无所有,一无所获。不禁对自己的职业发展、人生规划产生了疑惑。程序员,或者准确的说,普通的程序......
  • 程序员应该将质量要求视为需求
    有一个老笑话就是这样的:一个美国公司向一个日本制造商订购了10万个集成电路。规格说明书规定缺陷率只能是一万分之一。几个星期后,订单完成了,货物交付了。除了一个大盒子的芯片,还有一个小盒子,里面装着十个带有标签的芯片,上面写着“这些是有问题的”。要是我们能像那样控制质量就好......