以下是我之前的调查,因为有一段时间了,只有一部分记忆。
这里说的DNS是伯克利大学的BIND DNS。
在bind9.3.几之前(忘了哪个版本了,请原谅我没有耐心再去查阅)。对于给定的转发地址列表,DNS的选择是这样的:
(不好意思,具体的算法我忘了,等我查明白了再修正,但好像是下面这两个中的一个来着。
假设有两个地址A和B,那么其首先选择对A进行转发,直到A超时或者失败时,转为往B转发,然后B连接失败后,又转发给A,以此类推。
假设有两个地址A和B,那么其首先选择对A进行转发,下次再往B转发,再下次又转发给A,以此类推。
)
这个算法的缺点是很明显的,它不能很好地解决负载平衡的问题,于是,此版本之后,又改为如下的算法:
每一个转发地址都有一个时间属性srtt, DNS服务器在初期启动时,为每一个转发地址随机生成一个srtt的值,之后的地址选择则是从所有地址中选择srtt值最小的那个进行转发。得到结果后更新该地址的srtt值。而如果超时时,则将srtt的值设定为20000左右的一个值。每一次对当前地址的转发之后,除了计算出当前查询的响应时间付给当前地址之外,对于其他地址持有的srtt,也将会按某一个比例进行缩小(好像是乘以0.98)。
上面的算法看上去很完美,它不会让查询一直发往一个地址,因为别的地址的srtt会逐渐减小到最小,从而被转发;