私の会社が生産するデバイスからの信号を受信するネットワークサーバーで問題が発生しました。デバイスは、たまに使用した送信元ポートを再利用することがあります。これにより、サーバーによって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);
を、クライアントソケットが受信した後、次のように設定しています:私は、次のオプションを使用していますサーバソケット上で
私は真と偽の両方としてSO_LINGERを試してみました
Socket client = server.accept();
client.setKeepAlive(false);
client.setSoLinger(true, 0);
client.setReuseAddress(true);
client.setTcpNoDelay(true);
client.setSoTimeout(CLIENT_READ_TIMEOUT);
を、まったく同じトレース結果となります。 CLIENT_READ_TIMEOUTは10秒に設定されます。