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

时间:2011-12-28 02:26:30

标签: networking ip-address host subnet cidr

我需要制定出有关如何计算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部分?)

  3. 提前感谢您的帮助。

4 个答案:

答案 0 :(得分:9)

你过度复杂了。

IPv4地址(和子网掩码)仅在dot-decimal notation显示,只是为了让它们对人类更具可读性。在计算机中,它们只是4个字节的连续内存(通常存储在long int内):

Stored in computer:    11000000 10101000 00100001 00010110
Displayed for human:        192.     168.      33.      22

Stored in computer:    11111111 11111111 11100000 00000000
Displayed for human:        255.     255.     224.       0

掩码中的1表示标识网络号的位,因此只需要使用bitwise AND operation来提取网络号:

address   11000000 10101000 00100001 00010110    192.168.33.22
mask      11111111 11111111 11100000 00000000    255.255.224.0
(AND)     -----------------------------------    -------------
network   11000000 10101000 00100000 00000000    192.168.32.0

CIDR引入(地址'} class表示网络/主机边界之前),主机通常只知道拥有的掩码>网络,因此无法将任意地址(例如datagram目的地的地址)划分为网络和主机号码。

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

  • 如果它们匹配,则应该在link layer处可以到达目的地(例如,通过查找其MAC address,可能通过广播ARP请求,然后封装数据报在发往该MAC的frame中;

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

那些不能识别源网络号码的地址位,在其网络掩码中显然由0指示,可以认为是形成其主机号码 - 尽管它是'以与上面相同的方式提取它真的既没有意义也没有用:即使在与自己网络上的主机通信时,其完整地址也用于识别,从不主持人数。

那就是说,作为纯粹的学术练习,当然可以使用掩码的complement执行按位AND:

address   11000000 10101000 00100001 00010110    192.168.33.22
~mask     00000000 00000000 00011111 11111111    0.0.31.255
(AND)     -----------------------------------    -------------
host      00000000 00000000 00000001 00010110    0.0.1.22

所以,要解决你的问题:

  1.   

    主机ID是公共部分吗?网络ID是否是在本地网络中查找计算机的私有部分?

    整个地址是" public&#34 ;;没有"私人"部分。 ARP(使用完整地址)等查找协议用于查找本地网络中的计算机。

  2.   

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

    没有什么是"分成两个"。它只是出现这种情况,因为点十进制表示法的目的是使IPv4地址对人类更具可读性(虽然这个决定是在CIDR发明之前做出的,当时网络数字始终与字节边界对齐,因此从未引起明显的&# 34;拆分"十进制数。)

答案 1 :(得分: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,NetMask 255.255.224.0

该地址的网络部分是192.168.224.0,地址的主机部分是0.0.31.22。我故意选择示例中的数字来使数学尽可能明显。请将224和31转换为二进制,它应该清楚。如果没有,请参考wikipedia article on subnetting

答案 2 :(得分: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

答案 3 :(得分: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"