TCP/UDPの仕組み

TCPウィンドウ制御 てぃーしーぴーうぃんどうせいぎょ

ウィンドウ制御フロー制御スライディングウィンドウ受信バッファウィンドウサイズ
TCPウィンドウ制御について教えて

簡単に言うとこんな感じ!

相手が処理できる分だけデータを送る「流量調整」の仕組みだよ。水道の蛇口みたいに、受信側のバッファが満杯になりそうなら「ちょっと待って!」って伝えてくれるんだ!


TCPウィンドウ制御とは

TCPウィンドウ制御(Window Control)は、受信側のバッファ(一時的なデータ保管場所)があふれないように通信量を調整する**フロー制御(Flow Control)の仕組みです。TCPヘッダのウィンドウサイズフィールド(16bit)**で実現されます。

受信側は自分が現在受け入れられるデータ量(受信バッファの空き容量)を「ウィンドウサイズ」として送信側に通知します。送信側はこの値を超えないようにデータを送ります。バッファが空いたら大きな値を通知し、詰まったら小さな値(最終的には0)を通知します。

ウィンドウサイズが0になると送信側は送信を一時停止し、受信側からWindow Update(ウィンドウサイズ更新)パケットが来るのを待ちます。この仕組みにより、処理能力の異なる機器同士でも安全に通信できます。


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

TCPはスライディングウィンドウ方式を使い、ACKを待ちながらも複数パケットを連続して送ることができます。

スライディングウィンドウの概念 ACK済 送信済 送信済 送信可 送信可 未送信 未送信 未送信 ← ウィンドウサイズ(送信許可範囲)→ ACKが来るとウィンドウが右にスライドし、新たなデータを送れる ACK受信後、ウィンドウが1つ右にスライド ACK済 送信可に

ウィンドウスケールオプション

標準のTCPヘッダのウィンドウサイズは16bitで最大65535バイトです。高速・大容量ネットワーク(例:1Gbps以上)では、この最大値が帯域を活かしきれない(帯域幅遅延積が大きい)ことが問題になります。

RFC 7323で定義されたウィンドウスケールオプションを使うと、ウィンドウサイズを最大1GB(1073725440バイト)まで拡張できます。3ウェイハンドシェイク時に双方がオプションを提示することで有効になります。


歴史と背景

  • 1981年:RFC 793でウィンドウ制御の基本仕様が定義
  • 1992年:高速ネットワーク向けにウィンドウスケールオプションが提案(RFC 1323の前身)
  • 1992年:RFC 1323でウィンドウスケール・タイムスタンプ等のTCP拡張が標準化
  • 2014年:RFC 7323に更新。現代のOSはほぼすべてウィンドウスケールをサポート

関連する規格・RFC

規格・RFC番号内容
RFC 793TCP基本仕様(ウィンドウ制御を含む)
RFC 7323TCP拡張(ウィンドウスケール・タイムスタンプ)
RFC 6582NewRenoアルゴリズム(輻輳制御

関連用語

  • TCP — ウィンドウ制御を行うプロトコル
  • 輻輳制御 — ネットワーク混雑に対応するウィンドウ調整
  • 3ウェイハンドシェイク — ウィンドウスケールをネゴシエートするタイミング
  • 再送制御 — ウィンドウ制御と組み合わさるパケットロス対策