ChinaUnix首页 > 精华文章 > HP-UX > 正文

[保留] 对“设置不标准子网的问题”中的几个地方有疑问


http://www.chinaunix.net 作者:2bedodo  发表于:2004-03-16 20:06:50
发表评论】 【查看原文】 【HP-UX讨论区】【关闭

[color=blue]
williamCU:
8= 00001000 
240=11110000 
2项 and 的结果为 全0 
你看这样能行吗?[/color]
为什么不行?结果本来就应该是0啊,IP地址与MASK做与运算得到的就是网络地址啊,8正好是0/28这个网络里的地址啊。

[color=blue]
williamCU:
sorry,我说错了,不是and。计算结果后四位是1000,应该可以的。 [/color]
晕,到底应该是怎么样?我一下子昏了头了。难道不是IP地址与MASK做与运算得到网络地址?我以前好象一直是这么算的啊

[color=blue]
williamCU:
判断子网是否非标准,不仅要看子网掩码,也要看ip地址的网络部分。 
比如15.30.104.88 netmask 255.255.255.240可以 
218.1.131.88 netmask 255.255.255.240就不行 
TCP/IP有一套标准,什么样的子网是否标准,有一套算法。不是简单的看掩码就行的。[/color]
为什么前一个可以后一个不行?我觉得既然有MASK了就是有类地址啊,不存在ABC类地址的分别了吧?15和218有什么区别?MASK是240的话88这个地址应该可以在80网络里吧?有什么问题么?

[color=blue]
tc:
楼主,你说得情况偶算了一下,如果你使用255.255.255.240作为子网掩码,那么子网ID占用4个为,网络ID占用4个ID,并且,子网0000,1111是不可用的,子网中0000,1111也是不可用的。 
218.1.131中的8是在第一个不可用的子网中,所以设置的时候会出现错误。[/color]
8为什么在第一个不可用的子网里?是当8作为网络地址的时候才不可用吧,可是在0/28网络里只是个普通的地址呀。

另外,ip_check_subnet_addr到底是做什么用的呢?从字面上来看是检查子网地址,那它是去算子网的什么东西?到底什么样的子网地址才是可用的呢?如果在这个问题里将它设置成1那它限制8不能做IP,这样可以起到什么作用呢?那不是会浪费好多象8,16,32这样的地址?



 2bedodo 回复于:2004-03-05 21:13:32

我现在没有HPUX环境,在SUN上做了个实验,也是虚拟网口的:
# ifconfig hme0:1 plumb
# ifconfig hem0:1
hme0:1: flags=1000842<BROADCAST,RUNNING,MULTICAST,IPv4>; mtu 1500 index 2
        inet 0.0.0.0 netmask 0 
# ifconfig hme0:1 202.103.44.8 netmask 255.255.255.240
# ifconfig hme0:1
hme0:1: flags=1000842<BROADCAST,RUNNING,MULTICAST,IPv4>; mtu 1500 index 2
        inet 202.103.44.8 netmask fffffff0 broadcast 202.103.44.255
# ifconfig hme0:1 202.103.44.8 netmask 255.255.255.224
# ifconfig hme0:1
hme0:1: flags=1000842<BROADCAST,RUNNING,MULTICAST,IPv4>; mtu 1500 index 2
        inet 202.103.44.8 netmask ffffffe0 broadcast 202.103.44.255
# ifconfig -a hme0:1 202.103.44.8 netmask 255.255.255.248
ifconfig: hme0:1: bad address

大家看到了吧,系统将广播地址都算成255了,其实不应该是这样,240时广播地址是15,224时广播地址是31才对啊。这让我似乎想起来在无类地址中有一个0能不能做子网地址的配置,但是具体的记不起来了。SUN下面也没有那样一个ip_check_subnet_addr的参数,所以我也没试,也不知道有哪个参数可以对应那个0能不能做子网地址的,如果哪位知道的,贴出来大家一起试试看。

这样想来,HP上那个8的IP的问题,也就是ip_check_subnet_addr的参数可能跟这个有关,也许HP上就是这个参数决定0能不能做子网地址的。大家能不能帮我确定一下?


 williamCU 回复于:2004-03-08 14:22:32

2bedodo:
你好!关于你的几个问题,我的看法如下,供参考:
1.可能你对我的意思有所误解。
  我是为了计算IP地址中的host 位,而不是subnet位,才做如下计算的:
8= 00001000 
240=11110000 
我是这么计算host位的,先看子网掩码最后有几位是0,这里是4个0。然后看IP地址的最后4位是什么,这个数值就是host位。
一开始我看错了,将8看成00010000了,这样host位为全0,当然不行了。
但第二次我发现了8换算成2进制后最后4位的结果是1000,所以认为这样的IP地址应该是正确的。
这样看来,这样的计算host位的方法不是and,而是or,你说对吗?
当然,计算子网(subnet)时还应该是您所说的and.

2.至于什么样的子网才是符合标准的子网,应该由RFC的标准文档来决定。
但是RFC的标准文档里指定了不同的标准,例如,在RFC1878和RFC1122里面对可变长子网的定义制定了不同的标准。

参见http://www.rfc.net 
看一下RFC1878 和RFC1122的定义 
这2个RFC文档对IP子网有不同的定义。 

HP的参数ip_check_subnet_addr设置不同的值,其实是对应不同的RFC协议标准。值为0时对应RFC1878,值为1对应RFC1122.
当遵循RFC1122标准时,检查子网位的设置,此时不允许有全0或全1的子网位。

例如,在上例中,当掩码为255.255.255.240,IP地址最后一位为8时,
换算如下:

IP地址:8= 00001000 
子网掩码:240=11110000 
这样子网地址为2项做and运算,结果为全0.所以在RFC1122(ip_check_subnet_addr=1)的标准下,这样的子网是不合法的。

同理可证明,在子网掩码不变的情况下,如果遵循RFC1122的标准,IP地址在1-15的情况下都是不合法的。(当然16也不合法,因为此时host位为全0,此时2种RFC标准都不支持。)

以上可以通过如下试验证明:
首先。证明RFC1122(ip_check_subnet_addr为1时)下,子网位为全0或全1时IP地址为不合法:
先运行:
#ndd -set /dev/ip ip_check_subnet_addr 1
使用如下方法设置IP地址:
#ifconfig lan1:1 218.1.131.8 netmask 255.255.255.240 
A.在子网掩码255.255.255.240不变的情况下,设置IP地址最后一位为1-15时都不行,这是因为子网位为全0;
B.子网掩码不变,设置IP地址为17-238。
结果是都可以(这里还要剔除31,32,47..239等等ip地址后4位为全0或全1的地址。这些地址2种协议都不支持),因为此时子网位不是全0了。
C.子网掩码不变,IP地址最后一位修改,从241开始,又不行了。因为此时子网位又为全1。

其次。证明RFC1878下,支持子网为全0或全1:
#ndd -set /dev/ip ip_check_subnet_addr 0
使用ifconfig配置IP地址,在上例A,C的测试中,结果都成功。因为此时支持全0或全1的子网位。

最后补充说明一下,我前面 一个帖子里,以下说法有误,很抱歉收回。
引用:比如15.30.104.88 netmask 255.255.255.240可以 
218.1.131.88 netmask 255.255.255.240就不行 



谢谢!!


 williamCU 回复于:2004-03-08 14:24:57

还有什么不明之处,欢迎大家继续展开讨论。
谢谢!
--WilliamCU


 2bedodo 回复于:2004-03-15 08:57:06

由于上周出差,无法上网。非常报歉对你如此耐心的回答没有及时回应。同时向你表示感谢!
你的解释与回答,让我基本清楚了问题的存在原因。其实上周我自己也做了思考,得到的结论和你说的基本一致,但对最后你补充的一点有了新的疑问。即我原先对
引用:比如15.30.104.88 netmask 255.255.255.240可以 
218.1.131.88 netmask 255.255.255.240就不行


的怀疑在HP B2000 UX11.00上被打破,当ip_check_subnet_addr=1时,以上现象确实存在,也就是说你第一次提出这种说法是正确的。由于我目前手上没有空余的HP主机可再次验证(所有的都是生产用机,不敢动),如果有不一致情况,请指出。谢谢!对于这种现象,我猜想在你提到的rfc1122中可能会有相应说明,因周一早上时间紧张,我没有仔细看,先将问题提出,如果你已有解释,谢谢说明。

另:我想在lan0:1上试验,但是好象hpux上执行ifconfig lan0:1 unplumb不能生效,除非执行ifconfig lan0 unplumb,所以不敢做,请教如何只删除子口配置?


 2bedodo 回复于:2004-03-16 20:06:50

williamCU最近不来了么?




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=274499
转载请注明作者名及原文出处