【TCP/IP入門】TCPは何をしている?その役割と構造を紹介


今回も前回に続いてネットワークに関して調べたことを書き出したいと思います。

TCPとは

TCPはTransmission Control Protocolの頭文字をとったものであり、トランスポート層のプロトコルの一種であり、現在のWebにおけるほとんどの通信に置いて使われています。

特徴としてはデータをセグメントに分けて送受信し、確実に届けるために送信速度や、再送の手配など通信における大きな役割を果たします。

例えば10キロバイトのデータを送信して、5キロバイト分のデータ確認応答しか返ってこなかった場合、不足した5キロバイト分のデータを再送します。

TCPの構造

TCPのデータはセグメントに分けられ、それぞれのセグメントのヘッダーは下記のような構造になっています。

・送信元ポート番号
・宛先ポート番号
・シーケンス番号→送信済みのバイト数
・確認応答番号→受信済みのバイト数
・データオフセット→ヘッダーの長さ
・予約
・コントロールフラグ→現在の状況を相手に伝えて通信を制御する
・ウインドウサイズ→まとめて受信可能なサイズ
・チェックサム→データの状態をチェック
・緊急ポインタ
オプション設定
パディング

コントロールフラグの種類
・CWR→混雑のため送信量減少
・ECE→混雑のため受信に影響あり
・URG→緊急ポインタで指定データの処理が要される
・ACK→確認を伝播。確認応答番号とセット
・PSH→受信データをするにアプリケーション層に渡す必要があることを伝播
・RST→異常のため説ゾン強制終了
・SYN→接続を開始する際にオン
・FIN→送信完了で終了の旨を伝播

TCPにおける通信の流れ

TCPの通信はコネクションの確立からスタートします。この確立は3ステップかけて行われます。(3ウェイハンドシェイクと呼ばれます)

コネクションが確立するとデータを転送できる状態になり、データを送り終えたらコネクションを終了します。

通信完了の際は先ほど紹介したコントロールフラグにおけるSYNをオン、終了の際はFINをオンにします。通信の間はACKがパケットが届いたことを表します。もしACKが返ってこない場合は届かなかったことがわかります。

また、コネクション確立の際にはヘッダーにあるシーケンス番号とセグメントの最大値をすり合わせます。

例えば、クライアントとサーバー間でセグメントの最大値が異なる場合には、小さい方が採用されます。

最後に、通信データを送り終えたらコネクションを終了します。

通信の高速化と調整

上記で紹介したように確認応答を待ってから次のデータを送るのでは、あまりにも通信が遅くなってしまうので、応答を待たずにまとめてデータを送ることで高速化することも可能です。

この場合通信の失敗は、同じ応答番号が続いた時などで判断します。

また、まとめて受信できる容量に関しては、ヘッダーのウィンドウサイズにバッファの空き容量を記載することでお互いに認識しあいます。これはパソコンの性能が低い場合などに、通信速度に追いつかないことがあるためです。ウィンドウサイズに記載した空き容量を確認して、データの送信量を調整することが可能なのです。

仮にバッファが満杯になってしまうと、ウィンドウサイズに0が記載されて送られ、通信はストップします。

また、PCの処理速度だけでなく、ネットワーク経路の混雑などで、通信速度を落とす必要がある場合もあります。その際は、コントロールフラグのECEとCWRを立ててやり取りすることで、通信速度を落とします。

以上がTCPにおける通信になります。