3

我正在尝试通过 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类的实现?

4

1 回答 1

2

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

TCP 必须从 Internet 通信系统损坏、丢失、复制或乱序传送的数据中恢复。这是通过为每个传输的八位字节分配一个序列号来实现的,并且需要来自接收 TCP 的肯定确认 (ACK)。如果在超时间隔内没有收到 ACK,则重新传输数据。

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

于 2011-11-01T21:49:13.703 回答