IP通信の掟!

IP通信の掟

スマホからの利用も含むインターネット、事務所内のLAN、工場などの産業用ネットワークなど、今やあらゆる通信のインフラとなっているIP通信。どのようなルールで成り立っているのか、改めて捉えなおしてみましょう。

IPって?

Internet Protocolの頭文字

「IP」とは「Internet Protocol」の頭文字を取ったものです。標準規格としてはRFC791
Layer3の通信プロトコルで、これを運搬するLayer2以下のプロトコルからは独立しており、イーサネット、Wi-Fi(IEE802.11無線LAN)をはじめ、多種のLayer2媒体によって運ばれています。

どんなプロトコルで、何がが規定されているのかについては、何よりRFC 791原文(またはその翻訳)を見ていただくのが一番です。

とはいえ、必ずしもRFCは読みやすい文書ではありません。
規格の記載なので、基本の理解には必ずしも必要のない詳細な記述も同列に並べられています。
用語やその定義、なんでそうなの?という疑問もわいてくることでしょう。
次の項では、IP通信に関して使われる用語やその成り立ちについて、押さえておくべき基本的なことを記載します。RFCの中で使われているものもあれば、RFCでは言及されていないが、よく使われている用語用法も含んでいます。

用語:IPパケット、IPアドレス、IPセグメント、サブネット、サブネットマスク

IPパケット

IPプロトコルで送られるデータの塊の単位を、「パケット」あるいは「IPパケット」と呼びます。

ノード、ホスト

コンピュータなどIPパケットを使って通信する装置(主体)を、「ノード」あるいは「ホスト」と呼びます。

IPアドレス

各「ノード」がネットワークにつながっている「口」には、それぞれIPプロトコルで使う住所「IPアドレス」を持っています。世界中のネットワーク内で一つしか存在しない(ユニークな)「IPアドレス」を一般に「グローバルIPアドレス」「グローバルIP」と呼ぶことが多いです。それに対して、閉じられた範囲で使うことを前提として、閉じられた範囲でのみユニークな「IPアドレス」は「プライベートIPアドレス」「プライベートIP」と呼ばれます。

RFC 791ではこのIPアドレスを4オクテット(1オクテット=8ビット)=32ビットのビット列としました。ユニークな「グローバルIPアドレス」個数は、最大でも2の32乗個です(実際には、すべてのビットがゼロ、すべてのビットが「1」は、プロトコル上で予約しているため、ノードのIPアドレスとしては使いませんし、後述するIPセグメントの区切り方次第でもノードのアドレスとしては使えないアドレスが発生します。また、自身のIPアドレスである「ループバックアドレス」や「マルチキャスト通信に使う「マルチキャストIPアドレス」などいくらかの予約アドレスもあります)。

オクテット:
8ビットのビット列を「octet」(オクテット)と呼びます(外部Link先:Wiki Pedia)。「octo-」はラテン語で「8」を表す接頭語です。現状「バイト」と同義なのですが、当初、情報単位を表す用語「バイト」は8ビットと決まってはいませんでした。厳密に「8ビット」であることを明確にするために「octet」が使われています。

IPv6とIPv4

当初は2の32乗個は相当大きな数で、不足することは想定されていなかったようですが、のちにインターネットの普及にともなって、接続するノードの数が爆発的に増加しはじめ、アドレス数の枯渇が懸念される事態に至りました。2023年時点では、すでに新規に払い出せるIPv4アドレス範囲は枯渇していて、既存払い出しアドレス範囲の譲渡などが始まっています。

そこで、アドレス長を4オクテットから32オクテットとし、アドレス総数を大幅に拡張したIPアドレス体系ができました。アドレス拡張以外の点でもプロトコル面で改善を施したIPプロトコル「IP Version6」が、Draft Standard RFC 2460として規定されました。拡張されたIPアドレスは「IP Version6アドレス」「IPv6アドレス」と呼ばれます。なお、RFC 2460は廃止され、現在はInternet Standard RFC 8200によって規定されています。

「IPv6」の登場によって、従来の4オクテットのアドレスを使うものは「IPv4」とも呼ばれるようになりました。IPヘッダ内の「Version」フィールドが「4」であるのに由来しています。単に「IP」としている場合は、「IPv4」のことを意味することがほとんどです。
この記事でも、事務所内などのプライベートなネットワーク内で多く利用されるIPv4の範囲で「IP」として説明を進めます。

IPアドレス(IPv4アドレス)は、1オクテット毎に10進数表記するのが一般的

IPv4アドレスは4オクテットなのですが、通常「192.168.0.3」といったように各オクテットを10進数で表し、「.」(ピリオド、あるいはドット)で区切って表記します。「ドット付きの10進表記」とも呼ばれています。
標準として規定されてはいませんが、RFC 790で使われている表記がそのままデファクトになったようです。

RFC 790は、IPが使われだした初期に、様々な組織や団体のネットワークでアドレス範囲を分け合ったり、プライベートネットワークの大きさの段階を「クラス」として規定していたり、種々の予約IPアドレスを規定していました。のちに廃止されましたが、この「クラス」規定があった影響は21世紀に入っても、機器の仕様動作やネットワーク設計に残り続けました。

2進数表記では桁が多すぎるし、「人間が認識する数値には、10進数が好ましい」という思想も背景のあった模様です。

※とはいえ、私の意見としては、16進数表記が妥当だったのではないか?と思いますね(あくまで16進数表記が2進数表記のビットパターンイメージに結び付けることができるのが前提ではありますが)。

16進数表記というのは、数というだけでなく、4ビット区切りのビットパターンと結び付けて憶えやすいものだと思っています。後述のIPセグメントの割り出しなどは、基本AND、XORなどのビット単位の論理演算を使いますので、アドレスのビットパターン、サブネットマスクのビットパターンが直感的に把握しやすいでしょう。

例えば、「192.168.0.128」というIPアドレスは
2進数表記では「1100 0000 1010 1000 0000 0000 1000 0000」
16進数表記では「C0-A8-00-80」
です。サブネットマスク「255255.255.128」は
2進数表記では「1111 1111 1111 1111 1111 1111 1000 0000」
16進数表記では「ff-ff-ff-80」
です。

少々過激化もしれませんが、2進数表記(ビット列)、16進数表記と10進数の関係、ビット単位の論理演算は、義務教育で扱うべきものではないかと考えています。

IPセグメント

IPでの通信の特徴は、すべての通信ノードが、Internet全体に配置されたあらゆる宛先ノードの物理アドレス(MACアドレス)宛に、すべて直接送信しているわけではありません。IPでは、広範囲にわたる宛先については、ルータという転送の役割を持つノードが転送してくれることを前提として通信が成り立っています。

送信ノードのごく近隣のノードについては、送信ノード自身がARPによって宛先ノードのMACアドレスを特定して直接送信します。自身が直接送信すべきIPアドレスの範囲を、自身と同じ「IPセグメント」と呼びます。

「IPセグメント」の外へのパケットは、その宛先アドレスに届けてくれるであろうルータのMACアドレス宛にパケットを送信します。

サブネット

「IPセグメント」を、「サブネット」とも呼びます。

サブネットマスク

ところで、「IPアドレス」「サブネット」は、(手動、自動の別はあるとしても)各ノード毎に設定する値ですが、実際には「ノードのIPアドレス値」「サブネットマスク値」を設定します。この二つの値から、各ノードがそれぞれ「自身の所属するサブネットのネットワークアドレス」と「サブネット内のノードのアドレス範囲」を割り出しているのです。

「サブネットマスク」は、IPアドレスと同様4オクテット(32ビット)の値です。最上位からある桁まで必ず「1」が連続しており、ある桁から最下位までは必ず「ゼロ」が連続します。
最上位から「1」が連続している桁部分が、ネットワークアドレス部です。
「ゼロ」が連続している桁部分が、ノードのアドレスとなる範囲です。

サブネットマスクは、IPアドレス同様に「ドット付きの10進表記」で表記する、ネットワークアドレス部の桁数で表すこともあります。

例:「192.168.0.128 / 255.255.255.128」または「192.168.0.128 / 25」
2進数表記では
「1100 0000 1010 1000 0000 0000 1000 0000」/
「1111 1111 1111 1111 1111 1111 1000 0000」

ネットワークアドレス/サブネットマスクの関係
1234567891011121314151617181920212223242526272829303132
ネットワーク
アドレス
11000000101010000000000010000000
サブネット
マスク
11111111111111111111111110000000
ネットワークアドレス部ホストアドレス部

ネットワークアドレス、ローカルブロードキャストアドレス、ホストアドレス

「サブネットマスク」の2進数表記で下の桁から「ゼロ」が連続している桁分をすべて「ゼロ」としたIPアドレスを「ネットワークアドレス」と呼びます。「IPアドレス」と「サブネットマスク」のANDを取った結果は必ずこうなります。

また、「サブネットマスク」の2進数表記で下の桁から「ゼロ」が連続している桁分を「ホストアドレス」部、あるいは「ノードアドレス」部と呼びます。「ホストアドレス」部のビットがすべて「1」であるアドレスを、そのIPセグメント内の「ローカルブロードキャストアドレス」と呼ぶ場合があります。

「ネットワークアドレス」は「サブネット」の範囲も把握できるように、「ネットワークアドレス/サブネットマスク」もしくは「ネットワークアドレス/サブネットマスク内の1の桁数」の形式で表記します。

例:ネットワークアドレス:「192.168.0.128/255.255.255.128」もしくは「192.168.0.128/25」
  取りうるホストアドレスの範囲:192.168.0.129~192.168.0.254
  ローカルブロードキャストアドレス:192.168.0.255

例えば、「192.168.0.128/255.255.255.128」は「192.168.0.0/255.255.255.0」の中に含まれてしまうことがわかります。

「192.168.0.128」というIPアドレス値だけでは、「192.168.0.128/255.255.255.128」といったネットワークアドレスなのか、「192.168.0.0/255.255.255.0」というサブネット内にある「192.168.0.128」というノード(ホスト)のアドレスなのかなど、全く判別はできません。

実際にノードはどうやってIPで送信をするか?

では、実際にノードがIPパケットを送信するか、順に見ていきましょう。

1) 宛先IPアドレスを指定したIPパケットを生成する

宛先IPアドレスを指定したIPパケットを生成します。IPパケットのペイロードにはさらに上位のプロトコルのパケットが入ります。

IPパケットを乗せたL2フレームフォーマット(概略)

利用するLayer2の最大フレーム長によっては、上位プロトコルのパケットを複数のIPパケットに分割して生成することもあります(フラグメント)。このためIPヘッダ内には、「IPパケットのID」「後続の分割パケットの有無(more fragment flag)」「分割対象全体の先頭からの分割位置(fragment offset)」の情報が載せられます(分割に関する事項はこの記事では割愛します)。

2) 宛先IPアドレスは自身と同じセグメント内か、セグメント外か?判定する

宛先IPアドレスは自身と同じセグメント内にあるか、セグメント外にあるか?を判定します。
自身の属するIPセグメントのネットワークアドレスは、「自身のIPアドレス」と自身に設定された「サブネットマスク」の論理積(AND)を取ることで得られます(Aとします)。同様に「宛先IPアドレス」と自身に設定された「サブネットマスク」のANDを取った結果をBとします。
A=Bであれば、自身の属するIPセグメント内宛であり、AとBが異なっていればセグメント外宛となります。

3) 宛先MACアドレスを特定しフレーム生成する

2)項の判定結果にしたがってIPパケットを送る先のMACアドレスを特定し、フレームを生成します。

3-1)セグメント内宛⇒ARPテーブルから宛先MACアドレスを得てフレーム生成

  1. ARPによって宛先ノードのMACアドレスを特定します。
  2. 宛先MACアドレスに宛先ノードのMACアドレス、送信するIPパケットをペイロードに持つL2フレームを生成し、送信します。

ARPについては下記をご参照ください。

3-2)セグメント外宛⇒ルーティングテーブルを参照、宛先IPセグメントに送ることができるゲートウェイを特定し、ARPテーブルからゲートウェイのMACアドレスを得てフレームを生成

  1. 「ルーティングテーブル」を参照し、宛先IPアドレスを含むネットワークへのゲートウェイIPアドレスを得ます。

「ルーティングテーブル」とは、概念的には次のような情報のリストです。
リストの上から順に参照し、宛先IPアドレスが該当する項目を見つけたらそこに記載のデートウェイアドレスを使い、それ以下の項目は参照しません。どの項目にも該当しない宛先の場合には、一番最後の「デフォルトゲートウェイ」が使われます。

ルーティングテーブル例(概念)
宛先ネットワークアドレスゲートウェイアドレス
192.168.1.0/24192.168.0.254
192.168.2.0/24192.168.0.253
10.0.0.0/24192.168.0.252
172.0.0.0/16192.168.0.1
0.0.0.0(すべてのIPアドレス)192.168.0.1(デフォルトゲートウェイ)
  1. ARPにより、ゲートウェイのMACアドレスを特定します。
  2. 宛先MACアドレスにゲートウェイのMACアドレス、送信するIPパケットをペイロードに持つL2フレームを生成し、送信します。

ルータを超える宛先へ送信する動作については、下記にも記載しています。

ノードは受信したIPパケットをどう扱うか?

各ノードは受信したIPアドレスを次のように扱います。

自身のIPアドレス宛⇒受け取り、IPパケットのペイロードを上位プロトコル処理に引き渡す

MAC層から取り出されたIPパケットの宛先IPアドレスが自身のIPアドレスであれば、自身宛として受け取り、TCPやUDPなど上位プロトコル処理にIPパケット内のペイロード部分を引き渡します。

自身のIPアドレス以外宛⇒通常ノードでは破棄、ルータはルーティング処理へ

MAC層から取り出されたIPパケットの宛先IPアドレスが自身のIPアドレスでない場合、通常のノードでは破棄します。IPパケットを受信したノードがルータであれば、他へ転送するルーティング処理対象になります。ルーティング処理については以下「ルータの掟!」をご参照ください。

まとめ

IP=Internet Protocolは家庭内、事業所内からインターネットまで、様々な情報通信のインフラで使われているLayer3の通信プロトコルです。
イーサネットやWi-Fiなど様々なLayer2媒体に乗せることができるIPパケットを使い、ある範囲でユニークな「IPアドレス」を持つノード同士での相互通信ができます。

IPは、
IPアドレスを「サブネット」あるいは「IPセグメント」と呼ぶ小さな範囲に分け、
「サブネット」を超える宛先へのIPパケット転送を「ルータ」という装置にゆだねる
ことを前提として設計されています。

ノード自身の「IPアドレス」と自身に設定された「サブネットマスク」のANDを取った結果が、自身の属する「サブネット」の「ネットワークアドレス」です。

宛先IPアドレスと自身に設定された「サブネットマスク」のANDを取った結果が自身の「ネットワークアドレス」と等しければ、宛先は自身の「サブネット」内にあります。等しくなければ自身の「サブネット」外にあります。

送信するノード自身と同じ「サブネット」内にあるノード宛の場合は、送信ノード自身がARPによって特定した宛先ノードのMACアドレス宛に、直接送信します。
送信するノード自身の「サブネット」外にあるノード宛の場合は、送信ノードが自身の持つ「ルーティングテーブル」から見つけ出した妥当な「ルータ(ゲートウェイ)」のMACアドレス宛に送信します。送られたルータは、ルータが持つルーティングテーブルに従って、妥当な宛先に向けてパケットを転送します。

コメント

タイトルとURLをコピーしました