TCPおさらい・ふたたびさて、まだまだTCPの話は続く。今日は「ウィンドウ」の話だ。OSのことですか?いや、あれはウィンドウ「ズ」だからな。今回のものはTCP内部での「窓」だ。TCPヘッダのおさらいからいこう。緊急ポインタ(16)オプション[Table39-01:TCPヘッダ]ちゃんと「ウィンドウ」という項目がある。今回は、このウィンドウとシーケンス番号と確認応答番号の3つを使って説明していく。シーケンス番号と確認応答番号は前回でてきましたよね。大きなデータを分割して届ける際に使う番号でしたね。シーケンス番号は、送るデータの先頭バイトの番号だ。確認応答番号は受け取った際に返す確認応答につける次の送られてくる(予定の)データの先頭バイトの番号でした。1回のデータ転送で送るデータ量のことをなんといったかね?え〜。分割したものがセグメント。これはTCPのデータ受け渡しが開始されるスリーウェイハンドシェイクで決定される。一連の流れは、以下の図のようになる。[Figure40-05:シーケンス・確認応答の流れ]確実・正確に送ると。それがTCPの謳い文句だからな。その「確実・正確」のための技術はこれだけではない。これだけじゃない?なんかもう、十分な気がするんですけど。ウィンドウサイズまず。確認応答」という流れだが。これは手間がかかりすぎる。手間がかかりすぎるって。それはそうですけど、「正確・確実」なためには必要なものなんでしょう?うむ。実際はもうちょっと効率のよい送り方をしないと、時間だけがかかりすぎる。確認応答」という流れは一緒だが。確認応答」という形にする。すれば、時間的にだいぶ効率がよくなる。[Figure41-01:効率のよい送り方]このように、左の方式に比べると、同じ3つのセグメントを送るにも右の方式はだいぶ時間的に短縮できる。複数のセグメント送信?セグメント送信とACKが入れ違いになってますけど。前回で説明したのは「ACKで受信を確認したら次のセグメント」という方式だったわけだ。これを「ACKを待たずに複数のセグメントを送る」方式にしたわけだ。それだと、「確実・正確」の謳い文句がおかしくなってしまいませんか?一気に送って、後々になって届かなかったことがわかってしまう、とか。うむ、その可能性はある。「確実・正確」に、かつ効率よく送るためにTCPはウィンドウ制御というものを行う。窓の制御?何故「ウィンドウ」という名前がついたかは、後で話そう。前にバッファというものを話したよな。第38回で出てきた奴ですか?受け取ったデータを一時的に保管しておく場所でしたっけ?そうだ。送られてきたデータはバッファに溜め置かれて、そこから処理される。処理よりも、データ転送が早いとバッファに溜まっていって、あふれ出ちゃうんでしたよね。TCPではこのあふれ出る(オーバフロー)を防がなければならない。データの損失だからな。相手に自分がどれだけのバッファ量を持つかを教える必要がある。ははぁ、さすがTCP。このサイズのことをウィンドウサイズという。これは、MSSと同じように、スリーウェイハンドシェイクで初期値を決定する。MSSと一緒に相手に教えるんですね。ウィンドウ制御ウィンドウサイズは、相手のバッファの量だ。ウィンドウサイズまでのデータは一度に送っても相手はオーバフローしないということがわかるわけだ。えっと、そう、なるのかな?なるのだ。ウィンドウサイズとは確認応答を待たずに送ることのできるデータ量ということになる。相手のウィンドウサイズを知ることは「受け取れなかった原因」の1つであるオーバフローの可能性を失くすわけだから、確認応答なしでもいいことになる。「受け取れなかった原因」の「1つ」。他にも受け取れなかった原因はあるんですよね。その場合はどうするんですか?うむ。それはちゃんと後で説明する。ウィンドウ制御を説明しよう。[Figure41-03:ウィンドウ制御]はわ〜。「枠」には「現在送信中で確認応答が返ってきていないもの」が入る。この枠は順々に下に下がっていくわけだ。「再送されることがないので、枠からはずします」っていうのは?うむ。「確認応答が届いた」=「相手にそのセグメントは届いた」だろう?なのでもう送る必要がないので、送っているものが入る「枠」からはずすのだよ。このように、「枠(ウィンドウ)」が「ずれる(スライド)」ので、この方式をスライディングウィンドウ方式という。いでぃんぐうぃんどう。スライドするウィンドウですか。わかりやすく、簡略化したものを見てもらったほうがいいかな。[Figure41-04:スライディングウィンドウ]あ〜、なるほど。送るデータ全体のうち、今送信中のデータだけが見える窓(ウィンドウ)なわけですか。ウィンドウと呼ばれる。これがスライドするから、スライディングウィンドウ、だな。ウィンドウ制御・エラーの場合しかし、上の例は非常に上手くいった場合なわけだ。処理速度が速くて、いつもバッファは空なわけだからな。いつもウィンドウサイズ=3000ですからね。バッファが埋まっていった場合の例を出そう。[Figure41-05:バッファがたまった場合]ははぁ。