Internet子网

介绍

本文说明Internet中的子网及其作用。使用子网可以使企业不用再申请新的网络号,而把现在有的网络进行细划即可满足对网络划分的需要。在本文中请大家一定要记住一点,在本文以前还没有子网技术出现,IP协议中也不包括子网技术。

1. 产生原因

我们知道原来的IP地址是分为两级的,一级是网络号,一级是主机号。虽然这个方法比较简单,但是它的缺点也开始出现了,必须要加入新的解释地址的手段。把一个网分成许多小网就是子网分隔的概念。子网的概念对于中型企业来说是最为合适的,它可以把企业内部不同的LAN连接起来。这样可以使不同拓朴结构的网络互联,也可以使网络不至于因为少数主机的通信而变得十分噪杂。

企业中如果使用多个LAN,它可以有以下几种指定IP地址的方法:

  1. 为每个网段指定一个网络号;

  2. 整个网络使用一个网络号,随便指定主机的IP地址,不管它在什么网段上;

  3. 使用子网技术为每个LAN指定子网号;

每个方法都有缺点,第一个方法虽然不需要修改协议,但是会造成路由表的巨大负担,子网内部的结构必须为外部了解,虽然这样是不必要的,但这也必须如此,因此造成了浪费。如果IP资源不是那么丰富,那它也太浪费了。第二种方法必须使用一种技术使所有的LAN看起来象一个网络,这可就是问题了。更重要的是网桥必须知道主机在那一个LAN上,那么它必须使用广播,这会对网络造成巨大的负担。而第三种方法必须修改IP协议(过去的IP协议)。

2. 子网寻址

本节中首先解释子网寻址,下来讨论对软件的修改(以支持子网),最后给出寻找给定网络上地址解析方法的过程。

2.1. 关于IP地址

假定已经获得了IP网络号,而且已经分隔为一系列子网,而且需要指定主机地址,那应该怎么办呢?因为对IP地址的本地指定限制很小,因此可以采取以下几种方法:

  1. 变长域:每个子网的子网长度不相等,但是每个子网中的子网长度相同。如果长度为0,则不使用子网技术。

  2. 定长域:指定用于子网的子网长度。

  3. 自编码变长域:自己规定子网的长度和样式,但子网长度不一样。

  4. 自编码定长域:指定用于子网的子网长度。

  5. 掩码:使用掩码确定本地地址中子网是什么。

这几种方法中使用哪一个需要有一标准,它能够从现在的IP地址中指出子网是什么。自编码允许将网络划分成不同大小的子网。子网标准在整个Internet内必须是一致的,如果假定所有网络均使用子网就解决了这个问题。如果不使用自编码体制,也不会使用定长域体制,因为在这种情况下需要附加位来表示是否使用子网,这是不合适的。而使用掩码可以使用不经常使用的位(作为掩码)灵活地分隔子网。我们选择的是地址掩码策略。

使用子网后,IP地址变为下面格式:

<network-number><subnet-number><host-number>

其中<network-number>和IP中的定义一致,<host-number>域至少一位,<subnet-number>域对于给定网络是定长的,不同网络可能不一样。如果<subnet-number>长度为0,不使用子网。下面是一个B类地址中加上6位子网域:

子网格式

由于采用的是掩码,因此子网部分不一定要连续,但是推荐将本地地址的高位用作子网,而且要是连续的。因为在IP中全0代表本地(网络),全1代表所有(网络或主机)。这一点在子网内不能这样使用,在上例中6位的子网域不能取0或63。

2.2. 修改主机软件支持子网

在主机的软件中通常都会有一段代码决定发出的数据报是不是能够直接到达目的地,还是要发向网关。这段编码大致如下:(我们只讨论最简单的一种情况)

IF ip_net_number(dg.ip_dest) = ip_net_number(my_ip_addr)
THEN  send_dg_locally(dg, dg.ip_dest)
ELSE send_dg_locally(dg, gateway_to(ip_net_number(dg.ip_dest)))

如果要支持子网,就要引入新的32位变量my_ip_mask,而代码就会变成下面的样子:

IF bitwise_and(dg.ip_dest, my_ip_mask)=bitwise_and(my_ip_addr, my_ip_mask)
THEN send_dg_locally(dg, dg.ip_dest)
ELSE send_dg_locally(dg, gateway_to(bitwise_and(dg.ip_dest, my_ip_mask)))

2.3. 找到地址掩码

下面我们看一下新加入的主机如何知道目前子网内使用的地址掩码,在这种情况下,也只有两种解决方法,一种是将这个信息编码于硬件,另一个是进行广播。编码于硬件就是将有关子网的信息保存于磁盘文件中,因为有了无盘站,这种方法看来不怎么适用。因为LAN支持广播,那使用广播可能是比较合适的方法,我们可以使用RARP获得IP地址,因为广播占用的带宽可是不小,因此尽量在一个应答中将所有需要的信息都返回给新加入的主机。如果非要将子网信息和其它信息分次传送,可以使用ICMP中新加入的信息类型“地址掩码请求”和“地址掩码响应”。新加入的主机可以广播一个“地址掩码请求”信息,接收到此信息的网关返回“地址掩码响应”,如果信息中未指定发送请求的主机地址,网关会进行广播。这时主机就会知道地址掩码是什么了。如果主机和多个子网相连,它需要指定不同子网中的掩码。如果主机多次请求后仍然得不到应答,它会得到下面三个结论:(或者其中几个)

  1. 本地网络不和其它网络连接;

  2. 未使用子网,因此没有主机能够提供地址掩码;

  3. 所有网关现在都坏了。

前两种情况下可以不使用掩码,第三种情况比较难处理,安全的方法是也不使用掩码,当网关修复以后,它会进行响应,此时主机可以进行相应的修正。任何主机或网关都不能根据猜测而返回地址掩码。最后需要强调的是,不是所有的主机都需要使用ICMP获得地址掩码,它仅用于无盘站之类的计算机。

附录I 地址掩码ICMP

地址掩码请求和响应包的格式如下:

格式

在IP中它包括了源主机的地址,响应主机可以直接将这个地址作为返回地址,如果得到的源主机地址为0,则需要进行广播。

ICMP中的各域意义如下:

Type

AM1代表地址掩码请求,而AM2代表地址掩码响应

Code

0代表地址掩码请求,1代表地址掩码响应

Checksum

它是从ICMP中的Type开始计算的

Identifier

用于帮助匹配请求与应答,它的值可能为0

Sequence Number

用于帮助匹配请求与应答,它的值可能为0

Address Mask

32位掩码

网关返回主机所在子网的子网地址掩码,如果主机不知道自己的IP地址,则IP地址域设置为0,这样可以使网关进行广播。

附录II 例子

下例中是主机使用ICMP消息获得地址掩码的例子,我们假定255.255.255.255代表广播。

1. A类地址

主机在A类网络36.0.0.0中,拥有地址36.40.0.123,网关为36.40.0.62,使用8位子网地址掩码。地址掩码是255.255.0.0。我们建议在获得自己的IP地址后再进行ICMP请求,如果不能获得就只有向255.255.255.255发出请求了。

 

主机拥有IP地址的情况下进行请求:

Source address

36.40.0.123

Destination address

255.255.255.255

Protocol

ICMP = 1

Type

地址掩码请求 = AM1

Code

0

Mask

0

网关会直接响应:

Source address

36.40.0.62

Destination address

36.40.0.123

Protocol

ICMP = 1

Type

地址掩码响应 = AM2

Code

0

Mask

255.255.0.0

 

主机未拥有IP地址(和主机号)的情况下进行请求:

Source address

0.0.0.0

Destination address

255.255.255.255

Protocol

ICMP = 1

Type

地址掩码请求 = AM1

Code

0

Mask

0

网关会直接响应:

Source address

36.40.0.62

Destination address

36.40.0.123

Protocol

ICMP = 1

Type

地址掩码响应 = AM2

Code

0

Mask

255.255.0.0

 

不允许进行广播,但主机已经知道网关地址:

Source address

36.40.0.123

Destination address

36.40.0.62

Protocol

ICMP = 1

Type

地址掩码请求 = AM1

Code

0

Mask

0

网关会直接响应:

Source address

36.40.0.62

Destination address

36.40.0.123

Protocol

ICMP = 1

Type

地址掩码响应 = AM2

Code

0

Mask

255.255.0.0

2. B类地址

在这个例子中,我们假设主机处于B类地址网络128.99.0.0中,拥有地址128.99.4.123,网关是128.99.4.62,使用6位子网地址,地址掩码为255.255.252.0。

主机拥有IP地址的情况下进行请求:

Source address

128.99.4.123

Destination address

255.255.255.255

Protocol

ICMP = 1

Type

地址掩码请求 = AM1

Code

0

Mask

0

网关会直接响应:

Source address

128.99.4.62

Destination address

128.99.4.123

Protocol

ICMP = 1

Type

地址掩码响应 = AM2

Code

0

Mask

255.255.252.0

 

主机未拥有IP地址(和主机号)的情况下进行请求:

Source address

0.0.0.0

Destination address

255.255.255.255

Protocol

ICMP = 1

Type

地址掩码请求 = AM1

Code

0

Mask

0

网关会直接响应:

Source address

128.99.4.62

Destination address

255.255.255.255

Protocol

ICMP = 1

Type

地址掩码响应 = AM2

Code

0

Mask

255.255.252.0

 

如果不允许进行广播,但知道网关地址:

Source address

128.99.4.123

Destination address

128.99.4.62

Protocol

ICMP = 1

Type

地址掩码请求 = AM1

Code

0

Mask

0

网关会直接响应:

Source address

128.99.4.62

Destination address

128.99.4.123

Protocol

ICMP = 1

Type

地址掩码响应 = AM2

Code

0

Mask

255.255.252.0

3. C类地址

本例中主机在C类网络192.1.127.0中,拥有地址192.1.127.19,网关为192.1.127.50,使用3位子网(不连续)01011000,地址掩码为255.255.255.88。

主机拥有IP地址的情况下进行请求:

Source address

192.1.127.19

Destination address

255.255.255.255

Protocol

ICMP = 1

Type

地址掩码请求 = AM1

Code

0

Mask

0

网关会直接响应:

Source address

192.1.127.50

Destination address

192.1.127.19

Protocol

ICMP = 1

Type

地址掩码响应 = AM2

Code

0

Mask

255.255.255.88

 

主机未拥有IP地址(或主机号)的情况下进行请求:

Source address

0.0.0.0

Destination address

255.255.255.255

Protocol

ICMP = 1

Type

地址掩码请求 = AM1

Code

0

Mask

0

网关会直接响应:

Source address

192.1.127.50

Destination address

255.255.255.255

Protocol

ICMP = 1

Type

地址掩码响应 = AM2

Code

0

Mask

255.255.255.88

 

如果不允许广播,但主机知道网关地址:

Source address

192.1.127.19

Destination address

192.1.127.50

Protocol

ICMP = 1

Type

地址掩码请求 = AM1

Code

0

Mask

0

网关会直接响应:

Source address

192.1.127.50

Destination address

192.1.127.19

Protocol

ICMP = 1

Type

地址掩码响应 = AM2

Code

0

Mask

255.255.255.88