dns域名解析过程解析

科目三考试流程解析(附视频)_路考路训-驾驶员考试>&>正文科目三考试流程视频:科目三考试流程图文解析:
科目三考试内容:上车准备、起步、直线行驶、加减挡位操作、变更车道、靠边停车、直行通过路口、路口左转弯、路口右转弯、通过人行横道线、通过学校区域、通过公共汽车站、会车、超车、掉头、夜间行驶,共16项!(一)、上车准备:
从右后门下车,沿逆时针方向,经过车头,开左前门上车。上车后:①调整座椅。用脚踩踩离合、油门、刹车,把座椅调整到合适位置,调整后用力顶一下(以防开车时发生滑动)。调反光镜。(我们这没有要求两调,调座椅是为了踩踏板舒服。调后视镜的话一般是摸一下意思一下就可以了。)②系安全带。(插下去后再稍微拔一下看牢不牢。要把孔插对咯,我们这边科二的时候有人把它插副驾驶的孔去了。不过科三副驾驶坐着安全员,应该不会插错。)②检查空挡。(带档点火扣100分)③检查手刹。如果前一个人没把手刹拉上来或拉不到位,就把它拉到位。如果前一个人把手刹拉到死了,建议先把它往下放一点(有的女生力气不够,遇到这情况,在半联动后,需要用很大的劲来放手刹,结果脚下就控制不好导致熄火)。④检查灯光是否关闭。(二)、 起步
口诀:①踩②挂③打④鸣⑤看⑥抬⑦放①踩离合器②挂1档③打转向灯④鸣喇叭⑤通过后视镜观察后方交通情况⑥慢抬离合至半联动⑦再次侧头看后方交通情况,确认安全后,放手刹⑧车辆起步后,再慢慢抬完离合,然后慢慢踩油门。一定要慢!(离合抬太快可能导致车辆闯动。油门踩太猛会有冲出去的感觉,可加速踏板使用不当扣100)⑨慢踩油门,速度在15左右换2档。换二档后如果转向灯没有自动熄灭要记得手动把它熄灭。慢踩油门,速度在25左右换3档。补充:抬离合和踩油门,同时?先后?教练教我的起步是抬完离合再踩油门的,我不清楚是不是考试的要求。现在一般开车的人都是同时进行的,特别是大货车,不在半离合的时候踩油门根本启动不了。但是,我觉得考试的时候还是稳一点好,拿了驾照自己慢慢玩。(三)、变更车道①打灯②摆头看后视镜以及两边,默数3秒③动方向变道。如果有车变不过去的话,就踩刹车减速换2档,等车过去了再变道。变道后再提速换3档。④变道后如果转向灯没有自动熄灭要记得手动把它熄灭。(回复数字“17”看详细解析!)(四)、直线行驶保持3档35左右的速度,不要动方向。(不要动方向并不是完全不动,可以微微地动。具体可以动多少我也不清楚,但是1cm之内肯定是可以的。)直线行驶的时候往远处看(看的越远走的越直)(注意:以前单独发过直线行驶的讲解,可以查看历史消息或者回复数字“18”)(五)、加减挡操作:①3档踩油门到35-40之间换4档,②慢慢把油门踩到底(加油过程中遇到人行横道、学校、公交站、前方路口减速慢行,踩一下刹车,摆头看两边,然后继续加油)③速度达到50后慢松油门、慢踩刹车④速度降到45一下后再加大力度踩刹车,35左右换3档。(注意:加减挡操作详细过程,回复数字“55”即可)(六)、直行通过路口红灯停,绿灯行。路口一般有人行横道,记得看两边。(七)、路口左转弯(需要变道的话先变道)①打左转向灯②红灯停;绿灯行(若在3档及以上则减速换2档,若觉得车速快也可以换成1挡但不要太长时间用1挡否则系统会判定不合格)③记得摆头看两边④注意:路口不可停车,否则不合格(八)、路口右转弯(需要变道的话先变道)①打左转向灯②红灯停;绿灯行(若在3档及以上则减速换2档,若觉得车速快也可以换成1挡但不要太长时间用1挡否则系统会判定不合格)③记得摆头看两边④注意:路口不可停车,否则不合格(九)、公路掉头(需要变道的话先变道,建议停车后再掉)①打左转向灯②等对向无来车时,1档起步掉头(不加油,就用科二那种速度)③记得摆头看两边(注意:以前单独发过掉头的讲解,可以查看历史消息或者回复数字“22”)(十)、 通过学校区域、通过公交站、通过人行横道、前方路口前速慢行一定要摆头看两边。速度不超35就不用踩刹车减速,超过35就要踩一下刹车。(十一)、超越前方车辆:语音播报“请超越前方车辆”的时候:开启左转向灯3秒以上,看一下左侧后视镜,确认左后方无车辆可安全变道的前提下(开启转向灯后没有看后视镜,开灯时间不够三秒就变更车道的也是直接不及格),再斜向的变道至左边超车道后保持车辆直行,随后开启右转向灯3秒,同时看右后视镜,在确认安全的前提下再变换车道至中间车道(注意,超车的时候车速必须要在25码以上,超车车速不够25码的不及格,建议大家超车的时候车速保持在30码左右,)。超车结束后3档继续行驶,车速保持在30码左右,与前方车辆保证安全距离,打左转向灯提速超车,然后看右后视镜观察车辆找合适时机打右转向回原来的车道即可,转向灯要亮三秒以上。(十二)、会车语音播报“与机动车会车”时候:继续轻踩刹车,然后轻拉一把右方向盘(注意拉方向的时候不能压两边实线,会车动作不踩刹车和不拉右方向都会不及格)。(十三)、靠边停车①打右转向灯,丢油带刹②摆头看两边,默数3秒③右边如果有车或人就等,要是速度慢了就先换2档。右边没车或人了,踩离合和刹车慢慢靠边。④靠边后,拉手刹,退空挡,关转向灯(如果没自动灭的话),熄火,送离合和刹车,解安全带,看左边,没车没人就开门,下车,关门。(注意:以前单独发过靠边停车的讲解,可以查看历史消息或者回复数字“19”即可)(十四)夜考、模拟灯光科目三考试中需抽取不少于20%进行夜间考试;不进行夜间考试的考生,应当进行模拟夜间灯光使用考试。夜考攻略:1、出车前检查车辆灯光情况,近光灯、远光灯,雾灯等一个也不能少;2、跟随前车行驶时,应适当拉长两车之间的距离;3、注意道路上的交通标志和施工信号;4、夜间会车时,若遇到对方不关闭远光灯,应立即减速,并连续使用远、近光示意对
方关闭远光灯;若对方仍不关闭远光灯,应靠路的右侧停车避让。下面这些文章跟这篇文章很相关:★ 2016年4月最新模拟考试题★ 网友热搜大家在看最新信息路考路训排行榜推荐信息Tonyguo 的BLOG
用户名:Tonyguo
文章数:60
评论数:573
访问量:546291
注册日期:
阅读量:24883
阅读量:261221
阅读量:998935
阅读量:149285
51CTO推荐博文
1. DHCP Server
DHCPIPUDP 67DHCPDISCOVERMAC0.0.0.0255.255.255.255DHCP discover
DHCP discover1DHCP discover1DHCP discover248161-1000DHCP Server169.254.0.0/16IPIP5IP
DHCP ServerDHCP discoverIPTCP/IPUDP 68DHCP OFFERIPIPDHCP ServerIP255.255.255.255DHCP ServerIPDHCPIP
IPDHCP discoverMACXIDDHCP ServerDHCP OFFER
DHCPDHCP OFFERDHCP REQUESTMACIPDHCPDHCP ServerIPDHCPIPIPDHCP Server0.0.0.0IP255.255.255.255
DHCPDHCP ServerOFFERTCP/IPDHCP REQUESTDHCPDHCP Option FieldTCP/IP
DHCP ServerDHCP REQUESTDHCP ACKIP
DHCP ACKIPARPIPIPDHCP DECLINEDHCP ServerIPDHCP discoverDHCPIPBAD_ADDRESS
IPTCP/IPIP
50%IPDHCP ServerDHCP REQUESTDHCP ACKTCP/IPIPIP50%
50%87.5%IPDHCP100%IPDHCP169.254.0.0/165本文出自 “” 博客,转载请与作者联系!
了这篇文章
类别:未分类┆阅读(0)┆评论(0)
14:47:24 19:49:25 17:25:47 10:55:39 16:01:30 09:57:09 13:28:45 12:03:07 12:04:57 16:59:45 16:31:07作者:一帅
SQL任务是ODPS中使用最频繁的一类作业,大部分用户开始使用ODPS时要做的第一件事情就是学习怎么写ODPS的SQL。ODPS SQL是一种非常灵活的语言,兼容大部分的SQL92规范,也对大规模计算场景做了一些特别的定制。有些用户写出的SQL让人看了之后茅塞顿开的感觉,也有一些神级用户经常写一些1000多行的SQL,让人看的只想撞墙。本文会介绍一下SQL是如何分析解析,并拆解成分布式飞天任务的一些实现原理。
ps.由于一些历史包袱和工程实现的原因,ODPS某些内部实现细节可能与本文提到的不一致
语法分析的作用是将一个输入的‘字符串’变换为一个描述这个字符串的‘结构体’,让计算机可以更容易的理解用户输入的字符串是什么意义。这个阶段包含三个过程,分别是词法分析、语法分析、输出抽象语法树。
1.1词法分析
词法分析器是一个确定有限自动机,可以按照我们定义好的词法,将输入的字符集转换为‘单词’。如下:
1.2语法分析
在词法分析之后,接下来的过程就是语法分析了,词法分析的结果会作为语法分析的输入,语法分析在词法分析的基础上,来判断用户输入的单词是否符合语法逻辑,*SELECT FOO+100 FROM POKES*就是一个符合语法的句子,而*SELECT FOO+100 FROM*,是个不合法的语句,因为在FROM之后,一定要跟着一个表名。此时语法分析器会报错:
1.3抽象语法树
抽象语法树的英文全拼是:*abstract syntax tree*,这是用户输入语句的树形结构的表现形式,树上的每一个节点都是一个单词,树的结构体现了语法。抽象语法树是随着语法分析的过程构造的,当语法分析正常结束后,语法分析器就会输出一个抽象语法树,用户的输入和抽象语法树的结构内容是一一对应的,至此,用户输入的‘字符串’完完全全的变成了一个‘结构体’, SELECT FOO+100 FROM POKES转换为抽象语法树后如下所示:
ps.在ODPS中,真实的抽象语法树会复杂许多,为了方便大家理解,我将输出的抽象语法树做了一些简化。
编译的过程在过去曾经是最为复杂繁琐的,涉及到很多编译原理的理论,但是现在,开源的编译器工具已经足够的多,我们可以定义好语法,让编译器工具来帮我们完成这个转换。目前我们使用编译工具:来完成我们的编译。
2.语义分析
语义分析阶段是SQL解析过程中最为复杂最有难度的一环,涉及到SQL标准,SQL优化,和MapReduce的相关理论和概念。在这里,接着上面环输出的抽象语法树,语意分析后会输出一个查询计划,这个查询计划会指导着物理执行算子一步步的运行在我们的分布式系统之上,去读取表的内容,根据SQL的语意做运算,最后输入用户的内容。接下来我们会逐步分解语义分析的过程,揭开庐山真面目
语义分析阶段包含两大块,先逻辑分析后物理分析,逻辑分析基本上是纯代数的分析过程,与底层的分布式环境无关,而物理分析则是将逻辑分析后的结果做变换,与底层的执行环境密切相关。如我们使用飞天的分布式环境,物理分析时就需要确定在MapReduce时如何将数据分区、排序、读取数据量的大小、启动多少个进程来执行任务,等等。
2.1逻辑分析
顾名思义,逻辑分析过程就是要分析一下输入的SQL语句到底是干什么的,都有哪些操作。一般来讲,一个SQL语句总有一个输入,一个输出,输入数据经过SQL加工后得到输出数据,
2.1.1语句的执行顺序
SQL语句基本可以分解成下面7大块:
(5)SELECT (6)DISTINCT & select list &
(1)FROM & table source &
(2)WHERE & condition &
(3)GROUP BY & group by list &
(4)HAVING & having condition &
(7) ORDER BY & order by list &
在执行时,按照1-7的标号顺序执行,有些子句是可选的,比如where子句。当没有出现的时候就跳过这步。我们发现,写在最前面的select子句其实并不是最先执行的,这是因为SQL语句设计时为了让用SQL的人更容易与自己的思维相衔接。
2.1.2逻辑算子
根据上述的几个SQL基本操作,我们抽象出了一些逻辑算子(Operator),这些算子的功能是单一的不可再拆分的单位。分别是:
这些奇怪的算子是干什么用的呢?说白了,一个逻辑查询计划就是由这些算子组成的一个有向无环图(DAG),每一个算子都描述了SQL操作里的不同动作,由算子组成的有向无环图(DAG)描述了数据流的方向.
对于大部分算子而言,都有一个输入数据集,和一个输出数据集。JoinOperator和UnionAllOperator比较特殊,拥有两个或者两个以上的输入数据集,因为这两个算子的操作就是要将多个数据集做关联。我们将算子的输入数据集和输出数据集称之为虚表(vtable)
用户是看不到虚表(vtable)的,它只用来做内部分析,是算子和算子之间的桥梁,如下图所示:
2.1.3表达式分析
在SQL里,有很多子句都可以带有表达式,比如
其中SELECT子句中,GROUP BY子句中, WHERE子句中都带有表达式。表达式的解析和计算贯穿着整个SQL解析的过程,所以这里单独讲讲表达式。
1.类型推导
在分析表达式时,会遇到用户输入的常量,我们需要通过类型推导给输入的每一个常量做标记,识别SQL中常量的类型,规则较为简单,如:
2.隐式类型转换
所有的编程语言都会遇到隐式类型转换的问题,即当调用一个函数时,如果输入参数类型不符合函数签名时,就要尝试对输入的参数做隐式类型转换。当然,并不一定每次隐式类型转换都是成功的,如果发现无法无论如何转换都无法满足函数的签名,就会有异常抛出,终止分析过程。
3.布尔表达式分析
布尔表达式的分析主要作用是可以让之后的SQL优化更容易的进行下去,如Join时的条件下推优化,分区裁剪优化,都需要使用布尔表达式分析后的结果来进行。这步分析会用到很多布尔代数的知识,目的只有一个,那就是将用户输入的冗长的布尔表达式变换为最简合取范式,简而言之,就是将用户输入的一大推’and’ ‘or’组成的布尔表达式变换成由’and’连接的最简形式,如:
看起来这是一个很神奇的变换,实际上已经有很现成的算法来解决这个问题了。总共需要2步:
利用Quine McCluskey 算法对输入的布尔表达式生成合取范式(CNF)
利用Petrick’s method 算法对第一步生成的CNF计算最简合取范式(Minimal CNF)
4.CASE WHEN表达式的分析
CASE WHEN表达式是一个略显奇葩的表达式,它本身上是一个值函数(ScalarFunction),但又有逻辑判断,返回值又不固定,并且还可以嵌套使用,而且在语法上还有两种形式(简单CASE函数和CASE搜索函数) – -! 想在计算机里优雅的记录表达这个CASE WHEN真的很不容易。
condition参数是casewhen子句的条件,returnvalue1代表这THEN后的返回值,returnvalue2代表ELSE后的返回值。
这样,我们就可以很好的在计算机中结构化的表达,如:
2.1.4逻辑查询计划生成
有了以上的基础,我们就可以开始生成我们的查询计划了。严格按照SQL语句的执行顺序来遍历编译阶段生成的AST树,遇到什么操作就生成什么样的算子,遇到表达式就调用之前的表达式分析,真是兵来将挡水来土掩。
举个例子:
需要注意的是,在聚合函数里的值函数、Group by列表中的值函数,需要在聚合操作以前就计算完成,否则无法进行聚合操作,于是乎,出现了一个叫初始投影的东西,本质上这是一个SelectOperator,只是用来计算一下聚合需要用到的表达式。
题外话,在很久以前,group by 列表中和聚合函数里都是不允许使用表达式的,只能使用单一的值或者列,所以那时也不需要初始投影。用户想使用类似功能时只能通过子查询来实现。后来SQL语法扩展了,支持了group by、聚合函数中调用值函数,于是,在SQL解析时要先判断一下是否需要初始投影
还有很多结构的SQL没有讲到,比如JOIN, UNION ALL, WINDOWN FUNCTION,由于篇幅原因,这里先不提了,感兴趣的同学可以来找我们私下交流。
2.1.5子查询
SQL语法本身就是一个递归的结构,支持在FROM之后写一个子查询,如:
面对这样的语句,我们只要先去生成子查询的逻辑查询计划,将子查询的的结果虚表作为父查询的输入即可,在逻辑上很方便去应对。上面这个示例的查询计划如下图所示:
2.1.6逻辑优化
生成逻辑查询计划后,需要先对查询计划做一次优化,将一些显而易见的点优化掉,避免冗余的计算。主要包含三个优化:
常量表达式的计算举个例子:
SELECT 1+2 FROM POKES
“1+2“就是一个常量表达式,此时,我们可以将1+2的结果先计算出来,然后将结果放入查询计划,避免在执行时,对每一行数据都去计算这个固定结果的表达式。
列裁剪在生成查询计划时,默认会把全表中没一列的数据都读取出来,但现实的情况是用户可能只需要其中的某几列做计算,其他的列就变成了冗余数据,读取出来耗时耗力,但没有被用到。此时,我们就使用列裁剪这个优化去把不必要的列裁剪掉。
Predict Push Down在遇有JOIN运算时,用户很有可能还要在JOIN之后做WHERE运算,此时就要从代数逻辑上分析,WHERE中计算的条件是否可以被提前到JOIN之前运算,以此来减少JOIN运算的数据量,提升效率,千言万语不胜一张图,(又称no pic you say a bird):
SELECT * FROM A JOIN B ON A.ID=B.ID WHERE A.AGE&10 AND B.AGE&5
左面的是未优化前的查询计划,在FIL_4中计算了A.AGE&10 AND B.AGE&5这个表达式,右面的是优化后的查询计划,将A.AGE&10放入了FIL_7计算并且提前,将B.AGE&5放入了FIL_8中计算并且提前,最后将原有的FIL_4删除,以此来达到减少JOIN输入数据量的目的。
至此,逻辑查询与逻辑优化就结束了,逻辑查询计划和逻辑优化在所有的SQL系统中都是差不多的,下面来讲讲与我们分布式系统MapReduce相关的物理查询计划。
2.2物理分析
物理查询计划是通过之前产生的逻辑查询计划生成的,在转换的过程中,要与飞天的MapReduce编程框架做适配,生成飞天系统可以识别的
2.2.1物理算子
飞天的DAG是一个类似MapReduce的编程框架,想把刚刚一个SQL跑在分布式的飞天系统上,就需要按照分布式系统编程框架来抽象出一些新的物理运算符。
Shuffle-Sort算子(在ODPS中,这个算子叫ReduceSink)在飞天系统上,我们如果想做Group by或者Join操作,那么必须把相同key的数据放到同一个进程节点上来执行,而在这直线,这些相同key的数据也许是被打散在各个进程里的,这时我们就需要一个专门的算子来做数据的重新分区、排序的操作
GroupBy的不同阶段在飞天系统上,我们想实现一个GroupBy需要有4步:
准备阶段(AggregationPrepare), 在做一些非线性的聚合函数操作时,比如AVG求平均值,需要将AVG()拆解成SUM(),COUNT()两个线性的聚合函数,最后再使用SUM()/COUNT()来算出AVG()的值。在这步,只做拆解。
本地聚合(SemiHashAggregation), 对于Group by来说,需要将所有Group by 列表的字段数据放倒一个机器上才可以进行完全聚合,但是出于优化考虑,我们可以在数据片不全的时候先做一次聚合,虽然这次聚合操作不完全,但是可以减少输出的数据量,并且可以保证数据的正确性
流式聚合(StremAggregation), 这个聚合有个前提,一定是要求前趋的虚表Group by 列表中的数据都会在这一个进程里,并且排好序。一般而言,在本地聚合之后,数据会通过Shuffle-Sort运算数据重新分区和排序,再输入到流式聚合算子中
合并(FinalAggregation),这里输入的其实是已经聚合好的结果了,但是由于第一步提到的原因,有些非线性聚合函数被分解成了线性聚合函数,这里要将他们合并。如:AVG()=SUM()/COUNT()
在只有线性聚合函数时,上面的1,4步可以省略。
MapJoin 算子和MergeJoin算子
MergeJoinMergeJoin是最常见的一种Join算子,一般而言,MergeJoin是要求输入数据的虚表按照Join的Key分区并且排序的,所以MergeJoin一般出现在Shuffle-Sort算子之后。
MapJoin使用过的人应该都知道有一种Join的优化叫MapJoin,这个名字的本意是Map-side JOIN,就是JOIN运算在MapReduce的Map阶段完成。如果用户在做Join时,知道有一个数据表的数据量很小,可以选择使用MapJoin,MapJoin算子会在每一个进程里都把小表中的数据加载到内存,与打表一一做Join。这样可以减少一次Shuffle-Sort,提升执行效率。
2.2.2生成物理查询计划
逻辑查询计划是物理查询计划的输入,我们按照拓扑序去遍历逻辑查询计划上的每一个逻辑算子,生成物理算子,当我们认为虚表需要重新分区排序才能满足下一个阶段的运算时,我们就在中间加入一个Shuffle-Sort运算符.
还是使用逻辑查询计划生成的那个例子来描述一下物理查询计划是什么样子:
2.2.3物理优化
现在,又进入了一个优化的环节。此时的优化与底层的分布式系统更相关,主要目标就是减少读取的数据量,减少整个SQL执行的过程中,数据分区排序落地的过程。以此来提高执行效率。
分区裁剪大家知道,我们的业务表一般都是有分区的,而且一般都是按照时间来分区。大部分情况下不需要全表扫描,只需读出几个分区的数据就可以完成我们的业务逻辑。于是,分区裁剪优化诞了。
我们会分析用户写在WHERE子句中的分区字段,将分区字段的条件拿出来,再去metastore中读取所有的分区信息,用WHERE子句中的条件做过滤,最后,我们就知道哪些分区是需要读取的了,我们把要读取的分区信息放入对应的TableScanOperator,在执行是时,就不用读取不必要的数据了。
需要注意的是,并不是所有的WHERE条件中的分区条件都可以做裁剪,当用户写了LEFT JOIN,RIGHT JOIN, FULL OUTER JOIN时,如果在JOIN条件中涉及到了分区字段,那么很有可能就无法完成分区裁剪的优化,因为裁剪后SQL的结果就不对了。
减少不必要的Shuffle-Sort有时我们会写出这样的语句:
在上面这个例子中,Join 后做Group by ,应该在Join和Group by之间加入一个Shuffle-Sort算子,以保证Group by 算子的输入虚表按照固定的A.ID来排序,但是我们发现,JOIN之后A.ID这个字段本来就是有序的,所以,我们可以将中间这个Shuffle-Sort算子删除,减少数据的网络传输和落地。
2.2.4生成飞天的DAG
物理查询计划已经生成好了,下一步就是按照飞天的DAG编程模型把物理查询计划的算子适配进去。飞天DAG的单位是Stage,由多个Stage组成了DAG,Stage和Stage之间可以进行对数据的分区和排序,有点想Map和Reduce的关系。
生成飞天DAG的规则也很简单:
按照拓扑序遍历物理查询计划上的每一个算子,每一个算子都在一个独立的集和里。如果两个算子相连接,则将这两个集和合并。当遇到Shuffle-Sort算子时终止,并开始新一轮的合并集和过程。
对于上面这个语句,按照规则生成DAG后的样子如下:
其中每一个灰色的方块代表Fuxi的一个Stage。TS_1在STAGE1中读取表A,RS_3进按A.ID进行分区排序,TS_2在STAGE2中读取表B,RS_4按照B.ID进行分区排序。JOIN_5在STAGTE3中,按照A.ID=B.ID做MergeJoin, SEMIHASH_7为Group by A.AGE做半聚合,通过RS_8将数据按照A.AGE重新分区排序。 STAGE3的第一算子是STREAMEDAGG_9,接收按照A.AGE排序后的数据做流式聚合,最后SEL_10将数据做投影,FS_11将数据写出到磁盘。
洋洋洒洒写了这么多,SQL解析的逻辑基本就结束了,SQL解析是一个逻辑非常复杂繁琐的过程,有很多细节和恶心的坑本文中还没有提到,稍有不慎就可能引起SQL正确性的错误。
您需要才能发表评论。11779人阅读
一、域名系统
1、域名系统概述
& & & & 域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址。域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢?这是因为在这种因特网的命名系统中使用了许多的“域(domain)”,因此就出现了“域名”这个名词。“域名系统”明确地指明这种系统是应用在因特网中。
& & & & 我们都知道,IP地址是由32位的二进制数字组成的。用户与因特网上某台主机通信时,显然不愿意使用很难记忆的长达32位的二进制主机地址。即使是点分十进制IP地址也并不太容易记忆。相反,大家愿意使用比较容易记忆的主机名字。但是,机器在处理IP数据报时,并不是使用域名而是使用IP地址。这是因为IP地址长度固定,而域名的长度不固定,机器处理起来比较困难。
& & & & 因为因特网规模很大,所以整个因特网只使用一个域名服务器是不可行的。因此,早在1983年因特网开始采用层次树状结构的命名方法,并使用分布式的域名系统DNS。并采用客户服务器方式。DNS使大多数名字都在本地解析(resolve),仅有少量解析需要在因特网上通信,因此DNS系统的效率很高。由于DNS是分布式系统,即使单个计算机除了故障,也不会妨碍整个DNS系统的正常运行。
& & & & 域名到IP地址的解析是由分布在因特网上的许多域名服务器程序共同完成的。域名服务器程序在专设的结点上运行,而人们也常把运行域名服务器程序的机器称为域名服务器。
& & & & 域名到IP地址的解析过程的要点如下:当某一个应用需要把主机名解析为IP地址时,该应用进程就调用解析程序,并称为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用程序获得目的主机的IP地址后即可进行通信。
& & & & 若本地域名服务器不能回答该请求,则此域名服务器就暂时称为DNS的另一个客户,并向其他域名服务器发出查询请求。这种过程直至找到能够回答该请求的域名服务器为止。此过程在后面作进一步讨论。
2、因特网的域名结构
& & & & 由于因特网的用户数量较多,所以因特网在命名时采用的是层次树状结构的命名方法。任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。这里,“域”(domain)是名字空间中一个可被管理的划分。
& & & & 从语法上讲,每一个域名都是有标号(label)序列组成,而各标号之间用点(小数点)隔开。
& & & & 如下例子所示:
& & & & 这是中央电视台用于手法电子邮件的计算机的域名,它由三个标号组成,其中标号com是顶级域名,标号cctv是二级域名,标号mail是三级域名。
& & & & DNS规定,域名中的标号都有英文和数字组成,每一个标号不超过63个字符(为了记忆方便,一般不会超过12个字符),也不区分大小写字母。标号中除连字符(-)外不能使用其他的标点符号。级别最低的域名写在最左边,而级别最高的字符写在最右边。由多个标号组成的完整域名总共不超过255个字符。DNS既不规定一个域名需要包含多少个下级域名,也不规定每一级域名代表什么意思。各级域名由其上一级的域名管理机构管理,而最高的顶级域名则由ICANN进行管理。用这种方法可使每一个域名在整个互联网范围内是唯一的,并且也容易设计出一种查找域名的机制。
& & & & 域名只是逻辑概念,并不代表计算机所在的物理地点。据2006年12月统计,现在顶级域名TLD(Top Level Domain)已有265个,分为三大类:
& & & & (1)国家顶级域名nTLD:采用ISO3166的规定。如:cn代表中国,us代表美国,uk代表英国,等等。国家域名又常记为ccTLD(cc表示国家代码contry-code)。
& & & & (2)通用顶级域名gTLD:最常见的通用顶级域名有7个,即:com(公司企业),net(网络服务机构),org(非营利组织),int(国际组织),gov(美国的政府部门),mil(美国的军事部门)。
& & & & (3)基础结构域名(infrastructure domain):这种顶级域名只有一个,即arpa,用于反向域名解析,因此称为反向域名。
& & & & & & & & & & & & & & &
3、域名服务器
& & & & 如果采用上述的树状结构,每一个节点都采用一个域名服务器,这样会使得域名服务器的数量太多,使域名服务器系统的运行效率降低。所以在DNS中,采用划分区的方法来解决。
& & & & 一个服务器所负责管辖(或有权限)的范围叫做区(zone)。各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。每一个区设置相应的权限域名服务器,用来保存该区中的所有主机到域名IP地址的映射。总之,DNS服务器的管辖范围不是以“域”为单位,而是以“区”为单位。区是DNS服务器实际管辖的范围。区 &= 域。
& & & & 下图是区的不同划分方法的举例。假定abc公司有下属部门x和y,部门x下面有分三个分布们u,v,w,而y下面还有下属部门t。图a表示abc公司只设一个区。这是,区和域指的是同一件事。但图b表示abc公司划分为两个区:和。这两个区都隶属于域,都各设置了相应的权限域名服务器。不难看出,区是域的子集。
& & & & & & & & & & & & & &
& & & & 下图是以上图b中abc公司划分的两个区为例,给出了DNS域名服务器树状结构图。这种DNS域名服务器树状结构图可以更准确地反映出DNS的分布式结构。图中的每一个域名服务器都能够部分域名到IP地址的解析。当某个DNS服务器不能进行域名到IP地址的转换时,它就会设法找因特网上别的域名服务器进行解析。
& & & & 从下图可以看出,因特网上的DNS服务器也是按照层次安排的。每一个域名服务器只对域名体系中的一部分进行管辖。根据域名服务器所起的作用,可以把域名服务器划分为下面四种不同的类型。
根域名服务器:最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助根域名服务器。所以根域名服务器是最重要的域名服务器。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。需要注意的是,在很多情况下,根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。
顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。
权限域名服务器:负责一个“区”的域名服务器。
本地域名服务器:本地服务器不属于下图的域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。
& & & & & & & & & & & &
4、域名的解析过程
& & & & 一、主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
& & & &二、本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。
& & & & 下图给出了这两种查询的差别
& & & & & & & &&
& & & & 下面举一个例子演示整个查询过程:
& & & & 假定域名为的主机想知道另一个主机的IP地址。例如,主机打算发送邮件给。这时就必须知道主机的IP地址。下面是上图a的几个查询步骤:
& & & & 1、主机先向本地服务器进行递归查询。
& & & & 2、本地服务器采用迭代查询。它先向一个根域名服务器查询。
& & & & 3、根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器的IP地址。
& & & & 4、本地域名服务器向顶级域名服务器进行查询。
& & & & 5、顶级域名服务器告诉本地域名服务器,下一步应查询的权限服务器的IP地址。
& & & & 6、本地域名服务器向权限域名服务器进行查询。
& & & & 7、权限域名服务器告诉本地域名服务器,所查询的主机的IP地址。
& & & & 8、本地域名服务器最后把查询结果告诉。
& & & & 整个查询过程共用到了8个UDP报文。
& & & & 为了提高DNS查询效率,并减轻服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
& & & & 例如,在上面的查询过程中,如果在的主机上不久前已经有用户查询过的IP地址,那么本地域名服务器就不必向根域名服务器重新查询的IP地址,而是直接把告诉缓存中存放的上次查询结果(即的IP地址)告诉用户。
& & & & 由于名字到地址的绑定并不经常改变,为保持告诉缓存中的内容正确,域名服务器应为每项内容设置计时器并处理超过合理时间的项(例如每个项目两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器绑定信息。当权限服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名解析的正确性。
& & & & 不仅在本地域名服务器中需要高速缓存,在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花精力就能维护数据库的一致性。
参考文献《计算机网络第5版》--谢希仁
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:180733次
积分:2606
积分:2606
排名:第8922名
原创:90篇
转载:32篇
评论:11条
(1)(1)(1)(6)(7)(20)(4)(2)(9)(8)(6)(9)(2)(5)(4)(1)(21)(12)(3)}

我要回帖

更多关于 dns域名解析过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信