2011-06-17 25 views
0

我看到内部网上两台主机之间连接失败(称为客户端和服务器)。TCP在传输中丢失时可以重新传输握手吗?

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

我的理解是服务器已经用SYN,ACK响应客户端的SYN,但是这个数据包已经丢失。握手中断,套接字连接处于未完成状态,并在20-45秒后看到客户端超时。

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

更多有关系统详情:两端RHEL5,ssh成功,ping失败100%,traceroute成功。客户端建立在OpenOrb(Java)上,服务器是Mico(C++)。

回答

2

SYN和FIN标志被认为是序列空间的一部分,并且可靠地传输(所以,对你的直接问题的答案是“是的,它默认是这样”)。

不过,我觉得你真的要挖一个深一点,因为:

如果你有大量的Intranet上的主机连接失败的,这点在网络中的问题 - 通常你应该有一个低的,如果有的话,在这些状态下停留的连接。重传将意味着你的连接会打嗝2,4,8,..秒(虽然不是必须的 - 取决于TCP堆栈,但对用户来说没有什么好处)。

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

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