速读原著-TCP/IP(高速缓存)

╄→尐↘猪︶ㄣ 提交于 2020-03-09 15:17:30

第14章 DNS:域名系统

14.7 高速缓存

为了减少I n t e r n e t上D N S的通信量,所有的名字服务器均使用高速缓存。在标准的 U n i x实现中,高速缓存是由名字服务器而不是由名字解析器维护的。既然名字解析器作为每个应用的一部分,而应用又不可能总处于工作状态,因此将高速缓存放在只要系统(名字服务器)处于工作状态就能起作用的程序中显得很重要。这样任何一个使用名字服务器的应用均可获得高速缓存。在该站点使用这个名字服务器的任何其他主机也能共享服务器的高速缓存。

在迄今为止(图 1 4 - 9)所举例子的网络环境中,在 s u n主机上运行客户程序,通过主机n o a o . e d u的S L I P链路访问名字服务器。现在将改变这种设置,在 s u n主机上运行名字服务器。在这种情况下,如果使用 t c p d u m p监视在S L I P链路上的D N S通信量,将只能看到服务器因超出其高速缓存而不能处理的查询。

在默认情况下,名字解析器将在本地主机上( U D P端口号为5 3或T C P端口号为5 3)寻找名字服务器。从名字解析器文件中删除 n a m e s e r v e r行,而留下d o m a i n行:

sun % cat /etc/resolv.conf
domain tuc.noao.edu

在这个文件中缺少n a m e r s e r v e r指示将导致名字解析器使用本地主机上的名字服务器。使用h o s t命令执行下列查询:

sun % host ftp.uu.net
f t p . u u . n e t A 1 9 2 . 4 8 . 9 6 . 9

图1 4 - 1 4显示了这个查询的输出结果。
在这里插入图片描述
这次在t c p d u m p中使用了新的选项。使用- w选项来收集进出U D P或TCP 53号端口的所有数据。将这些原始数据记录在一个文件中供以后处理,同时防止 t c p d u m p试图调用名字解析器来显示与那个I P地址相对应的域名。执行查询后,终止 t c p d u m p并使用- r选项再次运行它。它会读取含有原始数据的文件并产生正式的输出显示(如图 1 4 -14)。这个过程要花费几秒钟,因为t c p d u m p调用了它自己的名字解析器。

在t c p d u m p输出中要注意的第一点是标识符 ( i d e n t i f i e r )是小整数(2和3)。这是因为我们关闭这个名字服务器,后又重新启动它来强制清空它的高速缓存。当名字服务器启动时,它将标识符初始化为1。

当键入查询,查找主机 f t p . u u . n e t的I P地址,该名字服务器就同 8个根名字服务器中的一个n s . n i c . d d n . m i l(第1行)取得联系。这是以前见到的正常的 A类型查询,但要注意的是它的期望递归表示没有说明(如果该标志被设置,在标识符 2的后边会跟着一个加号)。

在以前的例子中,经常看到名字解析器设置期望递归标志,但这里的名字服务器在与某个根服务器联系时没有设置这个标志。这是因为不应该向根名字服务器发出期望递归的查询,它们仅用来寻找其他授权名字服务器的地址。

第2行显示返回的响应中没有回答资源记录,而包含 5个授权资源记录和5个附加信息资源记录。标识符2后的减号表示期望递归标志( R A)没有被设置。即使我们要求进行递归查询,这个根名字服务器也不会回答期望递归查询。

尽管t c p d u m p没有显示返回的1 0个资源记录,我们也能执行h o s t命令来查看高速缓存的内容:
在这里插入图片描述
这次采用- v选项查看的不仅仅只是 A记录。它显示出对于域 u u . n e t有5个授权名字服务器,而由根名字服务器返回的 5个附加信息资源记录中含有这 5个名字服务器的 I P地址。这避免了在查找其中的某个名字服务器的地址时,无需再次与根名字服务器联系。这是 D N S中的另一个实现优化。

h o s t命令指出这个回答不是授权的,这是因为这个回答来自名字服务器的高速缓存,而不是来自授权名字服务器。

回到图1 4 - 1 4中的第3行,我们的名字服务器与第一个授权名字服务器( n s . u u . n e t)询问同一个问题: f t p . u u . n e t的I P地址?这次我们的服务器设置了期望递归标志。返回的应答(第4行)包含一个回答资源记录。
而后我们再次执行h o s t命令,询问相同的名字:

sun % host ftp.uu.net
ftp.uu.net A 1 9 2 . 4 8 . 9 6 .

这时t c p d u m p没有输出,这正是我们所期望的,因为由 h o s t命令返回的回答来自于名字服务器的高速缓存。
再次执行h o s t命令,查找f t p . e e . l b l . g o v的地址:

sun % host ftp.ee.lbl.gov
f t p . e e . l b l . g o v CNAME ee.lbl.gov
e e . l b l . g o v A 128.3.112.20

图1 4 - 1 5显示了这时的t c p d u m p输出。
在这里插入图片描述
这时第1行显示我们的服务器与另一个根名字服务器(c . n y s e r . n e t)联系。一个名字服务器通常轮询不同的根名字服务器来获得往返时间估计,然后选择往返时间最小的服务器。

既然我们的服务器向一个根服务器发出查询,那么期望递归标志不应被设置。正如我们在图1 4 - 1 4中所看到的该名字服务器并不清除期望递归标志(即便这样,一个名字服务器还是不应该向一个根名字服务器发出期望递归的查询)。

在第2行返回的响应中不包含回答资源记录,但含有4个授权记录和4个附加信息资源记录。正如我们所猜测的那样, 4个授权资源记录是供主机 f t p . e e . l b l . g o v进行域名服务的名字服务器名,其他4个记录则是这4个服务器的I P地址。

第3行是向名字服务器n s l . l b l . g o v(第2行中返回的4个名字服务器中的第一个)发出的查询请求。它的期望递归标志是被设置的。

第4行返回的响应和以往的响应不同。返回了两个回答资源记录, t c p d u m p指出其中的第一个是C N A M E资源记录。f t p . e e . l b l . g o v的规范名称是e e . l b l . g o v。

这是C N A M E记录常见的用法。L B L的F T P站点的名字通常是以f t p开始的,但它可能不时地从一个主机移到另一个主机。用户只需要知道f t p . e e . l b l . g o v,必要时DNS会用它的规范名进行替换。

记得我们在运行 h o s t程序时,它显示了规范域名的 C N A M E和I P地址。这是因为响应(图1 4 - 1 5中的第4行)中含有两个回答资源记录,第一个是 C N A M E,而第二个是 A记录。如果A记录没有随C N A M E记录返回,我们的服务器将发出另一个查询请求,询问 e e . l b l . g o v的I P地址。这是另一个D N S的实现优化—在一个响应中同时返回一个规范域名的 C N A M E记录和A记录。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!