【问题标题】:TCP connection establishmentTCP连接建立
【发布时间】:2011-11-01 18:02:41
【问题描述】:

我正在尝试通过 java 程序连接到远程主机:

socket = new java.net.Socket(host,port);     

我收到以下异常:

java.net.ConnectException: Connection refused: connect

跟踪我的电脑和远程主机之间的IP包,我看到我的电脑发送了3次SYN包,收到了3次[RST,ACK]包。

为什么我的电脑只建立了一个连接,却发送了三个 SYN 数据包?

是不是因为操作系统的 TCP/IP 堆栈?

还是因为Java实现了java.net.Socket类?

【问题讨论】:

  • 防火墙和java安全管理器已经在连接两端检查了?这应该有效。我一直使用这个没有问题。试试老重启?
  • 问题不是为什么要远程主机重置连接,而是为什么要发送 3 个 SYN 数据包。
  • 我认为是重试,但我想了解它是关于 tcp/ip 堆栈实现还是 Socket 类的 java 实现?
  • @ArtSpasky 它是 TCP 堆栈,而不是 Java。

标签: java tcp connection tcp-ip


【解决方案1】:

SYN的重传可能是为了遵守RFC793

TCP 必须从损坏、丢失、重复的数据中恢复, 或者 互联网通信系统无序交付。这 通过为每个八位字节分配一个序列号来实现 发送,并需要一个肯定的确认(ACK)从 接收 TCP。如果在超时时间内没有收到 ACK 间隔,数据重传。

重试 SYN 是有道理的,因为无论出于何种原因,ACK 都可能丢失。重传的次数和超时取决于 TCP 实现而不是 Java。

【讨论】:

  • 在短时间间隔内(不到一秒)发送了 3 个 SYN 数据包。从远程主机收到了三个带有 ACK 和 RST 标志的数据包。所以我认为原因不是丢包或超时。
  • 连续发送了 3 个 SYN 数据包,还是您的计算机在发送另一个 SYN 之前等待了 ACK/RST 数据包?
猜你喜欢
  • 2012-11-11
  • 2014-08-30
  • 1970-01-01
  • 2016-10-26
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 2015-05-25
相关资源
最近更新 更多