两个程序使用 TCP 连接(3 次握手)来打开、通信、终止连接和打开新连接。如果发送关闭第一个连接的 FIN 消息重复并延迟到第二个连接建立,然后传递,新连接是否会被终止?
如果传递了旧的 FIN,TCP 会终止新连接吗?
不,至少有两个原因:
- 源端口和目的端口
- 序列号
即使源/目的端口对与第一个连接相同,序列号也不太可能相同,因为连接的初始序列号应该是随机的。
RST 标志不依赖于 seq nb。假设 src/dst 端口对相同,先前的 RST 标志将终止会话。
因此,另一个旧的已终止会话的重复 FIN 数据包终止新会话的可能性非常低。
一个连接的 FIN 与第二个连接无关。请记住,连接由两个套接字(源和目标)标识。要么您将拥有两个单独的连接,其中识别连接的一对套接字中的一个是不同的,在这种情况下,这两个套接字是完全独立的,要么您将尝试建立现有连接,这将导致 RST。
基本上,您的情况不会发生,因为这两个连接是完全独立的,或者在第一个连接完全关闭之前无法建立第二个连接。
RFC 793,传输控制协议是 TCP 的定义,它解释了它的工作原理:
多路复用:
为了允许单个主机内的多个进程同时使用 TCP 通信设施,TCP 在每个主机内提供了一组地址或端口。与来自互联网通信层的网络和主机地址连接,形成一个套接字。一对套接字唯一标识每个连接。也就是说,一个套接字可以同时用于多个连接。
端口与进程的绑定由每个主机独立处理。然而,将经常使用的进程(例如,“记录器”或分时服务)附加到公知的固定套接字被证明是有用的。然后可以通过已知地址访问这些服务。建立和学习其他进程的端口地址可能涉及更多的动态机制。
连接:
上面描述的可靠性和流量控制机制要求 TCP 为每个数据流初始化和维护某些状态信息。这些信息(包括套接字、序列号和窗口大小)的组合称为连接。每个连接由一对标识其两侧的套接字唯一指定。
当两个进程希望通信时,它们的 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) 必须只引出一个包含当前发送序列号的空确认段和一个指示预期接收的下一个序列号的确认,并且连接保持相同的状态。
如果传入段的安全级别、隔离区或优先级与连接请求的级别、隔离区和优先级不完全匹配,则发送重置并且连接进入 CLOSED 状态。重置从传入段的 ACK 字段中获取其序列号。