我需要制定出有关如何计算IP地址的网络和主机部分的算法。
主机ID是公共部分吗?网络ID是否是在本地网络中定位计算机的私有部分?
如果子网掩码的值小于255,则必须将IP地址中相应的八位字节分解为二进制,以确定该号码的哪一部分是主机ID,哪部分是网络ID。结果二进制数总是分成两部分吗?
(例如,IP地址为192.168.33.22,子网掩码为255.255.224.0意味着八位字节保持33按如下方式分解:0010 | 0001表示0010是网络ID部分,0001是主机ID部分?)
提前感谢您的帮助。
答案 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
所以,要解决你的问题:
主机ID是公共部分吗?网络ID是否是在本地网络中查找计算机的私有部分?
整个地址是" public&#34 ;;没有"私人"部分。 ARP(使用完整地址)等查找协议用于查找本地网络中的计算机。
如果子网掩码的值小于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
答案 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"