セグメントの受信の確認
TCP の機能の 1 つは、各セグメントが確実に宛先に到達するようにすることです。 宛先ホストの TCP サービスは、送信元アプリケーションから受信したデータに対して確認応答を行います。
送信されたセグメントに含まれるデータ バイトの受信を確認するために、シーケンス(SEQ)番号と確認応答(ACK)番号が一緒に使用されます。 SEQ 番号は、現在のセグメントのバイトを含めて、このセッションで送信されたバイトの相対的な数を表します。 TCP は、送信元に返送された ACK 番号を使用して、受信側が期待している次のバイトを示します。 これは期待確認応答(expectational acknowledgement)と呼ばれます。
このデータ ストリームに含まれる、ACK 番号で示されるバイトの直前のバイトまでのすべてのバイトを宛先が受信したことが送信元に通知されます。 送信元ホストには、ACK 番号に等しいシーケンス番号を使用しているセグメントを送信することが期待されます。
それぞれの接続は実際には 2 つの一方向セッションであることを思い出してください。 どちらの方向でも、SEQ 番号と ACK 番号が交換されます。
図の例では、左側のホストが右側のホストにデータを送信します。 左側のホストは、このセッションの 10 バイトのデータと(ヘッダー内に)シーケンス番号 1 が含まれているセグメントを送信します。
受信側ホストは、このセグメントをレイヤ 4 で受信し、シーケンス番号が 1 で、データが 10 バイトであると判断します。 その後、このホストは、このデータを受信したことを示すセグメント(確認応答)を左側のホストに送信します。 このセグメントで、このホストは ACK 番号を 11 に設定することにより、このセッションで次に受信することを期待しているデータ バイトのバイト番号が 11 であることを示します。 送信元ホストは、この確認応答を受け取ると、次のセグメント(つまり、このセッションのバイト番号 11 で始まるデータが含まれているセグメント)を送信できます。
この例では、もし送信元ホストが 10 バイトごとに受信の確認応答を待たなければならないとしたら、ネットワークに大量のオーバーヘッドが発生することになります。 これらの確認応答によるオーバーヘッドを低減するために、データの複数のセグメントを送信し、それらのセグメントに対して受信側が単一の TCP メッセージで確認応答することができます。 この確認応答には、そのセッションで受信した合計バイト数に基づいた ACK 番号が含まれています。 たとえば、シーケンス番号が 2000 から始まって、それぞれが 1,000 バイトから成る 10 個のセグメントを受信したとすると、送信元に返される ACK 番号は 12001 になります。
確認応答を受け取る前に送信元が送信できるデータ量は、ウィンドウ サイズと呼ばれます。これは、失われたデータとフロー制御の管理を可能にする TCP ヘッダー内のフィールです。