TCP/IP(Transmission Control Protocol/Internet Protocol):Tech Basics/Keyword
開発から40年以上経過するも、いまだ使われ続けているインターネットの基幹プロトコルであるTCP/IP。その概要を解説。
「TCP/IP(Transmission Control Protocol/Internet Protocol)」は、コンピュータやアプリケーション同士の通信のために、現在最も多く使われている基幹ネットワークプロトコルである。インターネット、イントラネットを問わず、組み込み機器からPC、サーバ、スーパーコンピュータに至るまで、あらゆるコンピュータや通信機器がTCP/IPを使って通信やサービスを実現している。
TCP/IPのプロトコル階層
「TCP/IP」という呼び方は、「TCP」と「IP」という2つの中核となるプロトコルから名付けられている*1。だが実際には「UDP」「ICMP」「ARP」など、幾つかの補助的なプロトコルも含む総称である。
*1 TCP/IPという呼び方について
TCP/IPの原型は「Transmission Control Program」という、ARPAnet(米国防総省が開発していたネットワークシステム)上でストリーム型の通信を行うためのプログラムにある。その後、さまざまシステム上に実装するために「TCP(Transmission Control Protocol)」として仕様がまとめられ、さらに下位のプロトコルが「IP(Internet Protocol)」として分離された結果、まとめてTCP/IPと呼ばれるようになった。UDPが追加されたのは、そのさらに後である。
TCP/IPのプロトコル階層
TCP/IPは概念的には4階層のプロトコルだ。アプリケーションが利用するのがTCPかUDPで、IP(IPv4/IPv6)やICMP、ARPなどはTCPやUDPのパケットを通信相手に届けるために使われる。TCP/IPに関する仕様はRFC 7805などのRFCドキュメントを参照のこと。
各階層の役割は次の通りである。
- アプリケーション層は、TCPやUDPを使うアプリケーションに相当する
- トランスポート層では、上位のアプリケーション間での通信を担当する。TCPやUDPが該当する
- ネットワーク層では、2台のコンピュータ間での通信を担当する。IPが該当する
- ネットワークインタフェース層は、イーサネットや無線LANなど、実際の物理的なネットワークデバイスやインタフェースとそのドライバに相当する
TCP/UDPとIPのそれぞれの役割
TCP/IPを使うアプリケーションは、TCPかUDPのいずれかのプロトコルを利用して、他のコンピュータ上にあるアプリケーションと通信する。
IPは、TCPやUDPが内部的に利用するためのプロトコルであり、2台のコンピュータ間での通信を担当する。
TCP/UDPとIPの役割
アプリケーションはTCPかUDPを使ってデータを送信する。すると、そのデータはIP層に渡され、IPルーティング(後述)の機能などを使って相手先まで届けられる。相手先まで届いたデータは上位のTCPやUDPに渡され、そこから最終的な目的のアプリケーションにまで届けられる。IPルータは、IP層でIPパケットを中継する機能/装置。インターネットは、多数のTCP/IPローカルネットワークをIPルータを介して相互に接続したもの。
TCPとUDPは通信方法が少し異なっており、目的に応じてどちらかを利用する。
- TCP―1対1の「信頼性のある」通信を実現するが、通信に必要なコスト(手間)はやや高い
- UDP―1対1もしくは1対多で、「信頼性のない」通信を実現する。通信コストは非常に低い
以下、もう少し詳しく見ていく。
信頼性のある通信を実現するTCP
「TCP(Transmission Control Protocol)」は、2つのアプリケーション間で、「信頼性のあるコネクション型の通信」(ストリーム型とも言う)を行うためのプロトコルである。WebサーバとWebブラウザ間、メールサーバとメールクライアント間など、ほとんどのネットワークサービスで利用されている。TCPの機能や特徴は次の通り。
- まずアプリケーション間で双方向の通信路を開設し、それを使って相互に通信する
- 「信頼性のある通信」機能を提供する。信頼性のある通信とは、送信したデータが送信した順番で正しく相手にまで届くことが保証され、何らかの理由で送信が失敗した場合には自動的に再送信するなどして、確実に相手にデータが届くことを保証する通信のこと
- 通信経路が混んでいる場合は送信量を抑えたり、逆に空いている場合はまとめて送信したりして送信効率を上げる
TCPプロトコル
TCPプロトコルでは、最初にアプリケーション間で仮想的な通信路を開設し、それを使って信頼性のある通信を行う。ただし通信路の開設や終了処理、データを送信するたびに相手に届いたかどうかの確認や失敗時の再送信などの処理が必要なため、通信のコストは低くはない。通信する相手のアプリケーションは、IPアドレスとポート番号で指定する。例えば標準的なWebサーバではTCPのポート80番を使う。
TCPが信頼性のある通信路を実現してくれるため、アプリケーションはネットワークの状態に関係なく(混雑で遅くなったり、送信が失敗したりしても気にせずに)、データをやり取りできる。
データグラム指向の通信を行うUDPプロトコル
「UDP(User Datagram Protocol)」は、「信頼性のないデータグラム指向の通信」を行う。「信頼性がない」とは、送信したパケットの到着順序が入れ替わったり、(混雑などによって)消失したりする可能性があるということだ。
UDPプロトコルの機能は次の通りである。
- 「データグラム指向」の通信サービスを提供する。データグラム指向とは(コネクションレス型とも)、相手に対して、データを一方的に送りつけるような形態の通信のこと
- 相手に正しく届いたかどうかは分からないし、実際に届いていなくてもデータの再送信処理は行わない
- 1対1だけでなく、1対多のマルチキャストやブロードキャスト通信も可能
UDPプロトコル
UDPプロトコルでは、データグラム指向の送信を行う。送信の確実性は保証されない半面、あらかじめ通信路を開設する必要がないなど、オーバーヘッドが少なく高速で、1対多のブロードキャストやマルチキャスト通信も可能だ。IPの機能をほぼそのまま利用できるようにしたプロトコルである。
TCPと比較すると、相手にデータが届いたかどうかの確認や、通信路の開始/終了、送信失敗時の再送信処理などがない分、高速・軽量である。エラー検出や失敗時の再送信が必要なら、アプリケーション自身で対応する。
相手と確実に通信できるかどうか分からないUDPだが、用途によってはこれでも十分である。例えばDNSサービスのパケットでは、単純な問い合わせとその応答をUDPパケット1つずつで済ませている。またビデオ配信やオンラインゲームのような用途では、全てのデータが確実に届くことよりも、リアルタイム性の方が重要だろう。そんな用途にはUDPの方が向いている。
2台のコンピュータ間での通信を担当するIPプロトコル
TCPやUDPで送信するデータは、実際にはIPプロトコルを使って通信相手のコンピュータにまで届けられる。
IPプロトコルではネットワーク上の2台のコンピュータ間で片方向の「データグラム指向」の「ベストエフォート」通信を行う。
ベストエフォートとは、相手に届くように最善の努力はするが、場合によっては(例:ネットワークの混雑時など)送信に失敗することもある、という通信形態のことである。送信失敗時の再試行は、必要なら上位プロトコル(TCPの場合)か、アプリケーション自身(UDPの場合)で行う。
●IPルーティング
TCP/IPネットワークにつながっているコンピュータには、全て「IPアドレス」という固有の識別用の情報が割り当てられている(利用するIPアドレス体系の違いにより、IPv4とIPv6の2種類がある)。連続するIPアドレスを持つコンピュータは何台かずつまとめてネットワークグループを構成し、そのグループ間を「IPルータ」が相互に接続している。
IPプロトコルの役目は、このような構成になっているネットワークを使って、2台のコンピュータ間でデータをやりとりすることである。
同じネットワークグループ内にあるコンピュータ同士なら直接相互に通信してパケットを届ければよい。
通信相手が異なるグループにいる場合は「IPルータ」に依頼して、まずは隣接するネットワークへデータを送信する。データを受け取ったIPルータは、宛先が自分の所属しているネットワークグループ内にいるかどうかを調べ、存在しなければ、さらに隣接するIPルータへ転送を依頼する。
このようにしてIPルータ同士でパケットを順次バケツリレー方式でやりとりすることにより、目的のコンピュータまで届けられる。
IPプロトコルによるIPパケットの送信と中継
送信の相手先はIPアドレスで識別する。同一ネットワーク上のコンピュータ同士ならイーサネットなどを使って直接送信すればよい。そうでない場合は、IPルータに送信を依頼する。IPルータは、必要ならさらに隣接するIPルータに送信を転送する。これを繰り返して目的のコンピュータまでデータを届ける。
(1)同じネットワーク上にいる相手に送信する場合は、下位のイーサネットなどを使って直接送信する。
(2)同じネットワーク上にいない相手に送信する場合は、IPルータに転送を依頼する。
(3)送信する相手がさらに別のネットワーク上にいる場合は、そこへつながっているはずのIPルータへ再転送する。こうやって目的とする通信相手がいるネットワークまで転送される。
TCP/IPは1970年代中頃に開発が開始され、それから既に40年ほど経っているが、現在でもまだ使われ続けている。ネットワーク速度の高速化や接続されるコンピュータ数の増加などに応じて今でも改良が続けられており、今後もその重要性は変わらず、使われ続けるだろう。
■関連リンク
- Windowsネットワークの基礎 第6回「TCP/IPの概要」
- 基礎から学ぶWindowsネットワーク 第6回「TCP/IP始めの一歩」
- @IT eBook「Windows管理者のためのIPv6入門」電子書籍版
Copyright© Digital Advantage Corp. All Rights Reserved.