3

Java プログラムを介してリモート ホストに接続しようとしています。

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

次の例外が発生します。

java.net.ConnectException: Connection refused: connect

私のコンピュータとリモート ホストの間の IP パケットを追跡すると、私のコンピュータが SYN パケットを 3 回送信し、[RST,ACK] パケットを 3 回受信したことがわかります。

接続が 1 つしか確立されていないにもかかわらず、コンピューターが 3 つの SYN パケットを送信するのはなぜですか?

OSのTCP/IPスタックが原因でしょうか?

それとも、Java のjava.net.Socketクラスの実装によるものですか?

4

1 に答える 1

2

SYN の再送信は、おそらくRFC793に準拠するために行われます。

TCP は、インターネット通信システムによって破損、紛失、複製、または順不同で配信されたデータから回復する必要があります。これは、送信される各オクテットにシーケンス番号を割り当て、受信 TCP からの肯定応答 (ACK) を要求することによって実現されます。ACK がタイムアウト間隔内に受信されない場合、データは再送信されます。

何らかの理由で ACK が失われた可能性があるため、SYN​​ が再試行されることは理にかなっています。再送信される回数とタイムアウトは、Java ではなく TCP 実装に依存します。

于 2011-11-01T21:49:13.703 に答える