DNS-传输过程当中的算法——MX算法

117 阅读4分钟

《DNS与BIND》这本书中,作者提到,早期的MX记录被分成了两个部分——MD(Mail Destination)邮件目的地MF(Mail Forward)邮件转发器。

其中MF不清楚,需要继续进行研究和学习。

MX记录长什么样?

一条简单的MX记录一般形如:

复制代码
peets.mpk.ca.us     IN     MX    10 relay.hp.com

MX记录会为一个目的地域名指定一个邮件交换器:邮件交换器是一台主机,可以为该域名处理或转发邮件。在本例中,目的地域名就是peets.mpk.ca.usrelay.hp.com是一台邮件交换器,数字10是优先值。

优先值是什么?怎么又冒出来了新名词,继续往下看。

MX算法——优先值

上面提到了MX记录当中的优先值,优先值在MX记录当中非常重要,可以说正是因为有了优先值,才会出现MX算法。

为什么要设计优先值?因为它在MX算法的实现过程中起到了关键作用。

我们规定,MX记录当中优先值最小的邮件会先发往目的地,这里所说的小,是相对于同一域名下的其他MX记录中的优先值的小,比如下面两条MX记录:

plange.puntacana.dr.    IN  MX  10 listo.puntacana.dr.---->记录1
plange.puntacana.dr.    IN  MX  200 hep.puntacana.dr.---->记录2

无论记录1的优先值是10还是50,只要比记录2的优先值200要小,邮件转换器是listo.puntacana.dr.的邮件就会率先发送。

邮件总会有发送失败的时候对吧?如果记录1,邮件转换器为listo.puntacana.dr.的发送失败了,我们就会选择目的地相同优先级低于记录1的邮件转换器(如果有的话),重新发送一次——也就是使用了记录2.

MX算法

听起来不错,但这还不是MX算法的重点。MX算法真正要解决的是路由环路的问题。

先来看下面的例子:

dest.ido.cn     IN  MX  1 HostA.cn---->记录1
dest.ido.cn     IN  MX  2 HostB.cn---->记录2
dest.ido.cn     IN  MX  2 HostC.cn---->记录3

这是在某个域名下存放的三条MX记录,都旨在把邮件发往dest.ido.cn,但是“中转站”——邮件转发器不同。正常情况下,我们当然会优先选择记录1。

但是如果邮件被发送到了记录3的HostC.cn邮件转发器上,邮件并不会直接发往目的地dest.ido.cn,而是选择先将邮件转发至优先级比自己高的记录1的HostA.cn邮件转发器。——想一想优先级设置的初衷,邮件程序发送邮件时总是选择优先级最大的邮件转发器。

image.png

此时如果主机HostA.cn崩溃了,导致邮件发送失败,邮件将把邮件发给记录2的HostB.cn主机上,然后根据设计的规则,HostB.cn将邮件发给了优先级比自己大的HostA.cn,但此时HostA.cn已经无法使用,邮件要么回到HostB.cn的手里,要么发往优先级等同的HostC.cn上——但只要HostA.cn的问题不解决,邮件就迟迟不能发送到目的地dest.ido.cn那儿,陷入死循环——在网络通信当中,死循环可是一件很可怕的事情。这就是路由环路问题。

那该怎么办呢?MX算法的应对策略是,如果本地主机本身就是一个邮件交换器,邮件程序在决定向哪个目的地发送邮件前,会先删除大于或等于代表它本身的那个记录以及所有大于或等于其优先值(也就是优先级相同或更低)的MX记录。 这样做可以避免邮件程序把信息发送给自己,或是发送给离目的地“更远”的邮件转发器,有效避免了路由环路的问题。

还是刚才的例子,HostA.cn此时已经无法将邮件发往目的地,邮件便下发到优先级次之的HostB.cn,邮件程序将邮件发送之前,会先将记录2和记录3都删除(因为优先级相等,此时如果还有比记录2、3优先值更高的记录,也会一并删除),就只留下了记录1。但此时HostA.cn已经无法使用,HostB.cn会延迟发送,并将该邮件放到队列之中,不会导致死循环问题。

使用MX算法的其他注意

  1. 大多数邮件程序只会在MX记录列表中搜索其本地主机的规范化域名,它们并不会检查别名。除非在MX记录中一直使用规范化域名,否则就不能保证邮件程序能在MX列表上找到它自己——这样仍然有造成环路的风险。因此在MX记录中,我们应该总是使用邮件交换器的规范化名称。
  2. 倘若邮件程序发现自己所在主机就拥有最高优先级而必须将整个MX列表都删除,此时部分邮件程序会直接将邮件发往目的地主机的IP地址,作为最后的尝试——尽管对于大多数程序而言,这是个错误。