次探DNS

之前已经写过一次DNS的文章了,不过那时刚接触,文中还有很多不正确的地方。DNS分为客户端和服务器端,客户端称为resolver,但是不是一个应用程序,而是一个函数库。在Linux里,resolver实现在libc库中,这个话题以后研究到再写。今天主要想总结一下域名服务器的查询方法,以及nslookup的使用方法。

域名系统是按层次划分的,从根域“.”开始。它可以使得不同域的主机可以改一样的名字,只要保证一个域里的名字不重复就可以了,类似于C++和Java的命名空间的好处。然后还要引入一个“区域(zone)”的概念,它跟“域(domain)”不同,区域指的是域里的管理范围。举个例子,假设域“.sysu.edu.cn”由中大管理,然后中大把子域“cs.sysu.edu.cn”授权给计算机系管理,那么中大管理的区域实际上是除了计算机系外的主机。也就是说,中大负责给各个主机域名解析,除了计算机系的主机外。

Domain Name System
Domain Name System

域定义了层次结构,区域定义了管理范围。每个区域可以授权下级管理一个子域,从而把子域所在的区域划出自己的管理。因此,每个区域的域名服务器只包含自己区域的名字解析,不包含已授权出去的子域的解析,但是会包含授权的子域的域名服务器名字。IANA规定每个区域至少包含两台DNS服务器。

比如想查询cisco.sysu.edu.cn。首先得查根域的域名服务器,查询“cisco.sysu.edu.cn”,但是根域中没有这个名字的解析,它会返回“.cn”子域的域名服务器。然后再向该域名服务器作同样的查询,这次还是没有得到结果,服务器只是返回“.edu.cn”的域名服务器。一直重复下去。

顺便值得一提的是,执行查询任务的DNS服务器一般是catch-only的服务器。DNS服务器分两种,一种是保存区域信息,另一种专门执行查询任务。我们在操作系统一般配置的DNS服务器就是catch-only的,只作查询任务的服务器。

初探/dev/random

以前我以为比较基本的产生随机数的方法就是用C语言中的srand()和rand()函数。但是最近我发现除了这种方法之外,还有使用起来几乎一样简单的方法,就是读取/dev/random设备文件。

以前要生成随机数,通常首先用srand()设定种子。为了要每次运行的结果不一样,种子也必须不同。所以比较简单的方法就是利用time()函数返回当前的时间作为种子。如果希望随机性更大一些,则种子设定时也可以考虑其他因素,比如目前内存的使用数目,甚至同时包含好几个因素。

/dev/random
/dev/random

最近,我发现了有一种更简便,但是效果要更好的方法,就是使用字符型设备文件/dev/random。据Wikipedia说,是Linux首先实现了这个设备文件,不过现在其他Unix-like的系统也能找到。使用这个文件产生随机数很简单,就是先打开这个文件,然后读取里面的字节就可以了。它的优点是随机数质量非常高,甚至可以用在一次性加密的环境下,我的理解是它跟伪随机数产生器还是有点区别。不过读取这个文件需要注意要使用二进制的读取方式,用fread库函数,或者read系统调用,因为字节中可能有各种字符。另外,/dev/random不能并发打开,如果要并发打开,据说可以使用/dev/urandom,u表示unlock。

Frame-Relay实验续

昨天之前一直以为Packet Tracer不能配置串行口的子接口,因此不能完成完整的帧中继实验。然而,今天在做真实机器实验的时候,发现原来是自己犯了错误。在配置子接口的时候,没有在末尾加上point-to-point或者point-to-multipoint关键字,结果就提示错误。现在我在Packet Tracer敲上这个关键字之后,已经可以访问到子接口了,并且完成了完整的帧中继实验。

Frame Relay Figure 4
Frame Relay Figure 4

今天还有一个开心的事情就是把ns-3.4编译过了,起码主分支已经编译过了。接下来这个星期,要好好地弄一下ns3。

Frame Relay仿真实验

今天在Packet Tracer上做实验,终于做出之前一直以为Packet Tracer上不行的帧中继(Frame Relay)实验。

首先,帧中继交换机没有出现在Packet Tracer中,这也是我一直误以为它不能做帧中继实验的原因。要使用帧中继,把WAN Emulator中的云拖出来,上面不仅可以连ADSL和Cable,也可以模拟帧中继交换机,但是需要注意云上的串行口连接时是DCE。在GUI界面下的Config标签把DLCI配置到端口上,之后再使用Frame Relay标签即可。这个甚至比直接用路由器模拟成帧中继交换机还要简单。下图是配置Frame Relay的界面。

Frame Relay Figure 1
Frame Relay Figure 1
Frame Relay Figure 2
Frame Relay Figure 2

第二步,在路由器上面的接口模式,敲上“encapsulation frame-relay”就可以了,当然还要配置IP地址。

Frame Relay Figure 3
Frame Relay Figure 3

不过比较可惜的是,路由器上的串行口不能配置子接口,这意味着部分帧中继的实验做不了。期待下一个版本有这个功能。