質問者
TCPの接続タイムアウトの21秒について

質問
-
TCPの接続タイムアウトは21秒とのことですが、辻褄が合わないところがあり質問いたします。
調べたかぎりでは、TCP/IPの接続タイムアウトは21秒で内訳(3秒+6秒+12秒。初期3秒、リトライ回数2回、リトライ時は前回の2倍待ち)とのことですが、これは再転送回数設定のレジストリ「TcpMaxDataRetransmissions」が 3回なら分かるのですが、デフォルトは5回なので93秒になるはずです。
下記サイトでは、再転送回数5回でも約21秒(20.837)ですが、それはラウンド・トリップ・タイム(RTT)が自動調整により 3秒ではなく0.338(秒)になったからです。
Windows における TCP の再送機能を確認する
http://d.hatena.ne.jp/incarose86/20121222/1356193183
Window XP時代はデフォルト3回だったなら理屈は通るのですが、VISTA以降でも接続タイムアウトが21秒との幾つかのネット記事が散見されます。
例 IPv6 端末 OS におけるIPv6 対応・IPv6 機能活用ガイドライン
http://www.v6pc.jp/pdf/v6TermOs_2006Guideline-0.pdf
RTTが初期3秒の時は3回で、自動調整された場合はTcpMaxDataRetransmissionsの値が使用されるってことになっているのではないかと推測するのですが、どうなのでしょうか。2018年2月9日 7:22
すべての返信
-
チャブーンです。
その質問への答えですが、したに答えがあると思います。
----
Note In Windows 7 and Windows Server 2008 R2, the TCP maximum SYN retransmission value is set to 2, and is not configurable. Because of the 3-second limit of the initial time-out value, the TCP three-way handshake is limited to a 21-second timeframe (3 seconds + 2*3 seconds + 4*3 seconds = 21 seconds).
----ちなみにうえの修正プログラムは"MaxSynRetransmissions"が2秒固定だったのが、netshで変更が可能になった、ということのようです。
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
2018年2月9日 8:02 -
チャブーンさんの回答に補足。
- TcpMaxDataRetransmissions は "how many times TCP retransmits an unacknowledged data segment on an existing connection." で、TCP コネクション確立後のデータ セグメントのリトライ回数
- TcpMaxConnectRetransmissions は "how many times TCP retransmits an unanswered request for a new connection. " で、TCP コネクション確立時(3 way handshake) のリトライ回数
ですね。
かつ https://support.microsoft.com/ja-jp/help/2786464/ に書かれているように "The TcpMaxConnectRetransmissions registry entry is not available in Windows Vista, Windows Server 2008, Windows 7 , Windows Server 2008 R2, or any later version of Windows." かつ "In Windows 7 and Windows Server 2008 R2, the TCP maximum SYN retransmission value is set to 2, and is not configurable." なので,『(3秒+6秒+12秒。初期3秒、リトライ回数2回、リトライ時は前回の2倍待ち)』という動作になります。
hebikuzure
2018年2月9日 10:29 -
チャブーンさん、hebikuzureさん回答ありがとうございます。
自分が勘違いしていることがありました。
再転送回数がTcpMaxDataRetransmissions(5回)で、1再転送内にリトライ回数(TcpMaxConnectRetransmissions)があると思ってました。
1*3秒 3秒
1*2回*3秒 6秒
2*2回*3秒 12秒
3*2回*3秒 18秒
4*2回*3秒 24秒
5*2回*3秒 30秒
93秒
実際は、再転送回数TcpMaxDataRetransmissionsは別物で、リトライ回数(TcpMaxConnectRetransmissions)になるということですね。
1*3 seconds 0回目 3秒
2*3 seconds 1回目 6秒
4*3 seconds 2回目 12秒
21秒
WindowsXP
リトライ回数はデフォルト2回で、TcpMaxConnectRetransmissionsで変更可能
Windows Vista、7以降
リトライ回数はデフォルト2回で、TcpMaxConnectRetransmissionsは廃止で、netshで変更可能
では、TcpMaxDataRetransmissionsって何だろう? こんがらがってきた。
Windows における TCP の再送機能を確認する
http://d.hatena.ne.jp/incarose86/20121222/1356193183
TCPウィンドウ制御関連の何かでしょうか。
https://mio.yokohama/?p=2502018年2月9日 12:46 -
に書かれている内容によれば、TCP コネクションの中の特定のデータ セグメントに対して ACK が返らない場合の再送回数、のようですね。
"Determines how many times TCP retransmits an unacknowledged data segment on an existing connection. TCP retransmits data segments until they are acknowledged or until this value expires."
「既存のコネクション中で、acknowledged されない(unacknowledged)データに対して何回再送するか指定します。TCP はデータ セグメントを、acknowledged されるかまたはこの値の上限に達するまで再送します。」
hebikuzure
2018年2月9日 14:21 -
hebikuzureさん回答ありがとうございます。
TcpMaxDataRetransmissionsで検索して下記サイトをみました。
http://milestone-of-se.nesuke.com/nw-basic/tcp-udp/tcp-reliability/
再送タイマのタイムアウト時間は3秒にセットされていて、1パケットだけサンプリングされます。
1パケットすら繋がらない時は、21秒で内訳(3秒+6秒+12秒。初期3秒、リトライ回数2回、リトライ時は前回の2倍待ち)になる。
1パケットでサンプリングされた後は、3秒ではなく例えば0.338(秒)に更新される。
その際に再送する回数がTcpMaxDataRetransmissionsの設定した値である。
この理屈なら納得できそうです。間違っていたらすみません。
- 編集済み やじゅ 2018年2月10日 2:31
2018年2月10日 2:31