在互联网时代中,如果要问哪个应用层协议最重要的话,我想答案无疑是DNS.虽然我们每天都享受着DNS服务带来的便利, 却对它往往知之甚少.因此本文就来介绍一下DNS协议的工作流程,真正认识一下这个支撑着庞大互联网络的基础服务.

前言

DNS协议,全称为Domain Name System,即域名服务系统, 其功能描述起来很简单,就是将域名(网址)转换为IP地址. 可以想象为一个存储了全世界域名到IP的映射的服务器, 通过DNS请求查询获得IP地址. 然而事实上域名的 数量繁多,如果全部存放在一台服务器之上显然不合适. 因此对不同层级的域名往往需要在不同的域名服务器上查找, 直至找到最终的IP地址或者下一层级的域名服务器, 这是一个多次查找的过程.

域名的分级

我们日常上网所输入的网址,格式例子为http://www.pppan.net,其中www.pppan.net就可以看作是域名. 实际上,域名是从右到左分级的,格式如下所示:

主机名.次级域名.顶级域名.根域名
即:
host.sld.tld.root

www.pppan.net为例,其完整的域名应该是‵www.pppan.net.root‵,由于全球的根域名都是root,因此根域名 部分常常忽略,因此可以写成www.pppan.net.(注意最后的点),

根域名

根域名通过根服务器进行解析, 根服务器对于每个请求告知顶级域名服务器的地址. 目前全世界一共有十三台根服务器, 由不同国家或机构管理维护,分别坐落在如下的地方:

可以看到其中没有一台是在中国境内。

顶级域名

顶级域名, 英文名为TLD(Top-Level Domains). 根据用途不同被分为两部分. 一部分称为通用顶级域名gTLD(generic TLD), 如.com, .net, .org, .biz, .info等都是常见的通用顶级域名; 另一部分称为国别顶级域名ccTLD(country side TLD), ccTLD对应的国家拥有对应域名进行任何限制的权力,有的国家只允许本国公民注册ccTLD域名,不过其他国家的机构可以通过”租” 的方式来获得对应国家的ccTLD域名, 常见的ccTLD类型域名有.cn, .us, .ru等,还有些国家国别顶级域名因为有特殊的含义 而被批量租用的,如.tv, .ws, .tk等.

次级域名

次级域名, 英文名为SLD(Sub-Level Domains), 通常又被称为二级域名. 这一级别的域名是用户可以向域名代理商进行注册的, 我们通常说的购买域名,就是买的次级域名.

主机名

主机名(hostname), 是用户在自己的域中被服务器所分配的不同的名称. 常见的www就是一个主机名.

域名查找

当我们知道一个用名称表示的资源时,为了访问这个资源,我们就需要知道其地址, 这个地址通常也称为记录(records). 这个根据资源名称(域名)来查找地址的过程, 就称为DNS, DNS查找通常会经过下面四步:

  • 询问Resolver
  • 询问根服务器
  • 询问顶级域名服务器
  • 询问次级域名服务器

Resolver

resolver就是我们常说的DNS服务器, 其作用是为我们提供域名服务器的地址. resolver的地址一般在我们接入网络的时候, 通过DHCP获得, 也可以手动指定resolver地址. 在Linux系统中可以查看/etc/resolv.conf文件查看resolver地址, Windows则可以通过控制面板查看.

resolver通常有个root-hints文件, 其中硬编码了十三个根域名服务器的地址. 当我们向resolver发起DNS请求时, resolver会同时向所有根域名服务器发出查找请求,并以最快返回的响应为结果执行下一步的操作. 实际上, resolver会根据响应速度获得一个优先查找的根服务器,并将随后的查找都只向此根服务器进行请求. 当然, 优先服务器也有自己的更新机制,不过这是题外话了.

resolver获得根服务器的地址之后,通常还需要进行下一步的查询. 如果我们要查找的域名为www.example.com, 则还需要向根服务器查找com的顶级域名服务器,然后再查找次级域名服务器和主机名等.

询问根服务器

上面也说了,全球一共十三个根域名服务器,其中每一个都知道可以处理此次DNS请求的次级域名服务器的地址, 或者至少知道可以处理请求的下级的域名服务器地址.

一般来说,根服务器处理DNS请求,并且告诉resolver下一步应该去询问哪个顶级服务器. 不过如果根服务器识别出了 次级服务器的地址,就会把这个地址返回给resolver的.

询问顶级域名服务器

如果上一步根服务器没有识别出次级域名服务器的地址,那么就会给resolver返回顶级服务器的地址,从而resolver 需要再次向顶级域名服务器发起查询.

顶级域名服务器收到查询请求后,会将可以真正解析此请求的次级域名服务器地址返回给resolver.

询问次级域名服务器

上一步resolver请求顶级域名服务器后,会收到返回,内容是下一步要查询的域名服务器的地址, 也就是次级域名服务器的地址. 于是resolver向次级域名服务器发起DNS查询请求, 次级域名服务器接收到请求后即返回对应次级域名的IP地址.

值得一提的是,次级域名还有如下的别名:

  • 用户DNS名称服务器(User DNS name server)
  • 权威名称服务器(Authoritative name server)

其中后者更广为人知一些,因为SLD是查询到对应域名IP地址的最后一步(如果有的话), 而且这个域名服务器也负责对应资源的DNS设置,如添加不同主机地址的记录等.

resolver从次级域名服务器获得了域名的IP地址,并将其返回给用户,至此便完成了一次DNS查询.

域名查找实例

纸上得来终觉浅,绝知此事要躬行. 上面介绍了域名查找的一般流程之后, 我们就可以通过一次真实的DNS查找来验证上述的过程. 在Linux环境下,有默认的dig命令可以进行DNS的查找和调试, 这里以域名test.pppan.net为例. 输入命令dig +trace test.pppan.net可以看到详细的查找过程.

Step 1

首先, 向用户的DNS服务器(resolver,这里是10.0.20.166)查询根域名服务器的地址(std query A a-m.root-servers.net), 其中A表示查询ipv4地址记录,AAAA表示查询ipv6地址, 在下一节详细介绍. 返回结果如下:

.            318381  IN  NS  j.root-servers.net.
.           318381  IN  NS  k.root-servers.net.
.           318381  IN  NS  l.root-servers.net.
.           318381  IN  NS  m.root-servers.net.
.           318381  IN  NS  a.root-servers.net.
.           318381  IN  NS  b.root-servers.net.
.           318381  IN  NS  c.root-servers.net.
.           318381  IN  NS  d.root-servers.net.
.           318381  IN  NS  e.root-servers.net.
.           318381  IN  NS  f.root-servers.net.
.           318381  IN  NS  g.root-servers.net.
.           318381  IN  NS  h.root-servers.net.
.           318381  IN  NS  i.root-servers.net.
;; Received 811 bytes from 10.0.20.166#53(10.0.20.166) in 247 ms

可以看到,一共有13个根域名服务器,地址分别是a-m.root-servers.net., 其中响应最快的根域名服务器是j.root-servers.net.

Step 2

然后, 向j-root-servers.net(192.58.128.30)发起查询请求(standard query A test.pppan.net), 得到的返回如下:

net.         172800  IN  NS  a.gtld-servers.net.
net.            172800  IN  NS  b.gtld-servers.net.
net.            172800  IN  NS  c.gtld-servers.net.
net.            172800  IN  NS  d.gtld-servers.net.
net.            172800  IN  NS  e.gtld-servers.net.
net.            172800  IN  NS  f.gtld-servers.net.
net.            172800  IN  NS  g.gtld-servers.net.
net.            172800  IN  NS  h.gtld-servers.net.
net.            172800  IN  NS  i.gtld-servers.net.
net.            172800  IN  NS  j.gtld-servers.net.
net.            172800  IN  NS  k.gtld-servers.net.
net.            172800  IN  NS  l.gtld-servers.net.
net.            172800  IN  NS  m.gtld-servers.net.
net.            86400   IN  DS  35886 8 2 7862B27F5F516EBE19680444D4CE5E762981931842C465F00236401D 8BD973EE
net.            86400   IN  RRSIG   DS 8 1 86400 20170121050000 20170108040000 61045 . Y6+Td6BUfPw5RgC2aWX/pvC6OgEl8rVd3SCPtg+/qdwHxRa4TM8ppZWU +nTSRNTwgXX1VWxJ8D7MNu4q8gLZZWxO1U+3Viw8WNSRdIou+s2fVwon IQVF9y0GGpLaKt8mwlOaeHO3O1HiGGpR50GTlNhxyx6eGYHu5581ugFm NTjogYmrcTy5Es70WH6NhQ1z7+rO8rcuo5ES7fJoZWr4Bekd7YntSxXx +WCwOcpf3muLGPC9yshNprA/c9Fam3WDpJLYPjmCp2l96GyrJcv4o9z9 gov5IV69HWQnCD9IGRIj/XG/JZerp6YIRGH8cnrVe3F87Hy95SkNWnYR lC5fIg==
;; Received 863 bytes from 192.58.128.30#53(j.root-servers.net) in 524 ms

并没有返回IP,而是返回了可以解析该域名的顶级域名地址, 由于.net属于gTLD, 可以看到返回了多个顶级域名服务器(a-m.gtld-servers.net.)的地址.

Step 3

接着, 我们应该向返回的地址再次发起查询(standard query A test.pppan.net), 这次返回了次级域名服务器的地址,如下:

pppan.net.       172800  IN  NS  ns01.freenom.com.
pppan.net.      172800  IN  NS  ns02.freenom.com.
pppan.net.      172800  IN  NS  ns03.freenom.com.
pppan.net.      172800  IN  NS  ns04.freenom.com.
A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN NSEC3 1 1 0 - A1RUUFFJKCT2Q54P78F8EJGJ8JBK7I8B NS SOA RRSIG DNSKEY NSEC3PARAM
A1RT98BS5QGC9NFI51S9HCI47ULJG6JH.net. 86400 IN RRSIG NSEC3 8 2 86400 20170113060849 20170106045849 43880 net. WTfL5/hHBUsV2D5vusIP5KNSoiyfG4sG0GZQuBUqppWEY/WgZJ2wnnpk jjjfN5BlIExTuDyHclY2bXbiIqebcd1aVGp1ELUI7E5t3z7iCZmajPsT TLuLohKJmLC7b/OVdxoAuFoaIqj+GDsp2yDkXsem1IrfSOCbQlvJE9Ya xbQ=
OKR8BNVHVTI8CTK5KIDNJN546MJM5M16.net. 86400 IN NSEC3 1 1 0 - OKSF929IG7A7E1KLTJD5CF495DR06C54 NS DS RRSIG
OKR8BNVHVTI8CTK5KIDNJN546MJM5M16.net. 86400 IN RRSIG NSEC3 8 2 86400 20170113060546 20170106045546 43880 net. BGw3/vY9GzViJNHllwJkC1WB5XBtV9jzjy3LSA9I0zovOpVFHivHE01S r3YUtqAUuJ0LOJ4wrxBPwDRB0wTgbQdIO7dol2nQWuYujbxEbJ6AOWtR 7MTRhiG8BDn9LP06UWpUcWlsyywivKR70xCnamq3ZKeeI48dluRkVy9f lig=
;; Received 679 bytes from 192.33.14.30#53(b.gtld-servers.net) in 1813 ms

这一步返回可以看到, pppan.net所属的次级域名服务器是ns01-ns04.freenom.com, 因为我配置的就是这个地址. 但实际上可以自己在公网搭建这样一个次级域名服务器,只要可以解析出对应的hostname即可.

Step 4

最后,向ns01.freenom.com发起查询,便可以从响应中看到,已经找到了test.pppan.net的一条地址记录:

test.pppan.net.      14440   IN  A   233.233.233.233
;; Received 59 bytes from 54.171.131.39#53(ns01.freenom.com) in 464 ms

因此便能得到本次DNS查询的结果, 即test.pppan.net的ip地址为233.233.233.233.

注: 对于用户而言,其实只进行一次DNS查询,即向resolver的查询,中间的过程由resolver进行按级查询, 并将最后查询到的结果返回给用户(如果有的话). 上面的查询由dig命令发起,因此和实际的查询过程还是有点小差别的.

记录类型

从上面的示例中我们可以看到, 我们查询的记录类型为A或者AAAA, 返回的结果类型有NS,DS或者A等. 这些记录的类型在DNS协议中都有详细介绍,这里只解释几个常见的类型:

A

A记录(Address Mapping records), 指示了对应名称的IPv4地址, A记录用来将域名转换为ip地址.

AAAA

AAAA记录类似于A记录, 只不过指示的是IPv6的地址.

NS

NS记录(Name Server records), 用来指定对应名称的可信名称服务器(authoritative name server).

PTR

PTR记录(Reverse-lookup Pointer records), 和正向DNS解析(A/AAAA记录)相反, 主要用来根据IP地址查找对应的域名.

CNAME

CNAME记录即Canonical Name records, 用来指定一个新的域名用以完成本次查询. 当resolver查询过程中遇到一个CNAME记录时, 则会重新开始本次查询, 但是查询的域名会改为CNAME指定的域名. 举例来说,假如某次级域名服务器上有如下记录:

NAME                    TYPE   VALUE
--------------------------------------------------
bar.example.com.        CNAME  foo.example.com.
foo.example.com.        A      192.0.2.23

则查询bar.example.com的时候, 会在resolver端转而查询foo.example.com,从而得到查询的地址为192.0.2.23, 可以看到其实CNAME就是一个别名, 但是增加了查找的步骤. 不过这在当我们想要把自己的某个域名当作某个外部 域名的别称时还是很有用的. CNAME也有使用限制, 比如记录值不可以是IP, 以及不可同时有其他同名的A记录等, 具体可以参考这里.

MX

MX记录(Mail Exchanger records)为某个DNS域名指定了邮件交换的服务器. 这个记录信息由SMTP协议使用来将 邮件发送到正确的主机上. 通常对于一个域名有多个邮件交换服务器,并且他们之间都有对应的优先级.

TXT

TXT记录(text records)可以包含任意非格式化的文本信息, 通常这项记录被SPF框架(Sender Policy Framework) 用来防止发送给你的虚假邮件.

当然还有许多其他的记录类型, 不过相对而言没有那么常见. 需要了解的可以再深入查阅DNS协议的白皮书即可.

后记

经过上面对于DNS服务的解释, 我们应该就能解决大部分日常遇到的DNS问题. 比如为什么电脑能上QQ却打不开网页啦, 为什么我的网站突然解析不出来啦; 或者有独立域名的还能实现一些好玩的功能, 比如创建恶作剧的查询记录,或者 搭建个人邮件服务器等. 毕竟DNS协议是我们日常直接或者间接所接触到的最多的协议, 花上几个小时了解一下它的工作机制,我想应该也是挺有趣的吧.

转载链接:

http://jekyll.pppan.net/2017/01/08/dns-fundamentals/

内容略有编辑。

[计算机网络] - DNS基础介绍相关推荐

  1. 计算机网络 DNS服务介绍

    前言 本文梳理DNS服务 DNS是什么 DNS(Domain Name System,域名系统,也称为域名解析系统)是一种把计算机主机名称解析为对应的IP地址的服务. 从网络通信原理上来讲,DNS并不 ...

  2. MEC@JavaSE@实战篇@笔记05@计算机网络技术基础

    一.计算机网络技术基础 1.计算机网络的基本定义 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统中,网络管理软件及网络通信协议的管理和协调下, ...

  3. 计算机网络——DNS域名解析服务器原理

    摘要 本博文主要介绍DNS协议和DNS服务器域名解析相关知识和原理,帮助大家在理解计算机网络中的域名解析服务原理. 计算机网络知识脑图 计算机网络--计算机网络知识脑图_庄小焱的博客-CSDN博客_计 ...

  4. 计算机网络的体系结构与协议基本概念,计算机网络技术基础-第3章网络体系结构与协议.ppt...

    <计算机网络技术基础-第3章网络体系结构与协议.ppt>由会员分享,可在线阅读,更多相关<计算机网络技术基础-第3章网络体系结构与协议.ppt(19页珍藏版)>请在装配图网上搜 ...

  5. 网络基础:计算机网络由基础到深入常用知识集锦!

    网络技术的发展给社会带来了诸多益处,随着网络的广泛应用,网络给我们带来便利的同时,网络故障也时有发生.本文探讨了计算机网络中常见的网络问题及计算机网络维护方法,保证计算机网络运行稳定. 在日常使用过程 ...

  6. 电脑计算机网络由基础到深入常用知识集锦!

    网络技术的发展给社会带来了诸多益处,随着网络的广泛应用,网络给我们带来便利的同时,网络故障也时有发生.本文探讨了计算机网络中常见的网络问题及计算机网络维护方法,保证计算机网络运行稳定. 在日常使用过程 ...

  7. 计算机网络技术基础教学内容,计算机网络技术基础

    无 计算机网络技术基础>课程教案一 计算机网络技术基础> 课题: 课题:计算机网络概述(一) ) 教学顺序: 教学顺序:1 教学时数: 教学时数: 2 学时 教学目的:了解计算机网络产生的 ...

  8. 计算机网络技术人员介绍,计算机网络技术专业介绍2021 计算机网络技术专业就业方向及前景...

    计算机网络技术专业介绍2021,计算机网络技术专业是近来的热门专业,相信大家也想详细了解这个专业的内容.就业前景和方向.下面查字典网小编整理了2021计算机网络技术的简介及前景的内容,以供大家参考. ...

  9. 计算机网络应用最简单的,计算机网络的基础知识和简单应用.ppt

    文档介绍: 第8章计算机网络的基础知识和简单应用学****内容:计算机网络基本概念;因特网初步;因特网的服务功能.泊罩制藩往巍趋态拯巧郸嘘橡唤姬恍退戏付永缺彪崭嘶律旁炸雹蜡溪大相计算机网络的基础知识和 ...

最新文章

  1. php lalaogu cn,php安装编译时错误合集
  2. STM32F10x_StdPeriph_Lib_V3.5.0库与系统滴答定时器(Systick)
  3. 一部后现代文学的“奇书”:《烟草经纪人》
  4. 如何重新打开Windows防火墙提示?
  5. 使用NPOI——C#和WEB API导出到Excel
  6. unicode编码表_关于编码
  7. 《变革中的思索》各路读者评论
  8. c语言标识符附录,附录AC语言运算符表.PDF
  9. mysql 的安装目录linux命令_linux查看mysql安装目录
  10. 华为NP课程笔记3-OSPF3
  11. 通信线路工程验收规范_老杨一建通信学堂通信线路工程施工技术
  12. 许晓斌_Maven实战(二)——POM重构之增还是删
  13. 网络爬虫技术是什么,网络爬虫的基本工作流程是什么?
  14. Windows10下设置电脑屏幕仅显示黑白
  15. 2022年高考全国甲卷英语作文保护海洋
  16. 网页如何快速设置成黑白模式
  17. 观《风筝》电视剧感想
  18. JavaScript 如何计算两个日期之间的天数
  19. 使用ESP8266(基于官方SDK)接入阿里云物联网平台
  20. 什么是HIS、PACS、LIS、RIS

热门文章

  1. java list filter 性能,java的List中使用filter過濾出符合特定條件的元素List
  2. matplotlib 设置水平线、垂直线
  3. 解决linux vi报错 Can‘t open file for writing
  4. php 条码打印控件,jQuery插件jquery-barcode实现条码打印的方法
  5. 【Python爬虫学习笔记3】requests库
  6. 调用微信支付接口总结
  7. js时间格式化函数(兼容IOS)
  8. 简单nginx+tomca负载均衡
  9. http://ju.outofmemory.cn/entry/307891---------TICK
  10. 移动端上传照片 预览+Draw on Canvas's Demo(解决 iOS 等设备照片旋转 90 度的 bug)...