IP入門 (IPv4)


ネットワークの階層

Ethernet層

Ethernet frame (イーサネット・フレーム)
                     1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Ethernet destination address (first 32 bits)            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ethernet dest (last 1 6bits   |Ethernet source (first 16 bits)|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Ethernet source address (last 32 bits)                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Type code              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|    IP header, then TCP (or UDP) header, then your data ...    |
                  ...
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              Ethernet Checksum                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IP層 (IPv4)

                     1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|        Total Length           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Identification          |Flags|    Fragment Offset      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |       Header Checksum         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Source Address                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Destination Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|    TCP (or UDP) header, then your data ....                   |
                  ...
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

UDP層 (User Datagram Protocol)

                     1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Source Port              |     Destination Port          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Length                 |        Checksum               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|             your data ...                                     |
                  ...
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TCP層 (Transmission Control Protocol)

                     1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Source Port              |     Destination Port          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Acknowledgement Number                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|          Window               |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Checksum             |        Urgent Pointer         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|             your data ...                                     |
                  ...
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

サービス(ポート)番号

ネットワーク経由で、あるホスト上の特定のプロセスを識別する ためには、ポート番号という正の整数を用います。 1024未満のポート番号は well-known port と呼ばれていて、 使用目的が決まっています (たとえば、メイルの転送には 25番ポートが、 WWWのデータ転送には 80番ポートが予約されています)。 独自のポート番号を用いるには 5000番以降を用いるとよいでしょう。 ただし、この場合でも、他のプロセスが使っているポート番号と ぶつからないように注意が必要です (たとえばXサーバは6000番ポートを使っています)。

ARP --- IPアドレスからEthernetアドレスへの変換

ARP/RARPパケットのフォーマット
                     1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Hardware type            |      Protocol type            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  H Length     |  P Length     |        Operation              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Ethernet source address (first 32 bits)            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ethernet source (last 32 bits)| Source address (first 16 bits)|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source address (last 16 bits) | Ethernet dest (first 16 bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Ethernet destination address (last 32 bits)            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Destination address                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IP AddressをEthernetアドレスに変換するのに ARP (Address Resolution Protocol) 表を用いています。ARP表は "arp -a"コマンドによって参照できます。

 arp表 (Unix)
Net to Media Table
Device   IP Address               Mask      Flags   Phys Addr 
------ -------------------- --------------- ----- ---------------
le0    karel1               255.255.255.255       08:00:20:19:e7:b1
le0    praha                255.255.255.255       00:60:97:91:44:ac
le0    renoir               255.255.255.255       00:20:af:17:eb:a9
le0    vermeer              255.255.255.255 SP    08:00:20:7a:1b:d3
    ...

ARP表 (Windows系OS)
C:\Windows> arp -a
interface: 133.99.10.7
  Internet Address	Physical Address	Type
  133.99.10.1		08-00-20-19-e7-b1	dynamic
  133.99.10.2		00-00-c0-10-11-78	dynamic
    ...

ARP表にエントリのないホストと通信するときの手順は次のようになります。
  1. ARPリクエスト・パケットをネットワーク上にブロードキャストします。 このパケットには次の項目が含まれています。
  2. Ethernet上のホストはARPリクエストを受け取り、それに自分のIP Address が指定されていないときはこれを無視します。 自分宛であれば自分のEthernet Address とIP Addressが含まれた ARPリプライ・パケットを発信元に送り返します。
  3. ARPリプライ・パケットを受け取った発信元ホストはARP表に書き込みます。

Routing (経路制御)

以下の説明では、「ルータ (router)」と「ゲートウェイ (gateway)」 という用語を同義語として使っています。

通信の際に、データはIPを使って目的地まで送られていきます。 データを目的地へ届けるその方法を決定する仕事を routing (ルーティング、 経路制御)と呼びます。

同一のネットワーク上のマシンが目的地である場合は、 そのマシンのEthernet Addressを調べて、そのEthernet経由で 直接送ります。

しかし、他のネットワーク上に目的のマシンがある場合は、 経路制御は ルータ (router)に委ねられます。 ルータとは、複数のネットワークに接続されたシステムであり、 他のネットワークへのデータはまずルータに送られます。

次のようなネットワークを考えましょう。
         network 1              network 2     network3
         128.6.4/24             128.6.21/24   128.121/16
   ====+===========+========+=  =+======+=  =+========+=
       |           |        |    |      |    |        |
       |           |        |    |      |    |        |
   ----+----   ----+----  --+----+--  --+----+--    --+---------
   128.6.4.2   128.6.4.3  128.6.4.1   128.6.21.1    128.121.50.2
                          128.6.21.2  128.121.50.1
    Host A      Host B     router R    router S        Host C
ルータは、2つの異なるネットワークのアドレスを持っています。 Host AからHost Cへデータを転送する場合は、データは2つの ルータ R, S を経由することになります。 AはBやCへ送るデータがどのような経路を取るべきかを表 (経路制御表、routing table)にして持っています。 上の例では、経路制御表は次のようになっています。
ネットワークルータ度数
128.6.4none0
128.6.21128.6.4.11
128.121128.6.4.12
この表から、Aはネットワーク 128.6.4/24上の計算機にはデータを 直接送ることができますが、ネットワーク 128.6.21/24 と 128.121/16 上の 計算機には、一旦ルータ R に送る必要があることがわかります。 「度数(metric)」は、データが通過するルータの数であり、 目的地がどのくらい離れているかの尺度となります (これは hop countとも呼ばれます)。 ネットワークの変更が生じた場合、ルータから流される情報によって 経路制御表は更新されます。 ルータは、ネットワークの最新の状況をいつも把握している必要が ありますが、これに関しては後で述べます。

経路制御表(Routing Table)

各計算機は個々の目的地への経路を示す経路制御表 (routing table) を持っています。 経路制御表の内容を参照するには "netstat -n -r" コマンドを使います。
 経路制御表 (Unix)
nitta@vermeer 3> netstat -n -r
Routing Table:
  Destination           Gateway           Flags  Ref   Use   Interface
-------------------- -------------------- ----- ----- ------ ---------
127.0.0.1            127.0.0.1             UH       0     46  lo0
133.99.161.129       133.99.10.1           UGH      0      0  
133.99.1.0           133.99.10.1           UG       0     23  
133.99.161.0         133.99.10.1           UG       0      3  
...
default              133.99.10.1           UG       0      0  

経路制御表 (Windows系OS)
C:\Windows> netstat -n -r
Active Routes:
  Network Address          Netmask  Gateway Address        Interface  Metric
          0.0.0.0          0.0.0.0      133.99.10.1      133.99.10.7       1
        127.0.0.0        255.0.0.0        127.0.0.1        127.0.0.1       1
      133.99.10.0    255.255.255.0      133.99.10.7      133.99.10.7       1
      133.99.10.7  255.255.255.255        127.0.0.1        127.0.0.1       1
   133.99.255.255  255.255.255.255      133.99.10.7      133.99.10.7       1
        224.0.0.0        224.0.0.0      133.99.10.7      133.99.10.7       1
  255.255.255.255  255.255.255.255      133.99.10.7      133.99.10.7       1

次の行は特別なIPアドレスを表しています。
  (Unixの場合)
127.0.0.1            127.0.0.1             UH       0     46  lo0

  (Windows系OSの場合)
        127.0.0.0        255.0.0.0        127.0.0.1        127.0.0.1       1

127.0.0.1は loop back address (ループバック・アドレス)です。 これは、テストのためや、自分自身の計算機上にある他のアプリケーションと 通信するのに使われます (このアドレスはhostsファイルに localhost として登録されています)。
次の行はデフォルトの経路を表しています。
  (Unixの場合)
default              133.99.10.1           UG       0      0 

  (Windows系OS場合)
          0.0.0.0          0.0.0.0      133.99.10.1      133.99.10.7       1

すなわち、この経路は他のどのエントリにもマッチしない宛先への データの転送に使われます。 上の例では、他のエントリにマッチしないデータは 133.99.10.1 のルータに送られることになります。

経路制御の手順

  1. 経路制御表を見て、送り先のアドレスが特定のホスト経路に 合致すれば、その経路を使います。
  2. 送り先のアドレスがネットワーク経路に合致すれば、 その経路を使います。
  3. 上の2つに当てはまらなければ、default経路を使います。
  4. default経路もなければ、エラーとなります。

経路制御の設定方法

経路制御の設定には という2つの方法があります。 ネットワーク管理者は、ホストをネットワークに接続する際に、 自分のネットワークに適した方法を選択しています。

Static routing

固定の経路制御表を持つ方法です。 すなわち "route" コマンドで経路制御表を設定して、それ以後 内容の変更は行ないません。
 static routeの設定例 (Unix)
    # route add default 133.99.10.1 1

 static route(+その他)の設定例 (Windows系OS)
マイコンピュータ→コントロールパネル→ネットワーク
 →ネットワークの設定→追加→プロトコル→Microsoft→TCP/IP
 →ネットワークの設定→TCP/IP
 →TCP/IPのプロパティ
  →IPアドレス→IP Addressを指定
   →IP Address: 133.99.X.X
   →サブネットマスク: 255.255.255.0
  →ゲートウェイ→133.99.X.1→追加
  →DNS設定
   →DNSを使う
    →ホスト: compXX
    →ドメイン: tsuda.ac.jp
    →DNSサーバの検索順→133.99.161.3→追加
    →ドメインサフィックスの検索順
               →tsuda.ac.jp→追加
  →OK  (TCP/IPのプロパティ)
  →OK (ネットワーク)
  →再起動しますか?
  →OK

Dynamic routing

ルータは、 RIP (Routing Information Protocol、経路情報プロトコル) と呼ばれる情報(自分がどのネットワークに到達可能か)を 30秒に1回ネットワーク上にブロードキャストします。 これによって、ルータ同士で情報を交換し、ネットワークの接続関係を 把握できます。
ネットワーク上の各計算機は、このRIPを読みとって自分の経路制御表を 書き直せば Dynamic routing ができます。 Unixではそのような動作を行なうソフトとして routed や gated が 使われています。

ネットワークの構築

ネットワークを接続する方法には、リピータ(repeater)、ブリッジ(bridge)、 ルータ(router)の3種類があります。 上記の話はネットワーク間をゲートウェイで接続すること、すなわち ルータによる接続を前提としてきました。

「OSIのネットワーク参照モデル」とLANの拡張

アプリケーション層アプリケーション層
プレゼンテーション層プレゼンテーション層
セッション層セッション層
トランスポート層トランスポート層
ネットワーク層<--- router --->ネットワーク層
データリンク層<--- bridge --->データリンク層
物理層<--- repeater --->物理層

リピータ(repeater)

リピータは同じ技術を用いる2つのネットワークを接続します。 各ネットワーク上のフレーム(衝突したフレームも含まれる)を 受けとり、他のネットワークに送ります。 簡単なリピータはフレームレベルではなく、1bitごとに (すなわち全ての信号を!!)転送します。 バッファ付きリピータはフレーム毎の処理を行ないます。 リピータはトラフィックの遮断を行なわないので、1つの 建物内などの小さなネットワークに使います。
ハブはハーフ・リピータに相当します。

ブリッジ(bridge)

他のネットワークに向けられたフレームのみ選択して送ります。 衝突のような無駄なフレームを送ることはしません。 Ethenet アドレスを持ちますが IP Addressは持たないので、 経路制御の決定は次のようにしています。

  network 1                      network 2
  128.6.5/24                     128.6.5/24
  ==+===========+==   ==+========+============+=====
    |           |       |        |            |
  --+------   --+-------+--   ---+-----    ---+-----
  128.6.5.2       bridge      128.6.5.3    128.6.5.4
   Host A                      Host B        Host C

計算機AがBへデータグラムを送る際、まずAはBのEthernet Addressを 尋ねる ARP要求 (ARP request) を broadcast します。 ブリッジはbroadcastをネットワーク2に送ります。 するとBは自分のEthernet Addressを答えます(ARP reply、ARP 応答)。 以後、AからBへの通信はBのEthernet Addressを用います。
ブリッジはこれらの APR要求やARP応答のデータを見ていて 「どのEthenet Addressのマシンがどのネットワーク上にあるか」 という一覧表を作ることができます。 この表を用いることで、不必要なネットワークへのデータの転送を なくすことができるのです。
(ブリッジがあると、当然リピータの2段ルールはそこで切れます。)

ルータ(router)

ルータは自分が接続しているネットワークに対応する複数のIP Addressを 持っています。 ルータを構成する時に、定義しなければならないものは、IP Address, Subnet mask, broadcast address, RIP などがあります。 各ルータは RIP によって、自分がどのネットワークに到達できるか 通信しあっています。
パケットの経路づけや、フィルタリングを行なうことができるので、 ネットワークの分散や冗長性を実現できますし、また、セキュリティを 高めることもできます。 しかし、複雑なネットワークを扱うためにはそれだけ設定や管理が 大変になります。
(ルータがあると、当然リピータの2段ルールはそこで切れます。)

経路を調べる

あるホストへIPパケットが到達できるかどうかは ping コマンドで 調べることができます。
 IP Reachableの調査 (Unix)
nitta@vermeer 2> ping www.netscape.com
www-me1.netscape.com is alive

IP Reachableの調査 (Windows系OS)
C:\Windows> ping www.netscape.com
Pinging www-me1.netscape.com [204.152.167.20] with 32 bytes of data:
Reply from 204.152.167.20: bytes=32 time=553ms TTL=237
Reply from 204.152.167.20: bytes=32 time=531ms TTL=237
...

あるホストへの(途中のマシンも含めて)経路を知りたい 場合は traceroute コマンドで調べることができます。
 経路探索 (Unix)
nitta@vermeer 2> /usr/sbin/traceroute www.netscape.com
traceroute to www24.netscape.com (207.200.73.73), 30 hops max, 40 byte packets
 1  karel1 (133.99.10.1)  2 ms  1 ms  1 ms
 2  cisc194 (133.99.194.250)  1 ms  1 ms  1 ms
 3  cisckan (133.99.144.254)  2 ms  2 ms  2 ms
 ...
18  h-207-200-73-73.netscape.com (207.200.73.73)  314 ms  306 ms *

経路探索 (Windows系OS)
C:\Windows> tracert www.netscape.com
Tracing route to www24.netscape.com [207.200.73.73]
over a maximum of 30 hops:
  1     1 ms   <10 ms   <10 ms  karel.tsuda.ac.jp [133.99.10.1] 
  2     2 ms     1 ms     2 ms  cisc194.tsuda.ac.jp [133.99.194.250] 
  3     2 ms     2 ms     2 ms  cisckan.tsuda.ac.jp [133.99.144.254] 
  ...
 18   264 ms     *      281 ms  www24.netscape.com [207.200.73.73] 
Trace complete.


Private IP Address

Small Office/Home Office といって、小さな会社や自宅にある 計算機をネットワークに接続することが多くなってきました。 そのような場合は、IP AddressにPrivate Addressを使うことが よく行なわれています。
    Private Address: RFC1918 (旧 RFC1597)
        10.0.0.0      -  10.255.255.255  (10/8 prefix)
        172.16.0.0    -  172.31.255.255  (172.16/12 prefix)
        192.168.0.0   -  192.168.255.255 (192.168/16 prefix)
Private Address とは、「勝手に使ってもいいが、決して そのアドレスではインターネットにパケットを流してはいけない」 IPアドレスのことです。
外部から見えないネットワークに公式な IP アドレスを割り当てると ただでさえ少ない IP アドレスを浪費してしまいます。 しかし、(外から見えないからといって他の組織が使っているかもしれない) 適当な IP アドレスを割り当ててしまうと、外部と内部に同じIPアドレス のマシンがあることになり障害が起きる可能性があります。 Private IP アドレスは、インターネット上では存在しない IP 空間と なっているので、このような問題は発生しません。 すなわち、外から見えない限り自由に使っても構わないのです。
Private IP は「直接は外へ繋がらない」のですが、これは NAT (Network Address Translation)の機能を 使えば解決できます。 NAT とは NAPT (Network Address and Port Translation) や IP Masquerade などと呼ばれることもありますが、 基本的に 「Private IP Addressのネットワーク側で使っているIPアドレスとポート番号」 を「インターネット(Global IP Address)側のIPアドレスとポート番号」 に変換してインターネットに送り出す機能のことです。 家庭用ルータではNATの機能を持っているものがほとんどです。