仕事で作っているアプリのベータリリースが今週末に迫っている。
先週の月曜に、上司からこう言われた。
「泣いても笑っても10日がXデイだからね」
それなりに必死だったが、今月に入って既に残業が20時間を超えている。
気がつくとあと2日しかないではないか。
実装しなければならない機能はまだまだ沢山ある。
結合もかなり進んでいるので、他人のソースに手を入れることもかなり多い。
俺がコードを挿入しただの、コメントアウト(削除はしない方が良いだろう)しただの、
コメントでいちいち書くのがめんどくさい。
コメントは基本的に英語で書くが、たまに日本語を使うこともある。
自分が分らなくなっては元も子もないからだ。
例
// このやり方は気に入らないんだけど他になんか良い方法ないかなあ
// ifはコストが大きいため、ビット演算でループ。もしかすると俺以外分らないかも…
今日は何だ、IPアドレスについて語ろうかな。
少なくとも基本情報を持っている人や、情報系の大学出なら見るまでもない常識的なことだけど。
念のため…
2進数とは、0と1のみで数を表す表現手法。0>1>10>11>100>101>110>111と繰り上がる。
16進数とは、0123456789ABCDEFの16文字で表す表現手法だ。Fの次の数は10だ。
IPアドレスってのは、普通IPv4アドレスのことを言うと思う。ここでもIPv4について話す。
000.000.000.000といった感じで表現することが多い。
000.000.000.000?255.255.255.255の範囲で表現する。
実はこれは、32桁の2進数を8桁ずつに分けて、十進数で表現している。
なぜ一つの区切りが000?255なのかは、8桁の2進数で表現できる範囲が、十進数の0?255の256通りだからだ。
わかりやすく説明すると、001.001.001.001というIPアドレスの実態は次の2進数だ。
00000001000000010000000100000001
上記の2進数を、わかりやすい十進数に直すと次のようになる。
16843009
16進数ならこうだ。
0x01010101
2進数と16進数がよく似ていることがわかるだろうか。
2進数を4の倍数桁(4桁とか8桁)で区切ると、16進数で扱いやすくなる。
0000は16進数の0だし、1111なら16進数のFだ。
2進数の01010101は[0101][0101]と区切ってやれば、16進数の[5][5]即ち55だと直ぐにわかる。
だからプログラム上では16進数を多用する。2進数を使うことはまず無い。桁ばかり増えて無駄。
話を戻す。つまり、2進数の32桁即ち32bitでIPアドレスは表現されるのだ。
ややこしいのは、元々32桁の2進数を無理矢理8桁(1Byte)ずつ切って10進数にしているところだ。
8桁に切ったなら16進数で表現すればいいじゃまいか。いいじゃまいかいいじゃまいかー。
区切りを見分けるためにドットが入っているわけで、それはIPアドレスの表現の一種に過ぎない。
先ほどの001.001.001.001は、2進数を分かりやすくする表現手法の一種に過ぎない。
以下の数字は、同じ意味を持つアドレスだ。(ブラウザで使えるかは不明。ってか多分無理)
16843009
0x01010101
んで、アドレスは2進数を8桁ずつに切ってクラスという区分けをされる。
サブネットという概念で、桁を区切ることでネットワークを分けようと言うことだ。
サブネットマスクは、サブネット(分けたネットワーク)を作るためにある。
サブネットマスクで255になっている部分とIPアドレスを照らし合わせて、
同じ桁が同じ数字なら同じネットワークになり、通信が可能だ。
192.168.5.2/255.255.0.0 と 192.168.10.60/255.255.0.0は同じネットワークだ。
つまりサブネットマスクは、アドレスに「マスク」することでサブネットを決める存在だ。
(今はサブネットマスクを1bitずつ変えても良いので、クラスはメチャクチャだけど…)
クラスA 000 サブネットマスク255.0.0.0
クラスB 000.000 サブネットマスク255.255.0.0
クラスC 000.000.000 サブネットマスク255.255.255.0
下位のクラス(クラスCとか)程、影響力が弱い。末端のネットワークで変化する部分だ。
通信は同じサブネットでないと出来ない。違うサブネットを繋ぐ存在がゲートウェイだ。
ルータという機器をご存じだろうか。ルータはゲートウェイの役割をこなす。ルータはサブネット毎に存在し、別のサブネットからの通信を自分のサブネットの誰に繋げばいいかを決める役割をする。
余談だが、サブネットは物理的な違いではなく論理的な違いなので、1つのハブで構成されたスター型ネットワークに3つのサブネットがあれば、そのハブに3つのルータが接続されることもあると思う。
実際にネットワーク上を流れるIPパケットには、始点IPアドレスと終点IPアドレスがビッグエンディアンで格納される。
IPアドレスのクラス一部を0と255にすることはできない。
例えば192.168.1.0とした場合、これはIPアドレスではなくネットワークアドレスになる。
192.168.1が頭につき、サブネットマスクが255.255.255.0であるIPアドレスが所属するネットワーク自体を表す。
また、192.168.1.255とした場合、これはブロードキャストアドレスになる。
このアドレスへパケットを送ると、サブネット指向ブロードキャストとなり、192.168.1が頭につき、サブネットマスクが255.255.255.0であるIPアドレス全てが受信する。
ブロードキャストの最強版が制限付きブロードキャスト255.255.255.255だ。このアドレスにパケットを送ると、サブネットを無視して物理的に接続されているアドレス全てが受信する。つまり宛先MACアドレスはFF:FF:FF:FF:FF:FFとなる。
ブロードキャストパケットは、普通ゲートウェイに遮断される。つまり、外部には流れ無い。これは通信路のパケット渋滞を防ぐとともに、セキュリティのためでもある。
ローカルアドレス
閉じたネットワークで使うためのアドレスがある。
10.0.0.0?10.255.255.255
192.168.0.0?192.168.255.255
172.16.0.0 ? 172.31.255.255
ネットワークを組むときには、これに準拠した方が良い。
リンクローカルアドレス
ネットワーク機器が、自分でアドレスを知らされなかったときに割り当てるときに使う。
169.254.0.1 ? 169.254.255.254