第4回 TCP/IPプロトコルの概要詳説 TCP/IPプロトコル(4/5 ページ)

» 2000年08月10日 00時00分 公開
[岡部泰一]

TCP(Transmission Control Protocol)プロトコル

 TCP(Transmission Control Protocol)プロトコルは、IPを利用して、ネットワーク アプリケーションに対して信頼性のあるストリーム サービスを提供するためのプロトコルである。

 1つのコンピュータで複数のネットワーク アプリケーションを実行する場合、IPではコンピュータ同士の通信機能しか提供されていないため、コンピュータに届いたパケットをどのアプリケーションで処理すればよいのかがわからない。そのためTCPでは、「コネクション(connection)」と呼ばれる、アプリケーション間の通信のための仮想的な回線を提供している。

 コネクションとは、2つのプロセス間で通信するために使用する専用の通信路のことで、必要ならば1つのコンピュータで同時に複数のコネクションを利用することもできる(たとえばサーバ アプリケーションでは、多数のクライアントからの要求を処理するために、同時に複数のコネクションを使用して要求を受け付ける)。電話にたとえると、電話の利用者がプロセスにあたり、通話中の電話回線がコネクションということになる。そして電話機に相当する「エンド ポイント(end point、端点)」、電話機からの電話線のさしこみ口に相当する「ポート(port)」というものがある。ポートは1つのコンピュータに複数存在し、それぞれを区別するために「ポート番号」と呼ばれる番号が付いている。ポートは1つのプロセスが占有して使うため、複数のプロセスが同時に同じポートを使うことはできない。「エンド ポイント」はネットワーク上のコンピュータを特定するIPアドレスと、そのコンピュータ上のポートを特定するポート番号の組み合わせによって表される。

 TCPを利用して通信を行うプロセスは、最初にポート番号を指定してポートを確保する。ポートを確保することによって、プロセスはエンド ポイントを持ち、通信相手のエンド ポイントとの間で「コネクションを確立(establish)する」ことができる。コネクションとは、2つのプロセスのエンド ポイントの組み合わせによって管理される、プロセス間の仮想的な回線のことであり、コネクションが確立している間は、2つのプロセスはコネクションを利用して通信を行うことができる。

コネクション

コネクションとは、2つのエンド ポイント(IPアドレスとポート番号の組)の組み合わせによって管理される、プロセス間の通信路である。


 IPを利用してデータを送受信する場合は、IPデータグラムで一度に送信できるサイズに制限があるため(このサイズ制限は、下層にあるEthernetなどのフレーム サイズの最大長の制限とは異なる)、大きなデータは分割して送る必要がある。それに、分割したデータは送信した順に相手に届くとは限らないため、順番を管理する何らかの機構が必要になる。このような問題を解決するために、TCPでは「ストリーム サービス(stream service)」を提供している。

 ストリーム サービスとは、2つのアプリケーションが、お互いに、連続したデータ列を送受信するための機能である。コネクションを通じて送信したデータ列は、そのままの並びのままで相手に届くことが保証されている。TCPでは、このようなデータ列の並び順を管理するために、データ列のオクテット(octet:8bitのデータを表す単位*1)ごとに先頭から順番にシーケンス番号を付けている。

*1 ネットワークの世界では、正確に8bitを表す用語として、「バイト(byte)」ではなく「オクテット(octet)」という用語をよく使う。これは、過去のコンピュータにおいて、バイトという単位が8bit以外を表すことに使われた経緯があり(文字コードを格納するのに最も都合がよいサイズをバイトとして扱っていたが、これが6bitとか9bitというコンピュータがあった)、混乱を避けるためにネットワークの世界ではオクテットと言う単位を使うことが多い。


 TCP層では、上位層から渡されたデータ列を効率的に送信できるサイズに分割して、それをIP層に順次渡す。このIPに渡すデータのまとまりを「セグメント(segment)」と呼び、各セグメントには、そのセグメントに含まれるデータの先頭オクテットのシーケンス番号が付けられている。セグメントを受信したコンピュータでは、そこに付けられているシーケンス番号を元にしてデータ列を復元し、それを上位のアプリケーションに渡す。TCPでは、このようにしてアプリケーションがやり取りするデータ列の並びが正しくなっていることを保証している。

シーケンス番号

TCPはデータ列のオクテットごとに先頭から順番にシーケンス番号を付けている。データ列をセグメントに分割して送信するときに、そのセグメントに含まれるデータの最初のシーケンス番号を通知する。受信側はそのシーケンス番号を元にデータ列を復元する。


 このシーケンス番号の管理に加えて、さらにTCPでは、「確認応答(acknowledgement)」と「再送(retransmit)」を利用して、(データを確実に相手に届けるという)信頼性を確保している。確認応答とは、セグメントを受信したコンピュータがセグメントを送信したコンピュータに対して送り返す応答のことである。セグメントを送信したコンピュータは、一定時間内に確認応答が返ってこなければ、そのセグメントが宛先のコンピュータに到達できなかったと判断し、そのセグメントを再送する(この再送処理のため、場合によっては同じセグメントが2つ以上届くこともあるが、その場合は余分なデータは無視される)。

 TCPはこれらの機能を提供したうえで、効率のよい通信を行うための各種の技術を取り入れた複雑なプロトコルである。

確認応答と再送

TCPでは信頼性を提供するために確認応答と再送を利用する。送信したセグメントに対する確認応答が一定時間内に戻ってこないと、そのセグメントは途中で紛失したものと判断し、同じセグメント データを再送する。これにより、通信の信頼性を確保している。


UDP(User Datagram Protocol)プロトコル

 TCP/IPプロトコルには、TCPと並んでもうひとつ重要なプロトコルとして、UDP(User Datagram Protocol)というプロトコルがある。UDPは、アプリケーションからIPの機能をほぼそのまま利用するために用意されたプロトコルであり、IPにプロセスを区別するためのエンド ポイントを導入しただけの比較的単純なプロトコルである。そのため、UDPのデータグラムは、IPと同様に、送信の途中で紛失したり、到着が遅れたり、順番が入れ替わって伝送されたりすることがある。UDPを利用するアプリケーションは必要に応じて、これらの事態に対処する必要がある。つまり、データグラムの紛失の検出や通知、再送処理、順番の管理などの処理を、アプリケーション自身で行わなければならないのである(逆にいうと、このような「信頼性」が不要ならば、対処しなくてもよい)。TCPでは、このような処理をTCP自身が引き受けてくれるが、データの到着が遅れるとそのデータの到着を待ったり、データの確認応答の送信や再送処理を行ったりするため、UDPと比べるとオーバーヘッドがある。リアルタイムに音声や映像を送るようなアプリケーションでは、一部のデータが欠落しても、一瞬音声や画像が途切れたり、多少劣化したりするだけなので、大きな影響はない。それよりもリアルタイムにデータが届くということのほうが重要であり(欠落したデータが遅れて届いても、音声や画像を後戻りして再生するわけにはいかない)、このような用途ではTCPよりもUDPが適している。

 また、IPでは複数の相手にデータを送ることができるのだが(このような通信形態を「ブロードキャスト(broadcast)」とか「マルチキャスト(multicast)」と呼ぶ)、TCPはコネクションを利用した通信なので一度の送信で複数の相手にデータを送ることができない(「ユニキャスト(unicast)」という)。これに対してUDPでは、IPの機能をそのまま利用しているので、複数の相手にデータを送ることができるという利点もある。

 以上のような特性のため、UDPは、信頼性よりもリアルタイム性が重要なアプリケーションや、複数の相手に通知を行うようなアプリケーションなどで使われることが多い。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。