一気に送っていいよ!TCPの「ウィンドウ制御」とは?

[voice icon=”https://tomslifestylelab.com/wp-content/uploads/2019/05/tom0212.png” name=”この記事を書いている人” type=”l”]

ネットワークエンジニア
Tom

Tomとかいうやつが何者なのか知りたい方は下のプロフィールをご覧ください。

プロフィール

[/voice]

こんにちは、Tomです。

今回は、

「TCPにおけるウィンドウ制御」

についてお話していきます。

1.はじめに

1-1.ウィンドウ制御とは?

TCPにおけるウィンドウ制御とは、

「確認応答を待たずに連続して一定量のデータを送信する制御」

のことです。

 

TCPで通信する場合、データを受信したホストは必ず、「確認応答」を送信者側に通知します。
「確認応答」とは、「データを確実に受け取りましたよ!」という返事のことです。

しかし、データを送信した後に確認応答を待ってから次のデータ送っていては効率が悪すぎます。

 

そのため、TCPは「ウィンドウ制御」というもので、確認応答を待たずに、連続して複数のデータを送れるようにしています。

その際に、受信側のホストが相手に通知するのが「ウィンドウサイズ」です。

1-2.ウィンドウサイズとは?

ウィンドウサイズとは、データを受信するホストが、“一度にどの程度のデータサイズなら処理することができるか”を表した値です。

下の図は、TCPヘッダの中身です。

TCPヘッダには、赤枠で囲った「ウィンドウサイズ」という領域があります。

TCP通信を行うホストはコネクションを確立する段階で、TCPヘッダのこの領域にお互いのウィンドウサイズを入れ、通知します。

このウィンドウサイズは、それぞれのホストのバッファの大きさのことです。

バッファとは、コンピュータが一時的にデータを格納しておける領域のことなのですが、
ウィンドウ制御では、このバッファに受信したデータを一時的に格納して、順番に処理していきます。

そのため、連続してデータを送信されても、処理することができるのです。

2.ウィンドウ制御の流れ

それでは、実際にウィンドウ制御の流れを見ていきましょう。

 

まず、TCPの場合は通信を行うホストの間でコネクションを確立します。

今、3ウェイハンドシェイクを経て2台のホストの間にコネクションが確立されているとします。

3ウェイハンドシェイクについては、下の記事をご覧ください。

コンピュータが握手?3ウェイハンドシェイクとは?

 

コネクションの確立時に2台のホストはMSSを1000バイト、ウィンドウサイズを3000バイトと決めたとします。

今、ホストAから9000バイトのデータサイズのデータを送る場合を考えます。

 

MSSが1000バイト、ウィンドウサイズが3000バイトなので、
まず、ホストAは1000バイトのデータをまとめて3つ、合計3000バイトのデータを送ります。

 

データを受信したホストBは、受信したデータ一つずつに確認応答を返します。ここでは、ACK1、ACK2、ACK3としました。

 

ホストBからの確認応答を受信したホストAは、次の3000バイトを送信するわけですが、
このとき、ホストAはACK1を受信した段階で、シーケンス番号3100のデータを送ってしまいます。

本来は、ホストBからのACK3を受信した後でないと、シーケンス番号3100のデータを送ることができませんが、
ウィンドウ制御では、ACK1を受信した時点で次のデータを送ることができます。

 

データを受信したホストBは、受信したデータ一つずつに確認応答を返します。ここでは、ACK4、ACK5、ACK6としました。

 

ホストBからの確認応答を受信したホストAは、次の3000バイトを送信するわけですが、
ここでも、ホストAはACK4を受信した段階で、シーケンス番号6100のデータを送ってしまいます。

このようにして、ウィンドウ制御では、自分が送信したデータに対する確認応答を待つことなく、相手からの確認応答が一つでも返ってくれば、次のデータを送ることができるのです。

 

今の流れを時系列で表すと下の図のようになります。

ホストAが合計3000バイトのデータを連続して送信した後、ホストBからの確認応答が一つ届いた段階で、次のデータを送信していることがわかります。

3.まとめ

いかがでしたでしょうか?

TCPには今回お話した「ウィンドウ制御」の他にさまざまな制御があります。

そちらに関しても記事を書いたので、併せてご覧ください。

シーケンス番号が手掛かり?TCPの「順序制御」とは? 再配達します!TCPの「再送制御」とは?

それでは、最後まで読んでくださり本当にありがとうございました。