web-dev-qa-db-ja.com

IPアドレスのネットワークとホストIDの部分を特定します

IPアドレスのネットワークとホスト部分を計算する方法に関するアルゴリズムを理解する必要があります。

  1. ホストIDは公開されていますか?ネットワークIDは、ローカルネットワーク内でコンピューターを見つけるためのプライベートな部分ですか?

  2. サブネットマスクが255より小さい値の場合、IPアドレスの対応するオクテットをバイナリに分解して、番号のどの部分がホストIDで、どの部分がネットワークIDであるかを判別する必要があります。結果の2進数は常に2つに分割されますか?

    (たとえば、サブネットマスクが255.255.224.0の192.168.33.22のIPアドレスは、33を保持するオクテットが次のように分類されることを意味します:0010 | 0001は、0010がネットワークID部分であり、0001がホストID部分であることを示しますか?)

よろしくお願いします。

4
fwc

あなたは物事を複雑にしすぎています。

IPv4アドレス(およびサブネットマスク)は、単にそれらを読みやすくするための手段として、 ドット10進表記 で単に表示されます人間。コンピュータ内では、それらは単純に4バイトの連続したメモリです(たとえば、 long int 内に格納されることがよくあります)。

コンピューターに保存:11000000 10101000 00100001 00010110 
人間用に表示:192。168。33. 22 
 
コンピューターに保存:11111111 11111111 11100000 00000000 
人間用に表示:255。255。224. 0 

マスク内の1sは、ネットワーク番号を識別するビットを示します。したがって、ネットワーク番号を抽出するには、 ビット単位のAND演算 を使用するだけです。

アドレス1100000010101000 00100001 00010110 192.168.33.22 
マスク111111111111111 11100000 00000000 255.255.224.0 
(AND)---------------- ------------------- ------------- 
ネットワーク1100000010101000 00100000 00000000 192.168.32.0 

[〜#〜] cidr [〜#〜] (アドレスの クラス がネットワーク/ホスト境界を示す前)の導入により、ホストは通常​​、マスクのみを認識します。それらのownネットワークの、したがってunable任意のアドレスを分割することはできません(例: データグラム の宛先)をネットワーク番号とホスト番号に変換します。

それで、ポイントは何ですか?さて、ソースホストはまだ宛先のアドレスとその(ソースの)自身のネットワークのビットごとのANDを取ることができますマスク。その操作の結果は必ずしも意味のあるネットワーク番号を生成するわけではありませんが、同じネットワーク上にある場合に限り、ソースのネットワーク番号と一致します。

  • それらが一致する場合、宛先は リンク層 で到達可能である必要があります(たとえば、 MACアドレス を検索することによって、おそらく [〜#〜] arpをブロードキャストすることによって) [〜#〜] リクエストし、データグラムをそのMACにアドレス指定された フレーム にカプセル化します。

  • それらが異なる場合、ソースはデータグラムを自身のネットワーク上にある router に送信する必要があります(上記のプロセスを使用してそのルーターに到達します)。ルーターは、フレームがアドレス指定されていることを確認しますが、データグラムはアドレス指定されていないことを確認し、データグラム(別のフレームにカプセル化されている)を宛先に転送する必要があります。多くのホストは、「 デフォルトゲートウェイ 」という1つのルーターしか認識していませんが、他の構成も可能です。

送信元のネットワーク番号を識別しないアドレスビットは、ネットワークマスクの0sで示されているようですが、ホスト番号を形成していると見なすことができます。ただし、と同じ方法で抽出することは、実際には意味も有用でもありません。上記で実行されました。自分のネットワーク上のホストと通信する場合でも、その完全なアドレスが識別に使用され、ホスト番号だけでは使用されません。

とは言うものの、純粋に学術的な演習として、もちろん、マスクの complement を使用してビット単位のANDを実行することは可能です。

アドレス1100000010101000 00100001 00010110 192.168.33.22 
 〜mask 00000000 00000000 00011111 11111111 0.0.31.255 
(AND)--------------- -------------------- ------------- 
ホスト000000000000000000 00000001 00010110 0.0.1.22 

だから、あなたの質問に対処するには:

  1. ホストIDは公開されていますか?ネットワークIDは、ローカルネットワーク内でコンピューターを見つけるためのプライベートな部分ですか?

    アドレス全体が「公開」されています。 「プライベート」パーツはありません。 ARP(完全なアドレスを使用)などのルックアッププロトコルは、ローカルネットワーク内のコンピューターを見つけるために使用されます。

  2. サブネットマスクが255より小さい値の場合、IPアドレスの対応するオクテットをバイナリに分解して、番号のどの部分がホストIDで、どの部分がネットワークIDであるかを判別する必要があります。結果の2進数は常に2つに分割されますか?

    「2つに分割」されるものはありません。ドット10進表記はIPv4アドレスを人間が読みやすくすることを目的としていたため、そのようにしか見えません(ただし、ネットワーク番号が常にバイト境界に揃えられていたため、明らかな「分割」が発生しなかったCIDRの発明前に決定が下されました) 「10進数の」)。

8
eggyal
  • ホストIDは公開されていますか?ネットワークIDは、ローカルネットワーク内でコンピューターを見つけるためのプライベートな部分ですか?

IPアドレスのホスト部分とネットワーク部分は、パブリックおよびプライベートとは何の関係もありません。

  • サブネットマスクが255より小さい値の場合、IPアドレスの対応するオクテットをバイナリに分解して、番号のどの部分がホストIDで、どの部分がネットワークIDであるかを判別する必要があります。結果の2進数は常に2つに分割されますか? ... 255.255.224.0のサブネットマスクは、33を保持するオクテットが次のように分解されることを意味します:0010 | 0001 .. ..

あなたの例は間違っています。具体的には、33オクテットを0010|0001(|はネットワークとホスト間の除算)として吐き出すときに、224に4つの連続するバイナリビットがあると想定します。

224を含むサブネットマスクのオクテットには、3つの連続するバイナリ1が含まれています:11100000。したがって、IPアドレス全体の「ネットワーク部分」は次のとおりです。192.168.32.0。 IPアドレスの「ホスト部分」は0.0.1.22です。表記を使用すると、ip 192.168.33.22(マスク255.255.224.0)の3番目のオクテットは001|00001です。

IPアドレスのネットワーク部分を取得するには、IPアドレスとそのネットマスクのバイナリANDを実行する必要があります。ホスト部分は、反転ネットマスクのバイナリANDです(ビットは0と1の間で反転します)。

編集

あなたのコメントに対処するために別の例を作ってみましょう:

IPアドレス192.168.255.22、ネットマスク255.255.224.0

このアドレスのネットワーク部分は192.168.224.0であり、アドレスのホスト部分は0.0.31.22です。計算をできるだけ明確にするために、例の数値を意図的に選択しました。 224と31をバイナリに変換してください。明確になるはずです。そうでない場合は、 サブネット化に関するウィキペディアの記事 を参照してください。

2
Mike Pennington
Host address portion and network address portion can be easily identified.
Use this trick.
 Class A: N.H.H.H
 Class B: N.N.H.H
 Class C: N.N.N.H
(N= network  H=Host)
Class A network range: 1-127
Class B network range: 128-191
Class C network range: 192-223

参照: https://www.youtube.com/watch?v=ddodZeXUS0w

1
Aathira Sajan

次のスクリプトを使用できます。

#!/bin/sh
GetNumericIP()
{
    ipbin=0
    for part in `echo $1 | awk -F'.' '{print $1 " " $2 " " $3 " " $4}'`
    do
        ipbin=`expr $ipbin \* 256`
        ipbin=`expr $ipbin + $part`
    done
    echo "$ipbin"
}
GetSrtingIP()
{
    ipbin=$1
    count=0
    while [ $count -le 3 ]
    do
        rem=`expr $ipbin % 256`
        ipbin=`expr $ipbin / 256`
        if [ -z "$ipstr" ]
        then
            ipstr=$rem
        else
            ipstr=`echo ${rem}.${ipstr}`
        fi
        count=`expr $count + 1`
    done
    echo $ipstr
}
mask=$2
maskbin=`GetNumericIP $mask`
ip=$1
ipbin=`GetNumericIP $ip`
networkid=$(( $maskbin & $ipbin ))
networkid=`GetSrtingIP $networkid`
echo "networkid = $networkid"
0
John Smith