TCPとは?

トランスポート層の代表的なプロトコルにはTCPUDPがあります。

UDPは複雑な制御は行わず、アプリケーション側に制御を任せます。
必要最低限の役割を果たす事によって、スピードの早い通信を行うことが出来ます。
そのトレードオフとして通信の信頼性はなくなります。

それに対して、TCPは順序制御や再送制御をすることによって信頼性のある通信を行うことが出来ます。
ネットワークの途中でパケットが喪失した場合は再送制御を行います。
また、順序が入れ替わった場合は順序制御を行います。

さらに、TCPはコネクション制御を行います。
通信相手がいるかどうかを確認し、いる場合のみにデータを送信します。

このように、TCPは「伝送、送信、通信」を制御するプロトコルです。

信頼性をどう保証しているか

TCPでは**確認応答(ACK)**を行います。

  • 🔵 応答確認とは?
  • 確認応答とは送信したデータが受信側に到達したときに、
  • 受信側が送信側にデータを受信したことを知らせること

私達の会話でも、内容が伝わっていたら相槌や応答を返すように、
TCPでも応答を返します。

ちゃんとデータが送信されたときのことを肯定確認応答(ACK)
データがちゃんと送信できなかったときのことを**否定確認応答(NACK)**といいます。

TCPでは**肯定確認応答(ACK)**によって通信の信頼性を実現しています。

ACKが返ってきた場合、データは受信側に到達しており、
返ってこなければ、データが喪失した可能性が出てきます。

ただ、もしデータが途中で喪失してしまったとしても、
もう一度同じデータを送信します。

このようにして信頼性を確保しています。

コネクション管理

TCPはコネクション指向のプロトコルであり、UDPはコネクションレスです。

TCPでは、データの送信よりも前に、通信を始める準備をします。
この準備は以下のような手順で行われます。

クライアント側は、TCPヘッダだけからなるコネクション確立要求のパケット(SYNパケット)を送信します。

サーバー側はこれに対して肯定確認応答(ACK)とコネクション確立要求(SYN)を送信します。

ACKを受け取ったクライアント側はSYNに対する確認応答としてACKを送信します。

以上でコネクションの確立が完了します。

通信が終了した際にはFINパケットを送信してコネクション切断要求を行います。

MSS(最大セグメント・サイズ)

TCPの送信処理では出来るだけIPフラグメンテーションが起こらないように工夫がされています。
MSSを設定し、その値ごとに分割した2つのTCPパケット(2つのIPパケット)を送信するほうが、
IPフラグメンテーションによって2つのIPパケットを送信するよりも利点が多いです。

理由としては、IPパケットの分割と再構成に似た処理はTCP層のウィンドウ制御でも行われるため、非効率であるなどです。

MSSはスリーウェイハンドシェイクのときに決定されます。
お互いのホストがTCPヘッダにMSSオプションを付けMSSを通知します。
両者の小さい方のMSSが採用されます。

まとめ

  • ・TCPはUDPよりも信頼線の高い通信プロトコルである
  • ・肯定確認応答(ACK)によって信頼性を保証している
  • ・TCPはコネクション指向のプロトコルである
  • ・MSSによってIPフラグメンテーションを起こさない

参考文献

マスタリングTCP/IP入門編 第5版