我遇到了接收來自我公司設備產生的信號的網絡服務器的問題。該設備偶爾會重複使用剛纔使用的源端口。這會導致服務器丟棄SYN。然後設備重試,直到舊的套接字不在服務器上的TIME_WAIT中。服務器然後SYN-ACK。Java網絡服務器和TIME_WAIT
服務器是用Java編寫的。不幸的是,修改設備以正確循環端口不是一種選擇,因爲現場有許多設備,更新現有設備不是一種選擇。舊軟件以C++編寫,並以某種方式從Windows TCP堆棧中的列表中刪除了TIME_WAIT端口。
任何人都可以提供任何關於如何在Windows上從Java規避TIME_WAIT的建議嗎?
編輯:我確實在Wireshark中確認設備正在重新使用最近使用的端口。
服務器套接字我使用下列選項:
socket = new ServerSocket();
socket.setPerformancePreferences(3, 2, 1);
socket.setReuseAddress(true);
socket.setSoTimeout(CLIENT_READ_TIMEOUT);
socket.bind(new InetSocketAddress(group.getPort()), MAX_TCP_BACKLOG);
而且客戶端套接字有以下設置接收後:
Socket client = server.accept();
client.setKeepAlive(false);
client.setSoLinger(true, 0);
client.setReuseAddress(true);
client.setTcpNoDelay(true);
client.setSoTimeout(CLIENT_READ_TIMEOUT);
我試圖SO_LINGER既是真與假,具有完全相同的跟蹤結果。 CLIENT_READ_TIMEOUT設置爲10秒。