确定IP地址的网络和主机ID部分

7
我需要搞清楚有关如何计算IP地址的网络和主机部分的算法。
1. 主机ID是公共部分吗?网络ID是用于在本地网络中定位计算机的私有部分吗?
2. 如果子网掩码的值小于255,则必须将IP地址中相应的八位字节拆分为二进制,以确定哪一部分是主机ID,哪一部分是网络ID。结果的二进制数字总是被分成两个部分吗?
例如,具有子网掩码为255.255.224.0的IP地址192.168.33.22表示包含33的八位字节如下所示:0010|0001,表示0010是网络ID部分,0001是主机ID部分吗?
感谢您提前的任何帮助。
4个回答

12
你把事情复杂化了。
IPv4地址(和子网掩码)仅仅是以点分十进制表示法的形式显示出来,只是为了使它们更易读。在计算机内部,它们只是连续的4个字节(通常存储在类似于long int的数据类型中):
存储在计算机中:11000000 10101000 00100001 00010110
显示给人看:192.     168.      33.      22
存储在计算机中:11111111 11111111 11100000 00000000 显示给人看:255. 255. 224. 0
掩码中的1表示用于标识网络号的位,因此只需使用按位与操作即可提取“网络号”。
地址 11000000 10101000 00100001 00010110 192.168.33.22 掩码 11111111 11111111 11100000 00000000 255.255.224.0 (AND) ----------------------------------- ------------- 网络号 11000000 10101000 00100000 00000000 192.168.32.0
自从引入CIDR(在此之前,地址的class指定了网络/主机边界),主机通常仅知道其自己的网络掩码,因此无法将任意地址(例如数据报文的目的地)划分为网络号和主机号。
那么,重点是什么?源主机仍然可以对目标地址和它自己的网络掩码进行按位与运算。虽然该操作的结果不一定产生有意义的网络号,但只有在它们处于同一网络时才会匹配源的网络号。
如果它们匹配,则目的地应该可以在链路层到达(例如,通过查找其MAC地址,可能通过广播ARP请求,然后将数据报封装在寻址到该MAC的中);如果它们不同,则源必须将数据报发送到其所在网络上的一个路由器(使用上述过程到达该路由器);路由器将看到该帧是寻址给它的,但数据报不是,然后应该转发数据报(封装在另一个帧中)向目的地。许多主机只知道一个路由器,即它们的“默认网关”,尽管其他配置也是可能的。
那些不能识别源网络的地址位,显然由其网络掩码中的0表示,可以被认为是其“主机号”——尽管以与上述相同的方式提取它既没有意义也没有用处:即使在与本地网络上的主机通信时,其完整地址也用于标识,而不是仅使用主机号。
话虽如此,作为一种纯学术练习,当然可以执行与掩码的补码进行按位AND运算:
地址 11000000 10101000 00100001 00010110 192.168.33.22 ~掩码 00000000 00000000 00011111 11111111 0.0.31.255 (AND) ----------------------------------- ------------- 主机号 00000000 00000000 00000001 00010110 0.0.1.22
因此,回答你的问题:
  1. 主机 ID 是公共部分吗?网络 ID 是用于在本地网络中定位计算机的私有部分吗?

    整个地址都是“公共的”;没有“私有”的部分。查找协议(如使用完整地址的 ARP)用于在本地网络中定位计算机。

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

    没有什么是“分成两部分”的。只是因为点十进制表示法旨在使 IPv4 地址更易读(尽管在 CIDR 发明之前就做出了这个决定,在那时,网络号始终对齐到字节边界,因此从未导致十进制数的表面“分裂”)。


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

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

  • 如果子网掩码的值小于255,则必须将IP地址中的相应八位字节拆分为二进制,以确定哪部分是主机ID,哪部分是网络ID。结果的二进制数字总是分成两部分吗?...子网掩码为255.255.224.0表示包含33的八位字节如下:0010|0001...

你的例子是错误的。具体来说,在你将33个八位字节分割为0010 | 0001(其中|是网络和主机之间的分界线)时,你假设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地址的网络部分,必须执行IP地址和其子网掩码的二进制AND。主机部分是反转子网掩码的二进制AND(在0和1之间翻转位)。

编辑

让我们举一个例子来回答你的评论:

IP地址192.168.255.22,子网掩码255.255.224.0

该地址的网络部分为192.168.224.0,地址的主机部分为0.0.31.22。我有意选择了示例中的数字,以尽可能明显地进行计算。请将224和31转换为二进制,这应该可以说明问题。如果不能,请参考维基百科上的子网划分文章


嗨,Mike,我不确定我理解最后一部分关于网络和主机ID的部分。你是说因为224的二进制版本是11100000,所以网络部分将是与三个1对应的部分?而主机ID部分是与0相关联的部分吗?再次感谢您的解释。 - fwc
是的,那回答了我的问题。看起来算法使用子网掩码的二进制的1s部分。这意味着从我的例子中第三个八位组为31的相同IP地址将具有主机ID 0.0.31.22。如果我错了请纠正我。 - fwc
@fwc,你错了。请阅读我在答案中关于192.168.33.22和掩码255.255.224.0的说明。 - Mike Pennington
@MikePennington- 我会按照以下方式进行计算:第三个八位字节的子网掩码仍为11100000,因此33的二进制为00011111;因此它将分裂如下000|11111,其中线是网络和主机ID之间的分隔符,或者我还是漏了什么? - fwc
@fwc,请在Python解释器中检查您的二进制数学运算。>>> int('00011111', 2)结果应该是31,而不是33。 - Mike Pennington

2
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

抱歉,我无法翻译您提供的参考资料链接中的视频内容。如果您有其他需要翻译的IT技术相关内容,请随时告知我。

1993年,CIDR(无类域间路由)取代了分类寻址。 - eggyal

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接