浅谈DNS体系结构
DNS是目前互联网上最不可或缺的服务器之一,每天我们在互联网上冲浪都需要DNS的帮助。DNS服务器能够为我们解析域名,定位电子邮件服务器,找到域中的域控制器……面对这么一个重要的服务器角色,我们有必要对它进行一番深入研究,本文尝试探讨一下DNS的体系结构,从而让大家能更好地了解DNS的原理。
DNS的主要工作是域名解析,也就是把计算机名翻译成IP地址,这样我们就可以直接用易于联想记忆的计算机名来进行网络通讯而不用去记忆那些枯燥晦涩的IP地址了。现在我们给出一个问题,在DNS出现之前,互联网上是如何进行计算机名称解析的?这个问题显然是有实际意义的,描述DNS的RFC882和883出现在1984年,但1969年11月互联网就诞生了,难道在DNS出现之前互联网的先驱们都是互相用IP地址进行通讯的?当然不是,但早期互联网的规模确实非常小,最早互联网上只有4台主机,分别在犹他大学,斯坦福大学,加州洛杉矶分校和加州圣芭芭拉分校,即使在整个70年代互联网上也只有几百台主机而已。这样一来,解决名称解析的问题就可以使用一个非常简单的办法,每台主机利用一个Hosts文件就可以把互联网上所有的主机都解析出来。这个Hosts文件现在我们还在使用,路径就在\Windows\System32\Drivers\etc目录下,如下图所示就是一个Hosts文件的例子,我们在图中可以很清楚地看到Hosts文件把[url]www.baidu.com[/url]解析为202.108.22.5。
 

在一个小规模的互联网上,使用Hosts文件是一个非常简单的解决方案,一般情况下,斯坦福大学的主机管理员每周更新一次Hosts文件,其他的主机管理员每周都定时下载更新的Hosts文件。但显然这种解决方案在互联网规模迅速膨胀时就不太适用了,就算现在的互联网上有一亿台主机,想想看,如果每个人的计算机中都要有一个容纳一亿台主机的Hosts文件!呵呵,是不是快要崩溃了!
互联网的管理者们及时为Hosts文件找到了继任者-DNS,DNS的设计要求使用分布式结构,既可以允许主机分散管理数据,同时数据又可以被整个网络所使用。管理的分散有利于缓解单一主机的瓶颈,缓解流量压力,同时也让数据更新变得简单。DNS还被设计使用有层次结构的名称空间为主机命名,以确保主机域名的唯一性。
DNS的设计要求您已经看到了,下面我来具体解释一下。DNS的前身Hosts文件是一个完全的分散解析方案,每台主机都自己负责名称解析,这种方法已经被我们否定了。那我们能否使用一个完全集中的解析方案呢?也就是全世界只有一个Hosts文件,互联网用户都利用这个文件进行名称解析!这个方案咋一听还是有可取之处的,至少大家都解脱出来了,不用每台计算机都更新那个Hosts文件了,全世界只要把这个唯一的Hosts文件维护好就完事大吉了。实际上仔细考虑一下,有很多的问题,例如这台存放Hosts文件的主机会成为性能瓶颈,面临巨大的流量压力,而且每个域名解析的结果都要通过这个文件进行更新,更新的速度可想而知不会太及时。因此,DNS也没有采用这种完全集中的解析方案。
目前DNS采用的是分布式的解析方案。具体是这样的,互联网管理委员会规定,域名空间的解析权都归根服务器所有,也就是说,根服务器对互联网上所有的域名都享有完全的解析权!且慢,有读者要提问了,那这个根服务器不就相当于全世界唯一的Hosts文件了吗?呵呵,不要着急,根服务器用了一个简单的操作,就改变了这种结构。根服务器使用的是什么操作?委派!下图就是根服务器委派的示意图,如下图所示,根服务器把com结尾的域名解析权委派给其他的DNS服务器,以后所有以com结尾的域名根服务器就都不负责解析了,而由被委派的服务器负责解析。而且根服务器还把以net,org,edu,gov等结尾的域名都一一进行了委派,这些被委派的域名被称为顶级域名,每个顶级域名都有预设的用途,例如com域名用于商业公司,edu域名用于教育机构,gov域名用于政府机关等等,这种顶级域名也被称为顶级机构域名。根服务器还针对不同国家进行了域名委派,例如把所有以CN结尾的域名委派给中国互联网管理中心,以JP结尾的域名委派给日本互联网管理中心,CN,JP这些顶级域名被称为顶级地理域名。
 

 
每个被委派的DNS服务器同样使用委派的方式向下发展,例如和讯公司想申请使用hexun.com域名,这时和讯就要向负责.com域名的DNS服务器提出申请,只要hexun.com还没有被其他公司或个人使用,而且申请者按时足额缴纳了费用,负责.com域名的服务器就会把hexun.com域名委派到和讯公司自己的DNS服务器60.28.251.1。只要DNS服务器使用委派,域名空间就会逐步形成现有的分布式解析架构。这种架构把域名解析权下放到各公司自己的DNS服务器上,既有利于及时更新记录,同时对平衡流量压力也很有好处。
那么,在这种分布式的解析结构中,DNS服务器如何进行域名解析呢?换句话说,其他的DNS服务器怎么知道由60.28.251.1负责解析hexun.com的域名呢?如果一个互联网用户想解析域名[url]www.hexun.com[/url],过程是怎么样的呢?如下图所示,用户把解析请求发送到自己使用的DNS服务器上,DNS服务器发现自己无法解析[url]www.hexun.com[/url]这个域名,于是就把这个域名发送到根服务器请求解析,根服务器发现这个域名是以com结尾的,于是告诉查询者这个域名应该询问负责com的DNS服务器。这时查询者会转而向负责com的域名服务器发出查询请求,负责com域名的DNS服务器回答说[url]www.hexun.com[/url]是以hexun.com结尾的域名,以hexun.com结尾的域名已经被委派到DNS服务器60.28.251.1了,因此这个域名的解析应该询问60.28.251.1。于是查询者最后向60.28.251.1发出查询请求,这次应该可以如愿以偿了,60.28.251.1会告诉查询者所需要的答案,查询者拿到这个答案后,会把这个查询结果放入自己的缓存中,如果在缓存的有效期内有其他DNS客户再次请求这个域名,DNS服务器就会利用自己缓存中的结果响应用户,而不用再去根服务器那里跑一趟了。
 

 
以上介绍的域名解析过程我们可以通过一个实验来加以说明,Berlin是一个DNS服务器,IP地址为192.168.1.200,其他IP参数如下图所示。我们现在用Berlin来解析一个域名,我们用抓包工具ethereal追踪一下域名解析的轨迹。
 
 

在DNS服务器上查询[url]www.hexun.com[/url],如下图所示,DNS服务器已经解析了这个域名,但到底解析的过程是什么样的呢?向下看!
 
 

打开抓包工具Ethereal,如下图所示,我们看到第8条记录显示DNS服务器Berlin向198.41.0.4发出了一个查询请求,请求解析[url]www.hexun.com[/url],198.41.0.4何许人也,13个根服务器之一!
 
 

接下来看第9条记录,198.41.0.4给Berlin一个回应,告诉了Berlin这个域名解析问题应该询问负责com区域的DNS服务器,而且198.41.0.4还给出了负责com区域服务器的域名和IP地址。
 
 

接下来的第10条记录显示了Berlin向192.55.83.30发出了域名解析请求,从上图可知,192.55.83.30就是负责com区域的域名服务器之一,这次查询会有什么样的回应呢?
 

 
从下图的第11条记录可以看出,负责com区域的域名服务器告诉Berlin,以hexun.com结尾的域名已经委派出去,现在有四个服务器负责,Berlin可以向这四个服务器中的任何一个提出查询请求。
 
 

从第12条记录可以看出,Berlin这次向59.173.14.26提出了查询请求,59.173.14.26就是上图中提到的负责hexun.com区域的四个服务器之一。这次查询会有什么样的结果呢?
 
 

如下图的第13条记录所示,这次查询终于有了结果,负责hexun.com的59.173.14.26终于告诉Berlin,[url]www.hexun.com[/url]对应的IP是60.28.250.55。
 
 

通过这个实验,希望大家能够更好地理解DNS的分布式结构,下篇博文中我们要讨论一下如何DNS服务器的常用记录类型。

本文出自 “岳雷的微软网络课堂” 博客,请务必保留此出处http://yuelei.blog.51cto.com/202879/106228

<转>浅谈DNS体系结构:DNS系列之一的更多相关文章

  1. 浅谈PCIe体系结构(详细剖析PCIE数据流向)

    <PCI-Express 体系结构导读> <浅谈PCIe体系结构> http://blog.sina.com.cn/s/articlelist_1685243084_3_1.h ...

  2. 前端浅谈-协议相关(DNS协议)

    从应用层到实体层的协议太多了,我们并不能一一涉及,目前来说就打算整理可能会与前端相关的协议. 前端面试常会问到一个问题-"从输入一个url到页面渲染经历了哪些过程".这其实是一个相 ...

  3. 浅谈Java并发编程系列(八)—— LockSupport原理剖析

    LockSupport 用法简介 LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现. LockSupport是用来创建锁和其他同步 ...

  4. Spring5.0源码学习系列之浅谈BeanFactory创建

    Spring5.0源码学习系列之浅谈BeanFactory创建过程 系列文章目录 提示:Spring源码学习专栏链接 @ 目录 系列文章目录 博客前言介绍 一.获取BeanFactory主流程 二.r ...

  5. 浅谈Android应用保护(一):Android应用逆向的基本方法

    对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...

  6. 浅谈 TCP、IP、DNS 和 HTTP 的关系

    一.浅谈三个协议的基本概念 1.IP 协议 按层次分,IP网际协议位于网络层,几乎所有的网络的系统都会用到 IP 协议,其重要性非同一般.IP 协议作用就是把各种数据包传送给对方,对方的地址就要看其 ...

  7. 浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)

    1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...

  8. 【转】浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)

    1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...

  9. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. jackson基于注解的简单使用

    Jackson提供了一系列注解,方便对JSON序列化和反序列化进行控制,下面介绍一些常用的注解. 1.@JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性. 2.@JsonFo ...

  2. 李洪强iOS开发之【Objective-C】09-空指针和野指针

    一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...

  3. CF 317D Game with Powers

    题解: 将一个数的指数看着一个堆,问题变成这些堆的异或值 分析一个堆的情况,打SG表. #include<stdio.h> #include<string.h> ]; char ...

  4. Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步

    Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述     PV操作是对信号量进行的操作.     进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...

  5. python基础 - 文件读写

    完成功能: 从指定位置读文件到控制台 #! /usr/bin/python # coding=utf- 方法一. try: f = open ('/root/python/file/001.txt', ...

  6. Linux功能-RPM命令详解

    一.概述 RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”,用RPM包方式来发布软件变得越来越流行,主要的原因是这种软件发布 ...

  7. 10、JPA_映射双向多对多的关联关系

    双向多对多的关联关系 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也有对A的集合的引用.A.B两个实体对应的数据表靠一张中间表来建立连接关系. 同时我们还知道,双向多对 ...

  8. maven项目配置Jetty服务器

    <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin ...

  9. showdialog()与show的区别

    showdialog就是显示有模式的窗体,showdialog后面的语句不会执行,直到显示的窗体被关闭. show就是无模式的窗体,显示窗体后不论窗体是否关闭都执行show后面的语句. ------- ...

  10. 转 intent常用功能

    1.从google搜索内容Intent intent = new Intent();intent.setAction(Intent.ACTION_WEB_SEARCH);intent.putExtra ...