TCPとUDPの性質についてご紹介していきます。
TCP(Transmission Control Protocol)
トランスポート層で定義されるTCPの特徴は、通信に信頼性を提供することです。 これは、メール、Web通信などの、データの欠落が許されないような通信に対して使用されます。
そのため、TCPには信頼性を確保するためのさまざまな機能が定義されています。
◆3ウェイハンドシェイク
TCPを使用した通信では、アプリケーション層の通信を開始する前に必ず「3ウェイハンドシェイク」とよばれる行為が行われます。
これは相手との通信が行えるかどうかを確認する行為であり、双方向でコネクションを確立するために行われます。
TCPを使用した通信では、通信を開始する側が宛先の端末に対してSYN(Synchronization)を送信して接続要求を行います。
この要求を受け取った受信側は、これに対しACK(Acknowledgement)で確認応答を返信します。
この時、同時に受信側からもSYNを送信し接続要求を行います。
これに対しACKを返すことで、双方のコネクションが確立します。
この動作は3つのパケットによって確立するため、3ウェイハンドシェイクとよばれています。
TCPが使用されている通信では、必ず通信に先立って、この3ウェイハンドシェイクが行われます。
このコネクションが確立しないと、アプリケーション層の通信は開始されません。
図1.3ウェイハンドシェイク
◆確認応答とシーケンス番号
TCP を使用した通信では、送信したデータが相手に確実に到達したことを確認しながらデータ転送が 行われます。 これは送信した 1 つ 1 つのデータに対し、確認応答を返すことで実現しています。 これにより、受信側からの確認応答を受け取らない限り、次のデータを送信することはできないため、 通信における信頼性は向上する反面、データの転送効率は下がってしまいます。 確認応答は TCP ヘッダ内の「ACK フラグ」にビットをセットし、1 つ 1 つのデータに「シーケンス番号」を付加することにより、データの到着順序が逆転しても、受信側でデータの並び替えが可能になるよ うになっています。
TCP では、コネクションの確立時に「初期シーケンス番号」が使用され、それ以降は送信データをオ クテット(バイト)単位で計算して加算した値を使用していきます。 これによって、送信セグメントの データが、データ全体のどこに位置しているかを示すようになっています。 また、初期シーケンス番号は固定されておらず、一般的に「0」には設定されません。 通常、各シス テムではシステムクロックなどを用いて決められます。
図2.確認応答とシーケンス番号
◆ウィンドウ制御
TCP では、確認応答により信頼性を実現しています。 データの送信側は、確認応答によってデータ が相手に到着したことを知り、確認応答が返ってこなければデータを再送します。 しかし、1 セグメントごとに確認応答を行っているのでは効率が悪いため、「ウィンドウ制御」を使用 して効率よく送受信を行っています。
TCP では、確認応答を待たずに連続して複数セグメントを送信することができます。 このときの送 信できるデータの大きさを「ウィンドウサイズ」といいます。 ウィンドウサイズは、受信側が確認応答を送信する際に、TCP ヘッダのウィンドウサイズフィールド に設定して送信側に通知しています。 また、送受信に用いるバッファ(メモリ領域)を用意して、複数の TCP セグメントに対して並列的に 確認応答ができるようにすることで実現しています。
図3.ウィンドウ制御
下図.4の例ではウィンドウサイズが 5 となっており、ウィンドウから見えている部分に関しては、確認応答 を待たなくても送信できます。 送信側では、以下のような仕組みで順次データを送信していきます。
- 送信側がウィンドウ(5セグメント分)のデータを連続して送信します。 このとき、確認応答がまだ到着していないので、ウィンドウ内のデータは送信エラー時の再送に備えてバッファ内に格納しておきます。
- 受信側から、2セグメント分の確認応答が到着。
- 確認応答の届いている 2セグメント分については再送する必要がないため、バッファ内から削除します。そして、2セグメント分ウィンドウをスライドさせて、新たに2セグメントの送信を可能にします。
このように、順次複数セグメントを送信する仕組みを「スライディングウィンドウ」といいます。
図4.スライディングウィンドウ
いかがでしたでしょうか。今回はTCPの一部について紹介させていただきました。
次回TCPの残りの仕組みとUDPについて紹介したいと思います。
ぜひお勉強の際にお役立て下さい。