空野 アオイお姉ちゃん、基本情報技術者試験の勉強をしてるんだけど、『スライディングウィンドウ』という言葉が出てきて頭が混乱しちゃってるんだ。窓が滑るってどういうことなの?
空野 シオンアオイ、大丈夫よ。難しそうなネットワークの仕組みも、大人気レストランの厨房に例えれば一気にイメージできるようになるから、一緒に紐解いていきましょう!
インターネット上で動画を見たり、Webサイトを閲覧したりする時、私たちのデバイスの裏側では膨大な量の「パケット」と呼ばれるデータの断片が飛び交っています。このパケットの送受信を安全かつスピーディーに管理しているのが、TCP(Transmission Control Protocol)という仕組みです。TCPは、データが確実に届くことを保証する「信頼性の高い通信プロトコル」として知られています。
しかし、送信側が自分の都合だけでデータをどんどん送りつけてしまうと、受信側の処理が追いつかずにデータが溢れ、通信エラーが起きてしまいます。この「送りすぎによるパンク」を防ぎつつ、通信のスピードを極限まで高めるために開発された画期的なアルゴリズムが、「スライディングウィンドウ」です。
この記事では、IT資格の受験者や若手エンジニアに向けて、スライディングウィンドウの全体像と「フロー制御」の仕組みを、誰もが知っている「レストランの厨房と給仕」の例えを用いて徹底的に解説します。専門書を読んでも分からなかった「ウィンドウサイズ」や「ACK(確認応答)」の本当の役割が、この記事を読み終える頃には直感的に納得できるようになっているはずです。
スライディングウィンドウがないとどうなる?「1つずつ送る」非効率さ
スライディングウィンドウの凄さを理解するために、まずは「この仕組みが存在しなかった時代」の非効率な通信方法を見てみましょう。古い通信システムが抱えていたボトルネックを知ることで、なぜこのアルゴリズムが必要とされたのかがハッキリと見えてきます。
空野 アオイデータを送る時って、手紙を送るみたいに「届いたら返事をもらって、それから次の手紙を書く」のが一番安全で普通なんじゃないの? 何が問題なんだろう……?
空野 シオンアオイが言う方法は『交互応答方式』と呼ばれるものね。確かに安全性は高いんだけど、返事が戻ってくるまでの間、送信側が『何もせずに待つ時間』が発生してしまうのが最大の欠点なのよ。
アオイの言う通り、最も確実なのは「1通送るごとに、届いたという返事を待つ」という方法です。しかし、これをインターネットのような超高速なデジタル通信の世界でやろうとすると、致命的な問題が発生します。それが「スピードの極端な低下」です。
1セグメントごとにACK(確認応答)を待つ「交互応答方式」
TCPでは、大きなデータを「セグメント」という小さな単位に分割して送信します。交互応答方式では、送信側が1つのセグメントを送り出すと、受信側から「届いたよ!」という返事(ACK:確認応答)が返ってくるまで、次のデータを送ることができません。
たとえば、東京とアメリカの間で通信を行うとします。光の速さをもってしても、パケットが往復するには物理的な時間がかかります。1つのデータを送ってから返事が来るまでに1秒待たされるとしたら、どんなに光回線の帯域幅が太くても、1秒間に1セグメントしか送れないことになり、通信速度は使い物にならないほど遅くなってしまいます。
通信の待ち時間(ボトルネック)による速度低下
この待ち時間は「往復遅延時間(RTT)」と呼ばれ、通信距離が長くなればなるほど顕著になります。どれほど送信側と受信側の性能が高くても、その間の「待ち時間」がネットワークの帯域をスカスカにしてしまい、本来の通信スペックを全く発揮できなくなってしまうのです。
この非効率さを打破し、「返事を待たずに、送れるだけまとめて送ってしまおう!」という逆転の発想から生まれたのが、スライディングウィンドウという技術です。それでは、その具体的なメカニズムを、直感的に理解できるレストランの例えに当てはめて解説しましょう。
【図解】レストランに例えて納得!スライディングウィンドウの基本概念
難しいネットワークの教科書を読む前に、まずはこのレストランの登場人物たちの動きを追ってみてください。驚くほどすんなりと、スライディングウィンドウとフロー制御の役割が繋がっていきます。
空野 アオイレストランの厨房……? お姉ちゃん、お腹が空いてきちゃいそうな話だけど、本当にこれでスライディングウィンドウがわかるの?
空野 シオンええ、大いに関係あるわ。料理を作るシェフ、料理を運ぶウェイター、一時的に置く配膳台の3つの動きが、TCPの仕組みそのものなのよ。
一見関係のなさそうな料理の世界ですが、そこには「作る側(送信)」と「運ぶ側(受信)」のコミュニケーションが存在します。この情報のやり取りが、まさにネットワーク通信の縮図になっているのです。
登場人物と役割の対応表
スライディングウィンドウの動作を理解しやすくするため、まずは通信の要素をレストランの現場に置き換えた対応表を作成しました。
| ネットワーク用語 | レストランでの例え | 役割・意味 |
|---|---|---|
| 送信側(Sender) | シェフ(料理人) | データを生成し、次々と送り出す側。 |
| 受信側(Receiver) | ウェイター(給仕) | データを受け取り、処理(配膳)する側。 |
| 受信バッファ | 配膳台(一時置き場) | 届いたデータを処理するまで一時保管するメモリ領域。 |
| ウィンドウサイズ | 配膳台の上に置ける皿の限界数 | 一度にまとめて送信(調理)してよいデータの上限。 |
| ACK(確認応答) | お皿をお客さんに配って配膳台を空けること | 「データを受け取ったので、次を送ってよし」という合図。 |
シェフ(送信側)とウェイター(受信側)の連携
このレストランでは、シェフ(送信側)は料理を1つ作るたびにウェイター(受信側)の返事を待つ必要はありません。配膳台(バッファ)の上に空きスペースがある限り、どんどん料理を作って配膳台に並べることができます。この「配膳台に置ける最大のお皿の数」こそが、ウィンドウサイズです。
ウェイターは、配膳台からお皿を取ってお客さんに運びます。お皿が運ばれる(データが処理される)と、配膳台に「空きスペース」が生まれます。ウェイターはシェフに「今、お皿を3つ運んだから、あと3つ作っていいよ!」と伝えます。これがACK(確認応答)の送信と、それに伴う「ウィンドウのスライド」の正体です。
このたとえ話を頭の片隅に置きつつ、実際のTCPのデータ処理の流れをステップバイステップで見ていきましょう。驚くほど論理的に、フレームワークが頭に入ってくるのを感じられるはずです。
スライディングウィンドウの動作手順3ステップ
実際の通信において、データがどのようにスライドして流れていくのか、具体的な手順を追って解説します。
通信を開始する前に、送信側と受信側で「現在、一度にどれくらいのデータを送ってよいか」の初期値(ウィンドウサイズ)を決定します。これは、受信側のメモリの空き容量(配膳台のサイズ)に基づいて決定されます。
送信側は、決定したウィンドウサイズの範囲内であれば、受信側からの返事を待つことなく連続してセグメントを送信します。これにより、通信の待ち時間が激減し、一気にデータが流れます。
受信側がデータを受信・処理すると、送信側に「どこまで受け取ったか」を示すシーケンス番号付きのACKを返します。送信側はこれを受け取ると、受け取った分だけ「ウィンドウの枠(送信してよいデータの範囲)」を右にずらし(スライド)、次のデータを送り始めます。
このように、枠が右へ右へと滑るように動いていくことから、「スライディングウィンドウ」という名前がつけられました。通信をスムーズに進めるための非常にスマートなアイデアですが、ここで気になるのが、受信側の処理が追いつかなくなった時の動きです。ここから、TCPのもう一つの重要な役割である「フロー制御」が始まります。
ネットワークの信頼性を確保するためには、こうした基本的な制御プロトコルの理解が欠かせません。VPNなどを導入する際にも、これらのインフラ技術がベースとなっています。ネットワーク知識をさらに深めるため、まずはVPNの仕組みについて図解でわかりやすく解説した入門記事を読んで、通信レイヤー全体のイメージを掴んでおくのがおすすめです。
パンクを防ぐ「フロー制御」とウィンドウサイズ0の挙動
もし受信側のコンピュータが他の重い処理で忙しくなり、届いたパケットをバッファから処理できなくなったらどうなるでしょうか。その時の安全弁となる「フロー制御」の仕組みを詳しく見てみましょう。
空野 アオイもしウェイターが他のお客さんの対応で忙しくて、配膳台の上の料理をお客さんに運べなくなっちゃったら……。シェフがどんどん料理を作り続けたら、配膳台からお皿が落ちてガシャーンって壊れちゃうよね?
空野 シオンアオイの言う通り、料理を置き続ければいつか破綻してしまうわ。そうならないために、ウェイター(受信側)はシェフ(送信側)に対して『配膳台がいっぱいだから料理を作るのを止めて(ウィンドウサイズ0)』と警告するのよ。
ネットワーク上でも同様に、受信バッファの容量を超えてデータが届くと、メモリから溢れたパケットはそのまま「破棄(ロス)」されてしまい、通信の大混乱を招くことになります。そのため、TCPでは受信側の受け入れ余力に送信側が合わせるフロー制御が必要不可欠となります。
受信バッファ(配膳台)が満杯になった時の流れ
受信側の処理能力が追いつかず、受信バッファに未処理のデータが溜まっていくと、受信側はACKを送る際に、ヘッダ内の「ウィンドウサイズ」の値を徐々に減らして送信側に通知します。これは、「配膳台の空きが残り少なくなっています」というシェフへの警告です。
そして、ついにバッファの空きが完全になくなった時、受信側は「ウィンドウサイズ 0」のACKを返します。これを受け取った送信側は、一切のデータ送信を一時停止し、受信側の処理が再開してバッファに空きができるのを待ちます。これにより、パケットロスを未然に防ぐことができるのです。
通信再開のトリガーとプローブパケット
受信側の処理が進み、バッファに空きが生まれると、受信側は送信側に対して「空きができたので、送信を再開してください」という通知(ウィンドウ更新通知)を送ります。しかし、もしこの通知パケットが途中のネットワークで紛失してしまったら、お互いに「待ちぼうけ」の状態(デッドロック)になってしまいます。
これを防ぐため、送信側は定期的に「プローブセグメント(ウィンドウプローブ)」と呼ばれる小さなパケットを送信し、「そろそろ配膳台に空きはできましたか?」と受信側に安否確認を行います。これに対して受信側が現在のバッファ容量を返答することで、通信が安全に再開される仕組みになっています。非常によく考えられた安全設計です。
パケットロス発生時のリカバー:再送制御の仕組み
確認応答を待たずに次々とデータを送るスライディングウィンドウですが、途中でデータが消えてしまったり、届く順番が入れ替わったりした時は、どのように元の綺麗なデータに復元しているのでしょうか。その再送制御の代表的なアルゴリズムを解説します。
累積応答(Cumulative ACK)による確認
TCPのACKには、「次に送信側が送るべきデータのシーケンス番号」が記載されています。これを累積応答と呼びます。たとえば、送信側が1番から5番のデータを送ったとして、受信側が「次は3番を送ってください」というACK(ACK=3)を返した場合、これは「1番と2番は無事に受け取った」ということを意味します。
もし3番のパケットが途中で消えてしまい、4番と5番だけが先に受信側に届いた場合、受信側は「4番と5番は届いたけれど、3番がまだ来ていない」と認識します。このため、受信側は「次は3番を送ってください」という同じACK(重複ACK)を繰り返し送信側に返し、3番が抜けていることをアピールします。
高速再送(Fast Retransmit)のメリット
通常、パケットが消えたと判断するには「一定時間返事が来ない(タイムアウト)」のを待つ必要がありますが、それでは通信に大きなタイムラグが生じてしまいます。そこで考案されたのが「高速再送」です。
送信側は、同じシーケンス番号を求める「重複ACK」を3回連続で受け取ると、タイマーが時間切れになるのを待たずに、即座に対象のパケット(今回の例なら3番)を再送します。これにより、軽微なパケットロスであれば通信速度をほとんど落とすことなく、一瞬で修復することが可能になります。スライディングウィンドウの効率の良さを支える、非常に強力なパートナー技術です。
【試験対策】基本情報技術者・ITパスポートの頻出・ひっかけポイント
国家試験などのネットワーク分野において、スライディングウィンドウやフロー制御は非常によく狙われます。過去問で多くの受験生が引っかかって涙をのんだ「定番の罠」を整理しました。これさえ押さえておけば、本番での得点力は一気に跳ね上がります。
ひっかけ1:ウィンドウサイズの単位は「ビット」ではなく「バイト」
試験問題の選択肢で非常によく見かけるのが、「ウィンドウサイズは、一度に送信できるパケットのビット数を示す」という記述です。これは明確なひっかけ(間違い)です。TCPのウィンドウサイズの単位は「バイト(Byte)」です。
TCPヘッダ内のウィンドウサイズフィールドは16ビットの領域で構成されており、最大で65,535バイト(オプションを使用すればさらに大きく拡張可能)までの範囲を受信側が指定できます。計算問題などで単位を間違えると一発で誤答になってしまうため、「データ容量はバイト単位で数える」としっかり頭に叩き込んでおきましょう。
ひっかけ2:「フロー制御」と「輻輳制御」の決定的違い
この二つの制御は、どちらも「送信速度を調整する」という点では同じに見えるため、選択肢の意味を入れ替えるひっかけ問題が頻出します。誰のために、どこを見て速度を落としているのかを明確に区別してください。
| 制御の種類 | 制御の目的 | 判断基準(誰の都合?) | レストランでの例え |
|---|---|---|---|
| フロー制御 | 受信側のパンク防止 | 受信バッファの空き容量(受信側の都合) | 配膳台がいっぱいなので、シェフが料理を止める。 |
| 輻輳制御(ふくそうせいぎょ) | ネットワーク経路のパンク防止 | 回線の混雑状況やパケットロス率(通路の都合) | 厨房から客席までの「廊下」が混んでいるので、走るのを控える。 |
フロー制御は「受信側」のメモリが溢れるのを防ぐための1対1の通信制御です。一方で、輻輳制御は途中のルーターや回線全体(インターネットの共有通路)が混雑してパンクするのを防ぐための、ネットワーク全体への配慮です。この「誰のキャパシティを守るための制御か」という視点を忘れないようにしてください。
試験対策はもちろん、実務でVPNの接続速度が急に遅くなった時の原因究明などにも、この概念の区別は極めて重要になります。通信トラブル時に役立つキルスイッチとVPNの接続品質管理の仕組みを学んでおくと、理論と実務の繋がりがより深く理解できるようになりますよ。
TCPスライディングウィンドウに関するよくある質問 (FAQ)

さらに細かい技術仕様や、実際のインフラ運用での疑問についてお答えします。
- ウィンドウサイズは通信中にリアルタイムで変動しますか?
はい、常に激しく変動します。受信側のOSやアプリのCPU負荷、メモリの空き状況に応じて、受信側が送信するACKパケットの「ウィンドウサイズ」フィールドの値は動的に書き換えられ、送信側に現在の処理能力をフィードバックし続けています。
- UDPプロトコルにはスライディングウィンドウはないのですか?
ありません。UDPは「信頼性よりもリアルタイム性」を最優先するプロトコルのため、送信側は受信側の都合を一切気にせず、データを一方的に送りつけます。そのため、フロー制御も再送制御も存在せず、データが溢れた場合はそのまま破棄されます。
- ウィンドウサイズが大きければ大きいほど、通信は速くなりますか?
基本的には速くなります。特に遅延が大きい回線(海外との通信や衛星通信など)では、ウィンドウサイズを大きく設定しないと、帯域幅がどれだけ太くても速度が出ません。ただし、大きすぎるとパケットロスが発生した際の再送負荷が高くなるため、OS側で適切に最適化(ウィンドウ自動スケーリング)されています。
まとめ:スライディングウィンドウはインターネットの陰の立役者

TCPスライディングウィンドウのアルゴリズムは、一見非常に複雑に見えます。しかし、その基本思想は「相手の処理余力(バッファの空き)を見ながら、返事を待たずに送れるだけ送りつける」という、極めて合理的かつシンプルな工夫に基づいています。
この仕組みがあるからこそ、私たちは地球の裏側にあるサーバーの動画をスムーズに読み込み、何不自由なく大容量データをダウンロードすることができています。試験対策で丸暗記するのではなく、「シェフとウェイターのチームワーク」としてこの仕組みを捉え直すことで、ネットワークの本質的な美しさを理解するきっかけにしていただければ幸いです。
もし実際の運用や、より高度なネットワークセキュリティ(暗号化やVPNなど)の構築に興味が湧いた時は、いつでも他の解説記事を読みながらステップアップすることをおすすめします。みなさんのネットワークの学習と挑戦が、実りあるものになることを心から応援しています。
空野 アオイお姉ちゃん、ありがとう!レストランの配膳台の話を聞いたら、ウィンドウがスライドしていくイメージがハッキリ浮かんで、試験問題も迷わずに解けそうだよ!
空野 シオンどういたしまして、アオイ。理論をビジュアル化できればもう忘れないから、その調子で試験勉強も楽しく乗り切っていこうね!


