メインコンテンツまでスキップ

5. Estimating the Round-Trip Time (往復時間の推定)

高レベルでは、エンドポイントはパケットが送信されてから確認応答されるまでの時間をRTTサンプル (RTT Sample) として測定します。エンドポイントは、RTTサンプルとピアが報告するホスト遅延 (Host Delays, [QUIC-TRANSPORT] のセクション13.2を参照) を使用して、ネットワークパスのRTTの統計的記述を生成します。エンドポイントは、各パスに対して次の3つの値を計算します:一定期間にわたる最小値 (min_rtt)、指数加重移動平均 (Exponentially Weighted Moving Average, smoothed_rtt)、および観測されたRTTサンプルにおける平均偏差 (Mean Deviation, 本文書の残りの部分では「変動量」variation と呼ばれる, rttvar)。

5.1. Generating RTT Samples (RTTサンプルの生成)

エンドポイントは、次の2つの条件を満たすACKフレームを受信したときにRTTサンプルを生成します:

  • 最大確認応答済みパケット番号 (Largest Acknowledged Packet Number) が新たに確認応答されている、かつ

  • 新たに確認応答されたパケットの少なくとも1つが確認応答誘発 (Ack-Eliciting) である。

RTTサンプル latest_rtt は、最大確認応答済みパケットが送信されてから経過した時間として生成されます:

latest_rtt = ack_time - send_time_of_largest_acked

RTTサンプルは、受信したACKフレーム内の最大確認応答済みパケットのみを使用して生成されます。これは、ピアがACKフレーム内の最大確認応答済みパケットに対してのみ確認応答遅延 (Acknowledgment Delays) を報告するためです。報告された確認応答遅延はRTTサンプル測定には使用されませんが、smoothed_rttとrttvarの後続計算でRTTサンプルを調整するために使用されます (セクション5.3)。

単一のパケットに対して複数のRTTサンプルを生成しないようにするため、ACKフレームが最大確認応答済みパケットを新たに確認応答しない場合、そのACKフレームはRTT推定の更新に使用すべきではありません (SHOULD NOT)。

少なくとも1つの確認応答誘発パケットを新たに確認応答しないACKフレームを受信した場合、RTTサンプルを生成してはなりません (MUST NOT)。ピアは通常、非確認応答誘発パケットのみを受信した場合、ACKフレームを送信しません。したがって、非確認応答誘発パケットの確認応答のみを含むACKフレームには、任意に大きなACK Delay値が含まれる可能性があります。このようなACKフレームを無視することで、後続のsmoothed_rttとrttvarの計算における複雑さを回避できます。

1つのRTT内で複数のACKフレームが受信された場合、送信者はRTTごとに複数のRTTサンプルを生成する可能性があります。[RFC6298] で提案されているように、これを行うとsmoothed_rttとrttvarに不十分な履歴が生じる可能性があります。RTT推定が十分な履歴を保持することを保証することは、未解決の研究課題です。

5.2. Estimating min_rtt (min_rttの推定)

min_rttは、送信者が特定のネットワークパスに対して一定期間にわたって観測した最小RTTの推定値です。本文書では、min_rttは損失検出によって不合理に小さいRTTサンプルを拒否するために使用されます。

min_rttは、最初のRTTサンプル時にlatest_rttに設定しなければなりません (MUST)。他のすべてのサンプルでは、min_rttmin_rttlatest_rtt (セクション5.1) の小さい方に設定しなければなりません (MUST)。

エンドポイントはmin_rttの計算においてローカルで観測された時間のみを使用し、ピアが報告する確認応答遅延を調整しません。そうすることで、エンドポイントは完全に観測したものに基づいてsmoothed_rttの下限を設定でき (セクション5.3を参照)、ピアによる誤った遅延報告による潜在的な過小評価を制限できます。

ネットワークパスのRTTは時間とともに変化する可能性があります。パスの実際のRTTが減少する場合、min_rttは最初の低いサンプルで即座に適応します。しかし、パスの実際のRTTが増加する場合、min_rttはそれに適応せず、新しいRTTよりも小さい将来のRTTサンプルがsmoothed_rttに含まれることを許可します。

エンドポイントは、永続的輻輳が確立された後、min_rttを最新のRTTサンプルに設定すべきです (SHOULD)。これにより、RTTが増加したときに永続的輻輳を繰り返し宣言することを回避できます。また、これにより、破壊的なネットワークイベントの後、接続がmin_rttsmoothed_rttの推定をリセットできます。セクション5.3を参照してください。

エンドポイントは、トラフィック量が少なく、低い確認応答遅延を持つ確認応答が受信された場合など、接続の他の時点でmin_rttを再確立してもかまいません (MAY)。実装はmin_rtt値を頻繁に更新すべきではありません (SHOULD NOT)。パスの実際の最小RTTは頻繁に観測できるものではないためです。

5.3. Estimating smoothed_rtt and rttvar (smoothed_rttとrttvarの推定)

smoothed_rttは、エンドポイントのRTTサンプルの指数加重移動平均であり、rttvarは平均変動量を使用してRTTサンプルの変動を推定します。

smoothed_rttの計算では、確認応答遅延を調整した後のRTTサンプルを使用します。これらの遅延は、[QUIC-TRANSPORT] のセクション19.3で説明されているように、ACKフレームのACK Delayフィールドからデコードされます。

ピアは、ハンドシェイク中にピアのmax_ack_delayよりも大きい確認応答遅延を報告する可能性があります ([QUIC-TRANSPORT] のセクション13.2.1)。これを考慮するために、エンドポイントは、[QUIC-TLS] のセクション4.1.2で定義されているように、ハンドシェイクが確認されるまでmax_ack_delayを無視すべきです (SHOULD)。これらの大きな確認応答遅延が発生する場合、それらは非繰り返しであり、ハンドシェイクに限定される可能性があります。したがって、エンドポイントは、それらをmax_ack_delayに制限することなく使用でき、RTT推定の不必要な膨張を回避できます。

大きな確認応答遅延は、ピアの確認応答遅延の報告またはエンドポイントのmin_rtt推定にエラーがある場合、smoothed_rttを大幅に膨張させる可能性があることに注意してください。したがって、ハンドシェイク確認前に、確認応答遅延でRTTサンプルを調整すると、サンプルがmin_rttよりも小さくなる場合、エンドポイントはRTTサンプルを無視してもかまいません (MAY)。

ハンドシェイクが確認された後、ピアのmax_ack_delayよりも大きいピアが報告する確認応答遅延は、ピアでのスケジューラレイテンシや以前の確認応答の損失など、意図的ではないが潜在的に繰り返される遅延に起因すると考えられます。過剰な遅延は、非準拠の受信者による可能性もあります。したがって、これらの追加遅延は実質的にパス遅延の一部と見なされ、RTT推定に組み込まれます。

したがって、ピアが報告する確認応答遅延を使用してRTTサンプルを調整する場合、エンドポイントは:

  • Initialパケットの確認応答遅延を無視してもかまいません (MAY)。これらの確認応答はピアによって遅延されないためです ([QUIC-TRANSPORT] のセクション13.2.1)。

  • ハンドシェイクが確認されるまで、ピアのmax_ack_delayを無視すべきです (SHOULD)。

  • ハンドシェイクが確認された後、確認応答遅延とピアのmax_ack_delayの小さい方を使用しなければなりません (MUST)。そして

  • 結果の値がmin_rttよりも小さい場合、RTTサンプルから確認応答遅延を減算してはなりません (MUST NOT)。これにより、誤報告するピアによるsmoothed_rttの過小評価が制限されます。

さらに、対応する復号化鍵がすぐに利用できない場合、エンドポイントは確認応答の処理を延期する可能性があります。たとえば、クライアントは、1-RTTパケット保護鍵がまだ利用できないため復号化できない0-RTTパケットの確認応答を受信する可能性があります。このような場合、エンドポイントは、ハンドシェイクが確認されるまで、そのようなローカル遅延をRTTサンプルから減算すべきです (SHOULD)。

[RFC6298] と同様に、smoothed_rttrttvarは次のように計算されます。

エンドポイントは、接続確立中および接続移行中に推定器がリセットされるときにRTT推定器を初期化します。[QUIC-TRANSPORT] のセクション9.4を参照してください。新しいパスのRTTサンプルが利用可能になる前、または推定器がリセットされるときは、初期RTTを使用して推定器を初期化します。セクション6.2.2を参照してください。

smoothed_rttrttvarは次のように初期化されます。ここで、kInitialRttには初期RTT値が含まれます:

smoothed_rtt = kInitialRtt
rttvar = kInitialRtt / 2

ネットワークパスのRTTサンプルはlatest_rttに記録されます。セクション5.1を参照してください。初期化後の最初のRTTサンプルでは、そのサンプルを使用して推定器がリセットされます。これにより、推定器が過去のサンプルの履歴を保持しないことが保証されます。他のパスで送信されたパケットは、[QUIC-TRANSPORT] のセクション9.4で説明されているように、現在のパスにRTTサンプルを提供しません。

初期化後の最初のRTTサンプルでは、smoothed_rttrttvarは次のように設定されます:

smoothed_rtt = latest_rtt
rttvar = latest_rtt / 2

後続のRTTサンプルでは、smoothed_rttrttvarは次のように進化します:

ack_delay = decoded acknowledgment delay from ACK frame
if (handshake confirmed):
ack_delay = min(ack_delay, max_ack_delay)
adjusted_rtt = latest_rtt
if (latest_rtt >= min_rtt + ack_delay):
adjusted_rtt = latest_rtt - ack_delay
smoothed_rtt = 7/8 * smoothed_rtt + 1/8 * adjusted_rtt
rttvar_sample = abs(smoothed_rtt - adjusted_rtt)
rttvar = 3/4 * rttvar + 1/4 * rttvar_sample