为什么当我在连接时按下 Control-c 键时 telnet 会发送 RSET?

为什么当我在连接时按下 Control-c 键时 telnet 会发送 RSET?

Solaris 10 使用 snoop 捕获数据包。

当我通过 telnet 连接到一个未使用的 IP 地址并等待连接尝试超时时,一切都按预期运行(SYN 发送多次直到连接建立超时,然后 telnet 退出)。

当做同样的事情,但在达到超时之前取消尝试时,使用 control-c,最后一个数据包有一个 RSET。

这样做是有原因的吗?也许网络堆栈假设 SYN 成功了,即使 SYN-ACK 没有返回,因此它会发送 RSET 以防止远程系统处于半开状态?

我很久以前就读过 Stevens TCP/IP Illustrated, Vol 1,但我不记得有讨论过这个问题(我用谷歌快速查了一下,但没有找到这本书)。

答案1

正如您所怀疑的 - 它是一种以防万一的措施,通知远程主机中止连接尝试;就您的系统所知,主机发回了一个 SYNACK,而您没有收到它。

它基本上是“嘿,远程主机,如果您试图连接回我,您可以继续并停止”。

答案2

TCP 不允许会话处于模糊状态,无论该会话是已建立还是正在建立。它需要从容地终止连接或连接尝试,即它不会在不发送 FIN 或 RST 的情况下中止连接(据我所知)。

这并不是说会话永远不会因 TCP 范围之外的因素而处于模糊状态,例如,链接断开导致会话一端处于半开状态。从 TCP 的角度来看,半开连接只是长时间空闲的连接(除非实施了 TCP 保持活动)。

相关内容