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

时间:2012-02-13 21:31:48

标签: 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              

我的问题:

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

1 个答案:

答案 0 :(得分: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发起的三次握手。

从您的追踪中,如果没有更多的网络知识,很难说更多。

HTH!