使用这种技术纯碎是本地的事情,不会影响其他网络。此技术的使用是自由决定的。
综述:
RFC-950 指定了用掩码进行子网的划分。RFC-950没有指明同一个网络的不同子网是不是要有不同的掩码。这种歧义令人遗憾,因为这导致了路由协议不支持不同掩码。
网络管理员必须决定每个子网的掩码。这包括估计每个子网的主机数。因为预测每个子网的增长速度是不可能的,效率低的决策经常被采取,同时导致其他子网的利用率不足或因为超过最大主机数而导致重新编号。
该备忘录指明了一个省去估计子网规模的分配子网的方法。
在新的子网掩码中,主机无需改变地址。
这不是新技术,但也很少有人知道,甚至几乎没有人实现。随着新的诸如OSPF路由协议的发展,好好利用这个技术是有可能的。该备忘录的目的,是使该技术广为人知,完全准确地详细说明它。
1. 动机
子网划分标准,也就是RFC-950,指定了主机位可以被分为两部分-------子网号和主机号。这给了IP地址3级继承结构,同时也伴随防火墙和路由开销的节省。也介绍了地址分配增加的低效率。
低效源自这样一个事实,网络管理员会高估单个子网的主机数,为了不在未来重新分配子网.这也会发生在这样一种情况,如果在用的路由协议不能在不同长度的子网下工作,网络管理员必须给每个子网一个等同于被最大子网接受的大小。
假设掩码是255.255.255.0,A的子网是1.0 B是2.0 C是3.0,如果B的主机数超过254台,如果我们只想改变B的掩码而不改变主机号,但是比B大和比B小的子网号被A和C占走了.(如果3.0没有被占走,那么只要将B的掩码改为255.255.254.0即可).只要没有连续的掩码被使用,B就有可能让掩码的其他位置为0.然而,不连续的掩码不太受人喜欢,因为这样做就对路由算法产生了限制.所以RFC-950不建议这样使用。
所以,网络管理员可行的选择有 1)从现存的网络中组成两个子网 2)重编号子网.第一个选择只能在物理上或是逻辑上实现其中一个。物理上构成两个子网要求分割子网,在两个分区间插入一个网关。因为一些显而易见的原因,这样的做法很不理想。逻辑上组织两个子网可以简简单单地给相同的子网再分配比如4.0的地址,然后在新的子网下分配主机地址。
逻辑上这样分配的结果导致不同子网号码下的主机不能识别相同子网下的主机,会给默认网关而不是直接给主机传送包。事实上,这并不是一个很不好的解决方法,因为假设网关可以识别一个子网下的不同子网编号,网关会仅仅给主机发送一个ICMP回执,随后的包会直接发送给主机(这也许不会在所有主机下都能正常工作)。
然而,这都是不可接受和不可能的,接下来网络管理员必须给B分配一个新的子网编号,因此要给存在的主机重编号,修改DNS下的条目,然后改变任何其他在子网B中主机的电路地址的文件配置。
2. 一个更灵活有效的方法
为了帮助解释新技术,我们应该只是现在所做的有什么错误。现在,很多子网是把主机分为两部分来分配的,分别是子网号和主机号。子网对应的掩码为1,主机位对应的掩码为0.(在我们的所有地址中,最小为在右边,最大位在左边。)
MSB LSB
--------------------------------------
| subnet field | host field |
--------------------------------------
子网位是根据子网大小可变长的。举个例子,一个网络有两个很大的子网和一些小的子网.然后网络管理员也许会分配两种类型的地址:
--------------------------------------
| subnet | host | large subnets
--------------------------------------
--------------------------------------
| subnet | host | small subnets
--------------------------------------
在这种情况下,子网号码的全部范围对于小的子网来说将不可用,因为小的子网的bits对应的大的子网没有相同的值。举个例子,大的子网有4个位,小的子网有8个位。如果大的子网的值是0001和0010,然后再0001000到00101111的子网号码不能分配给小的子网,否则就会有映射到两个子网的地址了。
在任何情况下,一个网络管理员会给两个子网按数字序列分配号码。举个例子,给定一个指定的子网,主机会被标注为1,2,3等等。在给定的网络下,子网也会被分配为1,2,3等等。结果就是子网和主机的右边位会是1而左边是0.0的位代表了增长的空间。
--------------------------------------
| subnet field | host field |
|-----+-----------+-------+------------|
| | | | |
| 0's | 1's & 0's | 0's | 1's & 0's |
/\ /\
|| ||
subnets can hosts can grow here
grow here
现在,让我们假设主机号码在一个特定的子网下增长到了所给定的最大值,但是子网还有潜力分配更多的地址。我们便有了如下的结果:
--------------------------------------
| subnet field | host field |
|-----+-----------+--------------------|
| | | |
| 0's | 1's & 0's | 1's & 0's |
主机号无法再增长。问题是因为增长的地址被放好了,接下来的增长只能有效为子网保留。什么应该代替分配子网号码使得这能够正确工作呢。这种情况下我们得到下列情况:
--------------------------------------
| subnet field | host field |
|-----------+-------------+------------|
| | | |
| 1's & 0's | 0's | 1's & 0's |
/\
||
Both hosts and subnets can
grow here
现在,主机号和子网号都个字有很大的增长空间了,虽然组合的增长空间是一样的。因为一个人几乎不可能预测一个子网中会有多少主机,或者最终应该有多少子网,这种布局发挥了增长的最大灵活性。
实际上,先前的图有误导作用。主机和子网的域分界线在增长区的中间。然后,界限可以在增长区的任何一个位置。注意一点,是掩码来决定界限的位置。1指定子网的位,0指定主机位。我们之后会介绍实际上界限应该位于中间某处。将界限放在此处会减少主机位中掩码被改变的次数。
2-1 新技术的说明书
已经给了足够的介绍材料,现在我们能详细说明子网分配的步骤了。
Mirrot-image Counting:
比如有这样的子网号码
0 (reserved to mean "this host")
01
10
011
100
101
:
:
11...1110
11...1111 (reserved to mean "all hosts")
应该转变成如下形式
0 (reserved to mean "this subnet")
10
01
110
001
101
:
:
011...11
111...11 (reserved to mean "all subnets")
直接举例子来说明算法
假设有一个C类网络,举这个例子是因为网络号占了3个byte,比较方便。首先以3个子网A,B,C开始。h代表主机位,g代表可拓展位,h可以是0或1而g肯定是0.
Subnet Address Mask
A 10gg ghhh 1111 0000
B 01gg ghhh 1111 0000
C 110g ghhh 1111 0000
通常给子网分配较多的mask,这样当拓展主机号时只需要修改特定的mask,但增加子网时会导致修改已存在的其他子网的mask。
另外,可以发现C的前面是110而不是11这是因为11是广播地址。
接下来,我们再增加一个子网D,值应该是100根据MC变为001
Subnet Addr Mask
A 10gg ghhh 1111 0000
B 01gg ghhh 1111 0000
C 110g ghhh 1111 0000
D 001g ghhh 1111 0000
这时候其他子网并没有产生任何变化。
当我们再加一个子网E时,如下
Subnet Addr Mask
A 100g ghhh 1111 0000
B 01gg ghhh 1111 0000
C 110g ghhh 1111 0000
D 001g ghhh 1111 0000
E 101g ghhh 1111 0000
我们发现A变成了100,这是因为如果A还是10,那会和E产生冲突。另外注意如果A的mask初始设为11000000那么现在就必须要修改为11100000
接下来,往A和C中增加8台主机
Subnet Addr Mask
A 100g hhhh 1111 0000
B 01hh hhhh 1100 0000
C 110g hhhh 1111 0000
D 001g ghhh 1111 0000
E 101g ghhh 1111 0000
就要使用3th-bit变为h
之后,我们再添加一个子网F
Subnet Addr Mask
A 100g hhhh 1111 0000
B 01hh hhhh 1100 0000
C 110g hhhh 1111 0000
D 001g ghhh 1111 0000
E 101g ghhh 1111 0000
F 1110 ghhh 1111 0000
大家会很奇怪为什么F是1110,计算出来不是011么。原因是:011会和B发生冲突,而B已经无法拓展了,因为B的mask已经达到了11000000.所以我们继续直到找到合适的值为止。
最后,移除子网E
Subnet Addr Mask
A 10gg hhhh 1111 0000
B 01hh hhhh 1100 0000
C 110g hhhh 1111 0000
D 001g ghhh 1111 0000
F 1110 ghhh 1111 0000
因为移除了E,所以A也可以变回10了。