第6回 TCP/IPの概要:Windowsネットワークの基礎
現在のWindows OSのネットワーク機能は、すべてTCP/IP上に構築されている。Windows OSの進化と共にネットワーク関連の機能も強化されているが、TCP/IPの基本的な部分はもう何年もあまり変わっていない。今回はTCP/IPの機能についてまとめておく。
前回は、NetBIOSの下位プロトコルである「NBT(NetBIOS over TCP/IP)」について解説した。今回は、このNBTを支えるTCP/IPプロトコルについて見ていこう。
といってもTCP/IPとそれに関連する技術は非常に多岐にわたっており、その全てを解説するのは簡単ではないので、ここではTCP/IPプロトコルの提供する基本的な機能(サービス)について述べるだけにする。より詳しい機能やプロトコルの詳細については関連記事を参照していただきたい。
TCP/IPプロトコルとは?
「TCP/IPプロトコル」という名前からすると、TCPとIPという2つのプロトコルだけしか存在しないと考えるかもしれない。実際には、それを支える補助的ないくつかのプロトコルも含む総称である。TCP/IPのプロトコル階層を図にすると次のようになる。
TCP/IPのプロトコル階層
TCP/IPは基本的には4階層のプロトコルだ。OSIの7階層モデルと照らし合わせると、IPv4やIPv6はネットワーク層、TCPやUDPはトランスポート層に相当する。
・アプリケーション層は、TCPやUDPを使うアプリケーションに相当する。
・トランスポート層では、上位のアプリケーション間での通信を担当する。
・ネットワーク層では、2台のホスト間での通信を担当する。2台のホストが異なるネットワークに属している場合は、このネットワーク層で(ルーターが)中継しながら、パケットを目的のホストまで届ける。
・ネットワークインターフェース層は、イーサネットや無線LANなど、実際の物理的なネットワークインターフェースとそのドライバーに相当する。
アプリケーションからTCP/IPを利用する場合は、図中のトランスポート層にある「TCP」か「UDP」のいずれかのプロトコルを利用して、他のコンピューターと通信することになる。これらのプロトコルの意味は次の通りである。
プロトコル | 用途 |
---|---|
TCP | ・「セッション指向」のサービスの提供。セッション指向とは、あらかじめ2台のコンピューター間で通信回線を確立してから相互に通信する方式。電話のように、最初にダイヤルして相手に接続してから通信する形態のサービス。1対1の通信になる ・2台のコンピューター間で「信頼性のある通信」を行う。信頼性のある通信とは、送信したデータが正しく相手に届くことが保証され、何らかの理由で送信が失敗した場合には自動的に再送信するなどして、確実に相手にデータを届ける通信のこと ・フロー制御やウィンドウ制御などのサポート。通信経路が混んでいる場合は送信量を抑えたり、逆に空いている場合はまとめて送信して送信効率を上げたりする |
UDP | ・「データグラム指向」の通信サービスを提供する。データグラム指向とは、相手に対して、データを一方的に送りつけるような形態の通信。セッションサービスが電話だとすると、データグラムサービスは拡声器などによる一方的な送信に相当する。相手からの応答確認は行わない ・送信失敗時の再試行などは行わない。再試行が必要なら、上位のアプリケーションで対応する ・1対1だけでなく、1対多のマルチキャストやブロードキャスト通信もサポート |
IP | ・TCPやUDPのパケットは、このIPプロトコルによって、目的のホストまで届けられる。 ・別のネットワークアドレスのホストへ送信する場合は、ルーターがIPパケットを中継して、目的のネットワークやホストまで送られる ・TCP/IPのバージョンに応じてIPv4とIPv6がある(TCPやUDPは、IPv4でもIPv6でも変わらない) |
ICMP | ・エラーの通知などに使われる補助的なプロトコル ・TCP/IPのバージョンに応じてICMPv4とICMPv6がある ・通知されるエラーとしては、宛先のホストが見つからない、ルーターの最大中継可能回数を超えた、パラメーターが不正、などがある ・ICMPv6では、IPv6アドレスからMACアドレスを求める機能もサポート(IPv4のARPの機能に相当) |
ARP | ・IPv4アドレスから、イーサネットのMACアドレスなどを調べる ・イーサネットを使ってIPパケットを送信するには、先に通信相手のMACアドレスが分からないと送信できない。それを調べるために使われる |
RARP | ・ARPの逆プロトコル ・イーサネットのMACアドレスからIPv4アドレスを調べる ・RARPサーバーを使って、起動時に自分自身のIPアドレスを取得するために使うことがある |
DHCP | ・IPアドレス情報を取得するためのプロトコル。IPアドレスやホスト名、ドメイン名、デフォルトゲートウェイ、WINSサーバーアドレスなどを取得するために使われる ・ホストは起動時にDHCPを使って自分自身のIPアドレスなどの情報を取得して、自分自身にセットする |
BOOTP | ・IPアドレス情報を取得するためのプロトコル ・DHCPの前身。現在ではもうほとんど使われない |
DNS | ・ホスト名からIPアドレスを求めたり、その逆を行ったりするプロトコルおよびサービス ・DNSでは階層的な名前空間を構築できる ・IPv4だけでなく、IPv6のホスト情報も登録・管理できる |
LLMNR | ・小規模IPv6ネットワーク向けの名前解決プロトコル。ほぼWindows OS限定のプロトコル ・単一のネットワークセグメント環境において、ホスト名からMACアドレスを求めるために使われる ・LLMNR用のサーバーは不要。ローカルのブロードキャストで名前解決。ルーターを越える名前解決はできない |
NBT | ・NetBIOSをTCP/IP上に実装したプロトコル。詳細は前回の記事参照 ・ルーティングできないというNetBIOSの欠点を補い、TCP/IP的に通信できれば、NetBIOS APIを使ったアプリケーションがそのまま使える |
WINS | ・Windowsネットワークで利用されるNBT環境向けの名前解決サービス ・NetBIOS名からIPv4アドレスを取得するためのサービスで利用される ・Windows OSのlmhostsファイルを動的にしたサービス ・NetBIOS名とIPv4アドレスの対応データーベースを保持し、WINSクライアントからの登録や検索要求を処理する |
TCP/IPとその関連プロトコル(主要なもののみ) |
以下、各プロトコルや重要な用語などについて解説しておく。
TCPプロトコル
「TCP(Transmission Control Protocol)」は、2つのアプリケーション間で「セッション指向」で「信頼性のある」双方向通信を実現するためのプロトコルである。「信頼性がある」とは、送信したデータが、送信した順に確実に相手にまで届く、という意味である。
データが相手に確実に届くのは当たり前と思うかもしれないが、ネットワークが混雑していれば通信経路の途中でパケットが大幅に遅延したり、送信順とは異なる順番で届いたり、一部がエラーで化けたり、パケットそのものが廃棄されたりするなど、さまざまなことが起こる可能性がある。このような状況を検出し、必要なら送信元に再送信を依頼したり、どうしても応答が得られないなら、アプリケーションにエラーとして伝える、などの処理を行う。
TCPは例えばファイルサーバーとそのクライアント間の通信や、WebサーバーとWebブラウザー間、メールサーバーとメールクライアント間など、多くのネットワーク通信で使われている。
TCPプロトコル
TCPプロトコルでは、アプリケーション間で仮想的な通信路を開設して、その中で信頼性のある通信を行う。送信したデータは、送った順に相手に届くし、下位ネットワークの混雑などでパケットが消失しても、再送処理が自動的に行われる。上位のアプリケーションで再試行する必要はない。
TCPプロトコルでは、通信に先立って通信路(コネクション)を開設するし、確実なデータ転送を行うために、受信確認の返送やエラー時の再送処理を行う。また通信がスムーズに行えるようにフロー制御やウィンドウ制御(データを効率よく、滞りなく送信するように制御する技術)なども行われる。その分いくらかオーバーヘッドがあるが、通信の信頼性は高い。
●ポート番号
TCP(およびUDP)ではサービスを識別するために、「ポート番号」という16bitの整数値を使っている。例えばWebサーバーは通常TCPの80番ポートで「リッスン(待ち受け)」しており、Webブラウザーは、Webサーバーの80番ポートへ接続することによって通信を開始する。
よく使われるポート番号は、Windows OSなら%windir%\System32\drivers\etcにあるservicesファイルに記述されている。
servicesファイルの内容
これはWindows 7の%windir%\System32\drivers\etcにあるservicesをメモ帳で開いたところ。TCPやUDPの特定のポートを固定的に利用するサービスと、使用しているポート番号、プロトコル(TCPかUDPか)などが記述されている。
UDPプロトコル
「UDP(User Datagram Protocol)」は、2つのアプリケーション間で「データグラム指向」の通信サービスを提供する。データグラム通信では、通信に先立って通信路を開設する必要はなく、データを一方的に送りつけるだけである(応答が必要な場合は、自分でUDPを使って返送する)。通信経路の状態によっては、途中でパケットが消失して届かないこともあるし(必要ならアプリケーションで再送処理する)、送信した順番とは異なる順番でデータが届くといったこともあるが、オーバーヘッドが少なく、1対多の通信(ブロードキャストやマルチキャスト通信)も可能である。。DNSやDHCP、NBTの名前解決などで利用されている。
UDPプロトコル
UDPプロトコルでは、データグラム指向の送信を行う。送信の確実性は保証されないが、事前に通信路を開設する必要がないなど、オーバーヘッドが少なく、1対多のブロードキャストやマルチキャスト通信も可能だ。データが多少欠落しても問題ないような用途で使われる。
ちなみにUDPのこのような特性(データグラム指向で、通信の確実性が保証されない)は、下位のIPプロトコルそのものが持つ特性でもある。UDPでは、IPプロトコルが持つ機能をほぼそのまま利用している。
IPアドレス
「IP(Internet Protocol)アドレス」は、TCP/IPを使ったネットワークにおいて、お互いのシステム(ホストやノードとも言う)を区別するための重要な識別子である。NetBIOSの場合は、各コンピューターには最大15文字の重複しないNetBIOS名を付けてお互いを識別していたが(第4回参照)、TCP/IPネットワークではこのIPアドレスによって通信相手を識別・特定する。
IPアドレスのサイズは、IPv4では32bit、IPv6では128bitである。32bitあれば40億台以上のコンピューターにユニークなアドレスを割り当てることができる。しかし、ネットワークに接続される機器などが増えた結果、現在ではIPv4ではアドレス空間が不足するようになった。そのため、128bit幅のアドレス空間を持つIPv6が新しく開発され、普及し始めている。
TCP/IPでは、IPアドレスを「ネットワークアドレス部」と「ホストアドレス部」の2つに分けて利用する。
IPアドレスの表記方法
IPアドレスのサイズはIPv4なら32bit、IPv6なら128bitである。IPアドレスは「ネットワークアドレス部」と「ホストアドレス部」の2つに分解できる。一般的には、同じネットワークセグメント(グループ)のホストには全て同じネットワークアドレスを割り当て、その中でユニークになるように各ホストにIPアドレスを割り当てる。
・IPv4アドレスは32bitの幅があるが、これを8bit(1byte)ずつ区切って4つの10進数の組として表記するのが一般的である。
・IPv6アドレスは128bitの幅があるが、非常に長いので16進数で4桁ごとに「:」で区切り、さらに連続する「:0:」は省略するなどして表現する。
複数のネットワーク機器をまとめてグループにし(通常はイーサネットの1セグメントが1グループになる。「セグメント」については関連記事参照)、グループごとに異なるネットワークアドレスを割り当てる。そしてグループ内では、機器ごとに異なるホストアドレスを割り当てる。この階層的なIPアドレス構成を取れるところがNetBIOS(の名前空間)との違いだ。NetBIOSでは階層的な名前空間を構築できないため、全てのホストが1つのネットワークに属している必要がある。これに対してTCP/IPでは複数のネットワークを「ルーター」(「ゲートウェイ」とも言う)で相互に接続することにより、大規模なネットワークを構築できる。
●IPアドレスの設定
TCP/IPネットワークが正しく動作するためには、各ホストは、起動時に正しいIPアドレス(ネットワークアドレス+ホストアドレス)を自分自身に割り当てる必要がある。他のホストと重複するようなIPアドレスを付けたり、自分の属しているのとは異なるネットワークアドレスを設定したりすると、他のホストと通信できなくなってしまう。
その昔、IPアドレスを手動で設定していたころは間違ったIPアドレスを付けてしまって通信できなくなるトラブルが頻出していた。だが、現在ではDHCPのような自動設定プロトコルを使うのが一般的である。
DHCPやその前身であるBOOTP、RARPなどの自動設定機能が使えない場合は、Windows OSのIPv4ではAPIPAによって特別なIPv4アドレスが自動的に割り当てられる。IPv6の場合は、IPv6の持つステートレス設定機能によって(Windows管理者のためのIPv6入門 第4回 参照)、重複しない適当なIPv6アドレスが自動的に割り当てられる。
IPアドレスの自動設定
現在のTCP/IPでは、IPアドレスの設定はDHCPなどを使った自動設定が普通である。これはWindows 7のネットワークインターフェースの例。
(1)これを選択すると、DHCP(やBOOTP)による自動設定が有効になる。IPv4でもIPv6でも構わない。
(2)手動で設定することも不可能ではないが、トラブルの元なので望ましくない。
IPプロトコル
「IP(Internet Protocol)」プロトコルはネットワーク層のプロトコルであり、2つのホスト間でのデータグラム指向のパケットの送受信を行う。TCPやUDPは、このIPプロトコルを使ってその機能を実装している。もう少し詳しく言うと、IPプロトコルでは2台の「ホスト間」での通信を担当し、TCPやUDPは、そのホスト上で動作している「アプリケーション間」での通信を担当する。
IPプロトコル
IPプロトコルでは、2台のホスト間でIPパケットをやりとりする(TCPやUDPがこのIPプロトコルを利用して、パケットをやり取りする)。
IPパケットの最大長は64Kbytesだが、イーサネットの最大パケット長は通常は1500bytesしかない。それを超えるようなデータサイズの場合は、複数のパケットに分解して送信し、受信した側で再合成する、といった機能もサポートしている。
また別のネットワークアドレス(別のネットワークセグメント)へ送信する場合は、「ルーター」に中継を依頼する。ルーターは受信したIPパケットの宛先IPアドレスを見て、適切なネットワークセグメントや他のルーターへ転送する。転送を繰り返すことによって、目的のネットワークまでパケットが送られる。
IPルーティング
TCP/IPで通信する場合、通信パケットに埋め込まれた宛先IPアドレスに基づいて通信経路が決定される。同一ネットワーク内で通信する場合は、後述するARPプロトコルで通信先ホストのMACアドレスを求め、そのホストに対して直接イーサネットなどでパケットが送信される。
異なるネットワークアドレス上のホストへ送信する場合は、ARPプロトコルでルーターのMACアドレスを見つけ、ルーターへパケットの送信を依頼する。パケットを受信したルーターは、宛先のネットワークアドレスに応じて適切なネットワークや他のルーターへさらにパケットを送信(転送)する。こうしてパケットはいくつものルーターを介して、最終的な宛先ネットワークまで届けられる。
MACアドレスを解決するプロトコル
IPプロトコルはネットワーク層のプロトコルであり、実際にIPパケットを送受信するためには、その下のデータリンク層(ネットワークプロトコル階層で言えば第2層)のプロトコル、例えばイーサネットや無線LAN、Bluetoothなどを利用することになる。
TCP/IPではIPアドレスで通信相手を指定するが、イーサネットではMACアドレスで通信相手を指定しなければならない。となると、IPパケットを他のホストやルーターへ送信するためには、まず通信したい相手のMACアドレスを調べる必要がある。TCP/IPでは、相手のIPアドレスからMACアドレスを調べることを「L2アドレス解決」とか「MACアドレス解決」などという。
IPv4の場合は、この解決を行うプロトコルとして「ARP(Address Resolution Protocol)」と「RARP(Reverse ARP)」がある。IPアドレスからMACアドレスを調べるのがARP、逆にMACアドレスからIPアドレスを調べるのがRARPである。
IPv6の場合は、ICMPv6に含まれる「近隣探索(ND:Neighbor Discovery)」機能を使う。
補助的な通信を行うICMPプロトコル
TCP/IP通信でエラーなどが発生した場合、それをIPパケットの送信元に伝えるために使われるのが「ICMP(Internet Control Message Protocol)」という補助的なプロトコルである。IPv4とIPv6に応じて、ICMPv4とICMPv6がそれぞれ定義されている。例えばpingコマンド(関連記事参照)はICMPのEchoコマンドを使って実装されている。
ホスト名とIPアドレスの変換(名前解決)のためのプロトコル
TCP/IPでは各ホストにはIPアドレスが割り当てられているが、人間にとっては32bitや128bitのIPアドレスは覚えにくく、扱いづらい。やはり、アルファベットや数字などを組み合わせた文字列によるホスト名が使えるのが望ましい。
そこで用意されたのがホスト名とIPアドレスを変換する(名前解決する)ための仕組みである。例えばユーザーが「http://www.example.co.jp/」と入力すると内部では「http://192.168.1.2/」や「http://[2001:db8:baab:1000:3:4:5:6]/」(これはInternet ExplorerでIPv6アドレスを指定する場合の表記方法)のようにIPアドレスに変換され、通信が行われる。ユーザーはIPアドレスを意識せずにTCP/IP通信が行えるようになる。
ホスト名とIPアドレスを変換するための仕組みやプロトコルとしては、IPv4向けにはhostsファイルやDNSv4プロトコル、IPv6向けにはDNSv6やLLMNR(Link-Local Multicast Name Resolution)プロトコルなどがある。
今回は、TCP/IPプロトコルの概要と、関連するプロトコルについて簡単にまとめてみた。現在のWindowsネットワークではNetBIOSはもうほとんど使われておらず、TCP/IPさえ理解していればよいだろう。
TCP/IPについてより詳しく知りたい場合は、冒頭で紹介しているリンク先の記事(特に基礎から学ぶWindowsネットワークの「第6回」以降)も参照していただきたい。少し古い記事だが、TCP/IPの基本的な機能は最新のWindowsでも同じなので、問題ないだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.