第11回:確実にアプリケーションのデータを転送する【TCP・3ウェイハンドシェイク・ACK・フロー制御・シーケンス番号・ACK番号・MSS(Maximum Segment Size)・UDP・IP電話】

<<第10回:データは宛先にきちんと届いているか?【ベストエフォート型・ICMP・到達不能メッセージ・アドレス解決・pingコマンド・ARP・ポート番号・ウェルノウンポート番号・登録済みポート・ダイナミック/プライベートポート】

この記事のポイント

  • TCPによってアプリケーション間での信頼性のあるデータの転送を行うことができる
  • TCPによるデータ転送の流れは次の通り
  1. TCPコネクションの確立
  2. アプリケーション間のデータの送受信
  3. TCPコネクションの切断

確実にアプリケーションのデータを転送する

TCP

TCPとは?

TCPとは、信頼性のあるアプリケーション間のデータ転送を行うためのプロトコルです。TCP を利用すれば、アプリケーションプロトコルには信頼性を確保するための仕組みを入れておく必要がありません。

TCPによるデータ転送の手順

TCPによるアプリケーション間のデータ転送は次のように行われます。

  1. TCPコネクションの確立
  2. アプリケーション間のデータの送受信
  3. TCPコネクションの切断

まず、データを送受信するアプリケーション間の通信が正常に行うことが可能かどうかを確認します。この確認のプロセスは3ウェイハンドシェイク(コネクションの確立)と呼ばれます。

次に、アプリケーションが扱うデータをTCPで送信するためには、アプリケーションのデータにアプリケーションプロトコルのヘッダとTCPヘッダを付加する必要があります。これをTCPセグメントと表現することがあります。このときアプリケーションのデータサイズが大きければ分割して、複数のTCPセグメントとして転送します。どのように分割したかはTCPヘッダに記述されて、宛先で順番通りにもとのデータに組み立てられるようにしています。また、データを受け取ったらその確認を行います。データの受信確認のことをACKと呼んでいます。もし、一部のデネットワーータがきちんと届いていなければデータを再送します。また、ネットワークの混雑を検出すると、データの送信速度を抑えます。このようなデータの転送の仕組みをフロー制御と呼びます。

最後に、アプリケーションのデータの転送がすべて終了したら、TCOコネクションを切断します。

TCPによるデータ転送の手順

TCPでデータを分割する


次の項目のポイント

  • 転送したいアプリケーションのデータにTCPヘッダを付加してTCPセグメントとして転送する
  • 必要ならばTCPでデータを分割できる
  • TCPでデータを分割するサイズをMSSと呼ぶ

シーケンス番号、ACK番号

TCPヘッダフォーマット

TCPで転送したいアプリケーションのデータにはTCPヘッダを付加して、TCPセグメントとします。TCPヘッダのフォーマットは下の表のように決められています。

TCPヘッダフォーマット

TCPヘッダフォーマット

TCPヘッダ内で重要な部分のみを簡単に解説します。最も大切なのはポート番号です。ポート番号によって適切なプリケーションプロトコルヘデータを振り分けることができるからです。

そして、信頼性のあるデータの転送をするためにシーケンス番号ACK番号があります。シーケンス番号は、「シーケンス(順序)」という名前の通りTCPで転送するデータの順序をあらわしています。データを分割しているときには、シーケンス番号でどのようにデータを分割しているかがわかります。ACK番号はデータを正しく受信したことを確認するために利用します。

データの分割の仕組み

TCPにはデータの分割機能もあります。TCPでアプリケーションのデータを分割する単位をMSS(Maximum Segment Size)と呼びます。MSSを超えるサイズのデータはMSSごとに分割して送信します。MSSの標準的なサイズは1460バイトです。

Webアクセスの際のWebサーバアプリゲーションから Web サイトのデータを送信する場合について、TCPで分割する様子を考えます。アプリケションプロトコルとしてHTTPを利用するのでWebサイトのデータにHTTPヘッダが付加されます。これがTCPにとってのデータです。MSSごとに分割してそれぞれにTCPヘッダを付加して複数のTCPセグメントとします。もとのデータをどのように分割しているかは、TCPヘッダ内のシーケンス番号を見るとわかります。

Webサイトのデータ分割の例
Webサイトのデータ分割の例

Webサイトのデータ分割の例

アプリケーションへのデータの振り分けだけを行う


次の項目のポイント

  • UDPはアプリケーションへのデータを振り分けるためだけに利用するプロトコル
  • IP電話の音声データのようなリアルタイムのデータ転送を行うときにUDPを利用する

UDP

UDPとは?

UDPはPCやサーバなどに届いたデータを適切なアプリケーションに振り分けるためだけの機能を持っているプロトコルです。TCPのような確認はいっさい行いません。

UDPでアプリケーションのデータを送受信するには、UDPヘッダを付加します。UDPヘッダとアプリケーションのデータを合わせてUDPデータグラムと呼ぶことがあります。

UDPヘッダフォーマットは、TCPヘッダフォーマットに比べると極めてシンプルです。

UDPヘッダフォーマット

UDPヘッダフォーマット

UDPを利用する例

UDPでは相手のアプリケーションが動作しているかどうかの確認などせずに、いきなりUDPデータグラムを送りつけて、アプリケーションのデータを送信します。このような性質上、TCPに比べると、余計な処理をしないので、データの転送効率がよいというメリットがあります。その反面、信頼性が高くないというデメリットがあります。UDPの場合は送信したUDPデータグラムが相手のアプリケーションまできちんと届くかどうかはわかりません。もし、データが届いたかどうかを確認する必要があるならば、アプリケーションでそのような仕組みをつくりこみます。

また、UDPには大きなサイズのデータを分割する機能もありません。そのため、転送するべきアプリケーションのデータのサイズが大きいときには、アプリケーション側で適切なサイズに分割しなければいけません。

UDPを利用する典型的なアプリケーションはIP電話です。IP電話の音声データは、IP電話で細かく分割します。IP電話の設定によって異なりますが、1秒間の音声データは50個に分割されるような設定が一般的です。つまり、音声データは1個あたり20ミリ秒分です。IP電話で細かく分割した音声データにUDPヘッダを付加して転送します。

IP電話の音声データの転送

IP電話の音声データの転送

>>第12回:ネットワークの電話帳【ホスト名・DNS・名前解決・再帰問い合わせ・DNSリゾルバ・リソースレコード・ルート・キャッシュ・DHCP・DHCPクライアント】

TOP