TCP连接建立

3

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

防火墙和Java安全管理器已在连接的两端进行了检查吗?这应该可以工作。我经常使用它而没有问题。尝试重新启动电脑? - jefflunt
1
问题不在于远程主机重置连接,而在于为什么发送了3个SYN数据包。 - Art Spasky
这可能是重试吗?https://dev59.com/dnNA5IYBdhLWcg3wNrEy - James Jithin
我认为这是重试,但我想了解它是否涉及TCP/IP堆栈实现或Socket类的Java实现? - Art Spasky
@ArtSpasky 这是TCP协议栈,不是Java。 - user207421
1个回答

2
SYN的重新传输可能是为了遵守RFC793的规定:
TCP必须从因互联网通信系统损坏、丢失、重复或乱序传递而产生的数据中恢复。这通过为每个传输的八位字节分配一个序列号,并要求接收TCP发送积极确认(ACK)来实现。如果在超时间隔内未收到ACK,则会重新传输数据。
SYN被重试是有道理的,因为有可能由于某种原因ACK丢失了。重试次数和超时时间取决于TCP实现而不是Java。

在短时间内(不到一秒钟)发送了3个SYN数据包。来自远程主机的三个数据包带有ACK和RST标志。因此,我认为原因不是数据包丢失或超时。 - Art Spasky
你的计算机是连续发送了3个SYN数据包,还是在发送另一个SYN之前等待了ACK/RST数据包? - Dan O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接