my cognition

Cognitiveはよいぞ。電波伝搬はよいぞ。

グローバルアドレスにARPを聞きにいく子は何を思っているのか

もふもふ改めKatayamaです。どちらで名乗るのか非常に悩む今日この頃です。

今日は、昨日夜中にわちゃわちゃやってたコレについて、蛇足に蛇足をくっつけた上で技術的解説を行いたいと思います。

twitter.com

TL; DR

前段というか雑談

家庭用のルーターとかだと、よく192.168.0.1だとか、192.168.100.1みたいなIPがついてますよね。
で、それに繋ぐと192.168.0.2みたいなIPが自動的に割り振られて接続しますよね。

なんとなーく、192.168.0.1と192.168.0.2って似てるし、同じネットワークに居るんだなあ、というのは直感的に感じ取られるかと思います。 が、その意図、仕組みというのを正確に理解している人は意外と少ない印象を受けます。

特に、プライベートIPアドレスの払い出しを考えたときに、/8や/16、/24でぶった切ることは簡単ですが、/28や/30といったものを考えたときに思考が止まってしまうようです。

2進数という名の魔物

コンピュータは2進数、所謂1と0で計算をします。IPアドレスもその例に漏れなく、2進数の計算をします。WindowsMacに近しい人は、サブネットマスクとかいうなんか適当に255.255.255.0を設定する奴を見ますよね。アレです。あいつです。今からあいつの正体を暴きます。
その前に、2進数という概念がどうしても必要になりますので解説します。とはいえ、8桁の2進数がなんとなーくわかれば十分なので、下の表をご覧ください。

8bit 7bit 6bit 5bit 4bit 3bit 2bit 1bit
10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001
128 64 32 16 8 4 2 1

2進数と10進数の対応を表にしています。見易さの観点から、逆順にしています。
例えば、2進数で3という数値を表現したいときは、3=2+1=00000010+00000001=00000011となります。
10101010を10進数にしたいときは、10000000+00100000+00001000+00000010=128+32+8+2=170になります。
なんとな~くわかってもらえれば十分です。こんな感じの扱い方をします。

AND計算を理解しよう!

で、足し算がわかったところで、今度はANDとかいう掛け算みたいな奴です。2進数でいうところだと、ざっくりと掛け算と覚えててくれればいいです。
2進数は0と1しかありません。その掛け算といえば、下記のような計算結果になります。0をかければ0になってしまう、そのままの通りです。

1項 2項 計算結果
0 0 0
0 1 0
1 0 0
1 1 1

では、例題を解いてみましょう。00001111と11111100のANDを考えます。
00001111
11111100
00001100

縦に書くと分かりやすいです。小難しいこと考えず、こんなもんなんだと理解してください。

ちなみに、コレを10進数に直すと、
00001111 = 8+4+2+1 = 15
11111100 = 128+64+32+16+8+4=252
00001100 = 8+4=12
なので、15 AND 252 = 12 とかいう式が出来上がります。とくに意味はないです。

ここまで理解できれば、多分大丈夫!

ネットワークアドレスとはなんぞや!

最初に話した、192.168.0.2と、255.255.255.0とかいうちょっと強そうな設定の例で計算をしてみましょう。

種類 IPアドレス(10進) IPアドレス(2進)
クライアントIP 192.168.0.2 11000000 10101000 00000000 00000010
サブネットマスク 255.255.255.0 11111111 11111111 11111111 00000000
ネットワークアドレス 192.168.0.0 11000000 10101000 00000000 00000000

この計算結果のネットワークアドレスというのが、所属するネットワークのIPアドレスとなります。このネットワークアドレスが一致している通信機器は、同じ機械につながっているようなものです。
ちなみに、上記の表では露骨に文字色を変えてみました。192.168.0.XXXの部分は、サブネットマスクとAND計算すると、全てが0になることがわかりますね。
今感じた通り、192.168.0.0~192.168.0.255までは、同じネットワークに居ることになります。

それでは、2つほど例題を出してみましょう。認識があっているかの確認です。

種類 IPアドレス(10進) IPアドレス(2進)
クライアントIP 10.0.0.126 00001010 00000000 00000000 01111110
サブネットマスク 255.0.0.0 11111111 00000000 00000000 00000000
NWアドレス 192.168.0.0 11000000 10101000 00000000 00000000
種類 IPアドレス(10進) IPアドレス(2進)
クライアントIP 172.20.123.45 10101100 00010100 01111011 00101101
サブネットマスク 255.255.128.0 11111111 11111111 11110000 00000000
NWアドレス 172.20.112.0 10101100 00010100 01110000 00000000

特に2番目のを理解できた人はすごいです。オレンジを付け加えた部分は、10進数だと混じってしまっている部分です。とりあえず、IPアドレスは仕組み上こんなネットワークの作り方もできるということです。
テキストベースだと、ふーんって感じですが、実際は、GUIだとこういう設定を入れるわけです。ぱっと見むずがゆいですねw
f:id:moffumoffu:20171230020420j:plain

グローバルアドレスにARPを聞きにいくということ

では、ネットワークアドレスの計算がわかりました。で、上記の操作は、1回の通信で2回行います。自分のIPと、通信したい相手のIPに対してです。このとき注意したいのは、サブネットマスクは両方自分のものを使うということです。相手のことなんてわかりませんからね。
まとめると、こういうことです。

  1. 自分のIPとサブネットマスクのANDを取って、
  2. 通信先のIPとサブネットマスクのANDを取って
  3. 結果が同じになると、同じネットワークに居ると判断する!

と思うのです。では、サブネットマスクを0.0.0.0とした場合、どうなるでしょう。

種類 IPアドレス(10進) IPアドレス(2進)
クライアントIP 1.2.3.4 00000001 00000010 00000011 00000100
サブネットマスク 0.0.0.0 00000000 00000000 00000000 00000000
NWアドレス 0.0.0.0 00000000 00000000 00000000 00000000

真っ赤です。全部です。どのような値を与えても計算結果は0.0.0.0になります。
つまり、どんなIPアドレスを突っ込んでも、同じネットワークに居ると勘違いします。

同じネットワークに居る、イメージとしては同じルーターにつながっているなら、「あれ?お前すぐそこに居るんじゃね?」と思ってしまいますよね。すぐそこに居る機械のMACアドレスを聞きに行きます。これがARPというものです。

以上より、サブネットマスクが0.0.0.0と設定されているため、全てのIPアドレスが同一ネットワーク内に居ると勘違いし、グローバルIPアドレスARP問い合わせを実施していたということです。

番外編:名前解決について

今回の話のなかでは、あえて名前解決には触れませんでした。というのも、発端のツイートは、

という条件下で、色んなアプリケーションがドメイン名を指定して通信しようとしている様子が見て取れます。そのため、ARPも色んなものを聞きに行こうとしています。
その話まで含めようとするとややこしいので、今回は触れませんでした。

以上!明日起きれるかなあ・・・