すごく恥ずかしい話ですが、個人的に非常に勉強になったので書き残しておきます...
TL;DR
- 3台のPCをHUBを使ってデータを送受信できるようにしたかった。
- 無知すぎてうまくできなかった。
- ホストアドレス、ネットワークアドレス、サブネットマスク、デフォルトゲートウェイの役割を勉強してできるようにした。
※基本的に色々な記事の焼き直しです。
HUBを使って3台のPCを繋ぎたい
ある日、実験の下準備として3台のPC間でデータの送受信ができる環境が必要になったので、ハブを使用して以下のような環境を構築しました。
3台のPC(OS: Ubuntu 16.04 LTS)をLANケーブルとハブを使用して繋げています。
次にそれぞれのPCにIPアドレスを割り振ります。
このときにIPアドレスの仕様をきちんと調べておけば良かったのですが、面倒くさかったのですでにPCに登録されていた設定を使用。(こういうのは大抵すでに入ってる設定使えばうまくいくし的なノリ)
そうしてできた全体の設定が下の図。
当たり前ですがこれでは別のPCにデータを送れません。
デフォルトゲートウェイを変更してもうまくいかず、適当にアドレスの数値を変更してもうまくいかないのでしっかりIPアドレスの仕様を調べることに...
IPアドレスのネットワーク部とホスト部
まず、IPアドレス(ここではv4)は
- ネットワーク部
- ホスト部
で構成されています。
同じネットワーク部を持ったホスト(PCなど)は同じネットワークに属していると見なされますが、違うネットワーク部を持つホストとは通信することはできません。
違うネットワークに属するホスト同士は基本的に通信しあえない仕様になっています。
また、素のIPアドレスのネットワーク部を示すのがサブネットマスクです。
サブネットマスクはネットワーク部を表す部分のビットが1になっています。
サブネットマスクとIPアドレスの論理積を取ることで、ネットワークアドレスを知ることができるようになります。
ただしこのアドレスはネットワーク自体を表すアドレスのためホストに割り当てることはできません。
従ってローカルネットワークでPCが互いに通信するには、同じネットワーク部を持ち、違うホスト部を持ったIPアドレスが割り振られている必要があります。
何が問題だった?
では、先ほどのネットワークの構成を振り返ります。
...何度見てもひどい構成ですね。
ネットワーク部がバラバラで、下の図のように小さいネットワークがハブを介して繋がっているだけと等しいです。
これではデータが送れるはずがない...。
ネットワーク部が一致するように以下のようにIPアドレスを振り直します。
アドレスもローカルIPアドレスとしてありがちな 192.168.x.x
にしてみました。
最後に適当に設定してしまったデフォルトゲートウェイを消去します。
デフォルトゲートウェイとはローカルネットワーク外のネットワークにアクセスするとき、ホストがデータを送信するIPアドレスになります。
そのため、デフォルトゲートウェイはルーターなどに設定されていることが多く、基本的にネットワークに1つです。
2つ以上設定するとデータが行き先に迷ってしまったりするらしいです(未検証)。
これで準備完了です!
pingコマンドでPCAからPCBにデータを送って見ます。
PING 192.168.0.3: 56 data bytes
64 bytes from 192.168.0.2: icmp_seq=0 ttl=64 time=0.321 ms
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.341 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.234 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.284 ms
64 bytes from 192.168.0.2: icmp_seq=4 ttl=64 time=0.301 ms
64 bytes from 192.168.0.2: icmp_seq=5 ttl=64 time=0.212 ms
データを送れています。成功です。
まとめ
- ネットワーク部が違うホストは通信できない。
- サブネットマスクによってネットワーク部は決定する。
- デフォルトゲートウェイは外部のネットワークの出入り口で基本的にネットワーク上に1つ。
参考
間違いとか説明不足とかいっぱいあると思うので何かありましたらコメントにお願いします。。。。 (怠慢しないでちゃんと調べよう...)