TCPの制御(フロー制御・ウィンドウサイズ)

 TCPによる通信では、送信側がセグメントを送信し、そのセグメントを受信側が受信すると必ずACKの応答を返すようになっています。

 受信側の応答には、期待する次のシーケンス番号(受信したセグメントのシーケンス番号+1)を返します。

つまり、

今までの分は、ちゃんと受信できているので、次のセグメントを送って下さい。

という意味になります。

 TCPにおけるフロー制御は、ウィンドウサイズで実現しています。ウィンドウサイズによって一度に送信できるセグメントの数が決まります。TCPでは、一度に送受信するセグメントの数をコントロールすることで、フロー制御を行っています。

 もう少し、詳しく説明すると、ウィンドウサイズは、通信相手のバッファ量を指します。受け取ったデータは、一時的にバッファに溜められます。

データ転送が早いと、すぐにバッファは一杯になり、溢れ出してしまいます。そして、パケットは破棄されることになります。

つまり、ウィンドウサイズまでのデータは、一度に送っても相手はオーバフローしないことになります。

 TCPの通信では、スリーウェイハンドシェイクのコネクションの確立時に、シーケンス番号、確認応答番号の他に、ウィンドウサイズ(自分のバッファのサイズ)やMSSもお互いに教え合っています。

 この教えられたウィンドウサイズとMSSから、一度に送信できるセグメント数を求めることができます。TCPでは、一度に送受信するセグメントの数をコントロールすることで、フロー制御を行っています。

まずは、一度に送ることが可能なセグメント数が「1」の時のフロー制御を説明して行きます。

例えば

ウィンドウサイズ = 1,000
MSS = 1,000

の場合、一度に送ることが可能なセグメント数は、「1」になります。