TCP重传在RST标志出现后仍然继续。

5
根据我的理解,TCP复位(RST)标志设置是每当接收到的数据段不适用于当前连接时设置的,这会导致终止当前的TCP会话。但下面粘贴的Wireshark捕获似乎并不遵循这个理论。基本上发起RESET(frame#466)的端点A自己尝试在同一TCP会话中重新发送TCP帧,并继续响应来自端点B的任何后续新连接请求[SYN],并且这种行为重复了5次,在第6次尝试(frame#486)三向握手才再次成功。
464 04:35.1 50000 > enpc [PSH, ACK] Seq=31894 Ack=7454 Win=5345 Len=105             
465 04:35.2 enpc > 50000 [ACK] Seq=7454 Ack=31999 Win=32127 Len=0               
466 04:35.2 50000 > enpc [RST] Seq=31999 Win=0 Len=0                
467 04:35.4 [TCP Retransmission] 50000 > enpc [PSH, ACK] Seq=31894 Ack=7454 Win=5345 Len=105                
468 04:36.1 [TCP Retransmission] 50000 > enpc [PSH, ACK] Seq=31894 Ack=7454 Win=5345 Len=105                
469 04:37.5 [TCP Retransmission] 50000 > enpc [PSH, ACK] Seq=31894 Ack=7454 Win=5345 Len=105                
470 04:40.3 [TCP Retransmission] 50000 > enpc [PSH, ACK] Seq=31894 Ack=7454 Win=5345 Len=105                
471 04:45.9 [TCP Retransmission] 50000 > enpc [PSH, ACK] Seq=31894 Ack=7454 Win=5345 Len=105                
472 04:57.1 [TCP Retransmission] 50000 > enpc [PSH, ACK] Seq=31894 Ack=7454 Win=5345 Len=105                
473 05:17.1 fg-fps > 50000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=2 SACK_PERM=1                
474 05:17.1 50000 > fg-fps [RST, ACK] Seq=1 Ack=1 Win=0 Len=0               
475 05:17.5 fg-fps > 50000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=2 SACK_PERM=1                
476 05:17.5 50000 > fg-fps [RST, ACK] Seq=1 Ack=1 Win=0 Len=0               
477 05:18.0 fg-fps > 50000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=2 SACK_PERM=1                
478 05:18.0 50000 > fg-fps [RST, ACK] Seq=1 Ack=1 Win=0 Len=0               
479 05:19.5 [TCP Retransmission] 50000 > enpc [PSH, ACK] Seq=31894 Ack=7454 Win=5345 Len=105                
480 05:23.2 fg-gip > 50000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=2 SACK_PERM=1                
481 05:23.2 50000 > fg-gip [RST, ACK] Seq=1 Ack=1 Win=0 Len=0               
482 05:23.7 fg-gip > 50000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=2 SACK_PERM=1                
483 05:23.7 50000 > fg-gip [RST, ACK] Seq=1 Ack=1 Win=0 Len=0               
484 05:24.2 fg-gip > 50000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=2 SACK_PERM=1                
485 05:24.2 50000 > fg-gip [RST, ACK] Seq=1 Ack=1 Win=0 Len=0               
486 05:29.7 dyniplookup > 50000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=2 SACK_PERM=1               
487 05:29.7 50000 > dyniplookup [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=2             
488 05:29.7 dyniplookup > 50000 [ACK] Seq=1 Ack=1 Win=65536 Len=0               
489 05:29.7 dyniplookup > 50000 [PSH, ACK] Seq=1 Ack=1 Win=65536 Len=105                
490 05:29.7 50000 > dyniplookup [ACK] Seq=1 Ack=106 Win=5840 Len=0              
491 05:29.7 dyniplookup > 50000 [PSH, ACK] Seq=106 Ack=1 Win=65536 Len=105              

我的问题:

为什么端点A在生成RST的情况下仍然保持在连接上重新传输数据包?

该问题涉及IT技术,需要进一步了解具体背景和情境。

1
也许最初发送ACK的发起者并没有期望针对另一个数据包(不同序列号)再次收到ACK,因此它发送了RST,然后在逐渐增加的时间间隔内再次发送该数据包,直到接收方发送回正确的消息(但实际上它没有这样做,因此发起者一遍又一遍地发送RST)。看起来像是通道中出现了问题,可能是电缆故障或接口模式的差异(半双工与全双工等)。 - Alfabravo
@Alfabravo:为什么在发送RST后连接转移到CLOSED状态时,它会尝试重新传输数据包? - amit
RST并不意味着关闭。RST表示“让我们再试一次”。对于关闭连接,序列是FIN->,<-ACK,<-FIN,ACK->。通常,RST的意思是“让我们等待一个随机(递增)时间来进行每一次新的尝试,以避免冲突和其他问题”。 - Alfabravo
@Alfabravo:一旦发送了RST,连接可以保持在“同一状态”下,或者将移动到“已关闭”状态,并且至少在B的端点移动到“已关闭”状态,因为它尝试再次使用A重新初始化三次握手。 - amit
是的,我不准确。https://dev59.com/Xmsz5IYBdhLWcg3wrJ0x - Alfabravo
1个回答

3
有许多原因可能导致发送RST。当TCP段到达时不是针对当前打开的连接或监听端口时,将使用复位标志。例如,如果TCP端口关闭,则系统上的TCP堆栈将用RST进行响应。
通常情况下,当系统发送TCP重置时,它也会设置ack标志,因为它正在确认一个连接尝试。在您的情况下,没有ack标志,这(从记忆中)根据RFC只有在没有建立连接时才会执行,而在您的情况下已经建立了连接,这会使我认为它是防火墙或其他中介设备(不是TCP连接的一部分)发送了重置。因此,服务器A仍然合法地认为连接仍然活动。
帧467-472是标准的TCP重传行为(来自系统A),连接尝试之间的时间加倍,最后一次尝试在第472帧后似乎放弃了。这些帧是464帧的重传,这表明系统B没有收到465帧。我猜你是在系统B上捕获的吗?
我相信只有在发送第473帧后,系统A才转移到CLOSED状态,这将解释为什么我们随后看到三次握手从系统B启动。
从您的跟踪中,除非更了解网络,否则很难说更多。
希望对您有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接