はじめに
こんにちは。アメリカに住みながら、独学でエンジニアを目指しているTairaです。
現在インターネットの知識の確認するインターネットクイズを定期的にやっているのですが、そこで出てきたTCPのウィンドウ制御について説明していきたいと思います。
TCPウィンドウ制御とは?
TCPウィンドウ制御を説明する前に、TCPの確認です。TCPはインターネット上の通信でよく使われるプロトコルで、以下のような特徴を持っています:
- パケットの順序を保証する
- データの正確な送受信を確認する(ACK応答)
- 必要に応じて再送処理を行う
そして、TCPのデータ転送を効率よく安全に行うために登場するのが「ウィンドウ制御(Window Control)」です。
TCPウィンドウ制御の目的
TCPウィンドウ制御の目的は、以下の2点に集約されます:
- 送信側が一気に大量のデータを送りすぎないようにする
- 受信側のバッファに合わせて送信量を調整する
これにより、受信側の処理に不要な負担をかけず、給信線を最大限活用した通信が可能になります。
ウィンドウサイズとは何か
TCPでは、受信側が送信側に対し「現在受け取れるデータ量」を通知します。
このバイト単位の容量を ウィンドウサイズ と言います。
TCPの通信の流れ
- 受信側が「ウィンドウサイズ: 1000バイト」を伝達
- 送信側は最大 1000バイト までデータを送信
- 受信側はデータを処理したら、次のウィンドウサイズを指示
スライディングウィンドウ
TCPは「一度に送信できるデータの範囲」を管理し、ACKが届くたびにその範囲をずらして送信範囲を広げていきます。
TCPヘッダ内のウィンドウサイズ
TCPのヘッダには16ビットのWindow Size
フィールドがあり、ここに現在の受信可能量が入ります。
TCPウィンドウ制御を理解することで何が良いか?
ソフトウェアエンジニアにとってTCPウィンドウ制御の理解は、以下のような実務上の大きなメリットにつながります:
- 通信が遅い原因をアプリケーションの問題だけでなく、ネットワークレベルで分析できるようになる
- RailsなどのWebアプリが「APIレスポンスが遅い」ときに、TCP層に原因があることも特定できる
- 高遅延ネットワーク(例:海外サーバーや5G)で最大スループットを出すための条件(帯域遅延積)を理解できる
例えば、ウィンドウサイズが小さいと高速回線でも通信速度が上がらず、アプリケーションのボトルネックになってしまうことがあります。
ウィンドウサイズが小さいかどうかを確認する方法
ウィンドウサイズが通信遅延や低速の原因かを調べるには、以下のような方法があります:
クライアント側(ローカルPC)で確認
-
Wireshark:TCPヘッダの
Window Size
とCalculated Window Size
を確認 - curl -v や Chrome DevTools:通信時間やTTFB(Time To First Byte)の遅延傾向を把握
サーバー側(EC2や開発中のローカル環境)で確認
-
ss -ti
:現在のTCPセッションの送受信キューやウィンドウサイズを確認 -
tcpdump
:パケットキャプチャをしてWiresharkで解析
まとめ
項目 | 内容 |
---|---|
目的 | 送信量を制限して通信を最適化 |
ウィンドウサイズ | 受信側が受け取れるデータ量 |
送信側の動作 | 指示された範囲内でデータを送信 |
動的調整 | ACKと一緒にウィンドウサイズを更新 |
利点 | ネットワークのボトルネックを特定し、より高速な通信設計が可能に |
確認方法 | Wireshark / ss / X-Ray / CloudWatch Logs など |