想象这样一种情况 - 客户端(Linux)和托管在服务器(Linux)上的虚拟 IP 之间的 TCP 连接(NFS4 或数据库)。服务器出现故障,VIP 被另一台服务器接管(使用 ARP)。
客户端没有意识到这一点,并认为 TCP 连接仍然打开。客户端不断向辅助服务器发送重新传输(其中 5-8 个),并且忽略它们。大约需要 3 分钟,客户端会放弃,关闭失败的 TCP 连接并尝试打开一个新连接。
让客户端尽快故障转移到新服务器的最佳机制是什么?
想象这样一种情况 - 客户端(Linux)和托管在服务器(Linux)上的虚拟 IP 之间的 TCP 连接(NFS4 或数据库)。服务器出现故障,VIP 被另一台服务器接管(使用 ARP)。
客户端没有意识到这一点,并认为 TCP 连接仍然打开。客户端不断向辅助服务器发送重新传输(其中 5-8 个),并且忽略它们。大约需要 3 分钟,客户端会放弃,关闭失败的 TCP 连接并尝试打开一个新连接。
让客户端尽快故障转移到新服务器的最佳机制是什么?
客户端不断向辅助服务器发送重新传输(其中 5-8 个),并且忽略它们。
那是不正确的。如果故障转移服务器与发送主机没有 TCP 连接,TCP 将在接收到不存在连接中的段时发送 RST,杀死主机上的连接,这将需要与故障转移服务器建立新连接.
RFC 793,传输控制协议是 TCP 的定义,如果您尝试按照您的描述进行操作,您应该真正熟悉其中的所有内容。它有一个一般性的解释,但还有很多其他的事情你应该理解:
重置生成
作为一般规则,每当一个显然不是用于当前连接的段到达时,必须发送重置 (RST)。如果不清楚是这种情况,则不得发送复位。
状态分为三组:
如果连接不存在(CLOSED),则发送复位以响应除另一个复位之外的任何传入段。 特别是,寻址到不存在的连接的 SYN 会通过这种方式被拒绝。
如果传入的段有一个 ACK 字段,则重置从段的 ACK 字段中获取其序列号,否则重置的序列号为零,并且 ACK 字段设置为传入段的序列号和段长度之和. 连接保持在 CLOSED 状态。
如果连接处于任何非同步状态(LISTEN、SYN-SENT、SYN-RECEIVED),并且传入段确认尚未发送的内容(段携带不可接受的 ACK),或者传入段具有安全级别或如果隔间与连接请求的级别和隔间不完全匹配,则会发送重置。
如果我们的 SYN 未被确认并且传入段的优先级高于请求的优先级,则提高本地优先级(如果用户和系统允许)或发送重置;或者如果传入段的优先级低于请求的优先级,则继续,就好像优先级完全匹配一样(如果远程 TCP 无法提高优先级以匹配我们的优先级,这将在它发送的下一个段中检测到,并且连接将被终止)。如果我们的 SYN 已被确认(可能在此传入段中),则传入段的优先级必须与本地优先级完全匹配,否则必须发送重置。
如果传入的段有一个 ACK 字段,则重置从段的 ACK 字段中获取其序列号,否则重置的序列号为零,并且 ACK 字段设置为传入段的序列号和段长度之和. 连接保持相同状态。
如果连接处于同步状态(ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSING、LAST-ACK、TIME-WAIT),任何不可接受的段(超出窗口序列号或不可接受的确认) number) 必须只引出一个空的确认段,其中包含当前的发送序列号和一个指示预期接收的下一个序列号的确认,并且连接保持在相同的状态。
如果传入段的安全级别、隔离区或优先级与连接请求的级别、隔离区和优先级不完全匹配,则发送重置并且连接进入关闭状态。重置从传入段的 ACK 字段中获取其序列号。
重置处理
在除 SYN-SENT 之外的所有状态下,所有重置 (RST) 段都通过检查其 SEQ 字段来验证。如果其序列号在窗口中,则重置有效。在 SYN-SENT 状态(响应初始 SYN 接收到的 RST),如果 ACK 字段确认 SYN,则 RST 是可接受的。
RST 的接收者首先验证它,然后改变状态。如果接收器处于 LISTEN 状态,它会忽略它。如果接收器处于 SYN-RECEIVED 状态并且之前一直处于 LISTEN 状态,则接收器返回 LISTEN 状态,否则接收器中止连接并进入 CLOSED 状态。如果接收器处于任何其他状态,它会中止连接并通知用户并进入 CLOSED 状态。