【问题标题】:TCP Retransmission continues even after reset RST flag came up即使在重置 RST 标志出现后,TCP 重传也会继续
【发布时间】:2012-03-05 07:36:23
【问题描述】:

根据我对 TCP reset(RST) 的理解,只要收到的段不是用于当前连接的,就会设置标志,这会导致当前 TCP 会话中止。但是下面粘贴的wireshark捕获似乎不遵循这个理论。基本上,已经启动 RESET (frame#466) 的端 A 本身尝试通过同一个 TCP 会话重新传输 TCP 帧,并且还继续使用 [RST,ACK] 响应来自端 B 的任何后续新连接请求 [SYN] 和这个行为会重复 5 次,并且仅在第 6 次尝试(帧#486)期间 3 次握手再次成功。

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 的连接重新传输数据包?

【问题讨论】:

  • 也许最初发送 ACK 的发起者并不期望另一个数据包的 ACK(不同的序列号),所以它发送 RST,然后以越来越长的时间间隔再次发送数据包,直到接收者发回正确的消息(它没有,所以发起者一次又一次地发送 RST)。看起来是通道有问题,可能是电缆故障或接口模式不同(半双工与全双工等)
  • @Alfabravo : 为什么在发送 RST 后连接移动到 CLOSED 状态时它会尝试重新传输数据包?
  • RST 并不意味着关闭。 RST 的意思是“让我们再试一次”。对于关闭连接,顺序为 FIN->、。通常,RST 的意思是“让我们等待每次新尝试的随机(增加)时间,以避免碰撞和其他东西”。
  • @Alfabravo:一旦发送 RST,连接可以保持在“相同状态”或将移动到“CLOSED”状态并至少在 B 端移动到“CLOSED”状态,因为它试图重新再次与 A 启动 3 次握手。

标签: tcp


【解决方案1】:

发送 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!

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 2010-09-20
    • 2019-09-12
    • 2021-03-11
    • 1970-01-01
    • 2022-12-07
    • 2012-01-19
    • 1970-01-01
    相关资源
    最近更新 更多