因特网子网( 三 )


则说明没有使用子网 。
例如,在一个A类网络中的有8位长的子网字段,则它的地址如下:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0网络子网主机号
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
为了实现的简单和有效,我们希望所有的机构都使用8位或者8的倍数的子网字
段长度 。但作为一个统一的实现方法,必须能够其他可能的长度 。
我们反对“递归子网”的使用,就是将主机号字段再分成子网和主机两部分 。因为:
- 没有对四层结构的明显的需求 。
- IP地址中没有足够的位使这种方法有实用价值 。
- 需要复杂的而外机制
2.2为支持子网,软件所需的改动
在大多数IP的实现中,处理向外发送数据包的模块里常有类似下面的代码:
IFip_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 。
则上述的程序代码变为:
IFbitwise_and(packet.ip_dest,my_ip_mask)
=bitwise_and(my_ip_addr,my_ip_mask)
THEN
send_packet_locally(packet,packet.ip_dest)
ELSE
send_packet_locally(packet,
gateway_to(bitwise_and(packet.ip_dest,my_ip_mask)))
当然,部分条件的表达式可以预先计算好 。
函数"gateway_to"可能需要修改,以做类似的比较和判定 。
为支持连接在多个网络上的主机,程序可以给每个网络接口设置各自的
"my_ip_addr"和"my_ip_mask",上述代码中的比较和判定也要对每个网络接口进行 。
2.3子网和广播
在没有子网的情况下,因特网协议中只可能有两种广播:广播给指定网络中的所有
主机,或者是广播给本身网络的所有主机 。后一种方法在主机不知到自己在哪个网络中
是很有用 。
当使用了子网后,情况就变的复杂了 。首先,产生了广播给特定子网的可能性 。第
二,广播给子网中的所有主机需要附加的机制 。最后,“广播给本身网络“的解释变成
“广播给本身子网”
这中的实现中必须熟悉3中广播地址以及自己的主机地址:
本身的物理网络
所有位都是1的目标地址(255.255.255.255)将使数据包在本地的物理网络中进
行广播,网关并不传递这些数据包 。
指定的网络
目标地址中有有效的网络地址,而本地地址部分都是1(例如:36.255.255.255) 。
指定的子网
目标地址中的网落地址和子网地址有效,而主机号字段都是1(比如:
36.40.255.255) 。
因特网广播的更深入的讨论参看[6] 。
一个有助于决定是否使用子网的因素是:某台主机是否需要用一步操作就能给所有
主机广播 。假如两台主机不在同一网络中,就不可能用一个步骤就给它们广播 。
2.4决定子网字段的长度
一台主机怎么知道该使用多长的子网字段呢?这个问题和几个“引导程序”的问题
很相似:一台主机怎么知道自己的地址以及怎么知道网关的地址 。对这三个问题,有两
个基本的解决办法:“硬编码”的信息和基于广播的协议 。
“硬编码”信息是指主机不通过网络就能获得的信息 。可以是编译好的,或者更

推荐阅读