スキルアップ

IP(Internet Protocol)についてMACアドレスの必要性も交えて説明します

以下の不満を解消するため、会社員をやめてフリーランスになった『NaruTaku』と申します。

会社員時代の不満

・収入の限界(給料が上がらない)

・自由な時間が持てない(会社に拘束される)

・人間関係がしんどい

※フリーランスになり、これらの不満は解消されました(収入も増え、自分の時間を増やし、のびのびと働くことができております)

今回は基礎技術の紹介で、IP(Internet Protocol)について書いてみようと思います。

IPについては説明したいことが多いのですが、この記事はこれからエンジニアを目指す方やエンジニア経験の浅い方向けに説明する記事ですので、今回は概要に絞ってわかりやすく説明しようと思います。

リンク層での通信

IP(Internet Protocol)はTCP/IPプロトコルスタックのインターネット層に位置するプロトコルでIPアドレスを使用して通信するプロトコルになりますが、前段のリンク層から説明した方がわかりやすくなりますので、簡単にリンク層での通信を説明します。まず、以下をご覧ください。

3台のPCがスイッチングハブで接続されています。(MACアドレスは48bitなので本来は「AA-AA-AA-AA-AA-AA」という形になるのですが、説明のために「AA」と8bitの形に省略しています)

上記においてホストA、ホストB、ホストCがお互いに通信するとき、使うアドレスはわかるでしょうか?そうです。答えはMACアドレスです。

新人くん
新人くん
IPアドレスじゃねーのかよ!青いLANケーブルささってるしよー

と思われた方いらっしゃるでしょうか?若い頃の私は思ってました。LANケーブルをさした時点でIPアドレスを使って通信すると疑うことなく信じておりました笑

ここはすごく基本的なところなのですが、ここをしっかりしておかないとIPを正しく理解できないので説明します。

上記のホストA、ホストB、ホストCの関係を「同じネットワークに所属している」と表現します。IPアドレスはネットワーク部とホスト部にわかれて構成されているのですが、今回の例では上位24bitがネットワークアドレス部、下位8bitをホストアドレス部としています。(IPアドレスについてネットワーク部とホスト部の詳細な説明は別の記事で説明するつもりです)

そして、今回のIPアドレスは以下になります。

ネットワーク部(24bit)ホスト部(8bit)
19216801
19216802
19216803

3台ともネットワーク部は「192.168.0」です。ですので、この3台は「192.168.0」のネットワークに所属するホストということになります。そして、ホスト部は1と2と3が振られていますので、ホストAは「192.168.0」のネットワークに所属するアドレス1のホスト。ホストBは「192.168.0」のネットワークに所属するアドレス2のホスト。ホストCは「192.168.0」のネットワークに所属するアドレス3のホスト。という意味になります。当然ですが、同じネットワークで同じホストアドレスは使えませんので、例えばホストDを追加して「192.168.0.1」とIPアドレスを設定すると、「もうそのホストアドレスはこのネットワークで使われてるよ!」と警告されます。

そして、この「同じネットワーク」のことをLAN(Local Area Network)と言い、TCP/IPプロトコルではリンク層と呼ばれます。このリンク層(LANの中)ではIPアドレスでなくMACアドレスを使用して通信するルールになっています。(LAN内ではお互いにMACアドレスはわかっています)

ちなみに、上記の例ではスイッチングハブを介してLANケーブルを接続しておりますが、無線のアクセスポイントを使用して無線でつないでも、同じLANです。そのアクセスポイントで繋がっているホストはMACアドレスを使用して通信します。

少しくどい説明になってしまいましたが、リンク層であるLAN(同じネットワーク)ではMACアドレスを使用して通信することを理解しておくことが重要です。

新人くん
新人くん
ちょっと待て!おれはLAN内でもIPアドレス指定して通信させてるぜ!

と思われた方いるかもしれませんね。私もそうでした笑

ただ、IPアドレスを指定したとしても、裏ではEthernetヘッダ(宛先MACアドレスなどが記載される)に宛先MACアドレスを指定して、その情報で通信します。Ethernetヘッダの後にIPヘッダ(宛先IPアドレスなどが記載される)がついていて、ここに宛先IPアドレスは記載されているのですが、リンク層でIPヘッダの情報は使用しません。

新人くん
新人くん
いや、ちょっと待てよ!IPアドレスからMACアドレスに変換できるならよー、IPアドレスかMACアドレスどっちか一つでいんじゃね?

はい。LANの中でしか通信しないならどっちか一つで大丈夫です笑

ただ、ネットワークを超えて通信する場合にIPアドレスとMACアドレスの両方が必要になります、その場合どういった通信になるかを説明していきたいと思います。

インターネット層での通信

では、IPアドレスを使用した通信を見ていきたいと思います。以下をご覧ください。

ホストDを追加しました。しかし、ホストDのIPアドレスは192.168.1.1となっており、ホストA,B,Cとはネットワークアドレスが違います。つまり、ホストA,B,CとホストDは所属しているネットワークが違うのです。先ほど、LAN(同じネットワーク)ではMACアドレスを使用して通信すると説明しましたが、ホストA,B,CとホストDは同じネットワークではないため、MACアドレスでは通信できません。この場合にIPアドレスが必要になってきます。

そして違うネットワークで接続するとき、ルーターが必要になります。ルーターは違うネットワークをつなぐための機器なのですが、簡単に言いますと、

「〇.〇.〇ってネットワークアドレスがきたらこっちのポートから出して、それ以外はそっちからねー」

という設定をするための機器です。この設定をルーティングというのですが、このルーティングが適切に設定されているので、いろんなネットワークに接続することができるわけです。

新人くん
新人くん
ちょっと待て!ルーターでネットワークがわかれるってことは、ルーターの、なんていうかあっち側とこっち側でIPアドレスがかわるのか?

これ、私が新人時代にもった疑問です笑

実際にルーティングの設定をしたら一発で理解できるのですが、ルーターのあっち側とこっち側でかわります。ルーターはそれぞれのポートにIPアドレスを設定でき、もちろんそれぞれがMACアドレスを持っています。以上の説明を踏まえて少し先ほどの図を修正してみました。

左側がホストA,B,Cの所属する192.168.0のネットワーク、右側がホストDの所属する192.168.1のネットワークになります。そして192.168.0のネットワークと繋がっているルーターの左側のポート(ポートAとします)のIPアドレスは192.168.0.4。MACアドレスはR1。192.168.1のネットワークと繋がっているルーターの右側のポート(ポートBとします)のIPアドレスは192.168.1.4。MACアドレスはR2となっており、IPアドレスはそれぞれの所属するネットワークアドレスとなっています。

そして、ルーティングの設定は

「192.168.0あてのパケットはポートAから出して、192.168.1あてのパケットはポートBから出してねー」

となります。(通常はそれ以外のネットワークあてのパケットのルーティングも設定するのですが、今回は割愛してます)

これでホストA,B,CとホストDを通信させることができます。では、実際にどのように通信するのか見ていきます。

インターネット層での各ヘッダ情報

ここまでで、LAN(同じネットワーク)での通信はMACアドレス、違うネットワークの通信にIPアドレスが必要と説明してきましたが、その情報はそれぞれEthernetヘッダ、IPヘッダに設定することになっています。それぞれのヘッダではたくさんの情報を設定する決まりになっているのですが、ここではわかりやすくするために、送信元MACアドレス、宛先MACアドレス、送信元IPアドレス、宛先IPアドレスに絞って説明したいと思います。

では、ホストAからホストDへパケットを送る場合を例に見てきます。

まずEthernetヘッダーですが、送信元MACアドレスは自分のMACアドレスなので「AA」となります。宛先MACアドレスはホストDのMACアドレスなのでDDなのですが、ネットワークが違うためホストAにはわかりません。この場合どうするかというと、宛先MACアドレスにルーターのMACアドレスを設定します。違うネットワークへの通信なので、ルーターを経由するしかないからです。なので、宛先MACアドレスはR1となります。(自分の所属する側のポートになります。この場合は左側のポートAになります)

IPヘッダは宛先IPアドレスにホストDのIPアドレス192.168.1.1を送信元IPアドレスに自分のIPアドレスを設定します。ですので、ホストAからルーターへ向かって以下のパケットが送られます。

上記のようになります。

次にこのパケットをポートAで受け取ったルーターは、IPヘッダに設定された宛先IPアドレスのネットワークアドレスを確認します。「192.168.1」となっているのでルーティングの設定に従って、右側のポートBへ受け取ったパケットを転送します。この時点で192.168.0のネットワークから192.168.1のネットワークへ切り替わります。

192.168.1のネットワークへたどりつくことができましたので、ホストDのMACアドレスがわかります。ですので、宛先MACアドレスにホストDのMACアドレスである「DD」が設定されます。ホストDに向けてパケットを送るのはルーターになりますので、送信元MACアドレスはルーターのポートB(右側ポート)の「R2」、送信元IPアドレスもルーターのポートB(右側ポート)の「192.168.1.4」となります。

これで無事にホストDにパケットが届き、ホストAからホストDへの通信が完了しました。このような手順でネットワークが違う場合の通信はされるのですが、注目していただきたいのは宛先IPアドレスだけは最初から最後まで変わらないということです。

上記の例は目的のネットワークが隣にありましたのでルーターを一つ経由するだけでしたが、ルーターをいくつも経由する場合もあります。その場合もルーターを超えるたびに送信元MACアドレス、宛先MACアドレス、送信元IPアドレスは変わるのですが、宛先のIPアドレスだけは変わりません。

「IPアドレスが最終目的地でMACアドレスが次の目的地」

という説明を聞かれたり見たことがあるかもしれませんが、もう少し詳しく説明すると、

IPアドレスは最終目的地、MACアドレスは今いるネットワーク(LAN)の目的地ということになります。TCP/IP通信では目的地まで一気に飛ぶということはできません。ドラクエのルーラみたいな飛び方はできないんですね。(わからない方すみません。。。)

目的のネットワークにたどりつくまで、地道にルーターを通ってネットワークをたどっていきます。ですので、目的のネットワークにたどりつくまでは今いるネットワーク(LAN)のルーターを目指していくことになります。そして、LAN(同じネットワーク)ではMACアドレスを使用して通信するというルールに従って、宛先MACアドレスにはルーターのMACアドレスが設定されます。

このようにネットワークを超える場合の通信にはIPアドレスとMACアドレスが必要になってきます。できるだけわかりやすく説明したつもりですが、おわかりいただけましたでしょうか。

少しでもIP通信の理解を深めていただけたなら幸いです。

以上、今回はIP(Internet Protocol)について説明してみました。

まとめ

今回はIP(Internet Protocol)について書いてみました。

たまに、「IPアドレスは住所、MACアドレスは個人を特定するために必要」という説明を見たりしますが、これだけだとまったく不十分だと感じます。

だって、目的のLAN(住所)にたどりついたあと、個人(ホスト)はIPアドレス(プライベートIPアドレス)で特定できるからです。(プライベートIPアドレスとMACアドレスは紐づいているわけですが)

新人くん
新人くん
あれ?じゃあよー。LAN内はMACアドレス使わなくてもIPアドレス(プライベートIPアドレス)で通信できんじゃね?

と思われた方いらっしゃるかもしれませんが、きっとできます。

じゃあなぜそうせずMACアドレスを使っているかというと、そういう仕組みで設計されているからだと思います。MACアドレスはEthernetヘッダに設定され、その上にIPアドレスが設定されるIPヘッダがつく仕組みになっています。もしLAN内をプライベートIPアドレスで通信させるルールに変更すると、Ethernetヘッダの代わりにプライベートIPアドレスを設定するヘッダが必要になり、それに続き従来のIPヘッダが続くような形になるのかなぁと思ったりするのですが、こんな変更をしてしまうと影響範囲が大きすぎるので今後もされないと思います。

あと、別の記事で説明する予定ですが、ARPというプロトコルでIPアドレスとMACアドレスを紐づけていますので、LAN内はMACアドレスで通信していますが、結局IPアドレス(プライベートIPアドレス)で通信しているのと変わりません笑

ですので、「IPアドレスは住所、MACアドレスは個人を特定するために必要」というだけの説明を見ると、個人体には凄く違和感なのです^^;

共感していただけたら嬉しいです笑

最後まで読んでくださりありがとうございました。

※TCP/IPの各プロトコルについてこちらで紹介しております。

こちらもCHECK

TCP/IPの各プロトコルについてわかりやすく説明します

以下の不満を解消するため、会社員をやめてフリーランスになった『NaruTaku』と申します。 ※フリーランスになり、これらの不満は解消されました(収入も増え、自分の時間を増やし、のびのびと働くことがで ...

続きを見る

  • この記事を書いた人
  • 最新記事

NaruTaku

40代のフリーランスエンジニア・シナリオライター。 20代前半から20年間エンジニアとしてキャリアを積みフリーランスへ転身。ソフトウェア開発とゲーム開発、シナリオ執筆をメインに、プログラミング講師・Webライターとしても活動。また、フリーランスになり見た目の重要性に今さら気づき、ヒゲ脱毛を実施中。

-スキルアップ