为什么telnet发送一个RSET时,我控制c连接?

Solaris 10使用snoop捕获数据包。

当我telnet到一个未使用的IP地址,并等待连接企图超时,一切行为如预期(SYN发送多次,直到连接build立超时,然后telnet退出)。

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

这样做是有原因的吗? 也许networking堆栈假设SYN成功了,即使SYN-ACK没有回来,所以它发送一个RSET来防止远程系统被半开放?

我很久以前就读过Stevens TCP / IP Illustrated,第一卷,我不记得正在讨论这个问题(我用快速的谷歌进行了检查,但没有挖掘出这本书)。

正如你所怀疑的那样 – 这是通知远程主机中止连接尝试的一种恰当的措施。 所有你的系统知道,主机发回一个SYNACK,你没有得到它。

这基本上是一个“嗨,远程主机,如果你试图连接回我,你可以继续前进,停止”。

TCP不允许会话处于模糊状态,无论该会话是build立的还是正在build立的。 它需要正常地终止连接或连接尝试,因为它不会中断连接而不发送FIN或RST(据我所知)。

这并不是说,由于TCP范围之外的因素,如会话一端导致半开的断开连接,会话永远不会处于模糊的状态。 从TCP的angular度来看,半开连接只是一个很长时间的连接(除非实现了TCP保持连接)。