📝

TCPとは

2023/12/06に公開

TCP(Transmission Control Protocol)とはネットワーク通信で使われるプロトコルの1つです。主にウェブ閲覧やメール、ファイル転送などデータ通信の場面で使用されます。

特徴|信頼性の高い通信をする

TCPの特徴として信頼性の高さがあります。この信頼性とは
「データを壊さずに確実に届ける」
ということの可能性が高められるという意味です。ではどのようにして信頼性を高めているのでしょうか?

スリーウェイハンドシェイク|通信開始時

まず通信を開始する前に通信ができるかを確認するプロセス(仕組み)がTCP通信では整備されています。では具体的にどのような手順を踏むのかみてみましょう。

通信開始時の手続き

通信の開始は以下の手順で行います。
1.クライアントPCからサーバに「通信したいです」という意味でSYNパケットを送信します。

2.サーバからクライアントPCに「OKです!通信しましょう!」という意味でSYN-ACKパケットを送信します。

3.再度クライアントPCから「では通信しますね!」という意味でACKパケットを送信します。

これで通信開始の準備が整いスリーウェイハンドシェイクのプロセスが終了しました。

パケットごとの伝送確認も行う

データはパケットと呼ばれる小包のような形で小分けにして送信されるのですが、ある程度の範囲を決めてその都度確認をします。1000バイトごとにデータを送信する場合は1~1000バイトでちゃんと届きましたか?という確認をしてから次の1001バイト〜2000バイトのデータを送信します。この時クライアントPCからはシーケンス番号がサーバへ送信され、その応答としてサーバからクライアントPCへACK番号というものが発行されます。これにより通信が失敗したらそこで失敗したことがわかるような仕組みになっているんですね。


パケットの送信失敗

パケットのデータが壊れてしまったり、届かなかったりということもあります。

その際はACKの応答がないのでしばらく待ってもない場合は再度同じデータを送信します。

ACK番号の送信失敗

反対にデータがサーバに届いたんだけれどもその応答としてのACK番号が通信の途中で喪失してしまうこともあります。こちらも同様にクライアントPCから見れば応答がないということになるので再度同じデータを送信する形になります。

フォーハンドシェイク|通信終了時

TCPは通信終了時も慎重に確認を行います。このプロセスをフォーハンドシェイクと呼びます。

1.クライアントPCからサーバへ「通信を終了したいです」という意味でFINパケットを送信します。

2.サーバからクライアントPCへ「OKです」という意味でACKパケットを送信します。

3.サーバからクライアントPCへ「通信を終了したいです」という意味でFINパケットを送信します。

4.クライアントPCからサーバへ「OKです」という意味でACKパケットを送信します。

スリーハンドシェイク|通信終了時

書籍によっては終了時もスリーハンドシェイクと説明されているものがあります。これは前述のフォーハンドシェイクの手順2と3を一気に説明しています。重要なのはクライアントPCからとサーバからと独立して終了確認をしているというところなのでそこをしっかり押さえておきましょう。

TCPの高速化手法

スライディングウィンドウ方式

これは簡単に説明すると通常のTCP通信では1~1000バイトまでのデータを送信し、次に1001~2000バイトまでのデータを送信としていたのを、「とりあえず5000バイトまでのデータを送信させてください」という形で一定のデータまではACKの応答がなくても送信してしまう方法になります。この一定のデータのことをウィンドウと呼びます。そしてウィンドウがどんどんスライドする形でデータが送信されるのでスライディングウィンドウ方式というわけですね。

高速再送制御

こちらはACKの確認を緩くして高速化する手法です。データの制限なくACKの返信を待たずにデータをどんどん送信します。そしてトラブルが起きた際は必要最小限でACKの確認を行なってデータ通信をします。

フロー制御|スロースタート

トラブルの内容として受信側のPC性能が遅いということもあります。こういった場合を想定してTCPでは前述のウィンドウサイズを小さく開始して徐々にウィンドウサイズを大きくするという手法があります。これをスロースタートと呼びます。

ここで説明しているフロー制御は通信の間の調整も続けてくれます。例えば受信側のリソースに余裕がなくなった場合はACKパケットにウィンドウを小さくするようなメッセージを添えて送信されます。

なぜTCP(信頼性の高い通信)が必要なのか?

TCPはトランスポート層のプロトコルですがその下で動いているのはネットワーク層のIPになります。そしてこのIPはベストエフォートと呼ばれる「とにかく通信する努力はするけどダメだったらダメでしょうがない」という感じの通信をします。(UDPもベストエフォートですね)それゆえそこを保管する意味でTCPが通信のチェックを行いながら確実にデータを届ける仕組みを提供しているということになります。

UDPとの比較

UDPがコネクションレスでコネクションの確認をしないのに対してTCPはコネクション(3・4ウェイハンドシェイク)をしっかり行うプロトコルです。これらの特性の違いから使用される場面も違ってきます。UDPはリアルタイムでの音声通信や動画通信で使用されます。

Discussion