TCP连接建立

发布于 2024-12-13 12:32:52 字数 472 浏览 2 评论 0原文

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

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

我收到以下异常:

java.net.ConnectException: Connection refused: connect

跟踪我的计算机和远程主机之间的IP数据包,我看到我的计算机发送了三次SYN数据包,并收到了[RST,ACK]包三遍。

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

是由于操作系统的 TCP/IP 堆栈造成的吗?

或者是由于 Java 的 java.net.Socket 实现 类?

I am trying to connect to a remote host via the java program:

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

I am getting the following exception:

java.net.ConnectException: Connection refused: connect

Tracing IP packets between my computer and the remote host, I see that my computer sent SYN packets three times, and received [RST,ACK] packets three times .

Why does my computer send three SYN packets despite only one connection establishent?

Is it due to the TCP/IP stack of the OS?

Or is it due to Java's implementation of java.net.Socket class?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

失去的东西太少 2024-12-20 12:32:52

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

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

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

The retransmission of the SYN is probably done to comply with RFC793 :

The TCP must recover from data that is damaged, lost, duplicated,
or
delivered out of order by the internet communication system. This
is achieved by assigning a sequence number to each octet
transmitted, and requiring a positive acknowledgment (ACK) from the
receiving TCP. If the ACK is not received within a timeout
interval, the data is retransmitted.

It makes sense that the SYN would be retried since it's possible that for whatever reason the ACK just got lost. The number of times that that's retransmitted and the timeout would depend on the TCP implementation not Java.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文