2.2 802.11 のマルチレートと再送
2.5 TCP の課題と対応する実装
TCPにて様々な課題が報告され,その解決⽅法が報告されている.TCPの課題を⼀通 り解説し,それに対応する輻輳制御アルゴリズムについて説明する.
パケットロスの抑制
先に説明したTCP NewRenoなどのロスベースの輻輳制御では,途中経路のバッ ファ れが発⽣してパケットロスを引き起こすまで輻輳を検知しない.そのため,
過度に再送が⾏われスループット性能が低下する.
無線環境など伝送誤りが多いネットワークへの対応 ロスベースの輻輳制御では,パケッ トロスを輻輳の検知に⽤いる.これは伝送誤りによるパケットロスも輻輳として判 断してしまうことを意味しており,本来,送信速度を下げるべきではない場⾯で下 げてしまいスループット性能が低下する.このスループットの低下を防ぐため,無 線リンクレベルでの再送が⾏われるが,それでも有線LANよりも⾼い確率で伝送 誤りが発⽣する.
広帯域・⾼遅延のネットワークへの対応 TCP NewRenoなどのAIMD⽅式では,輻輳制 御状態に⼊ると,輻輳ウィンドウを1RTT毎に1MSS増加させていく.RTTによっ て輻輳ウィンドウの増加速度が左右され,⾼遅延のネットワークでは増加スピード は遅くなる.⼗分な送信速度に達するまで時間がかかり,スループット性能が低下 する.このような広帯域・⾼遅延ネットワークのことをLFN(Long Fat Network) もしくはLFP(Long Fat Pipe)と呼ぶこともある.
過度なバッファリングへの対応 ロスベースの輻輳制御ではバッファ れを起こすまで送 出速度を⾼める.そのため,送信バッファから送信されるデータの速度が低速の場合,
キューイング遅延が膨⼤になり,キューを共有する通信に影響を与える.これまで の課題はTCPのスループット性能の低下の影響を及ぼすものだったが,本課題は他 の通信に遅延性能の悪化の影響を与えるものとなる.次節にて本課題をBufferbloat 問題として詳細に解説する.
2.5.1 TCP Vegas
TCP Vegasは,RTTの増減によって輻輳を検出する遅延ベースの輻輳制御アルゴリズ
ムである.ロスベースのアルゴリズムでは輻輳が発⽣した後にパケットロスが発⽣するこ とを検出するが,VegasではRTTによって輻輳の初期段階で検出することができる.
まず,Vegasでは輻輳していない状態のセグメントのRTTをBaseRTTとして定義す
る.このBaseRTTは全てのセグメントのRTTの中で最⼩のものを⽤いる.この接続が
輻輳を起こしていないと仮定し,WindowSizeを現状の輻輳ウィンドウの値とすると,期 待されるスループットは以下の式となる.
Expected=W indowSize/BaseRT T (2.2)
次に実際のスループットを計算する.セグメントが送信され,そのACKが受信できる までの時間を測定し,かつ,その間に送信されたデータのバイト数を記録することによっ て計算する.
Actual=W indowSize/SampleRT T (2.3)
これら期待されるスループットと実際のスループットの差分をdと定義し,dは0か正の 値をとる.
d= (Expected−Actual)×SampleRT T (2.4) このdと2つの閾値αとβの関係によって,以下のように輻輳ウィンドウサイズの増減w は決定される.
w←
increase d < α decrease β < d unchange α < d < β
(2.5)
このαとβはネットワーク上のバッファに存在する余剰のパケットの⽬標数を⽰してお り,αはその最⼩数を,βはその最⼤数を⽰している.なお,Linuxにおいてα,βの初期 値は2, 4となっている.
2.5.2 TCP Westwood+
TCP Westwoodは,エンドツーエンドの帯域幅推定をベースとする輻輳制御アルゴリ
ズムである.ACKを受信することでウィンドウを広げていくロスベースの特徴を持って いるが,タイムアウト再送や⾼速再転送時に推定された帯域幅をssthreshに設定するこ とによって,過度にcwndが縮⼩することを防ぐ.Westwoodの帯域幅推定は,送信した データセグメントに対しての応答であるACKセグメントが到着するまでの往復遅延時間
(RTT)を⽤いる.この往復遅延時間によってデータセグメントのサイズを除算すること によって,単位時間あたりに送信できる帯域幅が推定できる.
あるACKを受信した時間をtk,その1つ前にACKを受信した時間をtk−1として,tk のACKに対応するデータ量をdkとする場合,帯域幅bkの推定は以下の式によって計算 される.
bk= dk tk−tk−1
(2.6) 重複ACKを受信したときやタイムアウト再送時はssthreshは以下の式によって計算 される.推定された帯域幅をBW E,TCPの最⼤セグメントサイズをM SS,その経路で 計測された最⼩のRTTをRT Tminとする.
ssthresh=BW E×RT Tmin/M SS (2.7)
ボトルネックリンクのバッファが空となるのはRT Tmin×BW Eとなるときであるとし,
輻輳回避状態に⼊るときにはバッファを⼀旦,空にするように動作する.タイムアウト再 送の場合はスロースタート状態となり,その経路のボトルネックのバッファにセグメント が滞留し始める⼨前まで指数的に増加させる.例えばRenoの場合,ssthresh=cwnd/2 と設定するが,伝送誤りの多い無線経路を含む場合,輻輳と判断され過度に輻輳ウィンド ウを縮⼩させることがあったが,Westwoodでは帯域幅推定によって必要以上に縮⼩させ ることがなくなった.
このような特性を持っているが,セグメントロスがあるまで輻輳ウィンドウを縮⼩する ことはなく,その点では他のロスベースと同様である.
2.5.3 CUBIC TCP
CUBIC TCPは⾼速ネットワークに最適化されたロスベースの輻輳制御アルゴリズム
である.CUBIC TCPはBIC TCPを拡張したものであり,TCPフレンドリネスとRTT フェアネスの改良を⾏っている.
BIC TCPはNewRenoなどのように輻輳回避状態において1RTTに1MSS増加する⼿
法をとらずBinary search increaseと呼ばれる特殊な⼿法を採⽤している.この⼿法では,
⾼速リカバリ直前のウィンドウサイズをWmax,直後のウィンドウサイズをWminとして,
輻輳ウィンドウはその中間値を設定する.セグメント消失がなければWminは現状の輻輳 ウィンドウの値に設定され,次回の計算時に使⽤される.前回,セグメント消失が発⽣し た値の近くで⻑く留まろうとすることで,セグメント消失の頻度を減らし,性能を落とさ ずに通信することを⽬的としている.
CUBIC TCPでは,BIC TCPの⼿法は低遅延ネットワークや低帯域のネットワークに
対してアグレッシブであり,また複数のウィンドウ増加関数を持つために解析が複雑にな るとして,単純な計算式で制御できるアルゴリズムを提案している.この計算式で求まる 輻輳ウィンドウの挙動はBIC TCPと似ているが,経過時間を⽤いている点が⼤きな違い である.
輻輳ウィンドウサイズ(cwnd)は以下の計算によって求まる.
cwnd=C(t−K)3+Wmax (2.8)
K =√3
Wmaxβ/C (2.9)
Cはスケーリングファクター,tは最後のウィンドウ減少(セグメント消失)からの経過 時間,Wmaxは最後のウィンドウ減少直前の輻輳ウィンドウサイズである.βは定数倍の 減少率である.輻輳ウィンドウは3次関数にて求まり,Kは3次関数の変曲点までにかか る時間を⽰している.Cには0.4が,βには0.2がよく使⽤される.
CUBIC TCPはLinux 2.6.19よりNewRenoと置き換わり,デフォルトの輻輳制御となっ ている.