组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
译者:傅小均(michael_fu fuxj@21cn.com)
译文发布时间:2001-5-9
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须
保留本文档的翻译及版权信息。
Network Working Group Jeffrey Mogul
Request for Comments: 917 Computer Science Department
Category: Standards Track Stanford University
October 1984
因特网子网
(RFC917 ——Internet Subnets)
本备忘录的状态
本文档是有关Internet的协议的提案,有待讨论。本备忘录的发布不受任何限制。
摘要
本文档讨论因特网中“子网”的效用。“子网”是整个因特网中的一部分。由于管
理和技术的原因,许多机构选择把一个网络分成几个子网,而不是单纯的使用一系列的
因特网地址。
本文档提出使用子网的程序和过程,并讨论解决由此而产生的问题的方法,特别是
路由问题。
目录
1. 介绍 2
1.1. 术语 3
2 子网地址分配标准 3
2.1 Internet地址的解析 3
2.2 为支持子网,软件所需的改动 4
2.3 子网和广播 5
2.4 决定子网字段的长度 6
3.子网路由方法 6
4.例子 7
4.1 斯坦福大学 7
4.2 麻省理工学院(MIT) 8
4.3 卡内基-梅隆大学(CMU) 9
5.地址格式因特网信报控制协议(ICMP) 9
5.1 描述 9
5.2 例子 10
参考 12
1. 介绍
Internet在开始时被视为两层结构,高层是作为一个整体的链式网,其下是一系列
“网络”的集合,每一个网络都有各自的网络号。(虽然Internet的拓扑结构其实是不
分层的,但Internet的地址解析是分层的。)
这种做法曾一度被证明是简单而有效的,但许多机构发现并不过充分。因此,在对
Internet地址的解析中加入了第三层。从这个观点出发,某一特定的网络就需要(也可
能不需要)分层一系列的子网。
将Internet视为两层的观点是建立在这样一个假设之上的,即:对一台处于某网络
中的主机而言,它所处的网络只有一个边界,也就是说,这个网络可以被视为一个有许
多主机相连着的黑盒。这对Internet早期的ARPA网来说是对的。因为IMPs屏蔽了网
络中的特殊连接的使用。对大多数局域网技术来说也是这样,比如以太网和环网。
但这种假设在许多实践中却是不对的。在一个中等大小的机构中,比如有好几个建
筑物的大学和公司,常常需要多条局域网网线将“局部地区”相连。在写这篇文档是,
斯坦福大学就有18条这样的网线,而且更多的还在计划中。
要用多条网线连接几个区域的原因有几个:
? 不同的技术的网络:特别是在研究环境中,可能会有几个不同的局域网,例如,
某个机构有一些设备支持以太网,而另一些则支持环网。
? 技术的限制:多数技术由于起电气参数的限制,而对连接的主机数和网线的总
长度有限制。这些限制,特别是网线长度很容易达到。
? 网络拥塞:在一个局域网中,一小部分的主机很可能独占大部分的带宽。通常
解决这个问题的方法是把主机根据相互间通信的多少分成几部分,各部分使用
不同的网线。
? 点对点的连接:有时一个“局部区域”被分成几个部分,而个部分之间的距离
对上述局域网技术来说太远了。在这种情况下,高速的点对点连接可以用来连
接这些局域网。
对不得不使用多个局域网的机构来说,分配Internet地址有三种选择:
1. 为每一条网线分配一个网络号。
2. 为整个机构分配一个网络号,并给主机分配地址,而不理会主机在哪个局
域网中。
3. 使用一个网络地址,并分成几个地址空间,从中给每个局域网分配一个子
网地址(显式子网)。
每一种方法都有缺点。第一种方法虽然不需要修改和增加现有协议,但会导致路由
表的急剧增大,整个网络的内部连通性信息传播于整个Internet,而这些信息对这个机
构以外的世界没有用处。特别是现在有些网关没有很大的路由表空间。所以这样的问题
应该避免。
第二种方法需要一定的协议把某些局域网的整合成一个单一的网络。例如,在使用
地址解析协议(ARP)的局域网中,Internet地址被解析成为硬件地址,局域网间的网
桥会拦截ARP对非本地目标的请求。但不是所有的局域网技术都可以做到这一点,特
别是没有使用ARP或不支持广播协议的。一个更基本的问题是,网桥要知道每台主机
在哪个局域网中(这些信息可以用广播算法获得),随着主机的增多,广播的代价也随
之增大,转换所需的缓冲也随之增大。
第三种方法的关键问题是:校友的标准认为所有同一局域网上的主机都是用同一网
线相连的。解决方法是显式的支持子网。这就需要改变现有的Internet协议,改变现在
正在使用的IP的实现方法。但我们认为,这样的改动不是很大,而且只需修改一次,
就能得到一个简单有效的解决方法。我们在本文档中使用的方法会避免导致和现有的非
子网上的主机不兼容的修改。
当找到合适的方法,就有可能是子网内的主机并不知道自己处于子网中。这点在后
面会解释。当不能修改主机以使其支持“显式子网”时,这样做是非常有用的。
1.1. 术语
为了讲述的清楚和简洁,这里定义一些术语,并在以后的文中使用:
链式网:连接在一起的网络的集合
网络:Internet中的一个网络(可以分成子网,也可以不分)
子网:网络中的一部分
网络号:见参考[8]
本地地址:Internet地址中没有分配给网络号使用的位,也叫“剩余位”
子网号:网络中标识子网的号码
子网位:Internet地址中分配给子网号使用的位
主机位:Internet地址中用于指明特定主机使用的位
网关:连接两个或更多不同网络或子网,传递数据的节点
网桥:连接两个或更多物理上可分,但管理上不可分的子网,在必要使传递数据包
的节点,主机不知道其存在。
2 子网地址分配标准
根据参考[2]中的描述,划分子网也就是地址的分配问题。在这部分中,我们首先
提出一个支持子网的地址解析方案,然后讨论这种地址格式和广播之间的关系,最后给
出一个地址解析协议。
2.1 Internet地址的解析
假设某机构分配到一个网络号,并将之分成一系列子网,再分配给主机。如何进行
呢?因为对于Internet地址中本地地址部分的分配限制很少,因此对子网号的分配主要
有以下几种方法:
a) 变长字段:本地地址部分任意位都可以给子网号使用,虽然这部分长度对
某一特定网络是一定的,但各网络间可以不同。如果长度是0,则说明没
有使用子网。
b) 定长字段:指定长度的字段(比如8位)用语子网号(在使用子网的情
况下)。
c) 自编码变长字段:网络好的字段长度是由其高位决定,相似的,子网号的
字段长度也由其高位决定。
d) 自编码定长字段:一定长度的字段给子网使用。如果最高位是1,则使用
子网,否则没有使用。
用什么标准从这四个方案中选择一个呢?首先,确定是否要选用自编码方案,也就
是说能否通过检测一个因特网地址就能得知这个地址是否用道子网?
自编码的一个优点是,人们能知道一个非本地的网络是否被划分成子网。 这是否
有用还不是很清楚。 但主要的好处是不需要额外的信息来说明两个地址是否在同一子
网上。 然而,从另一个角度看,这也会是个缺点:对于非子网网络,如果有主机在其
地址的本地地址字段中任意使用,则会导致问题(1)。也就是说,如果能够独立于主
机地址的分配而控制网络是否子网,这会非常有用。另一个自编码方案的缺点是,给主
机使用的地址空间会减少至少2位。
如果没有使用自编码方案,很明显,变长子网字段方案是合适的。既然任何情况下
每个网络都有“标志”显示是否使用子网,使用整数型标志比使用布尔型标志所多的耗
费也就可以忽略。使用变长子网字段的好处是允许每个机构选择最好的分配方案,以应
付给子网和主机使用的地址位数的相对不足。
因此,我们提议的因特网地址的解析是:
<网络号><子网号><主机号>
网络号使用的位在参考[8]中有述。主机号字段至少长1位。子网字段的长度在一
个网络中是固定的。子网字段和主机字段不需要其他的数据。如果子网字段的长度是0,
则说明没有使用子网。
例如,在一个A类网络中的有8位长的子网字段,则它的地址如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0| 网络 | 子网 | 主机号 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
为了实现的简单和有效,我们希望所有的机构都使用8位或者8的倍数的子网字
段长度。但作为一个统一的实现方法,必须能够其他可能的长度。
我们反对“递归子网”的使用,就是将主机号字段再分成子网和主机两部分。因为:
- 没有对四层结构的明显的需求。
- IP地址中没有足够的位使这种方法有实用价值。
- 需要复杂的而外机制
2.2 为支持子网,软件所需的改动
在大多数IP的实现中,处理向外发送数据包的模块里常有类似下面的代码:
IF ip_net_number(packet.ip_dest) = ip_net_number(my_ip_addr)
THEN
send_packet_locally(packet, packet.ip_dest)
ELSE
send_packet_locally(packet,
gateway_to(ip_net_number(packet.ip_dest)))
IF 因特网网络号(数据包的目标地址) = 自己的网络号
THEN
发送本地数据包
ELSE
发送本地数据包到网关
为了支持子网,需要另一个32位的值,成为网络掩码。这是一个位掩码,各个位
的设置和IP网络号以及子网号相对应。例如,一个A类网络使用8位子网字段,则其
掩码为 255.255.0.0。
则上述的程序代码变为:
IF bitwise_and(packet.ip_dest, my