
【9秒チャレンジ】
スライディング方式とは、ウィンドウサイズという概念を新たに使うことで、連続送信(=MSSを気にしない通信)をできるようにしたもの。で、これをすることでACKが返ってくるまでのアイドリング時間を減らして効率の良い通信ができる。そして適宜返ってくるACKを確認しつつ連続送信を続けていくという方式。
更に詳しく知りたい場合↓
1. スライディングウィンドウ制御の基本概念
スライディングウィンドウ制御とは、TCP(Transmission Control Protocol)のデータ送信制御方法の一つで、効率的な通信を実現するために使われます。この仕組みでは、送信側が受信側から通知されたウィンドウサイズ内でデータを送信し、ACK(確認応答)をもらいながら次々と送信することで通信の効率を高めます。

このウィンドウサイズという仕組みを取り入れたことがスライディング方式の成功の要因です。
なぜ必要か?
- 送信効率の向上
データを送信するたびにACKを待つ方式では、通信遅延が大きくなるため非効率です。スライディングウィンドウでは、ACKを待つことなく一定量のデータを連続して送信できます。
従来の流れ
#送信側# #受信側#
データ送信① ーーーーーー→ 処理
@
| ←ーーーーーー ACK
@
データ送信② ーーーーーー→ 処理
@
| ←ーーーーーー ACK
@
データ送信③ ーーーーーー→ 処理
@
| ←ーーーーーー ACK

このように、送信側がデータを1回送る度に確認応答を待っていると、アイドリング時間(@)が発生してしまい通信が非効率になってしまいます。そこで、ウィンドウサイズという概念を作ることで、連続して送れるようにしたのがスライディング方式です。
2. スライディングウィンドウの仕組み
2-1. ウィンドウサイズ
- 受信側が通知する値
受信側は、自身のバッファに空きがどれだけあるかを送信側に伝えます。この値がウィンドウサイズです。- 例:ウィンドウサイズが5,000バイトなら、送信側は最大5,000バイトまでデータを連続して送れます。
- 動的に変化する
受信側がデータを処理してバッファに空きができると、ウィンドウサイズは拡張(更新)されます。

TCPにはMSSと呼ばれる1回に送信できるデータ量の制限あります。そのため、ウィンドウサイズが5000でも、それを何個かに分割して送ります。しかし、いずれも連続して送れるので通信にさほど影響は与えないです。
2-2. スライディング(滑り)動作
ウィンドウサイズの範囲内で送信を行いながら、ACKを受け取るたびに「次に送信できる範囲」をずらしていきます。これが「スライディング(滑り)」と呼ばれる理由です。
- 動きのイメージ
- 送信可能な範囲(ウィンドウ)が固定されている。
- ACKが返るたびに、ウィンドウが右にスライドする(送信可能範囲が拡大)。

先ほど、説明したようにMSSがあるためデータは分割されて送信されます。そして、その一つ一つに対して確認応答が返されます。その、確認応答に含まれるウィンドウサイズを見ながら送る量を動的に対応させていくことで、待機時間を減らした通信が可能になるという訳です。
3. スライディングウィンドウの重要ポイント
3-1. MSS(Maximum Segment Size)との関係
ウィンドウサイズが大きくても、一度に送信できるデータ単位はMSS(1セグメントの最大サイズ)で制限されます。ウィンドウサイズが5,000バイト、MSSが1,500バイトなら、送信側は最大で3つのセグメント(1,500 + 1,500 + 1,500)を連続で送れます。
3-2. 確認応答(ACK)とシーケンス番号の役割
- シーケンス番号:送信データん順番を表す
- ACK:次に受信すべきシーケンス番号を意味します。つまり、1500まで送信した場合は次は1501からなので、確認応答は1501になります。
3-3. フロー制御
スライディングウィンドウはTCPのフロー制御の一部として機能し、送信側が受信側の処理能力を超えないようにデータ送信を調整します。
3-4. ゼロウィンドウ
- 定義:受信側が「バッファが満杯でこれ以上データを受け取れない」と通知する状態。
→ 送信側は、新しいウィンドウサイズが通知されるまでデータ送信を停止します。 - 注意:ゼロウィンドウ状態が続くと、通信が停止する可能性があります。
3-5. ウィンドウプローブ
- 目的:ゼロウィンドウ状態が続く場合、送信側が受信側に「まだ受け取れない?」と確認するために、小さなデータを送信します。
- 役割:受信側が応答することで、更新ウィンドウが有効になる場合があります。
4. 実際の動作例
例:ウィンドウサイズが5,000バイトの場合
- 送信側が1,500バイト(MSS)ずつ3セグメント(4,500バイト)を送信。
- 最初の1,500バイトに対するACKが返る。
- ACKを受信した送信側は、さらに1,500バイトを送信可能。
- この動作を繰り返しながらウィンドウがスライドし、データ送信が続く。

このように動作することで、まとめて一気に送りつつもセグメントは分割されているからACKが1つずつ返ってくる。このACKを利用して送る量を動的に対応させていくことで待機時間を減らせるという訳です。
まとめ
スライディングウィンドウ方式は、従来のTCP通信でMSS(最大セグメントサイズ)がボトルネックとなり、その都度確認応答(ACK)を待つ必要があった制約を克服するための仕組みです。この方式では、ウィンドウサイズを活用して、確認応答を待たずに複数のデータを連続的に送信できるため、通信効率が向上します。MSSの制約は依然として存在しますが、ウィンドウサイズの範囲内でデータを連続送信できるため、ACK待機時間を減らし、高速かつ効率的な通信を実現します。