第11回の目標:プログラミングを通してIPアドレスに関する理解を深める。
ネットワークを介して他のコンピュータと通信をする際には、各コンピュータを何らかの方法で識別する必要がある。
インターネット上の各コンピュータを識別するIDをIPアドレスという。
IPアドレスにはバージョン4とバージョン6があり、それぞれIPv4、IPv6と呼ぶ。
32bitのデータである。
そのままでは人間は読みにくいので、11000000.10101000.01100100.00001010 のように8bitずつの4つに区切って表すことがある。
それでもまだ読みにくいので、2進数を10進数に変換して、192.168.100.10 のように表すことが多い。
10進数にしても分かりにくい人向けに、IPアドレスに対して"www.hogehoge.co.jp"のような文字列を対応させ、そちらを使うこともある。この文字列をドメイン名という。
32bitのデータで2の32乗個のパターンを表現できる。それはおよそ43億であるが、世界のコンピュータが増えたことで、IPv4が足りなくなってきている。
そこで128bitのIPv6が作られた。が、これを書いている2024年の段階ではまだIPv4が主流であるようだ。ここではIPv6について詳しく触れない。
通信処理は複雑であり、通信プロトコルは階層になっている。IPアドレスはOSI階層モデルでいう第3層のネットワーク層で使われる。他にも第2層のデータリンク層で使われるMACアドレスがある。ここではMACアドレスについて詳しく触れない。
32bitのIPv4を8bitずつの4つに区切った1つ分で、2の8乗通りのパターンを、つまり、0から255を表せる。
例題1 長さが8の配列(配列のどの値も1か0とする)をパラメータとして引き受けて、それを2進数とみなし、10進数に変換したものを返す関数convert10を定義せよ。
同じのネットワーク内のコンピュータへデータを送るときと、別のネットワークのコンピュータへデータを送るときでは違う処理がなされる。同じネットワーク内のコンピュータへは比較的容易にデータを送ることができる。
ネットワーク同士をつなぐ中継装置をルータというが、別のネットワークへデータを送る際には、まずルータへデータを送ることになる。ルータは経路の情報を持っていて、ルーター間でデータが送られていって、結果的に対象のネットワークの対象のコンピュータへデータが届けられる。
IPv4にはネットワークのIDを意味する部分と、ネットワーク内のコンピュータのIDを意味する部分がある。
IPv4のどこでネットワークのIDとコンピュータのIDが区切られるかを表すのがサブネットマスクである。
例えば、IPv4が以下であり
11000000.10101000.01100100.00001010
サブネットマスクが以下であるとする
11111111.11111111.11111111.00000000
サブネットマスクが1であるところがネットワークのIDであるから、IPv4の先頭から24bit(つまり11000000.10101000.01100100)がネットワークのIDである。
ネットワークのID以外の部分がコンピュータのIDであるから、IPv4の末尾の8bit(つまり00001010)がコンピュータのIDである。
2進数は人間には辛いので普通は10進数で書くが、上の例は10進数で以下のように表される。
IPアドレス:192.168.100.10
サブネットマスク:255.255.255.0
サブネットマスクは先頭からどこかまで1が並び、その後0が並ぶ。区切りは8bitずつの位置とは限らない。例えば下のようなこともある。
11111111.11111111.11111111.11000000 (10進数で255.255.255.192)
また、
11000000.10101000.01100100.00001010(192.168.100.10)と11000000.10101000.01100100.10000010(192.168.100.130)は
サブネットマスクを
11111111.11111111.11111111.00000000 (255.255.255.0)だと思うと同じネットワークであるが
11111111.11111111.11111111.11000000 (255.255.255.192)だと思うと異なるネットワークにあることがわかる。
例題2 長さが32の配列(配列のどの値も1か0とする)3つをパラメータとして引き受けて、それを2進数とみなし、1つめはコンピュータAのIPv4、2つめはコンピュータBのIPv4、3つめはサブネットマスクとする。コンピュータAとコンピュータBが同じネットワークにあればtrueを、そうでなければfalseを返す関数sameNetworkを定義せよ。