2

結果が同じである場合、2 つの IP アドレスがサブネット マスクと AND 演算され、それらが同じネットワーク上にあることを理解しています。結果が異なる場合、それらは異なるネットワーク上にあります。私の質問は、いくつかの 0 を省略した IP アドレスが指定された場合、余分な 0 はどこに配置されるのでしょうか?

たとえば、サブネット マスクが 255 の場合。128 . 0 . 0 、および IP 126 を持っています。1. 0 . 10およびIP126.127 . 0 . 1 IP とサブネット マスクをやみくもに AND 演算すると、同じネットワーク上にあるにもかかわらず、異なる結果が得られます。

126.1.0.10 は 126.100.000.100 または 126.001.000.100 になりますか?

返信を読んだ後に編集:

255128000000 AND 126001000010 = 1085496376*32*しかし255128000000 AND 126127000001 = 1085276323*84*
何か足りないのですか?

4

3 に答える 3

10

IPv4 アドレスは、ドットで区切られた 4 つの通常の 10 進数 (それぞれが 1 バイトに収まる) として記述されます。

通常の 10 進数の 1 は「1」であり、001 と書くこともできます。ただし、100 はの数、つまり「100」です。


AND 演算は常にビット単位のAND であるため、それを理解するには、ドット付き 10 進アドレスとネットマスクが生のバイナリ 32 ビット アドレスにどのように対応するかをまず確認する必要があります。

        126   .    127   .     0    .    1
     01111110   01111111   00000000   00000001

        255   .    128   .     0    .    0
AND  11111111   10000000   00000000   00000000
 -----------------------------------------------
     01111110   00000000   00000000   00000000
        126   .      0   .     0    .    0

したがって、ネットマスク 255.128.0.0 の 126.127.0.1 はサブネット126.0.0.0 /9にあります。

ソフトウェアでは、通常、 IPv4 アドレスを単一の 32 ビット変数に格納します。つまり、126.127.0.1 は 01111110011111110000000000000001 バイナリ (2122252289 の 10 進数もエンコードしますが、32 ビット IP アドレスの 10 進数値が何であるかは誰も気にしません) です。人間のユーザーに表示する必要がある場合にのみ、ドット付き 10 進数に変換されます。この表現は、glglgl が 256 を数回掛けたものとして説明するものです。

32 ビット変数 (1111111110000000000000000000000 バイナリまたは 4286578688 10 進数) にもネットマスクがある場合は、1 つのマシン命令でそれらを AND 演算して、ネットワーク アドレス 011111100000000000000000000000 を取得できます。

于 2012-10-30T23:02:38.407 に答える
3

AND はバイナリ レベルで機能するため、数字を連結するだけではありません。

したがって、IPv4 アドレスをバイト単位で処理するか、1000 倍ではなく 256 倍の 10 進数に変換します。

つまり、する代わりに

((126 * 1000 + 1) * 1000 + 0) * 1000 + 10 = 126001000010

やったほうがいい

((126 * 256 + 1) * 256 + 0) * 256 + 10 = 2113994762

. これを他の数字に当てはめれば成功するはずです。

または、4 つの数字を個別に AND で結合することもできます。

255 & 126 = 126 (in both cases), 128 & (1 resp. 127) = 0, 0 & (anything) = 0, 0 & (anything) = 0.

したがって126.0.0.0、両方を取得して、それらを同じサブネットに属させます。

于 2012-10-30T23:30:56.050 に答える
0

かなり奇妙な質問ですが、具体的な質問に答えてみます。

その 2 番目のオクテットの数字「1」は実際には数字の 1 であるため、「100」ではなく「001」です。

とはいえ、あなたの例はうまくいったはずなので、実装に何か問題があると思います。パディングなどについて心配する必要はありません。これらは数値であり、ビットごとの AND は「正常に機能する」はずです。

何がうまくいかないのかについて、より詳細な情報を提供することをお勧めします。

于 2012-10-30T23:01:59.033 に答える