3 Minutes NetWorking
No.42

3Minutes NetWorking

第42回レイヤ4 TCP 輻輳制御

■ TCPおさらい・みたび

インター博士

まだまだTCPの話だ。
前回までのことは覚えているか?

ネット助手

えぇ、まあ、たぶん。

インター博士

ふむ。
自信なさげで大変よろしい

ネット助手

よろしいんですか、それって?

インター博士

自信あふれるネット君などというものは、物理的に存在し得ないものだからな。
「自信あります」などと言われたら、物理法則が捻じ曲がるところだ。

ネット助手

ううぅ。

インター博士

さて、まずはお約束。
TCPヘッダを見てもらおう。

送信元ポート番号(16)宛先ポート番号(16)
シーケンス番号(32)
確認応答番号(32)
データオフセット(4)予約(6)制御ビット(6)ウィンドウ(16)
チェックサム(16)緊急ポインタ(16)
オプション

[Table39-01:TCPヘッダ]

インター博士

このウィンドウシーケンス番号確認応答番号の3つを使って、前回説明したのはなんだった?

ネット助手

スラインディング・ウィンドウ?

インター博士

そうだ。
相手の処理できるスピードと一時的な保持領域(バッファ)を考慮して、データを送る。
つまりフロー制御だ。

ネット助手

ふろー。
「流れ」という意味ですよね。

インター博士

うむ。
つまり、「データの流れ」を制御するのだな。
この制御は、先ほども言ったが相手のバッファ量に応じた制御を行うわけだ。

ネット助手

まだ処理していないデータを入れておくバッファの量ですね。

インター博士

そうだ。
バッファが満タンに近い場合は、それ以上送るとあふれ出てパケットが破棄されてしまう。なので、満タンになりそうだったら、あまり送らない。

ネット助手

逆に、空いている時は一気に送りつけるんでしたよね。

インター博士

その一気に送り付けれる量の事を、ウィンドウサイズという。
先ほどのTCPヘッダにその項目がちゃんとあるだろう?

ネット助手

ありますね。
16ビットです。

インター博士

この「フロー制御」以外にも、TCPはまだまだ制御を行う。
それが今回の輻輳制御だ。

ネット助手

前回も聞きましたけど。
なんて読むんです?

■ 輻輳

インター博士

ふむ。
「車ヘン」を抜いて読んでみたまえ。

ネット助手

「副」「福」と同じだから、「ふく」?
後ろは「奏」だから「そう」?

インター博士

正解。
ふくそう」と読む。

ネット助手

やりぃ。
で、なんなんです、それって?

インター博士

渋滞によるデータ破棄」と説明するのが一番簡単だろう。
まあ、正確にはちょっと違うが。

ネット助手

はぁ。
渋滞によるデータ破棄…。

インター博士

これは普通の電話でも起きることだ。
大災害が発生すると、そこに電話がつながりにくくなるだろう?

ネット助手

なりますね。
安否の確認のため電話しますものね。

インター博士

そうだ。
集中した呼び出しが交換機の処理能力を超えると、繋がらなくなる。その状態を輻輳という。

ネット助手

ははぁ。
人気チケットの電話予約とかでも起きますよね。

インター博士

とまぁ、これは電話の輻輳の話だ。
より詳しくはNTTの説明ページでも読んでくれ。▼ link

ネット助手

電話での話ってことは。
ネットワークでは違うってことですか?

インター博士

いやまあ、似たようなものだ。
ルータの処理速度を超えたパケット量がきた場合や。そもそも回線のスピードを上回るパケットを送信しようとした場合などで起こる。

[Figure42-01:輻輳]

ネット助手

ルータの処理速度を超えるパケット…。
え〜っと、ルータは受け取ったパケットを一時保管するバッファを持たないのですか?

インター博士

もちろん、持っている。
ただ、パケットが集中するとバッファがあふれるのだ。

ネット助手

じゃあ、TCPみたいにフロー制御をすれば…。

インター博士

ネット君。
TCPのフロー制御とはどういうものだ?

ネット助手

え?
え〜っと、お互いに相手のウィンドウサイズを教えあって…。

インター博士

そうだ。はっきりいって、手間のかかる方式だ。
途中で経由するルータがいくつあるかわからないのに、そこまでやるのは現実的ではない

ネット助手

う、う〜ん。
そういわれれば、そうかも。

インター博士

基本的にネットワークは運ぶ以外の仕事をしたがらない
レイヤ3以下を考えてみたまえ。
誰が、何処にデータを送る以上のことを考えているかね?

ネット助手

そうですね。
…。そういわれると、ないかも。

インター博士

運ぶ以外のことを考え出すと、ネットワーク自体に負荷がかかりすぎる。全体の送受信量が増えるわけだ。
さらに、現在のネットワークはあまりにも多種多様なアプリケーションが存在する。

ネット助手

はぁ。

インター博士

どれか1つに最適化、などできようもない。いつどこで輻輳が発生するかも、予測できない。
なので、端末側で制御するのだ。

ネット助手

端末側で制御、ということは。
送る、受け取るパソコンで行うってことですか?

■ スロースタートアルゴリズム

インター博士

そうだ。
TCPではスロースタートアルゴリズムというものを使う。

ネット助手

すろーすたーと?
遅いスタートですか?

インター博士

うむ。
仕組みはこうだ。

[Figure42-02:スロースタートアルゴリズム]

ネット助手

最初は1つ

インター博士

うむ。
それで確認応答が届くうちは一度に送る数を増やしていく

ネット助手

1つ。2つ。4つ…、倍ですか?

インター博士

いや、ある程度までいったら、1ずつだ。
なので、グラフにすると、以下のようになる。

スロースタートアルゴリズム・グラフ

[Figure42-03:スロースタートアルゴリズム・グラフ]

インター博士

最初は、小さい数のセグメントを送り、倍々で送る数を増やしていく。
だが、多く送ると、それだけ輻輳の可能性が増える。

ネット助手

一度に多く送ると渋滞するかもしれないってことですか。

インター博士

うむ。
なので、ある一定値までいったら、ゆっくりと増やしていく。「輻輳が起きそうだな〜」とゆっくりと。

ネット助手

輻輳が起きた場合はどうなるんです?

インター博士

輻輳が発生した場合、つまり確認応答が1つでも帰ってこなかった場合いったん送る数を減らす
グラフにすると、以下のような形だ。

輻輳が発生した場合

[Figure42-04:輻輳が発生した場合]

ネット助手

1まで戻るんですか。

インター博士

そうだ。
基本は1まで戻す形になる。1まで戻せば連続して輻輳は発生しないからな。

ネット助手

確かにそうですね。
でも、「基本は」ってことは、応用もあるんですか?

インター博士

ふむ、なかなかいいツッコミだ。
確かに1まで戻せば、連続して輻輳は発生しないが、また多く送ることができるまでに時間がかかる。なので、応用は以下のグラフになる。

高速リカバリ

[Figure42-05:高速リカバリ]

ネット助手

ははぁ。半分にする、と。

インター博士

つまり、スロースタートアルゴリズムとは、送る数を増やしつつ、輻輳が起きる送信数を手探りで探していく方法だ、と考えてもらうといい。

ネット助手

手探りで探す…。あぁ、なんとなくわかります。
こう、順に増やしつつ送っていって、ポイントを探すみたいな。

インター博士

そうだな。
輻輳が起こりうる送信数は事前にはわからないから、ちょっとずつ送って反応を確かめるのだよ。

■ フロー制御と輻輳制御

ネット助手

でも博士。
これって前回のフロー制御と矛盾しませんか?

インター博士

どこがだね?

ネット助手

だって、ウィンドウによるフロー制御は、ウィンドウサイズまで送るって話だったじゃないですか。

インター博士

確かにそうだ。
だが、前回のフロー制御は、あくまでもバッファフローを起こさせないための制御だ。
今回は、輻輳でパケットが破棄されないための制御だ。

ネット助手

インター博士

つまり。
TCPでは最初はスロースタートアルゴリズムで始まる。最初は1個。次は倍々で送っていくわけだ。

ネット助手

はい。

インター博士

それで、輻輳が起きなかったら、最終的にはウィンドウサイズまでセグメントを送ることができるようになる
倍々に増えていくといっても、無限に増えていくわけではない。

ネット助手

それはそうですね。
で、輻輳が起きたら?

インター博士

輻輳が起きたら、一時的に送る数を減らして、輻輳を回避する。

ネット助手

ふむむ〜?
ウィンドウサイズまで送ることができるはずなのに?

インター博士

そうだ。
相手のバッファだけを見れば、ウィンドウサイズまで送ることが可能だ。だが、ネットワークの状態がそれを拒否するわけだ。

ネット助手

輻輳が発生したから?

インター博士

そう。
バッファフローだろうが、輻輳だろうがパケットの破棄という点では同じだ。それは、TCPでは起きてはいけないことだ

ネット助手

正確・確実、ですね。

インター博士

そういうことだ。
つまり、フロー制御でバッファフローを。

ネット助手

スロースタートアルゴリズムで輻輳を。

インター博士

この2つで送るセグメント数を制御して、パケットの破棄を防ぐということだ。

ネット助手

ははぁ。

■ TCP・まとめ

インター博士

今回で、TCPの話は終わりなのでまとめといこう。

ネット助手

はい。

インター博士

TCPは、スリーウェイハンドシェイクでコネクションを確立する。

ネット助手

コネクションを確立して、お互いに確実に送受信が可能であることを示すわけですね。

インター博士

そして、相手に確実に送ったことを、確認応答で確かめることをしながら、セグメントを送るわけだ。

ネット助手

シーケンス番号と、確認応答番号でしたっけ。

インター博士

送るときは、フロー制御輻輳制御を行う。

ネット助手

パケットの破棄が起きないように、確実に送るんですね。

インター博士

うむ、そうだ。

ネット助手

なんか確実って言葉ばっかりですね。

インター博士

それがTCPの謳い文句だからな。

ネット助手

ははぁ。

インター博士

さて、次回はポート番号の説明をする。

ネット助手

了解。
3分間ネットワーキングでした〜♪

輻輳制御
[congestion control]
スロースタートアルゴリズム
[slow-start algorithm]
ある程度
しきい値といいます。
ネット助手ネット君の今日のポイント
  • ネットワークの途中で処理が追いつかなくなり、パケットが破棄されるのを輻輳という。
  • TCPではスロースタートアルゴリズムで輻輳を回避する。
    • 送るセグメント数を1から順に増やしていく。
    • 輻輳が発生したら、送る数を減らし、連続して輻輳が発生しないようにする。
  • フロー制御と輻輳制御は同時に行われる。

3 Minutes NetWorking No.42

管理人:aji-ssz(at)selene.is.dream.jp