6

我需要制定有关如何计算 IP 地址的网络和主机部分的算法。

  1. 主机 ID 是公共部分吗?网络 ID 是用于在本地网络中定位计算机的私有部分吗?

  2. 如果子网掩码的值小于 255,则必须将 IP 地址中的相应八位字节分解为二进制,以确定数字的哪一部分是主机 ID,哪一部分是网络 ID。结果二进制数总是一分为二吗?

    (例如,IP 地址 192.168.33.22 和子网掩码 255.255.224.0 表示持有 33 的八位字节分解如下:0010|0001 表示 0010 是网络 ID 部分,0001 是主机 ID 部分?)

预先感谢您的任何帮助。

4

4 回答 4

11

你把事情复杂化了。

IPv4 地址(和子网掩码)仅以点十进制表示法显示,只是为了使它们对人类更具可读性。在计算机中,它们只是 4 个字节的连续内存(通常存储在例如 a 中):long int

存入电脑:11000000 10101000 00100001 00010110
为人类显示:192. 168. 33. 22

存入电脑:11111111 11111111 11100000 00000000
为人类显示:255. 255. 224. 0

掩码中的1s 表示标识网络号的位,因此只需使用按位与运算即可提取网络号:

地址 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(在此之前地址的类别表示网络/主机边界),主机通常只知道自己网络的掩码,因此无法将任意地址(例如数据报的目标地址)划分为网络和主机号。

那么有什么意义呢?好吧,源主机仍然可以将目标地址和(源的)自己的网络掩码按位与。虽然该操作的结果不一定会产生有意义的网络号,但当且仅当它们在同一网络上时,它才会匹配源的网络号:

  • 如果它们匹配,则在链路层应该可以到达目的地(例如,通过查找其MAC 地址,可能通过广播ARP请求,然后将数据报封装在寻址到该 MAC的帧中);

  • 如果它们不同,则源必须将数据报发送到其自身网络上的路由器(使用上述过程到达该路由器);路由器将看到该帧是发给它的,但数据报不是,然后应该将数据报(封装在不同的帧中)转发到目的地。许多主机只知道一个路由器,它们的“默认网关”,尽管其他配置也是可能的。

那些不能识别源网络号的地址位,0在其网络掩码中显然由 s 表示,可以被认为是其主机号——尽管以与上面相同的方式提取它实际上既无意义也无用:即使在与自己网络上的主机通信时,它的完整地址也用于识别,而不仅仅是主机号。

也就是说,作为一个纯粹的学术练习,当然可以使用掩码的补码执行按位与:

地址 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。结果二进制数总是一分为二吗?

    没有什么是“一分为二”的。之所以出现这种情况,是因为点十进制表示法旨在使 IPv4 地址对人类更具可读性(尽管该决定是在 CIDR 发明之前做出的,当时网络编号始终与字节边界对齐,因此从未导致明显的“分裂"的十进制数)。

于 2014-05-20T09:14:45.533 回答
2
  • 主机 ID 是公共部分吗?网络 ID 是用于在本地网络中定位计算机的私有部分吗?

IP 地址的主机和网络部分与公共和私有无关。

  • 如果子网掩码的值小于 255,则必须将 IP 地址中的相应八位字节分解为二进制,以确定数字的哪一部分是主机 ID,哪一部分是网络 ID。结果二进制数总是一分为二吗?...子网掩码 255.255.224.0 意味着持有 33 的八位字节被分解如下:0010|0001...

你的例子是错误的。0010|0001具体来说,当您将 33 个八位字节表示为(其中 | 是网络和主机之间的分隔符)时,您假设 224 中有四个连续的二进制位...

子网掩码中包含 224 的八位字节中包含三个连续的二进制 1:11100000. 因此,整个 IP 地址的“网络部分”为:192.168.32.0. IP 地址的“主机部分”是0.0.1.22. 使用您的符号,ip 192.168.33.22(掩码 255.255.224.0)的第三个八位字节是:001|00001.

要获取 IP 地址的网络部分,您必须执行ANDip 地址及其网络掩码的二进制。主机部分是AND反向网络掩码的二进制(位在 0 和 1 之间翻转)。

编辑

让我们再举一个例子来解决您的评论:

IP 地址 192.168.255.22,网络掩码 255.255.224.0

该地址的网络部分是 192.168.224.0,地址的主机部分是 0.0.31.22。我故意选择示例中的数字以使数学尽可能明显。请将 224 和 31 转换为二进制,它应该清楚。如果没有,请参考关于子网划分的维基百科文章

于 2011-12-28T08:54:15.390 回答
1
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

于 2017-04-18T04:25:00.820 回答
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 回答