我正在尝试通过java程序连接到远程主机:
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 :(得分:2)
可能需要重新传输SYN以符合RFC793:
TCP必须从损坏,丢失,重复的数据中恢复, 要么 由互联网通信系统发出故障。这个 通过为每个八位字节分配序列号来实现 发送,并要求来自的肯定确认(ACK) 接收TCP。如果在超时内未收到ACK interval,重传数据。
有意义的是,SYN会被重试,因为无论出于什么原因,ACK都可能丢失。重传的次数和超时时间取决于TCP实现而不是Java。