naobe @ ウィキ

RFC2581

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可
TCPに戻る。

フローコントロール(受信ウィンドウによる送信量制御)は、送信先サーバの過負荷防止、輻輳制御はネットワークの過負荷防止。
輻輳制御には、TCP Reno, TCP Tahoe, TCP Vegasが一般的だそうだが、このRFCはTahoeのようだ。
送信元と送信先の輻輳制御の方式が異なったときに問題が発生しないのか?

2. 定義

輻輳ウィンドウ(cwnd)

送信側のウィンドウ。受信ウィンドウと輻輳ウィンドウの小さいほうが送信最大サイズとなる。

ロスウィンドウ(LOSS WINDOW (LW))

再送したときはロスと判定する。再送したときに設定する輻輳ウィンドウ。

フライトサイズ(FLIGHT SIZE):

送信したが、またACKされていないデータの量である。

3. 輻輳制御アルゴリズム

3.1 スロースタートと輻輳回避

スロースタート閾値(ssthresh)はスロースタートアルゴリズムと輻輳回避アルゴリズムのどちらをデータ送信制御アルゴリズムとして使用するかを決めるために使用される。

スロースタートアルゴリズムは、送信の開始時、または再送タイマによって検出されたロスを修復した後に、輻輳回避を目的として使用される。

スロースタートアルゴリズムはcwnd < ssthresh の時に使用され、輻輳回避アルゴリズムはcwnd > ssthreshの時に使用される。

IW(cwndの初期値)は2*SMSSバイト以下でなくてはならず(MUST)

スロースタート中、TCPは新しくDataをACKするACKパケットを受信するたびに、最大でSMSSバイトをcwndを加算していく。スロースタートはcwndがssthreshを超えた時(または、オプショナルだが、ssthreshに一致した時。上記参照)、もしくは輻輳が観測された時に終わる。
<コメント>
1セグメントごとにAckが返るとするとcwndは送信ごとに倍になる。最初は、cwndが1セグメントでAckが返ると、cwndは2セグメントになる。次に2セグメント送ると2個のAckが返って、cwndは4セグメントになる。


輻輳回避中、cwndはラウンドトリップタイム(RTT)ごとに1フルサイズセグメントずつ加算される。

  cwnd += SMSS*SMSS/cwnd

<コメント>
Windowを全て送り終わってWindowの全てのAckが返るまでの時間をRTTとしている。このcwndは、Ackが返ってきたときの増分を計算している。
SMSS*SMSS/cwnd = SMSS/(cwnd/SMSS)。cwnd/SMSSがAckの回数になる。


TCPの送信側が、再送タイマを使用してセグメントのロスを検出した場合、ssthreshの値は式(3)で与えられる値にしなくてはならない

      ssthresh = max (FlightSize / 2, 2*SMSS)            

タイムアウトした場合、cwndは1セグメントになり、新しく設定したssthreshまで、スロースタートになる。
<コメント>
タイムアウトが輻輳の判断
Renoの場合は、cwndは1/2
ウィキ募集バナー