即使在重置RST标志出现后,TCP重传也会继续

ami*_*mit 5 tcp

根据我对TCP重置(RST)标志的理解,只要收到的段不是用于当前连接,就会设置该标志,这会导致中止当前的TCP会话.但是粘贴在下面的wireshark捕获似乎并没有遵循这个理论.基本上已发起RESET的结束A(帧#466)本身试图通过相同的TCP会话重新发送TCP帧,并且还使用[RST,ACK]继续响应来自B端的任何后续新连接请求[SYN]行为重复5次,3次握手仅在第6次尝试期间再次成功(帧#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              
Run Code Online (Sandbox Code Playgroud)

我的问题:

为什么结束A继续通过从其自身端生成RST的连接重新传输数据包?

Mar*_*ick 3

发送 RST 的原因有很多。当 TCP 段到达但不适合当前打开的连接或侦听端口时,将使用重置标志。例如,如果 TCP 端口关闭,系统上的 TCP 堆栈将使用 RST 进行响应。

通常,当系统发送 TCP 重置时,它也会设置 ack 标志,因为它正在确认连接尝试。在你的情况下,没有 ack 标志,根据 RFC,只有当没有建立连接时才会完成(从记忆中),在你的情况下,这对我来说是一个防火墙或似乎是中间设备(不属于发送重置的 TCP 连接)。因此,服务器 A 仍然会合理地认为连接是活动的。

帧 467-472 是标准 TCP 重传行为(来自系统 A),连接尝试之间的时间加倍,服务器在帧 472 中的最后一次尝试后最终似乎放弃了。这些帧是帧 464 的重传,这似乎表明系统 B 没有收到第 465 帧。我猜您是在系统 B 上捕获的?

我相信系统 A 在发送帧 473 后才转为 CLOSED,这将解释为什么我们会看到系统 B 发起的三向握手。

从你的跟踪来看,如果没有更多的网络知识,很难说更多。

哈!