多个子流的MPTCP连接是如何关闭的?如果客户端决定关闭其中一个子流,MPTCP连接会发生什么情况?如果你能一步一步地详细解释,那将是非常好的。
发布于 2019-01-15 17:01:43
您的问题的答案在RFC 6824,用于多地址多路径操作的TCP扩展中解释得很清楚:
2.6。当主机A想通知主机B它没有更多的数据要发送时,关闭MPTCP连接时,它会将此“数据鳍”作为数据序列信号的一部分发出信号(参见上文)。它具有与常规TCP FIN相同的语义和行为,但在连接级别。一旦成功地接收到了MPTCP连接上的所有数据,则该消息将在连接级别使用DATA_ACK确认。第3.3.3款.主机A主机B
-而且--
3.3.3。关闭常规TCP中的连接时,FIN会通知接收方发送者没有更多的数据要发送。为了允许子流独立运行,并保持TCP在线上的外观,MPTCP中的鳍只影响其发送的子流。这允许节点在任何时候对正在使用的路径行使相当大的自由度。对于常规TCP,鳍的语义保持不变;也就是说,直到双方都有ACKed对方的鳍时,子流才会完全关闭。当应用程序在套接字上调用close()时,这表明它没有更多的数据要发送;对于常规TCP,这将导致连接上的FIN。对于MPTCP,需要一个等效的机制,这称为DATA_FIN。DATA_FIN表示发送方没有更多要发送的数据,因此可以用来验证所有数据都已成功接收。DATA_FIN,就像常规TCP连接上的FIN一样,是单向信号。DATA_FIN是通过将数据序列信号选项(图9)中的'F‘标志设置为1来发出信号的。DATA_FIN占据连接级序列空间的一个八进制(最后一个八进制)。请注意,DATA_FIN包含在数据级别的长度中,而不是在子流级别:例如,包含DSN 80的段和具有DATA_FIN集的数据级长度11将从子流映射10个八进制到数据序列空间80-89,DATA_FIN是DSN 90;因此,包含DATA_FIN的段将被确认为DATA_ACK为91。请注意,当DATA_FIN未附加到包含数据的TCP段时,数据序列信号必须具有0的子流序列号、1的数据级别长度以及与DATA_FIN本身相对应的数据序列号。在这种情况下,校验和将只覆盖伪头。DATA_FIN具有常规TCP的语义和行为,但在连接级别。值得注意的是,只有在成功地在连接级别接收到所有数据之后,它才是DATA_ACKed。因此,请注意,DATA_FIN与子流鳍是解耦的。只有当在其他子流上没有未完成的数据时,才允许将这些信号组合在一个子流上。否则,可能需要重新传输关于不同子流的数据。基本上,除非安全,否则主机不能关闭所有有效的子流,即直到所有未完成的数据都是DATA_ACKed,或者直到设置了DATA_FIN标志的段成为唯一未完成的段。一旦确认了一个DATA_FIN,所有剩余的子流都必须与标准的鳍交换关闭。两台主机都应该在所有子流上发送FINs,这是出于礼貌,即使单个子流失败,也允许中间盒清理状态。还鼓励减少终端主机子流上的超时(最大段生存期)。特别是,如果仍有未完成的数据排队(为了使DATA_FIN得到承认而在其他子流上重新传输),则可以使用RST关闭任何子流。一旦两个主机的DATA_FINs被DATA_ACKs所确认,连接就被认为是关闭的。如上所述,单个子流上的标准TCP FIN只关闭发送它的子流。如果所有子流都已通过FIN交换关闭,但未接收和确认DATA_FIN,则仅在超时后才将MPTCP连接视为已关闭。这意味着实现将具有子流和连接级别的TIME_WAIT状态(参见附录C)。这允许在新的子流重新建立之前,在所有子流上失去连接的“先断再造”的情况。
https://networkengineering.stackexchange.com/questions/56135
复制相似问题