邪恶八进制信息安全团队技术讨论组's Archiver

冰血封情 2005-10-4 00:58

[转载]Internet子网

信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])

1. 产生原因

整个Internet看起来是两级结构:第一级是Internet整体,下一层是各个网络,每个网络均有自己的网络号,但是就Internet来说,它的拓朴结构并没有层次结构。在这个两层结构中,每台主机把自己所处的网络看成是一个整体。但是有些时候这样并不够,有些机构发现两级并不够用,于是就有了把一个给定网络划分为一系列子网的方法。

三层模型对于中等大小机构(如,大学或几幢楼的公司)的网络是很有用的,它需要多个LAN线缆以覆盖一个“局部地区”,每个LAN可以被作为一个子网。

使用一个或多个线缆来覆盖园区的原因有以下几个:

- 技术的不同:一个环境中可以使用不同类型的LAN,如Ethernet,令牌网。

- 技术的限制:由于电参数的,许多LAN技术对于连接的主机数目,线缆的最大长度都有限制。

- 网络拥塞:一个LAN的小子网的主机占据大量的带宽是有可能的。解决的方法是把主机分成能相互通讯的机群。

- 点对点连接:有时被称为“局域”,如大学校园,就使用LAN技术被分成两个相距很远的部分,这时,就需要高速点对点连接这几个LAN。

使用多于一个的LAN的机构有三种指定Internet地址的方法:

1. 直接指定独立的网络号,不使用什么子网;

2. 对整个机构使用同一个网络号,而不关心主机在哪个LAN上,这也称为透明子网;

3. 第三种方法与第二种方法大部分是相同的,只是每台主机都会明白自己在哪个子网上,这也称为显式子网。

每种方法都有不足。第一种方法会导致可用的网络地址大大减少,对路由表的占用也是巨大的,而现在应用的网关所支持的路由表往往大小有限,最好不要使用这种方法。

第二种方法要使用一些规则使得所有的LAN看起来象一个Internet网络,这也有点问题,对于网桥来说,要知道一台主机是哪一个网段的可是不容易,如果使用广播的话,随着网络内主机数目的增加,广播的开销可不少呢,而且网桥内所需要的缓存就要随着网络内主机数目的增加而增加,这也不是一个小问题。

第三种方法很明显支持子网,但是显式地支持子网需要对Internet协议进行修改。但是,这样的修改是微小的,而且一旦使用了会一劳永逸地解决问题。而且这各种解决方法对于没有使用子网技术的主机也一样适用,如果能够有技术使主机透明地使用子网技术就更妙了。

2. 子网寻址标准

上面已经解释了产生子网寻址的原因,下面我们看一下如何改变主机软件以适应这种改变。

2.1. Internet地址解释

假设一个机构有了一个网络号,并希望把这个网络划分为子网并指定主机地址,那应该怎么办呢?对于Internet地址来说,地址的本地地址部分规定很少,下面是几个表示子网号的方法:

1. 变长域:子网号域的长度可以可以是变长的,虽然在每个网络内部是一样的,但是网络与网络之间可能是不同的,如果子网号域长度为0,则没有使用过子网技术。

2. 定长域:这个概念与变长域是相反的,这里就不多说了。

3. 自编码变长域:正如网络号可以由高位字节定义,子网的长度也可以相似处理。

4. 自编码定长域:这个概念与变长域是相反的,这里就不多说了。

5. 掩码位:使用掩码来确定哪些位可以表示子网号。

如何进行选择呢?当然我们现在知道我们最后选择了掩码位的方法,因为它十分灵活,而且相对起来实现比较容易。

这样,一个Internet地址可以这样解释:

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

这里<network-number>由IP定义,<host-number>至少一位,而<subnet-number>对于给定网络是定的,不需要再有什么多余的信息用于<subnet-number>或<host-number>,如果<subnet-number>长度为0,则没有使用子网技术。因为使用了掩码,所以子网不需要相邻,但是一般在应用的时候应该保持子网是相邻的。

2.2. 为支持子网对主机软件的改变

在大部分的IP实现中都有代码完成以下功能:决定一个数据报是发向本网呢还是发向网关。这段代码通常的模样是下面的样子:

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,它是一些0和1的序列,其中1对应于子网号的位置,有了这个,我们上面看到的代码就会变成下面的样子:

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. 寻找地址掩码

一台主机如何知道它正连接的子网的子网掩码呢?在启动时它又如何知道自己的地址呢,又如何知道网关是什么呢?有两种解决方法:一种是采用固定信息的方法,另一种是基于广播协议的解决方法。下面我们就仔细介绍一下这两种方法。

固定信息是磁盘上的一个文件,它用来保存网络配置数据,但是随着无盘站的增多,这种方法不怎么具有通用性了。而基于广播协议的方法,我想大家如何熟悉反向地址解析协议的话,一定不会感觉到陌生了。我们都知道在广播的时候会占用大量的通信带宽,所以尽量要把广播的内容一次广播完,这就需要知道类似IP地址,网关的硬件地址等等信息,尽量能够把这些信息一定广播完毕,在无盘站中,工作站在启动时一次获得所有的相关数据,这样可以减少广播的次数。

在获得子网掩码的时候,可以通过ICMP协议进行,ICMP协议的具体内容请大家参阅相关资料。当然了,如果一台主机和多个网络连接,那么它必须找到每个网络的子网掩码。

一个潜在的问题现在来了,如果主机在尝试了几次后不能成功,那它会以下面三种方法解释自己碰到的情况:

1. 本地网络与其它网络不连通。

2. 未使用子网,所以得不到回应。

3. 本地网的所有网关都失效了。

第一二种情况说明地址掩码和Internet网络号一致,第三种情况下什么也无法了解,所以就假设它也处于第一二种情况下,这样可能会是错误的,但是当网关恢复后会纠正这一错误。最后,需要提醒用户的是主机不是非要使用ICMP协议寻找地址掩码,所以最好使用硬件文件保存相应的配置信息。

页: [1]
© 1999-2008 EvilOctal Security Team