Linux でのタイムアウトと再送信時間 (RTO) の実装に関する研究
最近、チェックする必要があるネットワーク タイムアウトの問題があります。大まかに図に従って確認します
1。問題、TCP 関連の問題の可能性、バグ、カーネル パラメーター、その他の問題。
2. KVM の問題をトラブルシューティングすると、同じホスト上の別の KVM でタイムアウトの問題が再発しました。
異常な接続継続時間のほとんどは 1 秒程度であることがわかります。パケット キャプチャ分析により、パケットのこの部分が再送信されており、再送信時間は 1 秒に固定されていることがわかります。
ここでの再送信時間はなぜ 1 秒ですか? 関連する規格と実際の実装は何ですか?
この記事では主にこの部分について説明します (centos 2.6.32-358 に基づいています)
RFC 標準
再送時間 (RTO) は現在のネットワーク状態 (RTT) によって決定され、次に基づいていますアルゴリズムが判断します。この部分の関連内容は『TCP/IP詳解 第1巻』に記載されていますが、古いものです。
RFCにアクセスして確認してください。再送信タイムアウトに関する最新のものはRFC1122を更新し、RFC2988を廃止しました
興味がある場合は、クリックして読んでください
。
1はRTOを繰り返します 基本的な計算方法:
最初にクロックによって取得される時間パラメータRTO_MINがあります
初期化:
最初の計算:
後の計算:
RTO の最小値は 1 秒であることが推奨され、最大値は 60 秒より大きくなければなりません
2 同じパケットを複数回再送信する場合は、Karn アルゴリズムを使用する必要があります。これは、先ほど見た 2 倍の増加です
さらに、タイムスタンプ パラメーターが有効になっていない限り、RTT サンプリングでは再送信されたパケットを使用できません (RTT を正確に計算するには、このパラメーターを使用します)
3 4*RTTVAR が 0 になる傾向がある場合、取得される値は次のようになります。 RTO_MIN 時間に近い
経験上、時計が正確であればあるほど、最良の誤差は 100ms 以内です
4 RTO タイマー管理
(1) データを送信 (再送信を含む)、タイマーが有効かどうかを確認します。が開始されます。開始されていない場合は開始します。データのACK受信時にタイマーを削除
(2) バックオフにはRTO = RTO * 2を使用
(3) 新しいFALLBACK機能: SYNメッセージの待機中にタイマーが期限切れになった場合、現在のTCPが実装されている場合3 秒未満の RTO を使用する場合、接続ペアの RTO を 3 秒にリセットする必要があります。リセットされた RTO は、正式なデータ送信 (つまり、3 ウェイ ハンドシェイクの完了後) に使用されます。 Linux の実際の実装 スリーウェイ ハンドシェイクによって送信された syn パケットをキャプチャして分析します
123456
01:00:00.129688 IP 172.16.3.14.1868 > 172.16.10.40.80: Flags [S], seq 377407 9837、win 14600、オプション [mss 1460,nop,nop,sackOK,nop,wscale 7]、長さ 001:00:01.129065 IP 172.16.3.14.1868 > 172.16.10.40.80: フラグ [S]、シーケンス 3774079 837 、勝利 14600、オプション [mss 1460,nop,nop,sackOK,nop,wscale 7]、長さ 001:00:03.129063 IP 172.16.3.14.1868 > 172.16.10.40.80: フラグ [S]、シーケンス 3774079837、勝利14600、オプション [mss 1460 ,nop,nop,sackOK,nop,wscale 7]、長さ 001:00:07.129074 IP 172.16.3.14.1868 > 172.16.10.40.80: フラグ [S]、シーケンス 3774079837、win 14600、オプション [mss 1460,nop ,nop,sackOK,nop,wscale 7]、長さ 001:00:15.129072 IP 172.16.3.14.1868 > 172.16.10.40.80: フラグ [S]、シーケンス 3774079837、win 14600、オプション [ MSS 1460、NOP、NOP、Sackok、Nop、Wscale 7]、長さ001:00:31.129128 IP 172.16.3.14.1868> ,nop,nop,sackOK ,nop,wscale 7]、長さ 0
1 秒から 2 倍増加します
5 回目のタイムアウトの後は、6 回目 (合計 63 秒) まで上位層に接続タイムアウトが通知されないことに注意してください
スリーウェイ ハンドシェイク syncak パケットが送信されます
1234567 |
01:17:20.084839 IP 172.16.3.15.2535 > 172.16.3.14.80: フラグ [S]、シーケンス 1297135388、win 14600、オプション [mss] 1460、いいえ、いいえ、サックOK ,nop,wscale 7]、長さ 001:17:20.084908 IP 172.16.3.14.80 > 172.16.3.15.2535: フラグ [S.]、シーケンス 1194120443、ack 1297135389、win 14600、オプション [mss 1460,nop,いや、sackOK、nop、w スケール 7 ]、長さ 001:17:21.284093 IP 172.16.3.14.80 > 172.16.3.15.2535: フラグ [S.]、シーケンス 1194120443、ack 1297135389、win 14600、オプション [mss 146] 0、 NOP、NOP、SACKOK、NOP、WSCALE 7]、長さ001:17:23.284088 IP 172.16.3.14.80> 1460,nop,nop,sack OK, nop,wscale 7]、長さ 001:17:27.284095 IP 172.16.3.14.80 > 172.16.3.15.2535: フラグ [S.]、シーケンス 1194120443、ack 1297135389、win 14600 、オプション[MSS 1460、NOP、NOP、SACKOK、NOP、WSCALE 7]、長さ001:17:35.284097 IP 172.16.3.14.80> 14600、オプション [mss 1460,nop 、nop、sackOK、nop、wscale 7]、長さ 001:17:51.284093 IP 172.16.3.14.80 > 172.16.3.15.2535: フラグ [S.]、シーケンス 1194120443、ack 129713 5389 、win 14600、オプション [mss 146 0、nop、nop、sackOK、nop、wscale 7]、長さ 0 |
1秒から2倍通常のパケット送信
123456789101112131415 16
01:32 :20. 443757 IP 172.16.3.15 .2548 > 172.16.3.14.80: フラグ [P.]、シーケンス 3319667389:3319667400、ack 1233846614、win 115、長さ 1101:32:20.644600 IP 172.16.3.15.2548 > 172 .16.3.14.80: フラグ [P .]、seq 3319667389:3319667400、ack 1233846614、win 115、長さ 1101:32:21.046579 IP 172.16.3.15.2548 > 172.16.3.14.80:フラグ [P.]、配列番号 3319667 389:3319667400、ack 1233846614、win 115、長さ 1101:32:21.850632 IP 172.16.3.15.2548 > 172.16.3.14.80: フラグ [P.]、シーケンス 3319667389:33196674 00、ack 1233846614、win 115、長さ 1101: 32:23 .458555 IP 172.16.3.15.2548 > 172.16.3.14.80: フラグ [P.]、シーケンス 3319667389:3319667400、ack 1233846614、win 115、長さ 1101:32:26.674594 IP 172.16.3.15.2548 > 172.16.3. 14.80: フラグ [P.] 、シーケンス 3319667389:3319667400、ack 1233846614、win 115、長さ 1101:32:33.106601 IP 172.16.3.15.2548 > 172.16.3.1 4.80: フラグ [P.]、シーケンス331966738 9:3319667400、ack 1233846614、win 115、長さ 1101:32:45.970567 IP 172.16.3.15.2548 > 172.16.3.14.80: フラグ [P.]、シーケンス 3319667389:3 319667400、ack 1233846614、win 115、長さ 1101 :33:11.69 8415 IP 172.16.3.15.2548 > 172.16.3.14.80: フラグ [P.]、シーケンス 3319667389:3319667400、ack 1233846614、win 115、長さ 1101:34:03.15430 0 IP 172.16.3.15.2548 > 172.16.3.14.8 0: フラグ [P.]、seq 3319667389:3319667400、ack 1233846614、win 115、長さ 1101:35:46.065892 IP 172.16.3.15.2548 > 172.16.3.14。 80: フラッグ[P.]、シーケンス 3319667389:33 19667400、ACK 1233846614、勝利 115、長さ 1101: 37:46.065382 IP 172.16.3.15.2548 > 172.16.3.14.80: フラグ [P.]、シーケンス 331966738 9:3319667400、ack 1233846614、win 115、長さ1101:39:46.064917 IP 172.16.3.15.2548 > 172.16: フラグ [P.]、シーケンス 3319667389:3319667400、ack 1233846614、win 115、長さ 1101:41:46。 064466 IP 172.16.3.15.2548 > 172.16.3.14.80: フラグ [P. ]、シーケンス 3319667389: 3319667400、ack 1233846614、長さ 1101:43:46.064060 IP 172.16.3.15.2548 > 172.16.3.1 4.80: フラグ [P.]、シーケンス3319667389:3319667400、ack 1233846614、win 115、長さ 1101:45: 46.063675 IP 172.16.3.15.2548 > 172.16.3.14.80: フラグ [P.]、シーケンス 3319667389:3 319667400、ack 1233846614、win 115、length 11 | |
0.2 秒から最大 120 秒まで 2 倍の増分、合計 15 回
32 分から開始して 47 分で終了することに注目してください。つまり、約 15 分 25 秒です
Linux はフォールバック機能? 簡単なテスト
123456789101112131415161718192021222324252627282930 |
サーバーが iptables を開いた後、クライアントはサーバーに接続し、5 タイムアウト以内に iptables を閉じます23:35:0 1.036565 IP 172.16.3.14.6071 > 172.16.10.40.12345:フラグ [S ]、シーケンス 2364912154、win 14600、オプション [mss 1460,nop,nop,sackOK,nop,wscale 7]、長さ 023:35:02.036152 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [ S]、シーケンス 2364912154、win 14600、オプション [mss 1460,nop,nop,sackOK,nop,wscale 7]、長さ 023:35:04.036126 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [S] 、シーケンス 236 4912154 、勝利 14600、オプション [mss 1460,nop,nop,sackOK,nop,wscale 7]、長さ 023:35:08.036127 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [S]、シーケンス 2364912154、勝利 14600、オプション [mss 1460,nop,nop,sackOK,nop,wscale 7]、長さ 023:35:16.036131 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [S]、シーケンス 236 4912154 、勝利 14600 、オプション [mss 1460,nop,nop,sackOK,nop,wscale 7]、長さ 023:35:16.036842 IP 172.16.10.40.12345 > 172.16.3.14.6071: フラグ [S.]、シーケンス 3634006739、 ack 2364912155、win 14600、オプション [mss 1460]、長さ 023:35:16.036896 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [.]、ack 3634006740、win 14600、長さ0 その後、サーバーが回転した後、 iptables では、クライアントはデータ パケットを送信します。iptables23:35:48.129273 IP 172.16.3.14.6071 > 172.16.10.40.12345: Flags [P.]、seq 2364912155:2364912156、ack 3634006740、win 146 00、長さ 123: 35: 51.129120 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [P.]、シーケンス 2364912155:2364912156、ack 3634006740、勝利 14600、長さ 123:35:57.1 2907 0 IP 172.16.3.14.6071 > 172.16 .10.40。12345: フラグ [P.]、seq 2364912155:2364912156、ack 3634006740、win 14600、長さ 123:36:09.129068 IP 172.16.3.14.6071 > 172.16.10.40 .12345: フラグ [P.]、シーケンス 2364912155 :2364912156、ack 3634006740、win 14600、長さ 123:36:09.129802 IP 172.16.10.40.12345 > 172.16.3.14.6071: Flags [.]、ack 2364912156、win 14600、長さ 0 サーバーが iptables を開いていない場合、クライアントはデータ パケット 23:36:15.217231 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [P.]、シーケンス 2364912156:2364912157、ack 3634006740、win 14600、長さ 123 を送信します。 36:15 .217766 IP 172.16 .10.40.12345> 172.16.3.14.6071: フラグ [.]、ACK 2364912157、Win 14600、長さ 0 が iptables を開き続け、クライアントがデータ パケットを送信 23:36:26.658172 ip 172.16.3.6071 & gt; .16.40.12345 : フラグ [P .]、seq 2364912157:2364912158、ack 3634006740、win 14600、長さ 123:36:26.859055 IP 172.16.3.14.6071 > フラグ [P.] 、シーケンス 23 64912157:2364912158、 ack 3634006740、win 14600、長さ 123:36:27.261065 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [P.]、シーケンス 2364912157:2364912158、ack 36340 06740、勝利 14600、長さ 123:3 6:28.065106 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [P.]、seq 2364912157:2364912158、ack 3634006740、win 14600、長さ 123:36:29.673132 IP 172.16。 3.14.6071 > 172.16.10.40.12345 : フラグ [P.] 、seq 2364912157:2364912158、ack 3634006740、win 14600、長さ 123:36:32.889068 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [P.] 、シーケンス 2364 912157:2364912158、 ack 3634006740、win 14600、長さ 123:36:39.321091 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [P.]、シーケンス 2364912157:2364912158、ack 363400 6740、勝利 14600、長さ 123:36:5 2.185135 IP 172.16.3.14.6071 > 172.16.10.40.12345: フラグ [P.]、seq 2364912157:2364912158、ack 3634006740、win 14600、長さ 123:37:17.913091 IP 172.16。 3.14.6071 > 172.16.1 0.40。 12345: Flags [P.]、seq 2364912157:2364912158、ack 3634006740、win 14600、length 1 |
このテストから、スリーウェイ ハンドシェイク中に RTT が 1 秒を超えた場合、データ送信フェーズの RTO は 3 秒であることがわかります (サーバー側の SYNACK タイムアウトについても同様です)
その後通常の RTT では、RTO は約 200 ミリ秒に収束します
タイムスタンプのサポートを見てみましょう
1234567891011121314151617 |
サーバーが iptables を開いた後、クライアントはサーバーに接続し、内部で iptables を閉じます。 5 タイムアウト23:47: 47.754316 IP 172.1 6.3.14.8603 > 172.16.10.40 .12345: フラグ [S]、シーケンス 479022248、win 14600、オプション [mss 1460、sackOK、TS val 2336007392 ecr 0、nop、wscale 7] ]、長さ 023:47:48.754079 IP 172.16.3.14.8603 > 172.1 6.10.40 .12345: フラグ [S]、シーケンス 479022248、win 14600、オプション [mss 1460、sackOK、TS val 2336008392 ecr 0、nop、wscale 7]、長さ 023:47 : 50.754088 IP 172.16.3.14.8603 > 172.1 6.10.40 .12345: フラグ [S]、シーケンス 479022248、win 14600、オプション [mss 1460、sackOK、TS val 2336010392 ecr 0、nop、wscale 7] ]、長さ023:47 :54.754083 IP 172.16.3.14.8603 > 172.1 6.10.40 .12345: フラグ [S]、シーケンス 479022248、win 14600、オプション [mss 1460、sackOK、TS val 2336014392 ecr 0、nop、wscale 7]、長さ023: 48:02.754094 IP 172.16.3.14.8603 > 172.1 6.10.40 .12345: フラグ [S]、シーケンス 479022248、win 14600、オプション [mss 1460、sackOK、TS val 2336022392 ecr 0、nop、wスケール 7]、長さ 023 :48:02.754683 IP 172.16.10.40.12345 > .16.3.14 .8603: フラグ [S.]、シーケンス 697602971、ack 479022249、win 14480、オプション [mss 1460、nop、nop、TS val 40446596] 41 ECR 2336022392]、長さ 023:48:02.754742 IP 172.16.3.1 4.8603 > 172.16.10.40.12345: フラグ [.]、ack 697602972、win 14600、オプション [nop、nop、TS val 2336022392 ecr 40446596] 41]、長さ 0 サーバーの電源が入った後iptables、クライアントはデータ パケットを送信し、15 タイムアウト以内に iptables を閉じます23: 48:11.944170 IP 172.16.3.14.8603 > 172.16.10.40.12345: Flags [P.]、seq 479022249:479022250、ack 697602 972、勝利 14600、オプション[nop,nop,TS val 23360 31582 ecr 4044659641]、長さ 123: 48:12.145036 IP 172.16.3.14.8603 > 172.16.10.40.12345: フラグ [P.]、シーケンス 479022249:47902 2250、ack 697602972、win 14600、オプション [nop、nop、TS val 23360 31783 ecr 4044659641]、長さ 123: 48:12.547084 IP 172.16.3.14.8603 > 172.16.10.40.12345: フラグ [P.]、シーケンス 479022249:4790 22250、ack 697602972、win 14600 、オプション [nop、nop、TS val 23360 32185 ecr 4044659641]、長さ 123: 48:13.351106 IP 172.16.3.14.8603 > 172.16.10.40.12345: フラグ [P.]、シーケンス 479022249:47 9022250、ack 697602972、勝利14600、オプション [nop、nop、TS val 23360 32989 ecr 4044659641]、長さ 123: 48:14.959080 IP 172.16.3.14.8603 > 172.16.10.40.12345: フラグ [P.]、シーケンス 4790222 49:479022250、ack 697602972、 win 14600、オプション [nop、nop、TS val 23360 34597 ecr 4044659641]、長さ 123: 48:18.175092 IP 172.16.3.14.8603 > 172.16.10.40.12345: フラグ [P.]、シーケンス 479022 249:479022250、確認応答 697602972 、勝利 14600、オプション [nop、nop、TS val 23360 37813 ecr 4044659641]、長さ 123: 48:24.607088 IP 172.16.3.14.8603 > 172.16.10.40.12345: フラグ [P.]、シーケンス 4790 22249:479022250、確認697602972、勝利 14600、オプション [nop,nop,TS val 23360 44245 ecr 4044659641]、長さ 1 |
タイムスタンプをオンにすると、RTO を 3 秒にリセットする FALLBACK メカニズムが機能しなくなることがわかります
Linux での RTO 計算の微調整
Linux での RTO 計算の実際の実装は、依然として RFC とは異なりますドキュメント はい、RFC ドキュメントに従って画像を検索するだけだと、実際の RTO 推定で道を誤ることになります
1 前の段落によると、彼は RTO の最小値を 200ms に設定していることがわかります (たとえubuntu では 50 ミリ秒、RFC では 1 秒を推奨しています)、最大値は 120 秒に設定されています (RFC では 60 秒以上が強制されています)
2 Linux コードの分析によると、RTT が激しくジッターすると、Linux 実装は大きく変化するRTTの干渉を軽減し、RTOを改善 トレンドチャートがより滑らかになります
これは、2つの微調整に反映されます:
微調整1
以下の条件を満たす場合
これは、R'の変動が大きすぎることを意味しており、平滑化されたRTT値と比較すると、RTTVAR
よりも差が大きいことが分かります
そして、RFCドキュメントは
と比較するとわかります。 RFC ドキュメントでは、平滑化係数は 1/8 倍されます。これは、RTTVAR に対する R' の影響が軽減され、RTTVAR がよりスムーズになり、RTO もよりスムーズになります
微調整 2
RTTVAR が減少すると、RTTVAR RTO が下がりすぎて急な傾向グラフを引き起こさないように平滑化されます
ここで、RTTVAR' は、RTT に基づいて計算された現在の値を指します。この値は、下限 (RTO_MIN) を制限し、前回の RTT の RTTVAR と比較して、減少が見つかった場合は 1/4 係数を使用して平滑化します RTO が増加しても問題ないためだと思います。減少が大きい場合、スプリアス再送信が発生する可能性があります (この用語の詳細については、上記の RFC を参照してください) 文書)
人間の介入によって RTO を変更する方法 元の質問に戻り、RTO の値を短縮できるかどうか、そして、実際の Linux 実装に基づいてこの RTO 値を見積もる方法 当然ですが、RTO (FALLBACK を含む) の初期値は変更できません、この部分はコードに記述されています そして 3 つ以外の RTO 値-way ハンドシェイクは推定可能です 推定時にネットワークが安定していると仮定すると、RTT が R になることはありません (そうでない場合は 1 と 2 を微調整するため、非常に複雑になります) その場合、SRTT は常に R、RTTVAR は R になります。常に 0.5R )それ以外の場合は そのため、RTO_MIN の値を変更するだけで RTO の値に大きな影響を与える可能性があります RTO_MIN の設定 RTO_MIN の設定は、 12345678910111213 | を達成するための IP ルートに基づいています。 [root@ localhost.localdomain ~]# ping www.baidu.comPING www.a.shifen.com (180.97.33.107) 56(84) バイトのデータ。180.97.33.107 からの 64 バイト: icmp_seq=1 ttl=51 time=30.8 ms64 バイトfrom 180.97.33.107: icmp_seq=2 ttl=51 time=29.9 ms Baidu の IP を取得後 [root@localhost.localdomain ~]# ip Route add 180.97.33.108 /32 via 172.16.3.1 rto_min 20[root@localhost.localdomain ~] # nc www.baidu.com 80[root@localhost.localdomain ~]# ss -eipn '( dport =:www )'State Recv-Q Send-Q Local Address:Port Peer Address:PortESTAB 0 0 172.16.3.14:14149 180.97.33.108:80 ユーザー:(("nc",7162,3)) ino:48057454 sk:ffff88023905adc0sack cubic wscale:7,7 rto:81 rtt :27/13.5 cwnd:10 send 4.3Mbps rcv_space:14600 |
RTO_MIN < 2R であるため、RTO = 3R = 27 * 3 = 81 です イントラネットの場合、RTT は非常に小さいです 1234567 | [root@localhost.localdomain ~]# ip Route add 172.16 3.16/32 (172.16.3.1 経由) rto_min 20[root@localhost.localdomain ~]# nc 172.16.3.16 22SSH-2.0-OpenSSH_5.3[root@localhost.localdomain ~]# ss -eipn '( dport =:22 )'状態 Recv-Q Send-Q ローカル アドレス:ポート ピア アドレス:PortESTAB 0 0 172.16.3.14:57578 172.16.3.16:22 users:(("nc",7272,3)) ino:48059707 sk:ffff88023b7c7000sack cubic wscale:7 , 7 rto:21 rtt:1/0.5 ato:40 cwnd:10 send 116.8Mbps rcv_space:14600 |
RTO_MIN > 2Rなので、RTO = R + RTO_MIN = 1 + 20 = 21 ネットワーク全体に自信がある場合は、次のように、ターゲット IP を設定せずに、すべての接続に直接適用することもできます 1 | ip Route change dev eth0 rto_min 20ms |
概要1 Linux タイムアウト リセット 送信の実装は一般に RFC を参照しますが、いくつかの微調整があります: RFC には RTO 初期値が 1 つだけあり、それは 1 秒です。 Linux 実装では、スリーウェイ ハンドシェイク フェーズのパケットの RTO が 1 秒に設定され、残りのパケットの初期時間が 0.2 秒に設定されます。RFC で指定されているアルゴリズムが不完全であるため、Linux の実際の実装では鮮明さが低下します。重大な RTT ジッターの場合の RTT の変化。RTT 干渉の変更により、RTO トレンド グラフがより滑らかになります 2 接続の SYN 再送信時間はカーネルを再コンパイルしない限り調整できませんが、プッシュ パケットの再送信時間は調整できます。調整済み 3 比較 安定したネットワークでは、rto セットの最小値は RTO_MIN であると想定されます
http://www.bkjia.com/PHPjc/1108029.html
www.bkjia.com本当http://www.bkjia.com/PHPjc/1108029.html技術記事 Linux でのタイムアウトおよび再送信時間 (RTO) の実装に関する研究。最近、ネットワーク タイムアウトの問題が発生しており、次の図に示す考えに従ってトラブルシューティングを行う必要があります。 1. コード ロジックの問題と、考えられる TCP 関連の問題を排除します。バグ...
|