# IPv4について IPv4は現代のインターネットにおいては **少しずつ消えていくべきもの** という扱いです。 将来的にはIPv6に置換されると思われますが、まだまだ当分使い続けられるものです。 ## アドレス空間について - IPv4は32ビットのアドレス空間を持ちます。 - 2^32 = 4,294,967,296 - ざっくり43億弱のアドレス空間です - ランダムに使うことはありません - IPv4アドレスは、世界的に管理されており、一定のブロックで 割り当てられています - 個人の利用においては、プロバイダー(ISP)が一定のブロックを保有した状態で、 その中から個人に割り当てる形になります - 指定の範囲内で、空いている値の中から適当に割り当てられます - 可能であれば、以前使っていた値を再利用することもあります(期待してはいけない) ### IPv4アドレスの所有者 - どのIPアドレスがどの組織に割り当てられているのかは、世界的に管理されています - 割り当て状況は `whois` というデータベースで確認できます Linux環境の場合、`whois`コマンドが入っていれば検証可能です。 ```bash $ sudo apt-get update # 実習環境で、必要があればパスワードが求められます $ sudo apt-get install -y whois # whoisパッケージを入れる $ whois 35.76.177.158 # 指定のIPを調査する ``` 入っていなくても、オンラインでwhois探索をするサイトがいくつかあります[^1]。 [^1]: いくつかありますが、個人的には[asuka.ioのWhoisゲートウェイ](https://ja.asuka.io/whois)を 適宜使います。ただしみんなアクセスするとDDoSを疑われてブロックされることがあるので、やるなら自宅でやってください。 ## IPv4アドレスの形式 IPv4アドレスは単純に4つの数字が並んでいるわけでは無く、それなりに意味を持ちます。 - 0〜255までの値を4つ並べている - それぞれを"."(ドット)で区切っている たとえば "192.168.1.1" は該当しますが、 "192.168.1.**256**" は該当しません。 それぞれが0〜255であるため8ビットに収まり、4つの部分で合計32ビットとなります(2^32であり前述の43億弱)。 ### アドレスクラス IPv4アドレスは、最初の部分の値によってクラス分けされます。 - **クラスA**: 0.0.0.0 〜 127.255.255.255 - 最初のビットが0で始まる - 大規模なネットワーク向け - **クラスB**: 128.0.0.0 〜 191.255.255.255 - 最初のビットが10で始まる - 中規模なネットワーク向け - **クラスC**: 192.0.0.0 〜 223.255.255.255 - 最初のビットが110で始まる - 小規模なネットワーク向け - クラスDとEがありますがここでは割愛 ただし、現在はこのようなクラスフルな割り当てはほぼ行われておりません。 ではどうしているかというと、CIDRと呼ばれる方式になっています。 CIDRを学ぶ前に、ビットを使ったアドレス計算について理解しておく必要がありますので、そちらから学んでおきましょう。 ### アドレス計算 IPv4アドレスでは、ネットワークの計算を行うためのビット演算が発生します。 ただし一般的な利用においては、複雑に考えなくても大丈夫なものとなっています。 たとえば、192.168.1.32/24というIPアドレスとマスクの表記は、192.168.1.0から192.168.1.255までのアドレスを含むネットワークを示しています。 これを計算するために、ビット演算を行っていきます。 #### ビットへの変換 192.168.1.32を桁ごとにビットに変換します。 - 192 = 11000000 - 168 = 10101000 - 1 = 00000001 - 32 = 00100000 8ビット毎に"."で区切ると、"11000000.10101000.00000001.00100000" となります。 また、24は24ビットのネットマスクであり、1が24個並んだものと考えます。 IPv4は32ビットのため、残りの8ビットを0で補います。 その結果、24ビットのマスクをビットに変換すると、 "11111111.11111111.11111111.00000000" となります(8ビット毎に"."で区切っています). #### ビット演算 前段で得られた2つのビットの並びを縦に並べましょう。 ``` 11000000.10101000.00000001.00100000 11111111.11111111.11111111.00000000 ``` そして、縦に下ろす形で、各ビットをand演算します。 and演算は、両方のビットが1の時に1が成立する論理演算です。 | A | B | A and B | |---|---|---------| | 0 | 0 | 0 | | 0 | 1 | 0 | | 1 | 0 | 0 | | 1 | 1 | 1 | 疑似的にand演算子を一般的な乗算である "×" で代用すると、以下のように書くことができ、計算結果も添えると以下のようになります。 ``` 11000000.10101000.00000001.00100000 11111111.11111111.11111111.00000000 (× -------------------------------------- 11000000.10101000.00000001.00000000 ^^^^^^^^ ← ※ ``` 計算結果を各8ビット毎に10進数に戻すことで、 192.168.1.0という値を取得できます。 #### 計算の実際 実はこの計算、8ビット単位でマスク長を操作することで、計算を**楽できる**という特徴があります。 - 192.168.1.32/24 -> 192.168.1.0(最後の桁が0になる) - 192.168.1.32/16 -> 192.168.0.0(最後の2桁が0になる) - 192.168.1.32/8 -> 192.0.0.0(最後の3桁が0になる) アドレスクラスのクラスA,B,Cは、複雑そうに見えて、そういう計算がしやすいというネットワーク設計でもあったりします。 - クラスA: ネットマスクは8ビット - クラスB: ネットマスクは16ビット - クラスC: ネットマスクは24ビット #### ネットワークアドレスとブロードキャストアドレス 実は、同じネットマスクで隣接するアドレスを演算すると、出力が同じになることがあります。 - 192.168.1.32/24 -> 192.168.1.0 - 192.168.1.64/24 -> 192.168.1.0 (同じになる) この場合、IPアドレスの計算上『**2つのアドレスは同じネットワークに所属する**』と扱われます。 逆に考えると『同じ計算結果になるのは同じネットワークに所属するから』ともなります。 この時同じとみなせるアドレス(計算結果)の部分を『**ネットワークアドレス**』と呼びます。 ここであらためて、先程のビット演算の様子を見てみましょう。 ``` 11000000.10101000.00000001.00100000 11111111.11111111.11111111.00000000 (× -------------------------------------- 11000000.10101000.00000001.00000000 ^^^^^^^^ ← ※ ``` ※の部分(`^^^^^^^^`)は、マスクによる演算で0にクリアされた部分です。 マスク長24ビットであれば、末尾8ビット(32-24)が該当しますし、16ビットであれば末尾16ビットが該当します。 このように、マスクを使ったことでそこにあった値がゼロにクリアされたビットが計算結果には必ず存在します。 そこで、この部分を強制的に1にしてあげてください。 ``` 11000000.10101000.00000001.00000000 ↓ ^^^^^^^^ ← この部分を強制的に1にする 11000000.10101000.00000001.11111111 ``` この結果(192.168.1.*255*)のことを、**ブロードキャストアドレス**と呼びます。 ここまでをまとめると、以下のような計算結果となります。 - IPアドレス 192.168.1.32 - ネットマスク長 24ビット(255.255.255.0) - ネットワークアドレスは 192.168.1.0 - ブロードキャストアドレスは 192.168.1.255 これらの情報により、このネットワークに属している(=同じネットマスクが設定されている)IPアドレスであれば、 ネットワークアドレスとブロードキャストアドレスは一致し、同じネットワークにいるとみなされます。 #### アドレス範囲 ネットワークアドレスとブロードキャストアドレスが決まると、アドレスの範囲も決定します。 ネットワークアドレスがネットワークにおける『最初のアドレス』位置となり、 ブロードキャストアドレスがネットワークにおける『最後のアドレス』位置となります。 ただし、両アドレス自体を割り当てることはできません(別の目的で共用するため)。 このことから、192.168.1.0/24(ネットワークアドレス/ネットマスク長)のネットワークにおいては、 192.168.1.1〜192.168.1.254までのアドレスが割り当て可能なアドレスとなります。 数にして254です。家庭や小さい組織で使うには現状では十分な範囲だと思います。 ここまでを踏まえ、アドレスクラスと、アドレスの幅を再計算してみます。 | クラス | アドレス範囲 | ネットマスク | 使用可能アドレス範囲 | |-------|-------------|-------------|--------------------:| | A | 0.0.0.0〜127.255.255.255 | 8ビット | 16,777,216 | | B | 128.0.0.0〜191.255.255.255 | 16ビット | 65,536 | | C | 192.0.0.0〜223.255.255.255 | 24ビット | 256 | ```{warning} 使用可能アドレス範囲の値は全て使えるとは限りません。 詳しくは今後登場しますが、ネットワークアドレスとブロードキャストアドレスと判定される部分は使用できません。 大雑把には「範囲-2」となります。 ``` ### ネットワークアドレスとブロードキャストアドレスの役目 前段で、両アドレスは割り当てができないと説明しました。 ではなんのために使うかです。 - ネットワークアドレス - 代表値として扱います - ルーティングの際にネットワークの開始位置として使います - ブロードキャストアドレス - ネットワーク内の全てのホストに対してデータを送信するために使います 特にブロードキャストは、必要なときに『同じネットワークにいる』全てのホストに信号を流す目的で使います。 ```{note} 『ブロードキャスト』(broadcast)は英語で『広範囲に(放送する)』という意味合いで使われています。 いわゆるBS放送のBがこのブロードキャストです(Sはサテライト(Satellite; 衛星)のこと)。 更におまけですが、CS放送のCはCommunicationです。 ``` ## CIDR CIDR(Classless Inter-Domain Routing)は、IPアドレスをより柔軟に割り当てるための方式です。 アドレスクラスのA,B,Cは計算も(わかってしまえば)やりやすくていいのですが、現実的にこの方式で配布を行うと、無駄に広く配布をするようなことが一般的でした。 ```{note} 読みとしては「さいだー」と技術者間であれば通じるようです。 ``` ```{note} 例えば従業員数人の会社に対してクラスC範囲を割り当てると、前後の数個のIPアドレスしか実際に使わないという状態になりかねないという話です。 ``` そして、TCP/IPの普及により、各企業がネットワークへの接続のためにIPアドレスを要求するようになりました。 それが原因となって、アドレス不足(レンジ不足)が発生してきました。 そこで考案されたのがCIDRであり、より柔軟にIPアドレス(レンジ)を割り当てるようにできるよう設計されました。 といっても簡単な話で、**従来のクラスの枠を取っ払い、マスク長をもっと融通利かせようという考え方**で十分です。 たとえば、18ビットマスクとか25ビットマスクという中途半端なマスク長をもちいるということです。 わかりやすい現実的な数値として、28ビット長を考えてみましょう。 192.168.1.32/28という計算ですが、前述のアドレス計算と同じでビットに落として計算してみます。 ``` 192.168.1.32 => 11000000.10101000.00000001.00100000 28ビットマスク => 11111111.11111111.11111111.11110000 (× --------------------------------------- 11000000.10101000.00000001.00100000 ^^^^ ``` となります。この場合計算によりクリアされたのは末尾4ビットであることに注意して、ネットワークアドレスとブロードキャストアドレスを計算してみましょう。 - ネットワークアドレスは 192.168.1.32 - ブロードキャストアドレスは 192.168.1.**47** - 割り当て可能なアドレスは 192.168.1.33〜192.168.1.46 割当可能アドレス数14 とかなり狭くなりました。 CIDRのポイントは、この考え方でアドレスを割り振ると、従来のクラスに対して充填密度が上がるという所があります。 例えばクラスCである 192.168.1.0/24 は 1つのネットワークとなりますが、 CIDRを用い、28ビットマスク長で割り振ると、細かいネットワークが形成できます。 - 192.168.1.0/28 - 192.168.1.16/28 - 192.168.1.32/28 - 以下16刻み... - 192.168.1.248/28 と、16のネットワークに細分化できます。 CIDRを使うことで、必要な幅を調整し、必要な範囲での割り当てがしやすくなりました。 ```{note} CIDRは単純に分割すればいいじゃないという話では済みません。 実際にはネットワーク上のルーティングも対応する必要があり、ルーティングテーブルという表計算の負荷が増えてしまう事もあるので、注意が必要です。 ルーターに負荷がかかると、トータルのスループットにも影響が出かねませんので、事前に対策などを検討する必要がありました。 ``` ## アドレスの配布方法 IPv4アドレスは全世界で共有される値です。 なおかつ、アドレスとして『重複が発生しない』事を保証しないといけません。 そのため、アドレスは勝手に使うことは許されておらず、管理下の元で配布されるようになっています。 そこで現在、IANAという組織(非政府組織)が、IPアドレスの管理を行っています。 ここではIPv4に話を絞って書き出しておきます。 - IANA(Internet Assigned Numbers Authority) - 世界中のIPアドレスを管理している組織 - 各国の地域インターネットレジストリ(RIR)に対して、IPアドレスを割り当てる - RIR(Regional Internet Registry) - IANAの下部組織みたいなもの - 全世界をとりあえず5つのブロックに分け、IANAから地域用のレンジの割り当てを受けている(受けていた) - 各地域、国などにそこを対象とするレジストリが存在します(NICと呼ばれます) - 例えば日本ならJPNIC(Japan Network Information Center) - あとは各地のNICがその中で配布をします(プロバイダーなどが該当) なお、RIRの5つは以下のものとなっています。 | RIR名 | 雑に管理区域 | |-------|----------------| | ARIN[^2] | 北米、カリブ海地域 | | RIPE | ヨーロッパ、中東、北アフリカ | | APNIC | アジア太平洋地域 | | LACNIC | ラテンアメリカ、カリブ海地域 | | AfriNIC | アフリカ地域 | [^2]: 正直「えーりん」か「あーりん」か、読みがわかりません。Gemini 2.5Pro先生に確認しましたが「どっちでもいいんじゃない」的にあしらわれてしまいました。