简单谈谈DNS协议
DNS协议也可以称为DNS服务,全称是Domain Name System,即域名系统,和HTTP协议一样,也是一个位于应用层的协议(服务),它是基于运输层的UDP协议的,关于网络协议的分层介绍,见这里(还没有写好,先放这里一个空链接)。
从DNS的名字我们就可以知道,它提供域名映射到IP地址的服务,那么在我们详细说DNS协议之前,先来大致讲讲互联网的域名结构。
1. 域名结构
我们都知道,在互联网中,每一台计算机想要访问互联网,都需要一个IP地址来进行网络通信,可以是形如192.168.1.1
这样的点分十进制的IPv4地址,也可以是形如[0:0:0:0:0:0:0:1]
这样方括号包围的十六进制的IPv6地址,但是这些地址不便于记忆,所以就产生了域名这种方便人们记住的东西(当然你要是记忆力好能记住IP地址,在浏览器地址栏输入URL的时候,也可以直接用IP地址替换掉域名,效果是一样的)。
域名也可以叫做主机名。这里我们先给出一个域名,例如www.abc.com
,以这个域名为例,来看一下域名的结构。
域名采用层次化的结构,其中com
是顶级域名,abc
是二级域名,www
是三级域名,从语法上来说,每个域名都是几个不同层级的名字用.
连接起来的组合,域名不区分大小写字母,所以www.ABC.com
和www.abc.com
是一样的,按照规定来说,域名有长度限制,这里就不再细讲。
上面提到,com
是一个顶级域名(TLD,Top Level Domain),除了com
之外,顶级域名还有好多,一般来说可以分为:
国家顶级域名
如
cn
表示中国,us
表示美国,uk
表示英国,当然还有一些特殊地区也有所谓的国家顶级域名,比如hk
表示香港通用顶级域名
如
com
表示公司企业,net
表示网络服务机构,org
表示非营利组织,edu
表示美国教育机构(中国的教育机构一般来说是xxx.edu.cn
),gov
表示美国政府部门(中国的政府部门一般来说是xxx.gov.cn
)等。基础结构域名
不常见,不做叙述。
所以说,在中国,企业的域名一般可以是xxx.com
、xxx.com.cn
、xxx.cn
。
下面这个域名树,清晰地展示了互联网的域名空间:
在图中,edu.cn
下面,划分除了很多三级域名,如tsinghua
、pku
等,一旦某个单位有了一个域名,它就可以自己决定是否要进一步划分下属的子域,域名树的树叶节点就是单台计算机的名字,不能再继续划分了,例如mail
和www
这两台计算机的完整域名分别为mail.tsinghua.edu.cn
和www.tsinghua.edu.cn
(这里起什么名字都可以,一般来说,人们愿意把用作邮件服务器的计算机叫做mail,把用作网站的服务器叫做www)。
到这里,我们已经知道了为什么要有域名以及域名的结构,域名就是为了便于人们记忆而产生的,但是域名是方便人们记忆了,计算机反而不好处理了,它更善于处理IP地址这种东西,所以这里就用到了我们要讲的DNS协议,用来把域名映射到IP地址,在了解DNS解析域名的过程之前,我们还需要了解一下域名服务器这种东西(怎么这么多东西,写个博客好麻烦啊23333)。
2. 域名服务器(DNS服务器)
上面说到了域名体系的树状结构,为了实现域名系统,我们首先想到的就是在域名树的每个节点都设置一台对应的服务器,这样就可以了,但是这样做的后果就是导致域名服务器太多,域名系统的运行效率太低,所以,通常是将好多个节点划分为一个区,用分区的方式来实现域名系统,如下图:
其中,(a)是abc这个公司只设置了一个分区的样子,(b)是abc公司设置了两个分区的样子,这两个区分别为abc.com
和y.abc.com
,这两个区对应了两个权限域名服务器(后面还会提到)。下图可以看出域名服务器的层次结构:
由上图可以看出,根据域名服务器起的作用,可以把域名服务器分为四种不同的类型:
根域名服务器
根域名服务器对应的是域名树中的根节点,是最高层次的域名服务器,但是并不是只有一台,而是有好多台,总共有13个不同IP地址的根域名服务器,用a到m来表示,如
a.rootservers.net
,每个IP地址对应一套装置,一套装置在世界不同地点安装了服务器,总之,数量很多,当访问根域名服务器时,往往就是由路由器找到最近的根域名服务器访问。一般来说,每台根域名服务器都知道所有的顶级域名服务器的域名以及IP地址,但往往也只知道这些,所以访问根域名服务器一般只能得到顶级域名服务器的IP地址,而不能直接知晓你要找的具体服务器的IP。一般来讲,如果要通过互联网解析域名,本地域名服务器首先访问的就是根域名服务器,下面还会讲到。
顶级域名服务器
顶级域名服务器负责管理在顶级域名下的所有二级域名,例如
cn
是顶级域名服务器,管理edu
、gov
等二级域名,当接收到查询请求时,要么给出最终结果(即具体IP地址),要么给出下一步应该访问的权限域名服务器的IP地址。权限域名服务器
权限域名服务器上面已经提到过一次了,就是每个域名分区对应一个服务器就叫做权限域名服务器。当接收到DNS查询请求时,如果可以给出具体的IP地址就给出(例如前面的
abc.com
可以给出v.x.abc.com
的IP地址,所以直接返回),如果不可以,就把下一步要访问的权限域名服务器的IP地址返回(如abc.com
不能给出t.y.abc.com
的IP,就会把y.abc.com
这个权限域名服务器的IP地址返回)。本地域名服务器
可能有人已经发现了,上面的图中并没有本地域名服务器这一层级结构,这是因为本地域名服务器(有时候也叫作首选域名服务器或者默认域名服务器)不属于域名树的层次结构,但是相当重要。当一台计算机要进行DNS查询的时候,就会将查询的请求发给本地域名服务器。
一般来说,一个互联网服务提供商(ISP)或者是一个大学(甚至是一个系)都有一个本地域名服务器,也就是说,当你再学校内使用校园网时,你的本地域名服务器并不是指你自己的电脑,因为你的系或者你的学校,都共用一个本地域名服务器。
3. 域名解析过程
在了解了上面的域名结构以及域名服务器之后,我们来看一下域名的解析过程,总的来讲,主机向本地域名服务器的域名查询一般采用递归查询,而本地域名服务器向根域名服务器的查询一般采用迭代查询。
概念其实很简单,递归查询就是如果主机向本地域名服务器查询IP,本地域名服务器不知道IP地址,这是本地域名服务器就代替主机称为DNS客户,向根域名服务器进行下一步查询。而迭代查询就是,在本地域名服务器向根域名服务器查询时,根域名服务器要么给出最终的IP地址,要么给出下一步本地域名服务器要访问的顶级域名服务器的IP地址,之后本地域名服务器再去访问相应的顶级域名服务器(而不是让根域名服务器代替本地域名服务器去进行下一步查询)。简单来说,递归查询返回具体IP地址或者报错没找到,迭代查询返回具体IP地址或者返回下一步的IP地址。如下图:
当然,我们也可以指定查询方式让查询过程全程使用递归查询,如下图:
下面以一个例子说说明在无缓存的情况下(下面会谈到缓存),通过DNS来查询域名的步骤,假设域名为m.xyz.com
的主机想要查询y.abc.com
这个域名对应的IP地址,那么他就会按照域名查询方式1(上图)中的方式进行查询:
- 主机
m.xyz.com
先向本地域名服务器dns.xyz.com
进行递归查询。 - 本地域名服务器无法给出IP地址,所以本地域名服务器向(离自己最近的)根域名服务器查询,这是的查询已经变为了迭代查询。
- 根域名服务器根据本地域名服务器发送的报文,知道了下一步应该查询的是哪个顶级域名服务器,这时根域名服务器告诉本地域名服务器,下一步应该查询的顶级域名服务器
dns.com
的IP地址。 - 本地域名服务器向顶级域名服务器
dns.com
发送请求查询。 - 顶级域名服务器
dns.com
告诉本地域名服务器,下一步应该查询的权限域名服务器dns.abc.com
的IP地址。 - 本地域名服务器向权限域名服务器
dns.abc.com
发送请求查询。 - 权限域名服务器
dns.abc.com
告诉本地域名服务器想要查询的域名y.abc.com
的IP地址。 - 本地域名服务器在拿到IP地址后,将IP地址返回给主机
m.xyz.com
。
这就是域名查询的具体过程,因为DNS协议的基于UDP协议,所以上述8个步骤中,总共使用了8个UDP报文。
上面提到,这是在没有缓存的情况下的DNS查询,实际上,为了提高查询的效率以及降低根域名服务器的负荷,一般来说域名服务器中都有高速缓存,用来记录最近查询过的域名的缓存,如果在查询域名时,有想要的域名到IP的映射缓存,并且缓存没有过期,那么就直接将缓存中域名映射的IP地址返回,省去了接下来的查询。只有在没有缓存或者缓存过期了才会进行下一步的查询。实际上,不知域名服务器有缓存,每台计算机甚至浏览器都会对域名到IP的映射进行缓存,这样一来大大加快的DNS的查询速度。
上面这些就是DNS协议的大概了,如果觉得有哪里写的不对的,还请多多指教。
参考书籍:《计算机网络》谢希仁
简单谈谈DNS协议的更多相关文章
- 简单谈谈DNS的工作原理及实践
DNS协议简介 dns(Domain Name System)是一个全球化的分布式数据库系统,用于存储域名和互联网IP地址的映射关系.dns协议是计算机协议栈应用层中,应用最广泛的协议之一.用户每一次 ...
- SMTP 简单邮件传输协议
SMTP 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传 ...
- 计算机网络——DNS协议的学习与实现
1. 主要内容 不说废话,直接进入正题.先说说本文本文的主要内容,好让你决定是否看下去: 介绍DNS是干什么的: 介绍DNS是如何工作的: 介绍DNS请求与响应的消息格式: 编程实现一个简单的DNS服 ...
- 网络协议 16 - DNS 协议:网络世界的地址簿
[前五篇]系列文章传送门: 网络协议 11 - Socket 编程(下):眼见为实耳听为虚 网络协议 12 - HTTP 协议:常用而不简单 网络协议 13 - HTTPS 协议:加密路上无尽头 网络 ...
- 【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识
第33章 SMTP简单邮件传输协议基础知识 本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作. (本 ...
- DNS协议工作过程;DNS的安全隐患
DNS协议工作过程 下面以域名为m.xyz.com的主机欲通过另一个主机的域名y.abc.com的IP地址为例,简述DNS协议过程. 主机m.xyz.com先向其本地服务器dns.xyz.com进 ...
- http基础(1.了解web及网络基础,2.简单的http协议)
第一章:了解web及网络基础 1.http:超文本传输协议 2.tcp/ip协议族:通常使用的网络是在tcp/ip协议族的基础上运作的,而http属于它内部的一个子集. 3.tcp/ip协议族按层次分 ...
- 简单认识http协议
1.什么是TCP/IP 如果要了解一个人,可以从他归属的集体聊起来.我们的HTTP协议就属于TCP/IP协议家族中的一员,了解HTTP协议再整个网络流程中的地位,也能更加充分的理解HTTP协议. 要 ...
- 结合Wireshark捕获分组深入理解TCP/IP协议栈之DNS协议
摘要: 本文简单介绍了DNS协议理论知识,给出URL解析步骤,详细讲述了DNS报文各个字段含义,并从Wireshark俘获分组中选取DNS相关报文进行分析. 一.概述 1.1 DNS ...
随机推荐
- Python threading中lock的使用
版权声明: https://blog.csdn.net/u012067766/article/details/79733801在多线程中使用lock可以让多个线程在共享资源的时候不会“乱”,例如,创建 ...
- 重度使用示波器进行优化分析——一个DSDA项目回顾
这是若干年前一个项目,最近有时间整理一下.回忆起来,印象最深刻的就是重度使用示波器辅助分析,进行优化. 项目背景是在原有项目3G+项目基础上,增加一颗2G+ Modem,使支持DSDA功能. 在介绍D ...
- php利用自定义key,对数据加解密的方法
客户端和服务端通信时,有个场景很常见,通过一个id作为url参数来回传递.假设现在业务上只有这个id标识,那么需要稍微安全一点的通信,对这个id进行加密传输,到服务端再进行解密.这里需要一个服务端进行 ...
- BZOJ3451 Normal 期望、点分治、NTT
BZOJCH传送门 题目大意:给出一棵树,求对其进行随机点分治的复杂度期望 可以知道一个点的贡献就是其点分树上的深度,也就是这个点在点分树上的祖先数量+1. 根据期望的线性性,考虑一个点对\((x,y ...
- ASP HTMLEncode/HTMLDecode
asp 有Server.HTMLEncode 却没有 Server.HTMLDecode....... 需要自定义一个 HTMLDecode 函数: Function HTMLDecode(sText ...
- Java 面试题 队列
Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Deque接 口. Q ...
- 在WPF中使用FontAwesome图标字体
原文:在WPF中使用FontAwesome图标字体 版权声明:原创内容转载必须注明出处,否则追究相关责任. https://blog.csdn.net/qq_36663276/article/deta ...
- 两个非常好的bootstrap模板,外送大话设计模式!
两个非常好的bootstrap模板,外送大话设计模式! 下载地址:http://download.csdn.net/download/wolongbb/10198756
- 调用不同目录类的protected构造器
一.问题 二.分析 调用不同目录类的protected构造器,IDE报错. 二.解决办法: 后面添加一个{}就可以了
- 递归遍历对象获取value值
let menu = { name: '一级菜单', data: { name: '二级菜单', data: { name: '三级菜单', data: { name: '四级菜单' } } } }; ...