2011-11-01 200 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數據包? –