《tcp/ip详解》 难点记录
一、DNS系统概述
详细的英文文档可参见https://www.freesoft.org/CIE/RFC/,其中domain names相关的部分。
相较于IP这种数字形式的数据,人们更容易接受和记忆有意义的字符,因此互联网初期就使用hosts文件构建 名字 ----> IP 的映射关系,以便人们使用互联网。但是一开始,名字由各个机构自行决定再向管理机构注册,因此整个名字空间是平面的,不存在层级的区分,这在互联网初期没什么问题,但是在IP资源越来越多的被使用,由于名称空间是平面,即取名字是没有特定的规则的,使得很难在保证富含意义的情况下不出现重复,扩展性极为限制。
DNS系统为了解决这一问题,构建了一个立体的名称空间,空间的形状就像一棵树,以无名的(空)label 作为根节点(往往省略不写),根节点下有多个TLD(top-level domain)节点(树叶),每个TLD下又各自有多个子节点。例如www.baidu.com从右往左,节点越来越详细,由(空)、com、baidu、www四个label组成,空节点覆盖所有的名称,com是最常见的TLD,baidu 由百度公司(一种组织)管理,www则详细到应用层级(web server)。
DNS系统构建了一个分布式系统用于更效率的提供名称解析服务,同时也避免了超负荷的中心服务器。但是为了保证信息的正确,每个服务器都有他负责的一片名称区域,他保证拥有这片区域全部的即时且正确的相关信息,这片区域称为zone,这些信息称为该服务器的权威信息。根据DNS标准,一个DNS服务器管理一个label及其下所有的sub label作为需要管理的zone。举例,"xx.com"以及"com"构成一个zone,全部的信息将由一台DNS服务器管理。当然一个DNS服务器需要能够提供足够信息能够解析所有域名,它就必须包含与zone外名称相关的信息,这些数据同称为缓存数据 (cache data),由该服务器定时向其他DNS服务器查询并缓存获得。一般情况下,权威数据相较于缓存数据更加准确即时,但是一般缓存数据改变较小,也是可以使用的。
DNS服务器存储数据的格式是Resource Record,(RR)的结构如下,但是其中RDATA(存储详细的数据)的具体结构由其中的type决定。最为常见的就是type为A,RDATA表示host address(IP)的RR。
一个zone包含的数据(或者说权威数据包含)大约有三种: zone的最上层域名(上限),zone的已分配子域名(下限),缔结数据(glue data)。举例来说,如果一个zone包含 "example.com"及其下的所有名称空间,最上层域名就是"exmaple.com",已分配的子域名包括所有"xx.example.com",详细解释如下:
- 其中下限数据只延伸到"xx.example.com"不延伸到更下一级,例如"hire.hr.example.com"不属于"example.com"zone,而是属于"hr.example.com"zone,所以他的数据并不是在管理"example.com"的DNS服务器中存储,而是在管理"hr.example.com"的DNS服务器中存储,这种情况也称为责任下放。
- 但是有特殊情况,由于DNS服务器作为一个主机(host),必然占据一个IP,IP又对应一个域名,因此DNS服务器的域名是可能归他自己管理的。例如假设"dns.hr.example.com"是管理"hr.example.com"zone的DNS服务器的域名,那么"dns.hr.example.com"属于这个zone,所以对应的IP必然由该服务器自己管理,此时如果"dns.hr.example.com"对应的IP没有同时存在在其他DNS服务器上,就会导致要找到该DNS服务器,必须解析该DNS服务器的域名,而要解析该DNS服务器的域名,又必须先找到该DNS服务器,···的死循环。
- 显然,解决方法就是将该DNS服务器的域名和IP数据存在另一个服务器上面,由于DNS服务器需要知道关于其管理的zone的所有信息,因此管理"example.com"zone的DNS服务器(简称eS)应该知道如何找到管理"xx.example.com"zone的DNS服务器(简称xeS),因此管理eS必然有一条数据包含xeS域名("dns.xx.example.com")对应的IP。这部分数据就称为结缔数据(glue data)。就是说eS包含xeS的域名对应的IP信息。图示如下
管理 "example.com" zone的DNS服务器 ,权威数据中包含的域名映射数据包括
Name | IP |
example.com | xx.xx.xx.xx |
xx.example.com | xx.xx.xx.xx |
管理"xx.example.com"zone 的DNS服务器的域名 (例子中的dns.hr.example.com) |
xx.xx.xx.xx |
DNS message的结构如下,左边为整体结构,右边为header结构,question一般包括name,type,class(name和type构成RR的唯一索引,从而找到NS中的唯一记录)而其余的部分结构都是以RR的格式呈现。
在DNS message中正常字符串由一般字符(有63种字符,字节首两位一定为00)以及结尾的空字符(0x00)组成。而为了节约空间,DNS提供一种offset指针压缩的方式用来代替相同的字符串。指针的长度为两个字节,且第一个字节首两位为11(以示区别,因此最小为0xc0),之后的14位表示从DNS message开始的offset值,如果为0代表DNS message header的第一个字符开始,直到正常域名的结尾(一个空字符0x00)。
- offset指针不需要以空字符结尾。
- 只要有一个字节值>=0xc0,那么他一定与后一个字节构成一个offset指针。
- 由于header的长度确定是12个字节长因此0xc00c往往代表header之后的第一个字符开始到空字符出结尾的字符(如一个query的name)。