図1 サブネット・マスクの値を間違えたら,見慣れないエラーが表示された<br><font size="-1">サブネット・マスクの設定で,255と入れるところを25にしてしまったら,図のようなエラー・メッセージが表示された。</font>
図1 サブネット・マスクの値を間違えたら,見慣れないエラーが表示された<br><font size="-1">サブネット・マスクの設定で,255と入れるところを25にしてしまったら,図のようなエラー・メッセージが表示された。</font>
[画像のクリックで拡大表示]
図2 1が連続しないサブネット・マスクの値を設定して通信できるか調べてみよう&lt;br&gt;&lt;font size="-1"&gt;4台のパソコンにさまざまなIPアドレスとサブネット・マスクを割り当てて,それぞれのパソコン同士が通信できるかを調べた。&lt;/font&gt;
図2 1が連続しないサブネット・マスクの値を設定して通信できるか調べてみよう<br><font size="-1">4台のパソコンにさまざまなIPアドレスとサブネット・マスクを割り当てて,それぞれのパソコン同士が通信できるかを調べた。</font>
[画像のクリックで拡大表示]
表1 各パソコンとpingコマンドで通信できるかを調べた結果&lt;br&gt;&lt;font size="-1"&gt;各項目の2行目は実行結果のメッセージ。&lt;/font&gt;
表1 各パソコンとpingコマンドで通信できるかを調べた結果<br><font size="-1">各項目の2行目は実行結果のメッセージ。</font>
[画像のクリックで拡大表示]
図3 PC3からPC2へのpingでは,見慣れないエラーが表示された&lt;br&gt;&lt;font size="-1"&gt;「Destination specified is invalid.」というエラー・メッセージが表示された。&lt;/font&gt;
図3 PC3からPC2へのpingでは,見慣れないエラーが表示された<br><font size="-1">「Destination specified is invalid.」というエラー・メッセージが表示された。</font>
[画像のクリックで拡大表示]


若手部員 宇田くん
  サブネット・マスクの値って「255.255.255.0」のように,ビット列に直すと,1が連続したあとに0が続くけれど,1は連続しないとだめなのかな。  

若手部員 貴子さん
  連続していた方が便利そうだけれど,原理的には連続していなくても大丈夫なんじゃないかしら。RFCのような仕様書は,どうなっているかと,実際にできるかを調べてみましょう。  


宇田:あれ,おかしいな。

貴子:どうしたの。

宇田:IPアドレスとサブネット・マスクを設定していたら,「入力されたサブネット マスクは無効です」と表示されるんだ(図1)。

貴子:サブネット・マスクの値が「25.255.255.0」になっているわよ。最初の値は255じゃないの。

宇田:あ,ほんとだ。「255」のところを「25」にしてしまったみたいだ。

貴子:でも宇田君,このエラー表示の続きにある「サブネット マスクは連続した値である必要があります」って,どういう意味なのかしら。

宇田:先月号までで勉強してきたビットが1のことじゃないかな。

 Windowsマシンが表示した「サブネット マスクは連続した値である必要があります」というエラー・メッセージは,宇田くんの推測通り,「サブネット・マスクの値をビット列で表したとき,1が連続する必要がある」という意味である。「255. 255.255.0」を2進数に直すと,「11111111 11111111 11111111 00000000」となり,1が連続する。ところが,25は「00011001」となり,1が連続しない。このため,Windowsはエラーを表示したのである。

■1が連続していないとダメ?

貴子:サブネット・マスクは,通信相手が自分のネットワークかどうかを判断するためにあるのだから,1が連続していない値でも大丈夫な場合がありそうね。

宇田:そうかなあ。絶対ダメだと思うんだけれど。

貴子:そんなことないと思うわ。TCP/IPの仕様を決めているRFC*で調べてみるわ。

宇田:それじゃあ,任せるよ。

 インターネット技術の仕様をまとめたRFCを調べると,サブネット・マスクに関連する文書がいくつも見つかるはずだ。貴子さんの調査結果は,どうなったのだろうか。

貴子:わかったわ。サブネット・マスク関連のRFCはいくつもあって,922番や1123番では,「連続していなくても大丈夫だけれど,連続するのが望ましい」と書かれていたわ。

宇田:え,そうなの。

貴子:ただ,RFC1878では,「連続していないとダメ」って規定されているわ。つまり,昔は大丈夫だったんだけれど,今は許されないのよ。

宇田:ということは,昔のOSなら,連続しないサブネット・マスクを指定できるかもしれないんだ。

 実際,Windows95やその後継OSであるWindows98では,1が連続しないサブネット・マスク値を設定してもエラーは表示されない。Windows95登場当時は,まだRFC1878が出ておらず,連続しないサブネットが絶対にダメというわけではなかったからだ。

 ただし,比較的新しいOSであるWindows2000やWindowsXPでは,連続しないサブネット・マスクは許されず,設定しようとすると図1のようなエラーが表示される。

■昔のOSで試してみよう

宇田:Windows95やWindows98では,連続しないサブネット・マスク値を設定できるみたいだから,実際に試してみようよ。

貴子:どんな設定にするの。

宇田:4台のWindows95マシンを用意して,サブネット・マスクはいずれも「255.255.255.170」にするんだ。最後の170を2進数にすると,「10101010」になるだろう。

貴子:ずいぶん,極端ね。

宇田:それで,IPアドレスは192.168. 0.1,192.168.0.2,192.168.0.3,192.168.0.4にするんだ(図2)。

 テスト環境を確認しておこう。テストにはWindows95をインストールした4台のパソコンPC1,PC2,PC3,PC4を用意した。そしてIPアドレスは192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4に,サブネット・マスクはどれも255.255. 255.170にした。

 それぞれに割り当てたIPアドレスとサブネット・マスクの論理積*を計算してネットワーク・アドレス*を求めると,PC1は192.168.0.0,PC2は192.168.0.2,PC3は192.168.0.2,PC4は192.168.0.0になる。

■通信できる組み合わせはどれ?

宇田:これら4台のパソコン間で通信できるかを調べるために,ping*コマンドを使ってみよう。貴子さんは,どの組み合わせが通信できると思う?

貴子:PC1とPC4,PC2とPC3が同じネットワーク・アドレスになるわね。

宇田:そうだね。

貴子:だから,PC1−PC4間と,PC2−PC3間で通信できると思うわ。

宇田:なかなか論理的な推理だね。僕は直感的にすべての組み合わせで通信できると思うんだけれど。  読者の皆さんも予想してみよう。前回前々回の本連載コラムを読んでいれば,だいたいの推測はできるだろう。

 自分に割り当てられたサブネット・マスクと相手のIPアドレスの論理積を計算し,その値が自分のネットワーク・アドレスと同じならば,そのパソコンは相手のパソコンが同じネットワークにいると判断する。そして,IPパケットを相手に直接送る。

■通信できたのはたった一組

貴子:テストをしたわよ。結果は表にまとめておいたわ(表1)。

宇田:今回も予想が大はずれだったね。通信できたのはPC1とPC4の間だけだったね。じゃあ,個別に検証してみよう。まずはネットワーク・アドレスが異なるパソコン間からだ。

貴子:この組み合わせは,PC1−PC2,PC1−PC3,PC2−PC4,PC3−PC4があるわ。どの組み合わせもすべて通信できなかったわよ。

宇田:pingパケットは送信されていたのかな。

貴子:どの組み合わせも,まったくパケットが送信されなかったわ。それはパケットをキャプチャ*して確かめたから大丈夫よ。

宇田:エラー・メッセージも,全部「Destination host unreachable.」と表示されたみたいだね。

貴子:pingコマンドを実行したパソコンは,相手のネットワーク・アドレスが自分と異なるから,自分と同じネットワークにはいないと判断したからでしょう。前回のテストのようにルーターがある環境なら,ルーターがパケットを転送してくれるけれど,今回のケースはルーターがないから,「相手に届けられない」というエラーが表示されたのよ。

宇田:ということは,1が連続しないサブネット・マスクでも,パソコンはネットワーク・アドレスを計算して相手に届けられるか判断しているんだ。

■見慣れないエラーが表示された

貴子:次はネットワーク・アドレスが同じ組み合わせを検証してみましょう。PC1とPC4の間は問題なく通信できているわ。

宇田:PC1からpingコマンドを実行すると,PC1は自分のサブネット・マスクと相手(PC4)のIPアドレスから,相手のネットワーク・アドレスを192.168.0.0と算出するよね。このアドレスは,PC1自身のネットワーク・アドレスと同じだから,PC1はPC4へpingパケットを直接送ったんだ。

貴子:正解。これを受信したPC4も,応答パケットを直接返信したはずよ。

宇田:この考え方をすれば,PC2とPC3の間も通信できるはずなんだけどな。テストでは,本当に通信できなかったんだよね。

貴子:PC2からPC3へpingコマンドを実行したら,「Request timed out.」,PC3からだと「Destination specified is invalid.」というエラーが出て通信できなかったわ(図3)。

宇田:「Destination specified is invalid.」って,今までに見たことがないエラー・メッセージだね。

貴子:そういえば,そうね。日本語に訳すと,「指定されたあて先は無効です」っていう意味になるわ。

 実は,PC2のネットワーク・アドレスは,PC2自身のIPアドレスと同じ192.168.0.2になる。これは許されない設定である。このため,PC3はPC2へpingパケットを送ろうとしたとき,相手(PC2)のIPアドレスは無効だと判断したのだ。

貴子:先輩に聞いたら,ネットワーク・アドレスと同じIPアドレスを割り当てると無効になると教えてくれたわ。つまり,PC2に割り当てたIPアドレスそのものが無効だったのよ。

宇田:それで,PC3からpingコマンドを実行したら,「あて先が無効です」というエラーになったんだ。

貴子:逆に,PC2からpingコマンドを実行したときは,PC3へ問題なくpingパケットを届けられたんだけれど,PC3は無効な相手に返信パケットを送れないから,「Request timed out.」のエラーが出たんだわ。

宇田:「Request timed out.」というエラーは,相手の障害で応答が返ってこないケースだけだと思っていたけれど,自分自身に問題があるケースもあり得るんだね。


寄稿者:ネットワークエンジニア集団 みずおか組

●水岡 祥二 NPOアイタック代表理事
●出口 雄一 株式会社タケキ IT教育事業部
●久保 幸夫 情報・通信エンジニア

出典:日経NETWORK2003年8月号「新・ネットワーク実験室」 より
記事は執筆時の情報に基づいており、現在では異なる場合があります。