6

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

4 に答える 4

11

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

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

コンピュータに保存: 11000000 10101000 00100001 00010110
人間で表示:192.168.33.22

コンピュータに保存: 11111111 11111111 11100000 00000000
人間の表示:255.255.224.0

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

アドレス 11000000 10101000 00100001 00010110 192.168.33.22
マスク 11111111 11111111 11100000 00000000 255.255.224.0
(と)  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - -  -  -  -  -  -  - -
ネットワーク 11000000 10101000 00100000 00000000 192.168.32.0

CIDR (アドレスのクラスがネットワーク/ホスト境界を示す以前)の導入以来、ホストは通常​​、自身のネットワークのマスクしか認識していないため、任意のアドレス (データグラムの宛先のアドレスなど) をネットワークに分割することはできません。およびホスト番号。

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

送信元のネットワーク番号を識別しないアドレス ビット (0ネットワーク マスクの s で明らかに示されている) は、そのホスト番号を形成していると見なすことができます。自分自身のネットワーク上のホストと通信する場合でも、完全なアドレスが識別に使用され、ホスト番号だけが使用されることはありません。

とはいえ、純粋に学術的な演習として、マスクの補数を使用してビットごとの AND を実行することはもちろん可能です。

アドレス 11000000 10101000 00100001 00010110 192.168.33.22
〜マスク 00000000 00000000 00011111 11111111 0.0.31.255
(と)  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - -  -  -  -  -  -  - -
ホスト 00000000 00000000 00000001 00010110 0.0.1.22

したがって、質問に対処するには:

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

    アドレス全体が「パブリック」です。「プライベート」な部分はありません。ARP (完全なアドレスを使用する) などのルックアップ プロトコルを使用して、ローカル ネットワーク内のコンピューターを検索します。

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

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

于 2014-05-20T09:14:45.533 に答える
2
  • ホスト ID は公開部分ですか? ネットワーク ID は、ローカル ネットワーク内でコンピュータを特定するためのプライベートな部分ですか?

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

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

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

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

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

編集

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

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

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

于 2011-12-28T08:54:15.390 に答える
0

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

#!/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"
于 2013-08-30T18:50:23.683 に答える