web-dev-qa-db-ja.com

TCP Socket no connection timeout

TCPソケットを開き、ネットワーク上の別のソケットに接続します。その後、データを正常に送受信できます。毎秒ソケットに何かを送信するタイマーがあります。

次に、強制的に接続を失い(この場合はイーサネットケーブルを抜いて)、接続を無作法に中断します。私のソケットは、毎秒正常にデータを書き込むことを報告しています。これは約1時間30分間続き、最終的に書き込みエラーが発生します。

ソケットが最終的にもう一方の端を受け入れるこのタイムアウトが指定されていないのはなぜですか? OS(Ubuntu 11.04)ですか、TCP/IP仕様のものですか、それともソケット構成オプションですか?

40
oggmonster

ネットワークケーブルを引っ張っても、通信は中断されますが、TCP connection(1))は壊れません。ケーブルを再び接続し、IP接続が確立されると、すべてのバックデータが移動します。 TCP=セルラーネットワークでも信頼できるようにするものです。

TCPがデータを送信する場合、応答でACKを期待します。一定の時間内に何も来ない場合、データを再送信して再び待機します。送信と送信の間の待機時間は一般に指数関数的に増加します.

ACKを使用しない再送信回数または合計時間の後、TCPは接続が「壊れた」と見なします。回数と時間はOSとその構成に依存しますが、通常は-数分で終了します。

Linuxの tcp.7 manページ から:

   tcp_retries2 (integer; default: 15; since Linux 2.2)
          The maximum number of times a TCP packet is retransmitted in
          established state before giving up.  The default value is 15, which
          corresponds to a duration of approximately between 13 to 30 minutes,
          depending on the retransmission timeout.  The RFC 1122 specified
          minimum limit of 100 seconds is typically deemed too short.

これはおそらく、接続が消失したかどうかを検出するのにかかる時間を変更するために調整する値です。

(1)これには例外があります。オペレーティングシステムは、ケーブルが取り外されたことを認識すると、すべての接続が「壊れた」と見なされる必要があることを上位層に通知できます。

67
Brian White