TCP可以在传输中丢失时重新传输握手吗?

时间:2011-06-17 15:19:24

标签: tcp

我在Intranet上的两台主机之间看到了大量失败的连接(称之为客户端和服务器)。

在两台计算机上使用netstat,我看到相应的端口号,其中服务器端处于SYN_RECV状态,客户端处于SYN_SENT。

我的解释是服务器已使用SYN,ACK响应客户端的SYN,但此数据包已丢失。握手中断,套接字连接处于不完整状态,我看到客户端在20-45秒后超时。

我的问题是,TCP是否为服务器提供了一种方法,可以在一段时间后重新发送SYN,ACK?这是一个好主意还是坏主意?

更多系统细节如果相关:两端RHEL5,ssh成功,ping丢失100%,traceroute成功。客户端建立在OpenOrb(Java)上,服务器是Mico(C ++)。

1 个答案:

答案 0 :(得分:2)

SYN和FIN标志被认为是序列空间的一部分并且可靠地传输(因此,您的直接问题的答案是“是的,默认情况下确实如此”)。

但是,我认为你真的想深入挖掘一下,因为:

如果Intranet上的主机上存在大量失败的连接,则表明网络中存在问题 - 通常情况下,如果存在这些状态中存在的低连接(如果有),则应该这样。重新传输意味着您的连接将打嗝2,4,8,...秒(虽然没有必要 - 取决于TCP堆栈。但对用户来说没有什么好处。)

我建议在两台主机上运行tcpdump或wireshark,并跟踪丢失数据包的位置 - 并修复它。

在旧硬件上,常见原因可能是路径中某些设备上的双工不匹配(错误地自动检测或硬编码不正确)。其他一些原因可能是驱动程序出现问题,或者电缆不良(不足以导致完全中断,但又足以造成定期停电)。