このコンテンツは、たまに掲示板に遊びに来てくれる『きいろさん』のご質問内容によりスタートしたコンテンツです。
みなさまは、インターネットプロトコルってご存知ですか?すでにある程度の知識を持っていて、検索してこのページを見つけた方ならすぐにわかると思いますが、何気なく立寄ってこのページを開いた方では、まるでわからないというケースもあることでしょう。
さて、インターネットプロトコルは、省略して「IP」と書かれることが多く、インターネットへの接続をご自分でなさった方でしたら、「TCP/IP」という文字を見かけたことがあるかと思います。このTCP/IPの後ろ側のIPこそ、インターネットプロトコルと呼ばれるものです。このページでは、その「インターネットプロトコルとはいったい何をするものなのか」、と言った部分を技術的に解説してみようと言うページです。予備知識もなく読み解くことはさすがに難しいと思いますので、もし予備知識が必要な方は、別途ちいさなねっとわ?くで公開中のネットワーク入門をご覧いただいてからお読みいただけるとそれなりにスムーズに理解することが出来ると思います。準備はよろしいですか?では、始めましょう。
インターネットプロトコルとは、その名の通りプロトコルですから、通信手順と言うことになります。このプロトコルが何をしているかといいますと、「データを目的の場所まで運ぶ」というお仕事をしています。平たく言うと、電車に乗って目的地まで旅行するための手順を取り決めたものと考えてもらえばわかりやすいかと思います。電車ですと、目的地を決めて、駅まで行き、切符を買い、改札口に行って切符を切ってもらい、電車に乗って、必要であれば乗り換えをして、目的地で電車を下り、改札口で切符を渡すという手順を踏みますね。インターネットプロトコルでも、実はこれと同じような事を行っています。ま、なにはさておき、次の節からは、以上のプロトコルの目的を踏まえた上で、予備知識を交えながら話を進めてみましょう。
そもそもそのTCP/IPというものは、1969年ごろ構築された、現在のインターネットの前身であるARPANET*1と呼ばれるネットワークで、技術者間で情報を共有する為に開発が始められたプロトコルです。ARPAとは、米国高等研究計画局のことで、その後米国防総省高等研究局DARPA*2となり、インターネットの戦略的な技術確立のための後方支援を行う機関となり、TCP/IPの仕様策定に大きく関わりました。そのARPANETでの研究のひとつとして1975年ごろTCP/IPが誕生し、様々な試行錯誤を繰り返しながら、1982年頃仕様が決定しました。現在もなお、新たな仕様を追加するなどの形で、少しずつ変化を見せています。これらの仕様はIETF*3の発行するRFC*4という形でドキュメント化され、誰でも閲覧が可能となっています。
私達の扱うLANにおいてもインターネットとの接続性が重要視される現在、ご家庭やイントラネットのLANでも標準プロトコルとしてTCP/IPを用いることが多くなりました。
*1: ARPANET Advanced Research Projects Agency Network
*2: DARPA Defense Advanced Research Projects Agency
*3: IETF Internet Engineering Task Force
*4: RFC Request For Comments
インターネットなどの大規模なネットワークでは、ネットワークへ接続するための媒体や各種プロトコルなど単純に思い浮かべただけでも、様々な仕様が混在します。それぞれが好き勝手な仕様を持ち出すと、あるネットワークには接続できるけど、こっちへは接続できないなど、各端末やネットワーク間での親和性にも欠けてしまいます。そこで、ネットワークを階層化することにより、それぞれを独立した仕様で作りつつも、親和性を確保することが考え出されました。
ネットワーク関連のWebサイトを探し回っていると、必ず出てくるのが「ネットワーク層」や「データリンク層」、はたまた「物理層」などの言葉です。これを世間様ではOSI*1基本参照モデルと呼んでおりますが、これはISO*2によって決められた通信仕様の階層構造のことで、TCP/IPに限らず、ネットワーク通信の為の標準的なレイヤー定義をあらわしています。また、TCP/IPでは、次に示す表のとおり、OSIの標準とは多少異なる階層構造を構成しています。
階層構造のもたらすメリットとしては、例えばEthernetと電話線を考えてみるとすぐにわかります。それぞれ物理的な媒体はまったく違うものなのに、どちらもインターネットへ接続し、それぞれ通信を交わすことが出来ます。それは、各物理層の仕様をそれぞれ媒体毎に定義しているものの、物理層間で交わされる通信データの中にインターネットプロトコルで必要なデータを含めることが出来るようにしてあるためです。受け取った側では、インターネットプロトコルの内容に適した反応をすればよく、その結果を再び自分が接続している媒体へ返せば良いようになっています。
*1: OSI Open System Interconnection
*2: ISO International Organization for Standardization
OSI参照モデル | TCP/IP | 概要 |
---|---|---|
7)アプリケーション層 | アプリケーション層 (FTP,SMTP,HTTP,POP3) | 各TCP/UDPなどのアプリケーションの通信仕様が定義されています。 |
6)プレゼンテーション層 | ||
5)セッション層 | ||
4)トランスポート層 | トランスポート層 (TCP,UDP) | 相手先への到達性を確認したり、パケットに含まれるポート番号の識別をし、上位層との仲介などをします。 |
3)ネットワーク層 | インターネット層 (IP,ICMP) | IPアドレスなどの審査して相手先へデータを転送する手段を提供します。 |
2)データリンク層 | ネットワークインターフェース層 (デバイスドライバ) (ハードウェア) | ネットワークからのデータを送受信し、MACアドレスの識別やエラー制御をします。 |
1)物理層 |
OSI基本参照モデルでいう物理層とは、わたしたちの扱うLANなどでは、Ethernet仕様に準じた機器のLANアダプタなどの物理的なネットワーク機器と電気的な流れのことを指します。TCP/IPのネットワークインターフェース層では、ハードウェアを含めたデバイスドライバまでを指します。通常、どこかのノードへデータを送ろうとしたとき、送信されたイーサネットフレーム(データリンク層で用いられるデータの単位)は、大まかに以下の様な情報を含んでいます。このとき、インターネットプロトコルのデータは、データ部に含まれています。
プリアンプル | 宛先MACアドレス | 送信元MACアドレス | データ |
プリアンプルとは、イーサネットフレームの先頭を意味するポイントです。この後ろから、データリンク層に該当するデータが続きます。データリンク層に割り当てられているMAC*1アドレスとは、物理層のLANアダプタなどのネットワーク機器を識別するための住所のようなもので、原則として、世界で唯一の番号です。通常媒体を通して直接通信をする場合に、個々を識別するために用いられます。このとき、送信されたイーサネットフレームは、直接接続されているネットワーク全体(セグメントと呼びます)にのみ配信されます。セグメント内の各ノードは、宛先に指定されているMACアドレスが、自分のものである場合にデータを取りこみ、上位のネットワーク層(インターネット層)へデータを流します。
*1: MAC Media Access Control
インターネット層では、ネットワークインターフェース層から送られてきたパケットを審査し、必要であれば別のネットワークへ転送するなどの処理を行います。このページの本題であるインターネットプロトコルは、この層に該当するプロトコルです。ネットワークインターフェース層では、宛先にMACアドレスを使っていましたが、インターネット層ではIPアドレスを用いて個々を識別します。
インターネット層での最も大きな仕事としてはIPアドレスを使って目的のノードまでデータを届けることです。このとき注意しなくてはいけないのは、MACアドレスはネットワークインターフェース層での通信に用いられるもので、IPアドレスとはARP*1によって関連付けられるものの、まったく等価ではないということです。このように、インターネット層とネットワークインターフェース層をわけることにより、ハードウェアに依存しない通信が実現されることとなり、その応用範囲を広げることができるようになっています。簡単に言うと、IPのデータを運べるのであれば、媒体は何でもかまわないと言うことになりますね。
*1: ARP Address Resolusion Protocol
トランスポート層では、インターネットプロトコルによって運ばれてきたデータを解析し、信頼性を持たせるとともに、より上位のアプリケーションなどへデータを渡したり、その逆の処理をします。アプリケーション層の各アプリケーション(WebサーバーやSMTP/POP3サーバーなど)には、それぞれ個別のポート番号が設定されており、TCP*1やUDP*2などの働きにより、それぞれのポートへデータが中継されます。
*1: TCP Transmisson Control Protocol
*2: UDP User Datagram Protocol
TCPやUDPの働きにより運ばれてきた情報をもとに、通信のために必要な処理を行った後、結果をTCPやUDPへ返します。結果を受け取ったTCPやUDPは、今度はインターネット層へデータを中継し、インターネット層では、さらにネットワークインターフェース層へ働きかけ、アクセス元のクライアントへデータが運ばれていくことになります。
なにはさておき、ここでは予備知識としてネットワーク機器を扱う際に必須となる2進数について考えてみましょう。
私たちの指は10本ありますので、人がものを数えるときは普通1?10で数えます。実際には一桁あたり0から9までの10種類の数字を使ってあらわしますが、この数え方を人呼んで10進法と呼びます。ひとつの位が9まで進むと次の桁へ繰り上がり、以降この繰り返しとなります。これに対してパソコンなどの電子機器では、2進法と呼ばれる数え方を使います。その2進法で使われる2進数とは、一桁あたり0と1だけの非常に単純な数字で、これを電子機器の中では電気的にonとoffの状態であらわしています。この一桁あたりの事を1ビットと呼びますが、パソコンの中では、これを例えば+5Vと0Vなど、電圧の違いであらわします。2進数ではonとoffの2つの状態しかないため、極端に言うと電圧の有無だけで全ての数字を表現できることになり、電子機器であるコンピュータにはとても都合が良かったのです。逆に同じような仕組で10進数を実現するには、実に十種類の電圧変化を識別する必要があり、前述の0/5Vであらわすとなると、実に50Vもの高電圧を必要としてしまいます。また、実際には電圧の誤差も考慮しなくてはなりませんので、現実的ではありません。この2進数の節では、この一見難解な2進数をネットワークの世界ではどのように扱うのかを見てみましょう。
2進数では、0、1と数えた後は、桁が繰り上がって10、11と続いて行きます。10進数と2進数の対応は次の表のようになります。
10進数 | 2進数 | 10進数 | 2進数 | |
---|---|---|---|---|
0 | 0 | 10 | 1010 | |
1 | 1 | 100 | 1100100 | |
2 | 10 | 255 | 11111111 | |
3 | 11 | 511 | 111111111 |
2進数では、前述の通り2つの状態しかありませんので、例えば2進数11111111で表すことのできる10進数は、2*2*2*2*2*2*2*2、つまり28で256(0?255)となります。同様に、全部で32ビットのIPアドレスで割り当てられる最大のノード数は、232で、4,294,967,296になることがわかります。
数字を桁数で表現する方法を位置取り表現法と呼びますが、例えば10進数「25」を位置取り表現法であらわすと、以下のようになります。
25 = 2 * (10 ^ 1) + 5 * (10 ^ 0) = 2 * 10 + 5 * 1 = 25 |
つまり「対象桁の数字 * (10進数 べき乗 桁-1)」ということになります。同じように、2進数でもこの表現方法を用いることにより対象となる数字から10進数へ変換することができます。
11001= 1*(2^4) + 1*(2^3) + 0*(2^2) + 0*(2^1) + 1*(2^0) = 1 * 16 + 1 * 8 + 0 * 4 + 0 * 2 + 1 * 1 = 16 + 8 + 1 = 25 |
2進数を位置取り表現法であらわした場合、掛ける数は0か1しかありませんので、これを「重み」と呼びます。1の個所は重みが有り、0の個所は重みが無いと表現しますが、重みの無い個所は計算しても0なので、計算する必要がありません。
前節では2進数を10進数に変換しましたが、逆に10進数を2進数にするには10進数の数字を基数(2進数では2)で割り、その余りを逆順に列記していくと2進数となります。
25÷2=12 余り 1 12÷2= 6 余り 0 6÷2= 3 余り 0 3÷2= 1 余り 1 1÷2= 0 余り 1 |
割り切れなくなるところまで計算した結果、上記のようになりました。結果、下から順に並べていくと「11001」となりました。これで、前回の2進数を10進数に直す方法と合わせ、2進数と10進数を自在に変換することができるようになります。
おまけですが、2進数と10進数を変換するスクリプトを用意しております。上記相互変換の仕組をVBScriptにて表現しておりますので、よろしかったらご覧下さい。
Download: 【cnv.lzh】
2進数を使った論理演算には、いくつかの種類がありますが、ここでは、ネットマスクを使ったネットワーク分割などに利用する論理積をご紹介します。以下の表から、A、Bともに1であるときだけCが1になることがわかります。これは単なる規則として、形で覚えていただいてかまいません。
A | B | C=A・B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
ここまでにも何度となく登場した「IP」についてですが、これはInternet Protocol(インターネットプロトコル)の略で、インターネット層(ネットワーク層)に属するプロトコルの名称です。主にネットワーク内の経路制御に用いられます。経路制御とは、目的の場所までデータを運ぶ仕組みのことを意味しますが、この際に送信元や送信先を識別するときには「IPアドレス」が用いられます。前述の電車を例に取ると自宅や駅、ターミナルに該当する場所をあらわすものです。IPアドレスとはIP通信による経路制御において、各ノード(ここでは仮に個々の装置と考えておいてください)を識別するためのアドレス(=住所)のようなものです。IP通信では、IPヘッダと呼ばれる領域に送信元・送信先IPアドレスを記録し、決められた経路を通って目的の場所まで情報が運ばれて行きます。
IP通信を行うには、データにIPヘッダを付けて行われます。
VER | IHL | Type Of Service | Total Length | I P H e a d e r | ||||
Identification | Flags | Flagment Offset | ||||||
Time To Live | Protocol | Header Checksum | ||||||
Source Address | ||||||||
Destination Address | ||||||||
Options | Padding | |||||||
Data | ||||||||
<---------- 32bit (4 octed) ----------> |
○VER:Version/Size:4bit
IPヘッダのバージョン番号を記載します。ちなみにIPv4*1では4、IPv6*2では6となります。
○IHL:Internet Header Length/Size:4bit
4オクテットを単位としてIPヘッダの長さをあらわします。オプション部分を持たないIPヘッダは、最小値で20オクテットとなります。このときIHLに設定される値は5になります。
○TOS:Type of Service/Size:8bit
IPのサービスのタイプを設定します。
○TL:Total Length/Size:16bit
1オクテットを単位として、IPデータグラム(IPヘッダ+データ)の長さをあらわします。
○ID:Identification/Size:16bit
IPデータグラムの識別子で、分割送信時の復元などに用いられる。
○FL:Flags/Size:3bit
パケット分割に関する制御に用いられます。
○FO:Fragment Offset/Size:13bit
分割されたデータのオリジナルの位置をあらわします。
○TTL:Time To Live/Size:8bit
IPデータグラムの生存時間。最大生存時間は255秒。
○PROT:Protocol/Size:8bit
データ部に含まれる上位層のプロトコルの種類をあらわします。
○HC:Header Checksum/Size:16bit
IPヘッダが壊れていないかを検査するための値。
○SRC:Source Address/Size:32bit
送信元のIPアドレス。
○DST:Destination Address/Size:32bit
送信先のIPアドレス。
○OPT:Options/Size:可変長
デバッグやテスト用に使用する。
○PAD:Padding/Size:可変長
オプションが32ビットの整数バイトならなかった場合の付加ビット。
*1: IPv4 Internet Protocol Version 4
*2: IPv6 Internet Protocol Version 6
IPアドレスの目的は前述の通りですが、一般の方の目に触れるのは通常 192.168.1.1 などのピリオドで区切られた4つの10進数であらわされているものです。しかし、これは人が見てわかりやすいようにした便宜上の表現形式で、内部的にはパソコンの情報処理と同じように2進数であらわされ、現在最も普及しているIPの仕様であるIPv4では最大32桁の2進数となります。また、便宜上1オクテット(octet=8bits)ずつをピリオドで4つに区切り表現します。この4オクテットごとに分けられたものを10進法であらわしたものが、われわれの目にするIPアドレスです。
前述の通り、IPアドレスは32ビットの数値で構成されています。しかし、この32ビットを全て個々のホストを識別するために使っているのではなく、実際には、ネットワークアドレスとホストアドレスに分けて利用されています。
ネットワークアドレスとは、言ってみれば会社の部署やスポーツのチーム分けのようなもので、何らかの集団をあらわすアドレスです。IP通信の世界では、このネットワークアドレスを元にデータが配信される範囲を決定します。従いまして、通常データは同じネットワークアドレスを設定した内部にのみ配信され、異なるネットワークアドレス間の配信を行うには、別途ルータ(経路制御装置)を用いてその他のネットワークアドレスを持つネットワークへ転送することになります。
ホストアドレスは、社員やチームのメンバーなど各個人に相当するもので、個々のノードを識別するための番号となります。結果、同じネットワークアドレスを持つデータリンク内で重複しない唯一の番号となります。
アドレスクラスは、たくさんのIPアドレスを必要とする団体にはたくさんの、少しで足りる団体には少しのIPアドレスを割り当てるための工夫で、以下の様なクラス分けを実施しています。このクラス分けの事をIPアドレスのクラスと呼びます。
ネットワークアドレスのうち、最初の4ビットまでのことをクラス識別ビットと呼び、先頭ビットから見てどの位置に0が現れるかでクラス分けが表現されています。
Class | アドレス範囲 | ||
---|---|---|---|
A | 00000000 | ? | 01111111 |
(0 ? 127) | |||
B | 10000000.00000000 | ? | 10111111.11111111 |
(128.0 ? 191.255) | |||
C | 11000000.00000000.00000000 | ? | 11011111.11111111.11111111 |
(192.0.0 ? 223.255.255) | |||
D | 11100000.00000000.00000000.00000000 | ? | 11101111.11111111.11111111.11111111 |
(224.0.0.0 ? 239.255.255.255) | |||
E | 11110000.00000000.00000000.00000000 | ? | 11111111.11111111.11111111.11111111 |
(240.0.0.0 ? 255.255.255.255) |
上記のように、先頭(1ビット目)が0だった場合はクラスA、2ビット目だったらクラスB、3ビット目ではクラスCとなります。さらに4ビット目に0がある場合は、クラスDとなります。クラスDは、マルチキャストアドレスと呼ばれ、特定用途の一斉配信を必要とする場合に用いられます。また、クラス識別ビットが全て1のクラスEが予約されており、5つのクラスが定義されています。なお、クラスD以降にはホストアドレスに相当する部分がありません。
クラスAでは、8ビットのネットワークアドレスのうち、先頭ビットが0ですから、残りの7ビット、つまり最大128のネットワークアドレスを持つことができます。このうち、最小と最大の0と127は、特殊な用途で使われるため割り当てができませんので、126個のネットワークアドレスが利用できます。同じように、その他のクラスでも最小と最大値のネットワークアドレスが使えませんので、最大のネットワークアドレス数-2がネットワークアドレスとして割り当てられる最大値です。
一方、ホストアドレスは、例えばクラスCのホストアドレスは8ビットですので、最大256台の割り当てができます。ホストアドレスをあらわすビット列のうち、全てが0の場合は、そのネットワークアドレスを以ってネットワークそのものをあらわします。また、すべてが1の場合は後述するブロードキャストアドレスとして使われます。したがって、実際には最大のホストアドレス数-2がホストアドレスとして割り当てが出来る最大値となります。なおブロードキャスト及びマルチキャストについては、後述いたします。
既にみなさまご存知のように、かねてよりIPアドレスの枯渇問題が発生していました。これは、インターネット利用人口の増加や利用方法の多様化などさまざまな要因がありますが、42億ほどもあるIPアドレスでも足りなくなることが予測できるようになってきました。そこで、各アドレスクラスの一部のアドレスをプライベートアドレスとして位置付け、本来大多数であるインターネットに常時接続を必要としないネットワーク機器にはグローバルアドレスを使わないですむようにしたものです。このアドレスは、物理的に接続されていないネットワークでは重複して使うことができるようになっています。したがって、重複が許されないインターネット上では中継されない特殊なアドレスとなっています。
クラスA | 10.0.0.0 ? 10.255.255.255 (10/8) |
クラスB | 172.16.0.0 ? 172.31.255.255 (172.16/12) |
クラスC | 192.168.0.0 ? 192.168.255.255 (192.168/16) |
プライベートアドレス以外の特殊なアドレスとしては、ループバックアドレスと呼ばれるものがあります。これは、自局、つまり自分自身を表すアドレスで、127.0.0.1で、ホスト名はlocalhostとして予約されています。ループバックアドレスは、送信したパケットが自局内で処理されます。従いまして、LANなどのネットワークへは流れませんので、自局内で処理される通信や、試験などで用いられます。
IPアドレスを割り当てるとき、アドレスクラスだけでは、とても無駄が多くなります。例えば、クラスAのIPアドレスを取得した会社が、実は2台しかつなぎませんでしたなんて事にでもなったら、残り千六百万あまりのアドレスの無駄が出てしまいますね。そこで、LANなどではプライベートアドレスを使うように切り分けしましたが、クラス分けに無駄があることには代わりありません。そこで、考え出されたのがサブネットマスクです。つまり、ホストアドレス部を利用して、ネットワーククラスをさらに小さなサブネットに分割してしまおうと言う考え方です。では、IPアドレスとサブネットマスクを2進数に置き換えて、その仕組を探ってみましょう。
○IPアドレス
1octet目 | 2octet目 | 3octet目 | 4octet目 |
192 | 168 | 1 | 1 |
11000000 | 10101000 | 00000001 | 00000001 |
○サブネットマスク
1octet目 | 2octet目 | 3octet目 | 4octet目 |
255 | 255 | 255 | 0 |
11111111 | 11111111 | 11111111 | 00000000 |
この2つのアドレスを論理積を用いて解を求めると・・・
IPアドレス | 11000000 | 10101000 | 00000001 | 00000001 |
サブネットマスク | 11111111 | 11111111 | 11111111 | 00000000 |
論理積 | 11000000 | 10101000 | 00000001 | 00000000 |
10進表現 | 192 | 168 | 1 | 0 |
同じように192.168.1.2でも計算してみましょう。
IPアドレス | 11000000 | 10101000 | 00000001 | 00000010 |
サブネットマスク | 11111111 | 11111111 | 11111111 | 00000000 |
論理積 | 11000000 | 10101000 | 00000001 | 00000000 |
10進表現 | 192 | 168 | 1 | 0 |
この結果から、192.168.1.1および192.168.1.2は、ともにネットワークアドレスが192.168.1(.0)となり、同じネットワークであると認識されます。
以上の例を良く見ると、結果的にサブネットマスクの4オクテット目に指定した「0」の部分がホストアドレスとなることがわかると思います。さて、この「0」の部分をちょっと変えて、「128」とした場合はどうなるでしょうか。
この例では、4オクテット目の先頭ビットまでが1になっています。従いまして、4オクテット目を10進数であわらすと128になります。
○サブネットマスク
1octet目 | 2octet目 | 3octet目 | 4octet目 |
255 | 255 | 255 | 128 |
11111111 | 11111111 | 11111111 | 10000000 |
前回と同じように論理積を用いて解を求めると・・・
IPアドレス | 11000000 | 10101000 | 00000001 | 00000001 |
サブネットマスク | 11111111 | 11111111 | 11111111 | 10000000 |
論理積 | 11000000 | 10101000 | 00000001 | 00000000 |
10進表現 | 192 | 168 | 1 | 0 |
同じように192.168.1.129でも計算してみましょう。
IPアドレス | 11000000 | 10101000 | 00000001 | 10000001 |
サブネットマスク | 11111111 | 11111111 | 11111111 | 10000000 |
論理積 | 11000000 | 10101000 | 00000001 | 10000000 |
10進表現 | 192 | 168 | 1 | 128 |
この結果から、192.168.1.1と192.168.1.129は、違うネットワークであると認識されます。したがって、IPアドレスの4オクテット目のビット列の先頭が0である192.168.1.0?127と、同じくビット列の先頭が1で始まる192.168.1.128?192.168.1.255までの二つのネットワークに分割することができます。また、サブネットマスクのビット列に1を指定した部分がネットワークアドレスであることがわかります。ちなみに、Case1の様なIPアドレスの割り当てを、192.168.1/24、Case2では192.168.1/25などと表現しますが、これは、1オクテット目の先頭から、何ビット目までをネットワークアドレスとして扱うかをあらわしています。
IPアドレスのホスト部のビットをすべて1にしたものをブロードキャストアドレスと呼びます。ブロードキャストアドレスを指定してネットワークへデータを送信すると、すべての端末にデータが届きます。ルータを越えない自分の所属するネットワークへは、ローカルブロードキャストアドレスで送ります。この場合、自分の所属するネットワークアドレスのホスト部のすべてに1を指定して送ります。また、ルータを越えるダイレクトブロードキャストアドレスは、当該ネットワークアドレスとそのホスト部をすべて1にしたものを送信します。
運ばれてきたデータは、上位層で要不要を判断し、該当する場合には反応するようになっています。
マルチキャストもブロードキャストと同じように一度に複数のノードへデータを転送する機能です。ただしブロードキャストではより上位層へデータを運んでから要不要を決定しますが、マルチキャストアドレスでは、そのアドレスによりあらかじめ用途が決められており、用途により決められたグループ内へ配信されるため、不要なパケットの転送などを避けることが出来るようになっています。IPマルチキャストのデータを受け取るにはIGMP*1を使ってグループに参加する必要があります。
これまでもずぅ?っと書いてきたように、IPは経路制御をするためのプロトコルです。IPアドレスは、いわゆる住所をあらわすものですが、それだけではデータを転送することができません。そこで登場するのが、経路制御(=ルーティング)と呼ばれるものです。
以前ちょこっと出てきたように、IPの仕様では、同じネットワークアドレスを持つネットワーク内(=セグメント)にだけパケットが転送されると説明しました。そりゃそうですよねぇ。LANくらいならともかく、インターネットだったら、データをひとつ渡すだけなのに、いちいち世界中の全てのノードにパケットを送っていたら大騒ぎになってしまいます。ということで、普段は同じネットワークアドレスの中だけにパケットを送って、自分のネットワークには無いノードにパケットを送りたいときだけ他のネットワークにパケットを渡す仕組が必要になります。
その経路制御の中核をなすものがルータ(=経路制御装置)と呼ばれる装置です。私たちにわかシステム管理者が扱うような数十台程度のネットワークなら、本来ほとんどお世話になることは無いはずなのですが、このところの家庭内LAN普及に伴って、ダイヤルアップルータなんてものが出てきて、ちゃんとルーティングまですることができるってんだから驚きですよねぇ?。
それはさておき、経路制御をするには、どこ宛てのデータはどこへ送ったら良いのかという情報をあらかじめ登録してあげることが必要となります。その経路情報を登録したものを経路制御表(=ルーティングテーブル)と申しまして、ルータだけではなく、みなさんお使いのOSにも登録されております。例えば、AというパソコンがBというパソコンにデータを送ろうとした場合、そのBにデータを渡すには、どこの経路を通したら良いのかという情報が経路表に登録されており、それを元にネットワーク内にデータを送り出しています。
さてさて、それでは、Windows のMS-DOSプロンプト又はコマンドプロンプトを開いて、実際みなさまのOSに登録されているルーティングテーブルを元に見てみましょう。
C:\WINDOWS>ROUTE PRINT ・・・※ここを入力して【Enter】 | ||||
Active Routes: | ||||
Network Address | Netmask | Gateway Address | Interface | Metric |
0.0.0.0 | 0.0.0.0 | 192.168.1.254 | 192.168.1.1 | 1 |
127.0.0.0 | 255.0.0.0 | 127.0.0.1 | 127.0.0.1 | 1 |
192.168.1.0 | 255.255.255.0 | 192.168.1.1 | 192.168.1.1 | 1 |
192.168.1.1 | 255.255.255.255 | 127.0.0.1 | 127.0.0.1 | 1 |
224.0.0.0 | 224.0.0.0 | 192.168.1.1 | 192.168.1.1 | 1 |
255.255.255.255 | 255.255.255.255 | 192.168.1.1 | 192.168.1.1 | 1 |
と、この様な画面が表示されると思います。ここで覚えておきたいポイントは、「0.0.0.0」。これはデフォルトルート、またはデフォルトゲートウェイと呼ばれるもので、各自に設定されている経路表には無いネットワークアドレスへの通信があった場合に、どこへ送ったら良いのかを指示するものです。この図のなかでは、送り先が「192.168.1.254」ですが、インターネット接続共有などを使っている方やダイヤルアップルータなどをお使いの方は、この宛先がインターネット接続共有を提供してるパソコンや、ダイヤルアップルータなどのIPアドレスとなっているはずです。
では、同じLANの中に2つのネットワークアドレスを設定して分割した場合はどうなるでしょうか。例えば「192.168.1/24」と「192.168.2/24」の様な場合を考えてみましょう。この場合は、すでにIPアドレスの項で述べたように、ネットワークアドレスが違いますので直接通信をすることは出来ません。そこで、登場するのがルータです。下記のようなケースでは、お互いに双方のIPアドレスがわかっていますので、各ネットワークの間にルータを置いて、それぞれの経路をルータの制御表に追加します。ルータには、通常2つ以上のLANアダプタが搭載されており、それぞれ異なるネットワークの間に設置し、LANアダプタをそれぞれのネットワークに接続させ、それぞれのネットワークアドレスに合わせたIPアドレスを設定します。
LAN1 | ルータ | LAN2 | ||
192.168.1/24 | → ← | 192.168.1.100 | → ← | 192.168.2/24 |
↑↓ | ||||
192.168.2.100 |
このように、LAN1と2の間にルータを置くことによって、それぞれのLAN同士が通信できることがわかります。例えば、LAN1の各パソコンには、192.168.2.0への通信が発生した際は、192.168.1.100へ送ってくださいという経路を追加します。もちろん、ゲートウェイがその装置以外に無いのであれば、デフォルトゲートウェイとして設定しても問題ありません。
Network Address | Netmask | Gateway Address | Interface | Metric |
192.168.2.0 | 255.255.255.0 | 192.168.1.100 | 192.168.1.1 | 1 |
上記の様な経路制御表は、ルータの中でも同じようになっていますが、こちらは2つのネットワークへのアダプタを持っていますので、内部で中継され、LAN2へデータを転送します。もちろん、LAN2からの逆のパターンも登録しておかないと応答が受け取れないため注意が必要です。ま、結局のところ、ルータとは電車を乗換えるターミナル駅、ルーティングテーブルは乗り換え案内のようなものですね。このようにして、通常は同一セグメント内にのみパケットを配信し、必要なときのみルーティングすることによって、インターネットの様な大規模なLANでも余計なトラフィックがかからないようになっています。
ちなみに、このように経路情報をあらかじめ登録するものをスタティックルーティング(静的経路制御)と呼びます。ただし、インターネットや、先の見えない大規模なLANの場合、全ての経路を登録することは不可能ですし、登録したIPアドレスが常に有効であるという保証もありませんので、このような場合は、RIP2やOSPF、BGPなどのルーティングプロトコルを用い、ルータ同士でルーティング情報を交換し合うダイナミックルーティング(動的経路制御)が用いられます。
*1: RIP2 Routing Information Protocol Version 2
*1: OPSF Open Shortest Path First
*1: BGP Border Gateway Protocol
ARP(アドレス解決プロトコル)は、ネットワークインターフェース層とインターネット層の中間に位置するプロトコルで、IPアドレスとMACアドレスを対応付ける機能を提供します。IPアドレスからMACアドレスを調べて、実際にネットワーク内のどの機器にデータを配送したら良いかを調べることができます。働きとしては、宛先IPアドレスを入れたARP要求パケットをブロードキャスト(一斉配信)して、要求先が自分であると認識したノードが、自分のMACアドレスをそのパケットに入れて、要求元へ返します。これがARP応答パケットです。この様な仕組を持つことにより、上下の層間に互換性を持たせつつ、それぞれの層のプロトコルを自由に設計することができます。ちなみに、これらの動作は自動的に行われますので、一般的に使用者が意識することはありません。また、逆にMACアドレスからIPアドレスを調べるには、RARP*1を使います。
*1: RARP Reverse Address Resolusion Protocol
IPアドレスの枯渇問題によりプライベートアドレスを設置したものの、このプライベートアドレスではインターネットと直接通信をすることが出来ません。そこで、考え出されたのがNAT*1と呼ばれる技術です。NAT機能搭載ルータ(ゲートウェイと呼びます)は、プライベートアドレスからの通信要求を受け取り、送信元IPアドレスをあらかじめルータ自身が取得しているグローバルアドレスに付け替えてインターネットへパケットを転送します。逆に、インターネット側より応答されてきたパケットに対しては、その逆の処理をします。このように、NAT機能では、IPアドレス変換する機能しか提供されていません。
さて、IPの上位層に位置するTCPやUDPは、ポート番号により個々のアプリケーションの種類を識別しています。IPの送信元アドレスと送信先アドレスのように、送信元ポートと送信先ポートをデータ部に記録して通信をしています。ポート番号は、全部で65536(0?65535)個ありますが、一般にウェルノウンポートと呼ばれる0?1023までのポート番号に様々なサーバー用のポート番号が割り当てられています。一方、クライアント側で割り当てる送信元ポートには、1024以降の現在端末内で使われていないポートがランダムに埋め込まれて送信されます。
仮に、192.168.1.1と192.168.1.2というIPアドレスを持った2台の端末がWebブラウザを使ってインターネットへアクセスしたと仮定してみましょう。それぞれ、Webブラウザは送信元ポート番号を1024、送信先のポート番号を80、送信元IPアドレス自分のIPアドレス、送信先にインターネット上のWebサーバーのIPアドレスを設定してパケットをゲートウェイへ転送します。ゲートウェイ側では、送信元のIPアドレスを自身が取得しているグローバルアドレスに変換して通信しますので、このときに2つの端末からの送信元ポートが同じであると、インターネットへ転送した2つの端末からのパケットは同じ内容になってしまいます。もちろん、応答があっても、ルータ側でどちらの端末へ返したら良いのかわかりません。従いまして、NATの場合は端末とゲートウェイが1対1で接続されている必要が出てきます。
そこで、Linuxの実装によるIPマスカレードでは、各送信元TCP/UDPポートをセッション毎に変換する方法を採用し、送信元IPアドレスと送信元ポート番号を組み合わせて記憶し、ゲートウェイ自身で適宜送信元ポートを選択してインターネット側サーバーと通信することにより複数の端末からのアクセスを実現しました。それらを元に各メーカーが独自で様々な方式を策定、結果として呼び方も様々でしたが、これらの仕様を元に、IETFが1999年、NAPT*2として仕様を標準化したようです。
*1: NAT Network Address Translator
*2: NAPT Network Address Port Translation
IPは、送りっぱなしで到達性を保証しないプロトコルです。ICMPは、その到達性などをある程度補完するためのプロトコルです。ICMPは、TCPやUDPのように、IPデータグラム内のデータとして運ばれますが、IPを補完する意味においてインターネット層に該当するプロトコルとされています。
IPを使ってパケットを送ったとき、相手先に何らかのトラブルなどがあり正常に転送できなかった場合、IPはICMPを使って送信元へエラー通知をします。ICMPのメッセージタイプは次のようになります。
TYPE Code | 内容 |
---|---|
0 | Echo Reply(エコー応答) |
3 | Destination Unrearchable(到達不能) |
4 | Source Quench(始点抑制) |
5 | Redirect (リダイレクト) |
8 | Echo Request(エコー要求) |
9 | Router Advertisement(ルーター通知) |
10 | Router Selection(ルーター選択) |
11 | Time Exceeded(時間超過) |
他にもいくつかありますが、それはとりあえずおいといて、PINGなどで使われるのはタイプ0と8です。エコー要求に対してエコー応答が返ってくれば相手へ到達していることになります。この時に、正常に到達しなかった場合、タイプ3の到達不能メッセージが返ってきます。
Code | ICMP到達不能メッセージ |
---|---|
0 | Network Unreachable |
1 | Host Unreachable |
2 | Protocol Unreachable |
3 | Port Unreachable |
4 | Fragmentation Needed and Do't Fragment was Set |
5 | Source Route Failed |
6 | Destination Network Unknown |
7 | Destination Host Unknown |
8 | Source Host Isolated |
9 | Communication with Destination Network is Administratively Prohibited |
10 | Communication with Destination Host is Administratively Prohibited |
11 | Destination Network Unreachable for Type of Service |
12 | Destination Host Unreachable for Type of Service |
*1: ICMP Internet Control Message Protocol
WindowsでGUIに慣れ親しんだユーザでは、あまり使うこともないMS-DOS/コマンドプロンプトですが、TCP/IPやネットワークを扱う上で、とても有効なネットワーク管理ツールがたくさんあります。とりあえず良く使うところをピックアップしてみました。ネタがややWindowsに片寄ってしまいますが、元々インターネットはUNIXを用いて発展してきており、これらコマンドもそちらからのからみで作られておりますので、あまり影響はないでしょう。
それぞれのネットワーク機器は、IPアドレスとMACアドレス間の対応表(ARP TABLE)を一時的にキャッシュしています。このARPテーブルを表示・編集するコマンドがARPです。また、ネットワーク上に同一のIPアドレスがエントリされているときなどの障害が出た場合、ARPテーブルを編集する際にも利用されます。
形式1:ARP [-オプション]
-a IPアドレス:アドレス解決用のキャッシュ情報のエントリを表示します。
-s IPアドレス MACアドレス:アドレス解決用のキャッシュ情報のエントリを追加します。
-d IPアドレス MACアドレス:アドレス解決用のキャッシュ情報のエントリを削除します。
各種ネットワークアダプタの詳細情報を表示します。各アダプタ毎に割り当てられているIPアドレスや、DHCPの有効無効、デフォルトゲートウェイなどの情報が表示されます。また、現在の設定を初期化したり、再設定をしたりできます。Windows9X/Meや英語版NTなどでは、winipcfgというGUIツールも搭載されています。
形式:IPCONFIG [/オプション]
/ALL:全てのアダプタの詳細情報を表示します。
/renew N:アダプタNの設定内容を更新します。
/release N:アダプタNを開放します。
NetBIOS over TCP/IP(NetBTまたはNBT)と呼ばれる仕組の様々なステータスを表示します。NetBTは、元々NetBEUIをベースに提供されていたマイクロソフトネットワーク共有サービスなどをTCP/IP上で実現するための仕組です。
形式:NBTSTAT [-オプション]
-c:NetBIOS Name cache の内容が表示されます。
-n:自分のパソコンが、NetBTに対してどのようにエントリをしたのかを表示します。
-r:Windows ネットワークの名前解決統計情報の一覧を表示します。
現在稼動中のプロトコルコネクション情報や統計情報を表示します。この情報を元に、現在どのようなサービスが開いていて、どのサービスにコネクションが確立しているのかなどを見ることが出来ます。
形式:NETSTAT [-オプション] [-p protocol]
-a:全てのプロトコルコネクション情報の表示。
-e:ネットワークインタフェース(Ethernet)の統計情報の表示。
-s:プロトコル別に統計情報を表示します
-p protocol:指定したプロトコルの接続を表示。TCP/UDP、ICMP、IPが指定できる。
-r:ルーティングテーブルの表示。
Windows9X系には入っていませんが、DNSへの様々な問い合わせに使います。これは説明を始めると長くなりそうなので、詳しくはWindowsNT系OSのヘルプでも見てください。(^^;
本コマンドにより宛先ホストからの応答を見ることで、通信が確立しているのかがわかります。PINGは、ICMP(Internet Control Message Protocol)の応答メッセージをみて、通信の確立を検査することができます。IPは、本来相手先への到達性を保証しないプロトコルですが、ICMPによって、相手先からの応答を見ることができます。
形式:PING [-オプション]
-a:指定したIPアドレスに対応するホスト名を表示します。
-l length:lengthで指定した長さのパケットでエコー要求します。最大は65,527。
-t:割り込み([CTRL]+[C])が発生するまで指定したホストを検査します。
-w timeout:タイムアウトの時間をミリ秒単位で指定します。
経路情報の表示や設定ができます。
形式:ROUTE [-オプション] [command [destination] [mask subnetmask] [gateway] [metric costmetric]]
-p:追加したルーティング情報を記憶します。
●コマンド
ADD:経路情報を追加できます。
PRINT:経路制御表が表示できます。
DELETE:経路制御表を削除できます。
CHANGE:経路制御表を変更できます。
●destination:送信先IPアドレス
●mask:このエントリのサブネットマスク
●gateway:このエントリのゲートウェイ
●matric:コストメトリック
目的地までの経路と応答時間を表示します。これはICMPのTime Exceeded(時間超過)を応用しています。
形式:TRACERT IPアドレス
このコマンドは、TCP/IPの管理コマンドではありませんが、Microsoft ネットワーク共有サービスの様々な表示や設定ができます。
・NET HELP ヘルプの表示。
・NET TIME サーバーの時刻を表示したり、時刻をサーバーに合わせたり出来ます。
・NET USE 共有リソースへの接続や解除が出来ます。
ちょっとおまけですが、Windows9X系OS標準搭載のGUIツールにネットウォッチャーがあります。Microsoftネットワーク共有サービスの共有リソースの使用状況やユーザーの切断などの管理ができます。また、リモート管理可能な状態では、自分以外のパソコンの共有リソースの管理が可能です。
結局のところ、このページの内容は、私自身の記憶に頼ったところが大きく、うっかりするとSEAWorksわーるどに入っている可能性が大きいです(笑)。ただし、ことの真偽はともかく、IPに必要な語句を出来る限りたくさん詰め込みましたので、必要であればそれらの語句を元にさらに検索をしてみるといろいろなことが見えてくると思います。まあ、広いインターネット、風説の流布も多いわけでして、それらに対して完全に責任を持てる方も少ないと思われますが、わからないことは調べることを習慣づけることが大切ですね。<-おまえが言うな!
というわけで、とても長文なわりにしょぼい内容で、本当に身についたのかどうだか全然わからない方も、何がしかヒントをつかめた方もお疲れ様でした。まあ、書いている時点で理解不足だったり、詳細まで書くのが面倒だったりと自分もあいまいにしている点がいくつかあって、理解できたときや気が向いたときに直していきたいなと思っています。みなさまもお気づきの点がございましたら、へっぽこ管理者SEAWorks宛てにご連絡下さい。
Rev 1: メニューをつけました。