独り言

プログラミングの講師をしています。新人研修で扱う技術の解説と個人の技術メモ、技術書の紹介など

【情報処理】ネットワークの基本(IPv4)

ここではネットワークの中でも、IPv4IPアドレスについて解説します。
IPアドレスの基本と、IPv4IPv6のざっくりとした解説はネットワークの基本の記事に書きましたので、そちらを参照ください。
ここではIPアドレスという表記は基本的にIPv4におけるIPアドレスの前提で解説します。

IPアドレスとは

まずはIPアドレスがそもそも何なのかをおさらいします。
IPアドレスは、Internet Protocol アドレスの略で、ネットワーク上の住所を表す数値となります。
同じネットワーク内において、異なるコンピュータ同士(ルータなどの通信機器も含む)ではIPアドレスの値は重複してはいけません。
同一ネットワーク内で問題なく通信を行う場合、全ての機器に異なるIPアドレスを割り当てる必要があります。
スマホやPCなどでインターネットに接続する際には、必ずIPアドレスが必要になります。

プライベートIPアドレスグローバルIPアドレス

IPv4IPアドレスにはプライベートIPアドレスグローバルIPアドレスがあります。
これはIPv4を効率よく活用するための仕組みの一つです。

簡単にいうと、グローバルIPアドレスはインターネットに接続するためのIPアドレスで、プライベートIPアドレスは、社内や学校内や家庭内など、閉じられたネットワーク内におけるIPアドレスです。

プライベートIPアドレスは、同じネットワーク内でアドレスが重複しないように割り振ります。
基本的にはどんな値でも割り振れますが、IPアドレスの管理組織により値の範囲が定められており、
10.0.0.0~10.255.255.255(クラスA)
172.16.0.0~172.31.255.255(クラスB)
192.168.0.0~192.168.255.255(クラスC)
の範囲から割り振ることになっています。

プライベートIPアドレスは、Windowsの場合はコマンドプロンプトから確認することができます。
コマンドプロンプトを起動し、
ipconfig
とコマンドを入力します。

ネットワークアダプタの数だけ情報が表示されるかと思いますが、その中でインターネットの接続に使用されているネットワークアダプタ
IPv4 アドレス」
の右側に書かれているピリオドで区切られた4つの数値がプライベートIPアドレスです。
私の環境の場合
192.168.0.6
となっています。

プライベートIPアドレスはネットワークの設定から自分で設定することもできますが、ルータの機能で自動的に重複しないように割り振ってくれます。

続いてグローバルIPアドレスを確認してみましょう。
グローバルIPアドレスは下記のサイトから確認することができます。

https://www.cman.jp/network/support/go_access.cgi

IPアドレスの管理組織

ここでIPアドレスの管理組織についても見ておきましょう。
IPv4では約43億のIPアドレスが使用可能ですが、個人個人が好き勝手にアドレスを使用しては、すぐに枯渇してしまいますし、何よりいたるところで重複が起きてしまいます。
IPアドレスが重複せずに効率よく使用されるように、管理組織が存在します。
IPアドレスの管理組織は、IANA(Internet Assigned Numbers Authority) を頂点とした階層構造になっています。
IANAの下には、地域ごとの管理組織があり、その下に国ごとの管理組織があります。
日本は、APNIC(Asia Pacific Network Information Centre)というアジアの管理組織の下にあるJPNICという組織が管理しています。
JPNICの下には各インターネットサービスプロバイダーがあります。
インターネットを利用するユーザーは、このインターネットサービスプロバイダーと契約することで、IPアドレスを使用することができるようになります。

IPアドレスの表記方法

ここではIPアドレスの表記方法について説明します。
プライベートIPアドレスグローバルIPアドレスも、4つの数値がピリオドで区切られて表記されています。
IPv4は、32bitで表現されています。
普通に表記すれば0と1の組み合わせが32個並ぶ形になりますが、それだと人が見た時に分かりにくいです。
そのため、8bitで4つに区切り、それぞれを10進数で表示するのが一般的です。
8bitの場合、10進数では最大255まで表現できます。
なので、IPv4IPアドレスは0~255の数値が4つ並んだ形で表現されます。

DHCP

IPアドレスは、手動で設定することも可能です。
Windowsの場合、
コントロールパネル ⇒ ネットワークとインターネット ⇒ ネットワークと共有センター ⇒ アダプターの設定の変更
を選択します。
選択すると自分のPCのネットワークアダプタの一覧が表示されます。
その中からインターネットに接続されているアダプタを右クリックし、「プロパティ」を選択します。

プロパティのウィンドウから、「インターネット プロトコル バージョン4(TCP/IPv4)」を選択し、プロパティを選択します。
するとIPアドレスを設定することができる画面が表示されます。
この画面で「IPアドレスを自動的に取得する」にチェックが入っている場合は、ルータの機能により各端末に自動でIPアドレスが割り振られます。

そうでない場合は、IPアドレスサブネットマスクデフォルトゲートウェイなどを手動で設定する必要があります。

ここでDHCPと呼ばれる機能について説明します。
DHCPとは、Dynamic Host Configuration Protocol の略で、IPアドレスやそれに関連する設定情報を動的に割り当ててくれる技術のことです。
ルータ(インターネットに接続するために必要な機器)には大抵このDHCPの機能がついています。
ルータでDHCPの機能が有効になっていれば、無線wi-fiや有線LANに接続した際に、自動的に重複しないようにIPアドレスを割り当ててくれます。

NAT

ここでプライベートIPアドレスグローバルIPアドレスの話に戻ります。
もし今社内や学校内、家庭内にいて、2台以上のPCを使用できる状態にあるのであれば、是非ともその2台でプライベートIPアドレスグローバルIPアドレスを確認してみてください。

おそらく、プライベートIPアドレスは2台で異なる値となっており、グローバルIPアドレスは2台で同じ値となっていると思います。

まず、基本的にIPアドレスはネットワーク内で重複しないように設定する必要があります。
ですので、同じネットワーク内にある端末同士ではプライベートIPアドレスは重複しないように設定されているはずです。
(仮に重複していた場合は、同じネットワーク内の端末同士やインターネット上でうまく通信できなくなります。)
手動でIPアドレスを設定している場合は、お互いでIPアドレスを確認しながら、重複しないように設定します。
DHCPの機能で自動的にIPアドレスを割り振っている場合は、DCHPの機能で各端末同士で重複しないようにIPアドレスを割り振ってくれます。

プライベートIPアドレスは、同じネットワーク内だけで有効となるIPアドレスです。
なので、プライベートIPアドレスを使ってインターネットに接続することはできません。
インターネットに接続する場合にはグローバルIPアドレスが必要です。

そこで、ルータにはプライベートIPアドレスグローバルIPアドレスを変換するための機能がついています。
それがNATと呼ばれる機能です。
NATはNetwork Address Translation の略で、先に述べた通りプライベートIPアドレスグローバルIPアドレスを相互に変換してくれる機能のことです。
この機能により、各PCではプライベートIPアドレスしか設定していない状態でも、インターネットへの接続が可能となっています。

厳密にいうと、NATはプライベートIPアドレスグローバルIPアドレスを1対1に変換する機能のことをいいます。
ただ、多くの場合、同じネットワーク内で各端末のグローバルIPアドレスを確認すると同じ値になっているかと思います。
つまり、グローバルIPアドレスとプライベートIPアドレスが1対多で変換されています。
これはNAPTと呼ばれる機能によって実現されています。
NAPTはNetwork Address and Port Translation の略で、IPアドレスに加えてポート番号と呼ばれる値も付け加えることによって、1対多の変換を可能にしている機能です。
Linuxサーバーに実装されているNAPTの機能はIPマスカレードと呼ばれます。

このように厳密にはNATとNAPTで機能の違いがありますが、ルータのマニュアル等ではほとんどの場合NAPTの機能もNATという言葉で説明されています。

サブネットマスク

コマンドプロンプトからIPv4アドレスを確認した場合、IPv4アドレスのすぐ下にサブネットマスクという表記があるかと思います。
続いてはこのサブネットマスクについて説明します。
サブネットマスクIPアドレスを「ネットワーク部」と「ホスト部」に分けるための仕組みです。
ネットワーク部とは、そのIPアドレスがどのグループに属しているかを表す部分で、ホスト部は、そのグループの中での各端末を区別するための部分です。

IPアドレスは32bitの数値で表すことができます。
ただ、数値を無作為に割り振ってしまうと管理しにくくなります。
例えば、ある程度規模の大きな企業の場合、部署ごとに、あるいはフロアごとに、など、意味のある単位でグルーピングしてIPアドレスを割り振った方が管理もしやすく、またセキュリティの面なども考慮しやすくなります。
このようにネットワークをグループ分けは、32bitを適当な場所で区切って、ネットワーク部とホスト部に分けることによって実現します。

このとき、32bitの内どこまでがネットワーク部でどこからがホスト部なのかを識別するために用いられるのがサブネットマスクです。
サブネットマスクを32bitで表示したときに、1で表示されている部分がネットワーク部です。

例えば私の環境ではIPv4アドレスとサブネットマスクは以下の様になっています。

IPv4 アドレス 192.168.0.6
サブネットマスク 255.255.255.0

このサブネットマスクの値を2進数で表示すると、
11111111.11111111.11111111.00000000
となります。
つまり、192.168.0.6のうちの最初の24bit(192.168.0まで)がネットワーク部を表し、後半の8bit(6の部分)がホスト部を表します。

例えば、
192.168.0.7
というIPアドレスの端末は、同じネットワーク部(グループ)であることを表しており、
192.168.1.5
というIPアドレスだった場合、異なるネットワーク部に属していることになります。

どこまでがネットワーク部でどこからがホスト部かを表す方法には、サブネットマスクを使用せずに、IPアドレスのあとにネットワーク部のbit数を/(スラッシュ)で区切って表記する方法もあります。
例えば、今回の例の場合、前半の24bitがネットワーク部を表しているので
192.168.0.6/24
と表記します。
このような表記方法をCIDR記法と呼びます。

クラスによるIPの分類

先に紹介したサブネットマスクやCIDRと呼ばれるネットワークの分け方はIPアドレスが登場したときからあったわけではありません。
IPアドレスが登場したばかりのころは、クラスと呼ばれる方法でIPアドレスのグループを管理していました。
しかし、その方法では、IPアドレスを有効活用できない(つまり、使われないIPアドレスが多く出てしまう)問題がありました。
先に述べたIPアドレス枯渇問題により、いずれIPアドレスが足りなくなると言われている中、IPアドレス有効に活用される仕組みとして登場したのがサブネットマスクやCIDRといった仕組みです。

そのため、クラスの分類は現在はそれほど重要な概念ではありませんが、簡単に説明しておきます。
クラスでIPアドレスを分類する場合、A~Dまでの4つのクラスがあります。

クラスAは、先頭の1bitが0で始まり、先頭8ビットまでがネットワーク部になります。
IPアドレスの範囲を10進数で表すと0.0.0.0~127.255.255.255です。
下位の24bitがホスト部になります。
1つのネットワーク部で割り当てができるホストの数は16,777,214個です。

クラスBは、先頭の2bitが10で始まり、先頭の16ビットまでがネットワーク部です。
IPアドレスの範囲を10進数で表すと128.0.0.0~191.255.255.255です。
下位の16bitがホスト部になります。
1つのネットワーク部で割り当てできるホストの数は65,534個です。

クラスCは先頭の3bitが110から始まり、先頭から24bitまでがネットワーク部です。
IPアドレスの範囲を10進数で表すと192.0.0.0~223.255.255.255です。
下位8bitがホスト部になります。
1つのネットワーク部で割り当てできるホストの数は254個です。

クラスDは、先頭の4bitが1110で始まり、先頭の32bitまでがネットワーク部です。
IPアドレスの範囲を10進数で表すと224.0.0.0~239.255.255.255です。
クラスDはIPマルチキャストと呼ばれる通信で利用されるもので、ホスト部はありません。

クラスでの分類の場合、クラスA、クラスB、クラスCのいずれかのクラスでIPアドレスを割り当てることになりますが、この場合無駄が多く発生します。
そのため、できるだけ無駄なくIPアドレスを利用できるようにサブネットマスク等が登場し、今ではあまり使用されていません。

ホスト部に割り当て可能なアドレス

サブネットマスクが255.255.255.0だった場合、ホスト部に割り当て可能なアドレス後半の8bit分です。
この場合、0~255までの範囲が扱えるので、最大256台の端末を接続することが可能になりそうです。
しかし、実際には全ての値が扱えるわけではなく、端末に割り当てることができない数値もあります。

まず、ホスト部の数値が全て0となっているアドレスは、ネットワークアドレスと呼ばれます。
ネットワークアドレスはそのネットワークそのものを表すアドレスとなっており、端末に割り当てることはできません。
今回の例でいうと192.168.0.0がネットワークアドレスになります。

そして、ホスト部の数値が全て1となっているアドレスは、ブロードキャストアドレスと呼ばれます。
ブロードキャストアドレスは、そのネットワーク内の全ての機器に一斉にデータを送るときに使用される特別なアドレスで、このアドレスも端末に割り当てることはできません。
今回の例でいうと192.168.0.255がブロードキャストアドレスとなります。

まとめると、ホスト部が8bitだった場合、端末に割り当てることができるIPアドレスの数は、256 - 2(ネットワークアドレスとブロードキャストアドレス) = 254 ということになります。
一般化すると、ホスト部がnbitだった場合、そのネットワーク内で割り当て割れるIPアドレスの数は 2のn乗 - 2個 ということになります。

また、ルータにもIPアドレスが必要になりますが、ルータは一般的にホスト部のアドレスが1のアドレスを割り当てることが多いです。
今回の例でいうと、192.168.0.1がルータのアドレスとなります。
ルータのIPアドレスは、コマンドプロンプトでipconfigでIPアドレスを確認した際の「デフォルト ゲートウェイ」の値です。