【发布时间】: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