全部博文(403)
分类:
2006-09-15 17:13:21
在TCP/IP中用IP地址标识系统,这种标识方法是很不方便的。IP地址是16字节的2进制数,它以16进制数表示成32个字符。如果用户必须使用4E68:9F24:FFFF:1734:1529:0800:0219:7E14这个冗长的地址,不仅效率极低,也容易出现错误。
幸好,在TCP/IP中提供了这一问题的解决方案,即采用域名系统(DNS:Domain Name System)。用户利用此业务,能够以简单的域名标识系统,以便于实际应用。在协议执行时,使用的不是域名而是IP地址。为将域名“翻译”成IP地址或进行相反的操作,可以利用域名系统DNS的功能。DNS不仅提供这种变换的服务,还对域名进行层次化的处理。实际上,DNS比其它任何TCP/IP协议都更强调利用层次的概念。
图13.1示出了Internet域名分层的一个示例。由图可见,这种域名的层次类似于树型结构,例如www.ustc.edu.cn最后面的cn是顶级域名,由后向前分别用句点划分为不同层次的域。Internet上的顶级域名有两种,一种是如同edu、org、net、com 等分类代码,表13.1列出了这些最高层的分类代码,它们将域名空间按功能分成几大类,分别表示不同的组织;另一种象cn这样的按照地理位置划分的国别代码,通常用两个字符表示。
图 13.1 Internet域名的层次
如图13.1所示,这些最高等级域还可以再分配。商业域(com)中包括有例如微软计算机公司和其他商业公司。教育机构域(edu)中包括美国斯坦福大学等,在组织域(org)中有IEEE和国际电联(ITU)。国别顶级域下的次级域名同样可以按照地域或组织结构来分类,例如www.gd.cn是中国(cn)广东省(gd)WWW网址的域名,而域名www.edu.cn是中国教育网WWW网址的域名。
表13.1 Internet最高等级的功能域
com |
商业组织 |
edu |
教育机构 |
gov |
政府机构 |
int |
国际实体 |
mil |
军事机构 |
net |
网络提供者 |
org |
其他组织 |
注: Internet的雏形是仅仅位于美国本土的,因而其域名的顶级域是不需要国别代码的。随着Internet扩散到全世界,美国本土的域名沿用了下来,而其他地区的域名均采用国别代码作为顶级域名。这就是Internet具有两种顶级域名的原因。但是因为后来申请的域名可以根据自身的需求申请上一级域,所以现在不能够仅仅根据顶级域名为功能域来判断该主机是否位于美国本土。
利用Internet域名空间中的各个实体。还可以进一步对其进行划分,在一个域中形成多个子域。例如,中国科技大学可以对计算机科学系和电子工程与信息科学系定义各自的子域。
利用这种层次,Internet可以分级赋予命名权限。例如,中国科技大学的计算机系的网络管理员可以给某个计算机系统起名为shenhua。于是,该系统的全名为shenhua.cs.ustc.edu.cn。实际上,中国科技大学的电子工程与信息科学系也可以放心地给某个主机命名为shenhua。这是由于该系的主机名为shenhua.eeis.ustc.edu.cn,它们之间不会发生重名的缘故。
在DNS中,对命名存在若干限制。名字无论在层次中的哪一级都应该以ASCII字符开始,在域名中只能使用字符,数字和连字符(hyphen)。各等级的名字的大小被限制在63个字符以内,整个域名(包括所有等级和区别它们的句点)不能超过255个字符,大写的域名和小写的域名没有区别,可以随意选用。
在DNS中,域名服务器也具有分层结构。域名服务器是指在DNS协议中用作服务器的计算机。域名服务器将客户指定的域名变换成IP地址。图13.2示出了域名服务器如何形成层次。此图的最高层是根服务器(root server)。根服务器逻辑上对整个Internet网负有变换域名的责任。但是,如图所示,根服务器将一部分工作交给其他服务器承担。在该图中,根服务器拥有二个“子服务器”,分别对应edu.cn域和org.cn域的服务器.这种模式还要向ustc.edu.cn域的服务器和cs.ustc.edu.cn域的服务器的下方子域延续下去。
一个域名服务器所承担的责任范围被称作区(zone)。在该图的层次中的各个等级分别表示一个区,但并不要求区直接与子域对应。各个子域总是要被包含在一个区内,区则可以包含多个子域。例如,中国科技大学实际上对ustc.edu.cn子域及其下层的所有子域只用了一个域名服务器[注1]。该服务器管理一个区,但该区含有多个子域。
图 13.2 一级域名的查询
此外,一个服务器还可能负责多个区。例如,在Internet中,可以分配给一个服务器承担mil区和gov区双方的域名服务。
在图13.2中分析了从左下方系统开始的操作。在该图中,shenhua.cs.ustc.edu.cn为了和jianlibao.cs.ustc.edu.cn通信,需要知道其IP地址。首先,从shenhua所在的子域的域名服务器(局域域名服务器)进行查询(图中步骤1)。因被查询的对象jianlibao在该局域域名服务器的区域内,所以该域名服务器能够立即回送对应的IP地址(见步骤2)。此后shenhua和jianlibao开始进行通信。
图13.3示出了shenhua打算和bayi.eeis.ustc.edu.cn通信的实例。和上例相同,shenhua生成域名查询报文,向局域域名服务器发送(步骤1)。但该对象不在局域域名服务器的服务区内。该服务器因不能直接回答,于是向其父域名服务器查询(步骤2)。在这种情况下,它的父服务器负责ustc.edu.cn区。该请求报文送到父服务器后,父服务器知道该对象在eeis.ustc.edu.cn区中,并且在该区中存在着支持该区的子服务器。因此,在步骤3中,该请求报文传到下一层,被送往负责eeis.ustc.edu.cn的子服务器。
注1:域名服务器的发现方法
虽然大部分的域名服务器都被冠名,但客户并不使用其名字来标识域名服务器。DNS协议和其他的TCP/IP协议一样,需要的不是名字而是IP地址。换句话说,客户为了发送域名查询报文,必须预先知道域名服务器的IP地址。十分明显,客户向域名服务器查询域名服务器本身的IP地址是办不到的。第14章阐述的DHCP协议是客户获取域名服务器IP地址所能利用的协议之一。
图13.3 二级域名查询
此时,请求报文到达能够对其作出应答的服务器。eeis.ustc.edu.cn域的服务器向ustc.edu.cn服务器回送应答报文(步骤4),再将该应答报文向cs.ustc.edu.cn域的服务器转发(步骤5),于是该应答报文回送给shenhua(步骤6)。
这是一个递归查询(recursive guery)的示例。利用这种查询,客户只须向局域域名服务器发送一次报文,此域名服务器负责找出对应的应答信息。如该例所示,局域域名服务器要找出应答信息,有时则必须作为客户的代理进一步进行查询。最后,该局域域名服务器向客户回送应答。
图13.4 非递归和域名查询
DNS也支持非递归的操作。图13.4示出了shenhua非递归地查询bayi的IP地址的方法。与上例相同,首先从向该局域域名服务器查询开始(步骤1)。其后,局域域名服务器并不将该查询送往父服务器,而是立即回送应答。在此应答报文(步骤2)中虽未含有对查询请求的应答,但通知它向其父服务器“查对”。
Shenhua收到对此应答报文后,再次生成查询报文,利用返回的“查对”报文向其父服务器发送此查询消息(步骤3)。在此仍得不到对该查询的应答。该父服务器又回送含有别的查对的报文(步骤4)。这一查对只是对bayi.ustc.edu.cn区的服务器查询,这次用对该服务器的查询报文(步骤5)可以得到满意的回答(步骤6)。于是shenhua可以向bayi发送第一个数据报。
DNS采用了极其简单的的协议。客户向服务器发送查询报文,服务器回送应答。在DNS协议中为节约分组内的空间,对域名采用了压缩方法。
UDP和TCP都可以用于DNS,大部分服务器支持这二种服务。当查询报文到达域名服务器后,该服务器就利用与这一请求报文发来时所用的相同的传输服务进行应答。只做一个查询的客户大多使用简单的非连接型的UDP。而域名服务器作为客户工作时,往往进行多个域名查询。例如,有时域名服务器要更新全部的信息表。此时,通常可以利用TCP提供传输服务。
在DNS中,查询报文和应答报文都采用同一种格式(参阅图13.5)。报文中的起始2字节是标识符。客户生成查询报文时,对此域任意取值。服务器在应答报文中原封不动的回送该值。利用此域的功能可保证即使一个客户中存在多个查询时,也能使服务器的应答报文与其一一对应。当应答报文到达时,客户利用此标识符对该应答报文和原查询报文进行核对。
接下来的2字节是控制域。表13.2列出其中各个比特的意义。其顺序从高位到低位。
当应答报文是从对查询报文中包含的域名负有直接责任的服务器发来时,AA比特置成1。当应答报文是由递归查询得来时,或应答服务器通过与其它服务器交换报文获得该信息时,AA比特必须置0。
标识符 |
控制域 |
查询记录数 |
应答记录数 |
注册机构记录数 |
追加记录数 |
| |
| |
| |
|
图13.5 DNS报文格式
表13.2 DNS控制域中各个比特的意义
域 |
比特 |
内容 |
QR |
1 |
在查询报文中置0,在应答 报文中置1 |
Opcode |
4 |
在一般查询中置0,在逆向查询中置1 |
AA |
1 |
应答服务器是注册机构时置1 |
TC |
1 |
因尺寸限制报文被截短时置1 |
RD |
1 |
客户请求递归查询时置1 |
RA |
1 |
应答服务器支持递归查询时置1 |
Z |
3 |
保留(必须置0) |
Rcode |
4 |
应答代码 |
应答代码(Recode)域的值表示该项查询是否成功。当查询失败时,用此代码表示失败的理由。表13.3示出了DNS应答代码极其内容。
表13.3 DNS应答代码
0 |
无差错 |
1 |
查询报文的格式不对 |
2 |
服务器原因导致查询失败 |
3 |
查询对象的名字不存在 |
4 |
服务器不支持该类查询 |
5 |
服务器拒绝应答 |
接下来的4个域是查询记录数、应答记录数、注册机构记录数和追加记录数。
大部分的查询报文只含有一个查询,没有其他信息。此时,整个DNS报文如图13.6所示。应当注意,这里报文查询记录含有3个域。此记录的第1个域中表示查询对象的名字。在这个查询报文和示例中,发信者对shenhua.cs.ustc.edu.cn的IP地址进行查询。如图所示,DNS对其所描述的域名没有使用“习惯”的句号标记,而在名字中的各个符号(label)之前标记其长度。图中第一个符号是shenhua,在它前面加上表示长度为7的字节。其后是表示2的字节,用来指示符号cs的长度。长度0表示名字结束。
标识符:1234(16进制) |
控制域:0100(16进制) |
查询记录数: 1 |
应答记录数: 0 |
注册机构记录数: 0 |
追加记录数: 0 |
7 ‘s’ |
‘h’ ‘e’ |
‘n’ ‘h’ |
‘u’ ‘a’ |
2 ‘c’ |
‘s’ 4 |
‘u’ ‘s’ |
‘t’ ‘c’ |
3 ‘e’ |
‘d’ ‘u’ |
2 ‘c’ |
‘n’ 0 |
查询类型: 28 |
查询等级: 1 |
图13.6 shenhua.cs.edu.cn查询等的DNS查询报文
表13.4 常用DNS查询类型
类型 |
值 |
内容 |
A |
1 |
Ipv4地址 |
NS |
2 |
有注册权限的域名服务器 |
CNAME |
5 |
标准名称 |
SOA |
6 |
有区域注册权限的域名服务器 |
PTR |
12 |
域名指针 |
MX |
15 |
邮件交换服务器 |
TxT |
16 |
文本地址 |
AAAA |
28 |
Ipv6地址 |
AXFR |
252 |
区域的整体传送 |
* |
255 |
全记录的请求 |
在域名之后的2字节是标识查询类型的域。DNS支持对各种数据的查询。表13.4列出了TCP/IP中常用的些查询类型。在查询记录最后的二个字节是表示查询等级的域,其值为1时表示与Internet 有关的信息。
在图13.6所示的查询报文中,分组以查询记录结束。在应答报文中通常包含应答记录,注册机构记录和追加记录。这些记录被称作资源记录(resource record),它们具有图13.7所示的公共格式。
资源记录以域名、类型和等级开始。这三个域和查询记录一样,具有相同的格式。“寿命(TTL:Time to Live)”域表示该记录中信息的有效期限。它告知接收方可以认为该信息在多长的时间内时有效的,其单位是秒。
域名
类型 等级 T T L 资源数据 资源长度
图13.7 资源记录的格式
接收方可以在TTL指定的时间内将DNS信息置入高缓(cache)中。由于DNS管理的绝大部分信息很少变更,倘若客户今天需要的信息和昨天需要的信息相同,昨天的信息的可用性就很大。只要客户知道TTL并记住了昨天的信息,就完全可以省去DNS的检索。利用高缓,可以减少相当大的网络流量。
图13.8示出在应答报文中应用资源记录的实例。此报文是对图13.6查询报文应答时可能采用的报文形式之一。在此图中原查询报文中含有的查询记录被复制到应答报文中。其后是一个应答记录和2个注册机构记录。在此分组中,若干域名域采用了与查询报文不同的格式,它们出现在这个应答记录的域名域之后。此格式利用了DNS的报文压缩。
为避免重复使用相同的域名(或域名后缀(suffix)),采用了报文压缩。发送方在报文中只使用一次完整域名,在报文的其他位置只须应引用该域名即可。
图13.8是报文压缩的实例。第二个记录是此应答报文中的应答记录。应答记录和其他的资源记录一样,从域名开始。在本例中,其域名只以二字节,即16进制的CO OC表示。CO通常位于域名长度所在的位置(即相当于查询记录中7的位置)。但因DNS将所有的符号限制在63字节以内。十分明显,不可能出现像CO(10进制数为192)这么长的符号。
标识符:1234(16进制) |
控制域:8180(16进制) | ||
查询记录数:1 |
应答记录数:1 | ||
|
追加记录数:0 | ||
|
‘h’ ‘e’ | ||
‘n’ ‘h’ |
‘u’ ‘a’ | ||
查询记录 |
‘s’ 4 | ||
‘u’ ‘s’ |
‘t’ ‘c’ | ||
|
‘d’ ‘u’ | ||
2 ‘c’ |
‘n’ 0 | ||
查询类型: 28 |
查询等级 1 | ||
C00C(十六进制) |
类型: 28 | ||
等级 :1 |
TTL:82019 | ||
应答记录 |
长度:16 | ||
| |||
注册机构 记录 ‘u’ ‘s’ ‘ t ’ ‘c’ 3 ‘e’ ‘d ’ ‘u’ 2 ‘c’ ‘n’ 0 | |||
类型:2 |
等级: 1 | ||
|
86336 | ||
长度:2 |
C0(16进制) |
0C(16进制) | |
|
类型 2 | ||
注册机构 记录 |
TTL :86336 | ||
TTL(接上字节) |
长度: 10 | ||
‘s’ ‘h’ ‘a’ ‘n’ C0(16进制)44(16进制) |
利用紧接CO之后字节的低位14比特可以指示实际域名的偏移。在本例中,这14比特的的值为OC(10进制数为12),也就是说,真正的域名应丛报文头部算起的12字节处开始。偏移是从DNS分组 的头部起算的相对值。0偏移是指该报文标识符的第一字节。
在此图中,以箭头指出12字节的偏移所指的位置。此时,查询记录中的域名是shenhua.cs.ustc.edu.cn。这完全合乎道理,因为原来的查询报文查询的是shenhua的IP地址,与此域名对应的IP地址应呈现在应答记录中。
此报文的最后二个记录是注册机构记录。注册机构是指登录了shenhua.cs.ustc.edu.cn这一域名的域名服务器。这二个注册机构记录都列出了cs.ustc.edu.cn的域名(在第2个记录中采用了报文压缩),它是这2个域名服务器管理下的区域的域名。各注册机构的记录中的资源数据(resource date)指示该注册机构本身的域名。应当注意,在第一个注册机构记录中,为了指示域名是shenhua.cs.ustc.edu.cn使用了报文压缩。事实上,shenhua就是cs.ustc.edu.cn区域中的一个域名服务器。第二个注册机构记录中的域名服务器是taishan.cs.ustc.edu.cn。应当注意,在此记录中,为指定完整的域名,将通常的域名格式和报文压缩加以组合。
表13.5阐明了DNS应答报文的五个部分的主要功能。
1. 此报文是对标识符为1234的查询报文的应答报文。在查询报文中请求递归查询(RD=1),服务器支持递归查询(RA=1),因不是从注册机构发回的应答(AA=0),所以这一应答是由递归查询得到的。在处理这一查询时,没有出现差错(Rcode=0)。
2. 原来的查询报文是查询shenhua.cs.ustc.edu.cn的IPv6地址(查询类型=28)。
3. 对该查询的应答是”shenhua.cs.ustc.edu.cn在分组内所对应的Ipv6 地址”。此地址至少在以后的22小时(TTL=82019)内有效。
4. 作出应答的第一已注册的机构是cs.ustc.edu.cn区域内的域名服务器(类型=2)。该域名服务器的域名是shenhua.cs.ustc.edu.cn,该服务器至少在以后的24小时(TTL=86,336)内是此区域的域名服务器。
5. 作为应答的第二已注册的机构仍是cs.ustc.edu.cn区域的域名服务器。此服务器的域名是taishan.cs.ustc.edu.cn。它在以后的24小时内仍是注册机构。
DNS起初是为十分稳定的静态环境设计的。也就是说,由网络管理员对主机分配IP地址和域名,几乎不必再对它们做任何修改。但是随着TCP/IP的发展,目前的网络环境都是动态变化的。例如,从一个网络移往另一个网络的笔记本电脑等的移动系统随着移动而改变IP地址(因为各个网络拥有自己的IP地址前缀)。此外,拨号接入Internet的家庭用户,在诸多用户间共享Internet提供者分到的有限的IP地址空间。安装在个人计算机上的LAN接口卡(即网卡)一旦被高性能的 新卡取代,其链路地址被更新,通过地址自动配置,IP地址也被更新。
DNS,为适应这种环境,已开始具有动态更新DNS信息的能力。也就是说,在DNS中,不等待网络管理员来更新某个系统的域名和地址的对应关系,系统本身就能更新信息。
图13.9 利用DNS更新报文的笔记本计算机
图13.9示出了如何进行动态更新。一旦笔记本电脑接入以太网,它就立即执行地址自动配置的操作以获取IP地址。接着,此笔记本电脑利用这一知识向各域名服务器发送DNS动态更新请求报文。域名服务器接收该请求报文,并根据它来更新信息。