【问题标题】:Can TCP re-transmit a handshake when it’s lost in transport?TCP在传输过程中丢失时可以重新传输握手吗?
【发布时间】:2011-06-17 15:19:24
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: tcp


    【解决方案1】:

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

    但是,我认为您确实想深入挖掘一下,因为:

    如果您在 Intranet 上的主机上有大量失败的连接,则表明网络存在问题 - 通常您应该有少量连接(如果有的话)卡在这些状态。重新传输意味着您的连接会中断 2,4,8,.. 秒(虽然不是必需的 - 取决于 TCP 堆栈。但对用户来说没什么好看的)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 2011-05-14
      相关资源
      最近更新 更多