2011-11-01 152 views
3

我试图通过Java程序连接到远程主机:TCP连接建立

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

我得到以下异常:

java.net.ConnectException: Connection refused: connect 

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

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

是由于OS的TCP/IP堆栈?

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

+0

防火墙和java安全管理器已在连接的两端进行检查?这应该工作。我一直用这个没有问题。尝试ol重新启动? – jefflunt

+1

问题不在于为什么远程主机重置连接,而是为什么发送了3个SYN数据包。 –

+0

这可能是一个重试? http://stackoverflow.com/questions/1045964/how-to-view-change-socket-connection-timeout-on-linux –

回答

2

的SYN的重发可能是做符合RFC793

的TCP必须从被损坏的数据恢复,丢失,重复 或 由互联网通信系统按顺序发送。这个 是通过分配一个序列号给每个被发送的八位组,并且要求来自接收TCP的肯定确认(ACK)。如果在时间间隔 内未收到ACK,则重新发送数据。

它是有道理的,SYN将被重试,因为无论出于什么原因ACK都可能丢失。重传次数和超时时间取决于TCP实现而非Java。

+0

在短时间间隔(小于1秒)内发送了3个SYN数据包。从远程主机接收到三个数据包,其中包含ACK和RST标志。所以我认为原因不是数据包丢失或超时。 –

+0

确实有3个SYN数据包连续发送,或者您的计算机在发送另一个SYN之前是否等待ACK/RST数据包? –