IPアドレス、というもの

いまさらIPv4の世界でもないんですが、IPv6に軸足も移りつつも、いまだに権勢を振るうIPv4。

さて、このIPアドレス、というものを少しだけ真面目に考えてみます。基本的なところは皆様ご存じの通り。
0.0.0.0 ~ 255.255.255.255の範囲で構成される32ビット。

なんでこんなこと言い始めているのかというと、正規表現でこれを表せ、とAIに聞いたら0.0.0.0 ~ 999.999.999.999を表しやがったので、ああ、やっぱりAIってバカなんだな。と再認識したわけで。

さて、なんで各ピリオドで区切られた何かが0~255なのか、というとこれはもうただ2進数の8ビットだからにすぎません。つまり、もう簡単に言ってしまえば、w.x.y.zというIPアドレスがあったとしたら、これは単純な十進数に変換できてしまいます。
※ちなみにブラウザはこの十進数形式のIPアドレスを認識しますし、つながります。

つまりどういうことかというと、

w.x.y.z = 2^24 * w + 2^16 * x + 2^8 * y + 2^0 * z

が成り立ちます。十進数から二進数はこの逆ですね。つまり、二進数<->十進数の変換ファンクションでも持ってる言語体系なら(というか普通持ってるし)、こんなもん自在に計算できてしまいます。
もちろん、十六進数への変換も可能ですし、同様に8進数にも変換できてしまいますね。

まあそれでも計算するのはめんどくさい、というのは分からんでもないですが。

例えば、192.168.0.1は私のアドレスなので使わないでください。とかのネタはともかくとして、なぜいきなりIPの話をしているかというと、お付き合いのある先で専門学校出の子が「ねっとわーくの時間は完璧に寝てました!」とか言ってて、マジで困るぞ、と心配になったわけです。

よくよく話を聞けば、TCPスタックどころかIPアドレスすら怪しい、というのはさすがにそれで開発がしたいです、と言われましても、ねぇ…。

正直、マイクロアーキテクチャ全盛となりつつあるこの状況で、ネットワーク知らないのは正直致命傷に近い気がします。なんせ、あらゆるアプリケーション間メッセージングはネットワークを介しており、それらはREST APIだけじゃなく、SOAPやJSON RPCがあったり、それらのセッションがどう維持されていていつクローズして、いつその接続情報が破棄されるのか、というところとかはもうもろにアプリケーションのセキュリティ問題にも直結しています。

え?なに?フレームワークが全部やる?そりゃそうかもしれんが、そのパラメータ設定するの君だろ。

え?デフォルト値がすべてよきように取り計らっている「はず」?

(かなり本気で)エンジニアやめちまえ。

いやまあRESTしか使わねぇよ!とか言うなら別かもしれませんが、「RESTしかできない」と「選択したうえでRESTばかり使っている」は意味が違います。そして、どうも昨今「RESTしかできない」を「アプリケーションメッセージングは完璧です」みたいな風潮で口にしている人もちらほらと。

インフラ屋から見てもRESTしかできないとかちょっと意味わかんないし、ちょっとしたメッセージングでなんかフレームワーク持ち出してくるほどでもないからソケット開いてちょっとデータやり取りしつつモック作ろう、とかはまあしょっちゅうやってるわけでもないですが必要に迫られればやります。

(というかその楽ちんなRESTすらめんどくさがるんですが…)

そもそもアプリケーション間メッセージングなんて自由極まりない世界なので、みんな自由にプロトコル作ってるわけですし、インフラ屋の私でもIoTなんかのEmbeddedな世界のプロトコルなんて話になったらほとんど存じ上げません。
根底のTCPスタックまではわかるからそこから上はお願いね、ということになるんですが、これが開発者との間でコンセンサスが取れない、という事態が生まれるんです、ネットワークわかんにゃい。とか言ってる開発者の方との間だと。
TCPスタックのTCP/IPまで処理したらもうあと上なんてアプリケーション層しか残ってないのに、なんで「え? ネットワークだからあなたでしょう?」みたいな目で俺を見てるんだ君はwwwww

で、最終的に見たことも聞いたこともないなんか変なプロトコル実装の仕様書までこっちが目を通してるとか、オンプレミスあるあるですね。なんせ独自プロトコルだからググってもなにも出てこないし、仕様書の内容通りのパケット飛んでこないし、なんかところどころ仕様書と実装が違うし、どうなってるんだこれwwwwwとか、まあ普通にあります。

まあそれでも、通信の基礎はインターネットならTCPスタックです。トークンリングとかATMセルがにょきにょき生えてくるわけじゃないので、インターネットを介する限り、「TCP/UDPしかできない」を「インターネットのネットワークならできる」とか言ってもまあなんとかなります。
というか別にそれ以外までは知らなくていいので、せめてTCPスタックの基礎位は知っていてほしい。別にトンネリング組めとか言わないから。IP通信とパケットの届く範囲、ブロードキャストとネットワークアドレスの意味、そしてそれらがwhoisとDNSでどのように管理されているか、くらいは知っておいてたぶん損はありません。ルーティングまで分かってろとは言わないけど、ネットワーク分離したらつながらないのでNATだとスイッチだのがなんか必要になってくるんだ、くらいは知っていてくださいお願いします。

見た目おなじだからハブとスイッチの区別ついてないんですよね、世間の方は。まあなんもかんもハブにつなげば全部つながるオフィスネットワークが悪い。

じゃないとDockerのコンテナで困ると思うし、開発環境でVM使うときにも困るでしょう。ブリッジしてるからつながらないね、って言って「ぶりっじ????ブラウザからつながるよ?」って何回言われたことやら。そりゃ君のデスクトップからならつながるだろうよwwwwwというのがわからない、ということなんですね。

まあIPv6が完全に浸透すればいいんですけどね。基本全部がフラットな世界なんで。隣の家の冷蔵庫にPing of Death!とかできると楽しいですね。たぶんw まあv4わかんないって言ってたらv6がわかるとも到底思えないんですが。

v6のアドレスは128bitで、これは実数としてはとんでもない数です。処理系依存だろうけどdouble型で8Byteでしたっけ? たかが64bitでしかない。っていえば多少は実感湧くんですかね…。

16Byte=128bitなんだから2Byte文字で8文字、utf8mb4で4文字しかねぇとか言われたら、文字コードセットの中身全部表現できるものが8枚/4枚並んでるということに思いが至ってないってことなんだよなぁ…。

きっと隣の家の冷蔵庫をPing of Deathして遊んでいたはっかー(?)が実際に冷蔵庫止めたら翌日から異臭がしてきて大家と踏み込んだら冷蔵庫にばらばら死体を発見する、みたいな始まりのミステリが出てくるに違いない。うわぁ、面白くなさそう。ウォーゲームかよ。