链路状态传播

 

上一次修改主题: 2005-05-23

要确保有效可靠的邮件路由,Exchange 服务器的链路状态表中必须有最新的信息。此信息必须准确地反映所有桥头服务器和邮件连接器的状态。为了将链路状态信息传播到 Exchange 组织中的所有服务器,使用称为链路状态算法 (LSA) 的传播协议。

在所有服务器之间传播链路状态信息具有下列好处:

  • 每个 Exchange 服务器都可以在源端选择最佳邮件路由,而不用沿着连接器不可用的传输路径发送邮件。
  • 邮件不继续在服务器之间来回传递,因为每个 Exchange 服务器都有关于备用传输路径或冗余传输路径是否可用的最新信息。
  • 不会再出现邮件循环。

链路状态算法

路由组内部的链路状态信息传播与路由组之间的链路状态信息传播不同。在路由组内部,可以假定 TCP/IP 连接可靠,并且服务器通过直接的 TCP/IP 连接彼此通信。但是,在路由组之间,可能无法建立直接的 TCP/IP 连接。在路由组之间,Exchange Server 2003 通过 SMTP 或 X.400 传播链路状态信息。

在这两种情况下,Exchange Server 2003 分别按如下过程传播链路状态信息:

  • 路由组内部的 LSA 在路由组内部,路由组主服务器跟踪链路状态信息,并将它传播到路由组中其余的服务器。其余的服务器也称命名的成员节点或路由组成员。在成员节点已启动并已使用 Active Directory 中的信息初始化其路由表后,便会建立与端口 691 的 TCP/IP 连接。然后,成员节点通过路由组主服务器的身份验证,并获取路由拓扑中所有链路的最新状态信息。路由组内部的所有连接都要求双向身份验证。连接一直保持,这样,无论链路状态何时发生变化,主节点和次级节点都可以相互通信。
    79da1379-e364-4851-a108-d61ec3078161
    在路由组内部,Exchange Server 2003 按如下过程更新链路状态信息:

    1. 当高级排队引擎或 Exchange MTA 确定桥头或路由组连接器出现问题时,会通知本地路由引擎。Exchange Server 2003 邮件路由中的“基于链路状态信息的邮件重新路由”对此进行了说明。

    2. 本地路由引擎充当路由组主服务器与高级排队引擎或 Exchange MTA 之间的缓存代理,将链路状态信息通过与 TCP 端口 691 的链路状态连接转发到路由组主服务器。

    3. 当路由组主服务器收到更新时,用新信息重写链路状态表。路由组主服务器根据这一新信息创建新的 MD5 哈希值,并将它插入到链路状态表中,然后将新信息传播到路由组中的所有服务器。此通信同样是通过 TCP 端口 691 来进行的。

      note注意:
      MD5 哈希值是通过对邮件使用哈希算法而得到的加密数据块。哈希算法根据一列长度为 512 的比特块生成 128 位哈希值。当相同的邮件通过相同的哈希算法进行传递时,始终会产生相同的哈希值。即便一个字符的不同也会产生完全不同的哈希值。
    4. 路由组主服务器将整个链路状态表(即 OrgInfo 数据包)发送到每个路由组成员。每个路由组成员都将新 OrgInfo 数据包的 MD5 哈希值与自己链路状态表中的 MD5 哈希值进行比较,确定本地服务器是否有最新的信息。

    5. 如果 MD5 值不同,路由组成员便会对 OrgInfo 数据包进行处理。替换内存中的链路状态表后,路由组成员向路由组主服务器发送一个简短的答复,该答复现在也引用新的 MD5 哈希值。

    6. 路由组主服务器处理此信息,发现该路由组成员已更新后,便会向路由组成员发送一个简短的确认消息。

    7. 之后的每五分钟,路由组成员都轮询主服务器,以查询最新的路由信息。主节点和成员节点比较其 MD5 哈希值,确定路由信息是否发生变化。

    note注意:
    路由组内部的所有服务器都必须通过可靠的 TCP/IP 连接与路由组主服务器通信。
  • 路由组之间的 LSA 链路状态信息在路由组之间是通过桥头服务器和路由组连接器间接传递的。为了将链路状态信息发送到另一个路由组,路由组主服务器以 Orginfo 数据包的形式传递链路状态信息,并将它通过 TCP 端口 691 发送到路由组桥头服务器。然后,桥头服务器使用所驻留的各个路由组连接器,将此信息转发到所连接的其他路由组中的所有桥头服务器。
    如果路由组之间的通信是基于 SMTP 的(也就是说,是通过“路由组连接器”或 SMTP 连接器来进行的),那么,在使用扩展的 SMTP 命令 X-LINK2STATE 进行常规的邮件传输之前,将首先交换链路状态信息。具体如下所述:

    1. 源桥头服务器通过 TCP 端口 25 建立与目标桥头的 TCP/IP 连接。

    2. 桥头服务器使用 X-EXPS GSS API 命令相互进行身份验证。

    3. 连接和身份验证过程后,链路状态通信开始使用 X-LINK2STATE 命令。

    4. 首先,桥头服务器比较其 MD5 哈希值,检测链路状态信息是否发生任何变化。然后,本地桥头服务器使用 DIGEST_QUERY 动作向远程桥头服务器请求 MD5 哈希值。DIGEST_QUERY 动作包含 Exchange 组织的 GUID 及本地桥头服务器的 MD5 哈希值。

    5. 远程桥头服务器现在通过 DIGEST_QUERY 动作将其 MD5 哈希值与收到的 MD5 哈希值进行比较。如果哈希值相同,远程桥头服务器会发送一个 DONE_RESPONSE 动作,以指示链路状态表不需要更新。否则,远程桥头服务器将发送其整个 OrgInfo 数据包。

    6. 收到 OrgInfo 数据包后,远程桥头服务器和本地桥头服务器调换角色,由本地桥头服务器将其自己的 OrgInfo 数据包发送到远程桥头服务器。两个桥头服务器都将自己所收到的 OrgInfo 数据包传输到各自的路由组主服务器。路由组主服务器确定是否用 OrgInfo 数据包中的信息更新链路状态表。版本号越高,说明 OrgInfo 数据包越新。

      note注意:
      路由组主服务器从不接受远程路由组中的路由组主服务器发来的有关它所在的本地路由组的信息。
    7. 交换 OrgInfo 数据包后,远程桥头服务器开始传输电子邮件,或者发出 Quit 命令结束 SMTP 连接。
      有关运行 Exchange Server 2003 的服务器之间的 SMTP 通信的详细信息,请参阅 SMTP 传输体系结构

note注意:
通过 X.400 连接器链接路由组时,作为典型邮件传输的一部分,链路状态信息在 MTA 之间交换。在传输人员间邮件之前,会通过系统邮件将一个称为 Orginfo 数据包的二进制对象发送到接收方 MTA。然后,接收方 MTA 将 Orginfo 数据包传输到本地路由引擎,后者再将 Orginfo 数据包传输到路由组主服务器。

LSA 示例

下图说明了链路状态算法如何在包含多个路由组的 Exchange 组织中工作。在该图所显示的环境中,路由组 E 包含一个不可用的桥头服务器。此外,其他路由组中的桥头服务器尚未收到有关存在路由问题的信息。

fe73ef70-194d-4e11-af10-a43b3c5c62a7

Exchange Server 2003 通过下列方式发现路由问题:

  1. 路由组 A 中的用户向路由组 E 中的收件人发送邮件。
  2. 路由引擎选择如图 5.9 所示的路径。因此,邮件传输到路由组 B 中的桥头服务器。
  3. 路由组 B 中的桥头服务器尝试将邮件直接传输到路由组 E 中的桥头服务器。由于远程桥头不可用,尝试失败。连续三次连接尝试失败后,该路由组连接器的本地桥头服务器将标记为 CONN_NOT_AVAIL。由于连接器配置中没有更多的桥头,因此该连接器将标记为 STATE DOWN。
    6396d708-0281-4fa2-a6b9-8b6c51497f70
  4. 路由组 B 中的桥头服务器通过 TCP 端口 691 连接到其路由组主服务器,并传输新的链路状态信息。主服务器将信息合并到链路状态表中,并将此变化通知给路由组中的所有服务器。
  5. 链路状态变化导致在路由组 B 中发生重新路由事件。Exchange Server 2003 可以从两个开销值相同的路径中进行选择。在本示例中,邮件发送到路由组 C,此传输路径是路由引擎随机选择的。
  6. 传输实际邮件之前,路由组 B 和路由组 C 中的桥头服务器将比较其 MD5 哈希值。由于 MD5 哈希值不匹配,因此服务器交换链路状态信息。路由组 B 中的桥头服务器将链路状态变化通知给其余相邻的远程桥头服务器(路由组 A、C 和 D)。
  7. 路由组 C 中的桥头服务器将通过 TCP 端口 691 连接到其路由组主服务器,并传输新的链路状态信息。路由组主服务器将信息合并到链路状态表中,并将此变化通知给路由组中的所有服务器。路由组 B 和 C 中的所有服务器现在都知道路由组 B 与路由组 E 之间的路由组连接器不可用。
  8. 路由组 C 中的桥头服务器尝试将邮件直接传输到路由组 E 中的桥头服务器。由于远程桥头不可用,因此连接尝试失败。三次连接尝试失败后,该连接器将标记为 STATE DOWN。
    c71e54a9-c35b-450f-8402-037e969cc33e
  9. 路由组 C 中的桥头服务器将通过 TCP 端口 691 连接到其路由组主服务器,并传输新的链路状态信息。路由组主服务器将信息合并到链路状态表中,并将此变化通知给路由组中的其他所有服务器。
  10. 链路状态变化导致在路由组 C 中发生重新路由事件。邮件现在发送到路由组 D,因为路由引擎仍然能够找到从路由组 D 到路由组 E 的可用传输路径。路由组 C 中的桥头服务器将链路状态变化通知给其余相邻的远程桥头服务器(路由组 A、B 和 D)。
  11. 邮件被传输到路由组 D,但在实际传输邮件之前,路由组 B 和 C 中的桥头服务器将比较其 MD5 哈希值,并交换链路状态信息。
  12. 路由组 D 中的桥头服务器将通过 TCP 端口 691 连接到其路由组主服务器,并传输新的链路状态信息。路由组主服务器将信息合并到链路状态表中,并将此变化通知给路由组中的所有服务器。路由组 D 中的所有服务器现在都知道路由组 B 与路由组 E 以及路由组 C 与路由组 E 之间的路由组连接器不可用。
  13. 路由组 D 中的桥头服务器尝试将邮件直接传输到路由组 E 中的桥头服务器,但是由于远程桥头不可用,连接尝试失败。三次连接尝试失败后,该连接器将标记为 STATE DOWN。
    5d5b211c-383c-4274-bd84-42956f3a3a84
  14. 路由组 D 中的桥头服务器将通过 TCP 端口 691 连接到其路由组主服务器,并传输新的链路状态信息。主服务器将信息合并到链路状态表中,并将此变化通知给路由组中的所有服务器。
  15. 链路状态变化导致路由组 D 中发生重新路由事件。由于没有可用于路由组 E 的其他传输路径,因此邮件将保留在路由组 D 中,直到至少有一条传输路径可用。一旦路由组 E 中的桥头服务器可用,邮件便会被传输到路由组 E。
  16. 路由组 D 中的桥头服务器将链路状态变化通知给其余相邻的远程桥头服务器(路由组 B 和 C)。然后,这些路由组将链路状态变化传播到路由组 A。

链路状态变化和链路状态传播

链路状态表包含每个路由组的版本信息,其中包括主版本号、次版本号以及用户版本号。主版本变化具有最高的优先级,其次是次版本的变化,再其次是用户版本号的变化。

Exchange Server 2003 分别通过下列方式检测链路状态变化:

  • 主版本号 主变化是路由拓扑的实际物理变化。例如,当在路由组中添加新连接器或者更改连接器配置时,便产生了主变化。为了接收关于路由拓扑中的路由组主变化的通知,路由组主服务器使用 DSAccess 在 Active Directory 注册,以申请变化通知。配置域控制器按照标准的轻型目录访问协议 (LDAP) 变化通知过程,将这些通知发送到 Exchange 服务器。当路由组主服务器收到来自配置域控制器的路由拓扑更新时,将已更新的信息发送到其路由组中的所有成员服务器。它还按照前面“链路状态算法”一节中的说明通知远程路由组中的所有桥头服务器。有关 DSAccess 的角色和 Exchange 2003 上的配置域控制器的详细信息,请参阅 Exchange Server 2003 与 Active Directory

  • 次版本号 次变化是链路状态信息的变化,例如,连接器从 STATE UP 变为 STATE DOWN。但是,不可靠的网络连接可能导致连接器频繁地标记为 up 和 down,从而导致 Exchange 组织中的链路状态更新过于频繁。由于过多的路由重置和邮件重新路由,处理开销可能会大大增加。默认情况下,Exchange Server 2003 通过使链路状态延迟十分钟变化来缓解连接器振荡的情况。在此期间,所发生的变化将合并到一起,然后通过批操作一次性地在整个组织中复制。但是,如果变化持续的时间过长,振荡连接仍然会产生链路状态通信。
    可以通过下列注册表参数来加大或减小更新窗口:

    位置

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RESvc\Parameters\

    StateChangeDelay

    类型

    REG_DWORD

    数值数据

    链路状态更新的时间间隔(秒)。默认为十分钟。最大为七天。排除连接故障时,将该参数设置为 0 会很有用。之后,故障将立即反映在连接器状态中。

    还可以通过设置下列注册表项来防止路由组主服务器将其连接器标记为 down。这是一种很有用的手段,尤其是在中心辐射型路由方案中。在这种方案中,每个目标都只能通过一个连接器来到达。这样,如果备用连接器不可用,将不会发生邮件重新路由。

    位置

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RESvc\Parameters\

    SuppressStateChanges

    类型

    REG_DWORD

    数值数据

    0x1 值将禁用链路状态变化。

  • 用户版本号 用户更新包含最小的变化,例如,当路由组主服务器发生了变化、在 Exchange 服务器上启动或停止了服务、将另一个服务器添加到了路由组中,或者当成员服务器断开了与路由组主服务器的连接时,所发生的变化都是最小变化。

更改路由组主服务器

安装在路由组中的第一台服务器自动被指定为路由组主服务器。如果该服务器出现故障或者脱机,链路状态信息将不会继续在路由组中传播。路由组中的所有服务器都继续使用之前的信息来工作。如果路由组主服务器再次可用,将重新构建链路状态信息。路由组主服务器开始工作时,将所有服务器和连接器都标记为不可用。然后探查所有不可用的服务器,并更新路由组内部的成员。

如果要关闭路由组主服务器较长的时间,应指定另一台路由组主服务器,以避免降低邮件路由的效率。在 Exchange 系统管理器中,展开相应的路由组,然后选择“成员”容器。在详细信息窗格中,用鼠标右键单击要提升为路由组主服务器的服务器,然后选择“设为主服务器”。

note注意:
更改路由组主服务器代表主链路状态变化。链路状态发生变化后,链路状态信息将在整个组织中传播,并且所有 Exchange 服务器都必须重新路由其邮件。因此,不要经常更改路由组主服务器。

路由组主服务器之间存在冲突

路由组中只能有一台服务器被当作路由组主服务器。此配置是通过算法(路由组中必须有 (N/2) +1 台服务器同意并认可该主服务器)来强制实现的。N 表示路由组中的服务器数。随后,成员节点向主节点发送链路状态 ATTACH 数据。

有时,会有两台或更多的服务器将另一台服务器错认为路由组主服务器。例如,如果不首先选择另一台路由组主服务器就移动或删除原有的路由组主服务器,那么 Active Directory 中的 msExchRoutingMasterDN 属性(指定路由组主服务器)可能指向已删除的服务器,因为该属性未链接。

当原有的路由组主服务器拒绝脱离主服务器身份,或者恶意的路由组主服务器继续向原有的路由组主服务器发送链路状态 ATTACH 信息时,也会发生这种情形。在 Exchange Server 2003 中,如果 msExchRoutingMasterDN 指向已删除的对象,则路由组主服务器会放弃其主服务器的角色,并关闭主服务器角色。

通过执行下列步骤可以解决这些问题:

  • 在端口 691 上检查路由组内部的链路状态传播是否正常,并确认防火墙或 SMTP 筛选器未阻止通信。
  • 确认没有 Exchange 服务停止运行。
  • 使用 Microsoft Windows Server 2003 附带的 Active Directory 复制监视工具,检查 Active Directory 中的复制延迟。
  • 检查网络问题和网络通信延迟。
  • 检查已删除的路由组主服务器或服务器是否不再存在。在这些实例中,传输事件 958 会记录在事件查看器的应用程序日志中。该事件指出路由组主服务器不再存在。通过使用诸如 LDP (ldp.exe) 或 ADSI Edit (adsiEdit.msc) 等目录访问工具来确认此信息。这些应用程序包括在 Windows Server 2003 支持工具中。