17.4. 邮件路由如何工作?

将消息定向到接收者主机的过程称为 路由。除了找到从发送站点到目的地的路径之外,它还涉及错误检查,并可能涉及速度和成本优化。

UUCP 站点处理路由的方式与互联网站点处理路由的方式之间存在很大差异。在互联网上,将数据定向到接收者主机(一旦已知其 IP 地址)的主要工作由 IP 网络层完成,而在 UUCP 区域中,路由必须由用户提供或由邮件传输代理生成。

17.4.1. 互联网上的邮件路由

在互联网上,目标主机的配置决定是否执行任何特定的邮件路由。默认是将消息传递到目的地,首先确定消息应发送到哪个主机,然后将其直接传递到该主机。大多数互联网站点希望将所有入站邮件定向到能够处理所有这些流量并将其在本地分发的高可用性邮件服务器。为了宣布此服务,站点在其 DNS 数据库中为其本地域发布所谓的 MX 记录。MX 代表 邮件交换器,基本上声明服务器主机愿意充当域中所有邮件地址的邮件转发器。MX 记录也可用于处理未连接到互联网的主机的流量,例如必须通过网关传递邮件的 UUCP 网络或 FidoNet 主机。

MX 记录始终被分配一个 优先级。这是一个正整数。如果一个主机存在多个邮件交换器,邮件传输代理将尝试将消息传输到优先级值最低的交换器,并且只有当此操作失败时,它才会尝试优先级值较高的主机。如果本地主机本身是目标地址的邮件交换器,则只允许将消息转发到优先级低于自身优先级的 MX 主机;这是一种避免邮件循环的安全方法。如果域没有 MX 记录,或者没有合适的 MX 记录,则允许邮件传输代理查看域是否有关联的 IP 地址,并尝试直接传递到该主机。

假设一个组织,例如 Foobar 公司,希望其所有邮件都由其机器 mailhub 处理。那么它将在 DNS 数据库中拥有如下所示的 MX 记录
green.foobar.com.        IN   MX      5    mailhub.foobar.com.

这宣布 mailhub.foobar.com 作为 green.foobar.com 的邮件交换器,优先级为 5。希望将消息传递到 joe@green.foobar.com 的主机检查 DNS 并找到指向 mailhub 的 MX 记录。如果没有优先级小于 5 的 MX,则消息将传递到 mailhub,然后由 mailhub 将其分派到 green

这是对 MX 记录如何工作的非常简单的描述。有关互联网上邮件路由的更多信息,请参阅 RFC-821、RFC-974 和 RFC-1123。

17.4.2. UUCP 世界中的邮件路由

UUCP 网络上的邮件路由比互联网上的邮件路由复杂得多,因为传输软件本身不执行任何路由。在早期,所有邮件都必须使用 bang 路径寻址。Bang 路径指定了转发消息的主机列表,以感叹号分隔,后跟用户名。要向名为 moria 的机器上的名为 Janet 的用户发送信件,您将使用路径 eek!swim!moria!janet。这将把邮件从您的主机发送到 eek,从那里发送到 swim,最后发送到 moria

这项技术的明显缺点是,与互联网路由相比,它要求您记住更多关于网络拓扑、快速链接等的信息。更糟糕的是,网络拓扑中的更改(例如链接被删除或主机被移除)可能会导致消息失败,仅仅是因为您没有意识到更改。最后,如果您搬到不同的地方,您很可能必须更新所有这些路由。

然而,使源路由的使用成为必要的一件事是存在不明确的主机名。例如,假设有两个名为 moria 的站点,一个在美国,一个在法国。moria!janet 现在指的是哪个站点?这可以通过指定到达 moria 的路径来明确。

消除主机名歧义的第一步是 UUCP 映射项目的成立。它位于罗格斯大学,注册所有官方 UUCP 主机名,以及关于其 UUCP 邻居及其地理位置的信息,确保没有主机名被使用两次。映射项目收集的信息以 Usenet 地图 的形式发布,这些地图定期通过 Usenet 分发。地图中的典型系统条目(在删除注释后)如下所示:[1]
moria
        bert(DAILY/2),
        swim(WEEKLY)

此条目表示 moria 有一个到 bert 的链接,每天调用两次,以及到 swim 的链接,每周调用一次。我们稍后将更详细地回到地图文件格式。

使用地图中提供的连接信息,您可以自动生成从您的主机到任何目标站点的完整路径。此信息通常存储在paths文件中,也称为 pathalias 数据库。假设地图声明您可以通过 ernie 到达 bert;然后从之前的地图片段生成的 moria 的 pathalias 条目可能如下所示
moria           ernie!bert!moria!%s

如果您现在给出目标地址 janet@moria.uucp,您的 MTA 将选择上面显示的路由,并将消息发送到 ernie,信封地址为 bert!moria!janet

从完整的 Usenet 地图构建paths文件并不是一个好主意。其中提供的信息通常相当失真,有时会过时。因此,只有少数主要主机使用完整的 UUCP 世界地图来构建其paths文件。大多数站点仅维护其邻域中站点的路由信息,并将他们数据库中找不到的任何邮件发送到具有更完整路由信息的更智能的主机。此方案称为 智能主机路由。只有一个 UUCP 邮件链接的主机(所谓的 叶子站点)不执行任何自己的路由;它们完全依赖于其智能主机。

17.4.3. 混合 UUCP 和 RFC-822

到目前为止,解决 UUCP 网络中邮件路由问题的最佳方法是在 UUCP 网络中采用域名系统。当然,您无法通过 UUCP 查询名称服务器。然而,许多 UUCP 站点已经形成了在内部协调其路由的小型域。在地图中,这些域宣布一个或两个主机作为其邮件网关,因此不必为域中的每个主机都有一个地图条目。网关处理流入和流出域的所有邮件。域内的路由方案对于外部世界是完全不可见的。

这与智能主机路由方案配合得非常好。全局路由信息仅由网关维护;域内的小型主机只需一个小的手写paths文件即可,该文件列出了其域内的路由以及到邮件中心的路由。即使是邮件网关也不再需要世界上每个 UUCP 主机的路由信息。除了他们服务的域的完整路由信息外,他们现在只需要在其数据库中拥有到整个域的路由。例如,此 pathalias 条目将 sub.org 域中所有站点的邮件路由到 smurf
.sub.org        swim!smurf!%s

发送到 claire@jones.sub.org 的邮件将发送到 swim,信封地址为 smurf!jones!claire

域名空间的层次结构允许邮件服务器将更具体的路由与不太具体的路由混合使用。例如,法国的系统可能具有 fr 子域的特定路由,但将 us 域中主机的任何邮件路由到美国的某个系统。通过这种方式,基于域的路由(正如这项技术所称)大大减小了路由数据库的大小,以及所需的管理开销。

然而,在 UUCP 环境中使用域名的主要好处是,符合 RFC-822 标准允许在 UUCP 网络和互联网之间轻松进行网关连接。如今,许多 UUCP 域都与充当其智能主机的互联网网关建立了链接。通过互联网发送消息速度更快,并且路由信息更加可靠,因为互联网主机可以使用 DNS 而不是 Usenet 地图。

为了可以从互联网访问,基于 UUCP 的域通常会为其互联网网关宣布 MX 记录(MX 记录在前面的 17.4.1 节 中描述过)。例如,假设 moria 属于 orcnet.org 域。gcc2.groucho.edu 充当其互联网网关。moria 因此将使用 gcc2 作为其智能主机,以便将所有外国域的邮件通过互联网传递。另一方面,gcc2 将为 *.orcnet.org 宣布 MX 记录,并将所有 orcnet 站点的传入邮件传递到 moria*.orcnet.org 中的星号是一个通配符,它匹配该域中没有任何其他记录与之关联的所有主机。对于仅限 UUCP 的域,通常应该是这种情况。

唯一剩下的问题是 UUCP 传输程序无法处理完全限定域名。大多数 UUCP 套件的设计目的是处理最多八个字符的站点名称,有些甚至更少,并且对于大多数套件来说,使用非字母数字字符(如点)是完全不可能的。

因此,我们需要 RFC-822 名称和 UUCP 主机名之间的映射。此映射完全依赖于实现。将 FQDN 映射到 UUCP 名称的一种常见方法是使用 pathalias 文件
moria.orcnet.org  ernie!bert!moria!%s

这将从指定完全限定域名的地址生成纯 UUCP 风格的 bang 路径。一些邮件程序为此提供了一个特殊的文件;例如,sendmail 使用uucpxtable.

当从 UUCP 网络向互联网发送邮件时,有时需要进行反向转换(俗称 域名化)。只要邮件发送者在目标地址中使用完全限定域名,就可以通过在将消息转发到智能主机时不删除信封地址中的域名来避免此问题。但是,仍然有一些 UUCP 站点不属于任何域。它们通常通过附加伪域 uucp 来进行域名化。

pathalias 数据库在基于 UUCP 的网络中提供主要的路由信息。典型的条目如下所示(站点名称和路径用制表符分隔)
moria.orcnet.org  ernie!bert!moria!%s
moria             ernie!bert!moria!%s

这使得任何发送到 moria 的消息都通过 erniebert 传递。如果邮件程序没有单独的方式在这些命名空间之间进行映射,则必须给出 moria 的完全限定名称及其 UUCP 名称。

如果您想将所有消息定向到域内的邮件中继主机,您还可以在 pathalias 数据库中指定路径,给出以点开头的域名作为目标。例如,如果可以通过 swim!smurf 到达 sub.org 中的所有主机,则 pathalias 条目可能如下所示
.sub.org        swim!smurf!%s

仅当您运行的站点不需要执行太多路由时,编写 pathalias 文件才是可以接受的。如果您必须为大量主机执行路由,则更好的方法是使用 pathalias 命令从地图文件创建文件。地图可以更容易地维护,因为您可以通过编辑系统的地图条目并重新创建地图文件来简单地添加或删除系统。尽管 Usenet 映射项目发布的地图不再用于路由,但较小的 UUCP 网络可能会在其自己的地图集中提供路由信息。

地图文件主要包含每个系统轮询或被轮询的站点列表。系统名称从第一列开始,后跟以逗号分隔的链接列表。如果下一行以制表符开头,则列表可以跨越换行符继续。每个链接由站点名称和括号中给出的成本组成。成本是由数字和符号表达式(如 DAILY 或 WEEKLY)组成的算术表达式。以井号开头的行将被忽略。

例如,考虑 moria,它每天轮询 swim.twobirds.com 两次,每周轮询 bert.sesame.com 一次。到 bert 的链接使用慢速 2,400 bps 调制解调器。moria 将发布以下地图条目
moria.orcnet.org
        bert.sesame.com(DAILY/2),
        swim.twobirds.com(WEEKLY+LOW)
moria.orcnet.org = moria

最后一行使 moria 以其 UUCP 名称为人所知。请注意,其成本必须指定为 DAILY/2,因为每天调用两次实际上会将此链接的成本减半。

使用来自此类地图文件的信息,pathalias 能够计算到路径文件中列出的任何目标站点的最佳路由,并从中生成 pathalias 数据库,然后可以将其用于路由到这些站点。

pathalias 提供了其他一些功能,如站点隐藏(即,仅通过网关才能访问站点)。有关详细信息和链接成本的完整列表,请参阅 pathalias 手册页。

地图文件中的注释通常包含有关其中描述的站点的其他信息。有一种严格的格式来指定此信息,以便可以从地图中检索该信息。例如,一个名为 uuwho 的程序使用从地图文件创建的数据库,以格式良好的方式显示此信息。当您向向其成员分发地图文件的组织注册您的站点时,您通常必须填写这样的地图条目。下面是一个示例地图条目(实际上,它是 Olaf 站点的条目)
#N      monad, monad.swb.de, monad.swb.sub.org
#S      AT 486DX50; Linux 0.99
#O      private
#C      Olaf Kirch
#E      okir@monad.swb.de
#P      Kattreinstr. 38, D-64295 Darmstadt, FRG
#L      49 52 03 N / 08 38 40 E
#U      brewhq
#W      okir@monad.swb.de (Olaf Kirch); Sun Jul 25 16:59:32 MET DST 1993
#
monad   brewhq(DAILY/2)
# Domains
monad = monad.swb.de
monad = monad.swb.sub.org

前两个字符后的空格是制表符。大多数字段的含义都很明显;您将从您注册的任何域收到详细的描述。L 字段是最有趣的发现:它给出了您在纬度/经度方面的地理位置,用于绘制 PostScript 地图,这些地图显示每个国家以及全球的所有站点。[2]

注释

[1]

在 UUCP 映射项目注册的站点的地图通过新闻组 comp.mail.maps 分发;其他组织可能会为其网络发布单独的地图。

[2]

它们定期发布在 news.lists.ps-maps 中。注意。它们非常庞大。