📄 rfc917.txt
字号:
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_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 决定子网字段的长度
一台主机怎么知道该使用多长的子网字段呢?这个问题和几个“引导程序”的问题
很相似:一台主机怎么知道自己的地址以及怎么知道网关的地址。对这三个问题,有两
个基本的解决办法:“硬编码”的信息和基于广播的协议。
“硬编码”信息是指主机不通过网络就能获得的信息。可以是编译好的,或者更
好的方法是存放在磁盘文件中。但对于不断增加的无盘工作站来说,由于它是从网络启
动的,所以两种“应编码”的方法都不适用。而大多数的局域网技术都支持广播,因此
另一个较好的方法是启动的主机广播所需要信息的要求。比如,为了知道自己的因特网
地址,可以使用“逆向地址解析协议”[4]。
我们建议将ICMP[9]协议(因特网信报控制协议)进行扩展,加入一对新的ICMP
消息类型:“地址格式请求”和“地址格式回复“,和“信息请求”和“信息恢复”消
息很相似。细节参看附录1。
当一台主机启动时,广播新加入的ICMP消息“地址格式请求“<3>.网关(或相当
于网关的主机)接收到后,回复以” 地址格式回复“。如果请求中没有说明是哪台主
机发送的(源IP地址是0),则回复消息以广播形式发出。发出请求的主机就能接收到
这个消息,从而知道自己的子网字段长度。
在“地址格式请求”中只可能有一个值,所以发出请求的主机就没有必要去匹配请
求和回复:就是有多个网关回复也没有关系。我们认为主机不会经常从新启动,所以网
络上这两个消息的广播负载是很小的。
如果主机连在好几个局域网上,它需要对每个局域网使用这个协议,除非它能确定
(从其中一个网络的回复)几个局域网是在同一个网络中的。在这种情况下,其地址会
有相同的子网字段长度。
一个潜在的问题是如果主机重复好多次都没有收到对“地址格式请求”的响应时该
怎么办。有三种原因可能导致这种情况:
1. 局域网没有和其他的网络相连(永久的)。
2. 没有使用子网,而且没有主机支持这两个ICMP请求。
3. 所有的网关都没有正常工作(暂时的)
第一、二种情况意味着子网字段长度是0。第三种情况下没法知道其值会是什么:
最安全的选择是0。 虽然很可能是错的,但这样不会阻止原来可以成功的数据传送。
当网关恢复工作以后,当它收到“地址格式请求”时,就会回复,主机就可以获得正确
的信息,并将自身的数据相应的调整。主机和网关不应该发送基于“猜”出的“地址格
式回复”。
最后,要注意并不要求主机使用这两个ICMP协议消息来获得子网字段长度,特别
是对于有稳定存储介质的主机。
3.子网路由方法
一个因特网所有主机都要面对的是怎么决定到另一台主机的路由。在有子网的情况
下,这个问题只需要很小的改变。
使用子网后,路由过程就要处理两个层次。如果目标主机和源主机在同一个网络中,
只需要子网间的网关来决定路由。而如果目标主机和源主机在不同的网络中,则需要网
络间的网关和子网间的网关共同来决定路由。
幸运的是,许多主机可以使用“缺省”的网关作为所有路由的第一个目标,在回复
ICMP主机重定向消息时再定义更多的合适的路由。但这种方法对于网关和连在多个网
络中的主机来说效率太低,而应该使用路由信息交换协议。这超出了本文档的讨论范围,
在没有子网的情况下也存在这个问题。
对于只连在一个网络上的主机,需要找到至少一个邻接的网关。同样,也有两个解
决办法:硬编码和广播。邻接网关的问题在不使用子网时也存在,用不用子网对次问题
没有影响。
但还存在另一个问题:源主机必须知道数据包是直接发送给目标主机还是要通过网
关发送?也就是要知道目标主机和源主机是否在同一个物理网络上。这是路由过程中唯
一一处需要知道子网的地方。事实上,如果不使用广播,这也是因特网的实现中唯一需
要修改的地方。
所以,有可能不用修改就可以使用现有的方法使之支持子网<4>。这样的实现方法
必须具备如下条件:
- 只给连接一个网络的主机使用,也不给网关使用。
- 使用在有广播的局域网中。
- 使用地址解析协议ARP,如[7]。
- 不需要维护和网关的连接。
在这种情况下,可以修改子网网关上的地址解析ARP服务模块,当它接收到地址
解析请求时,检查数据包是否正由最佳路由传递。如果是,则将自己的硬件地址回复给
源主机。源主机认为网关的地址就是目标地址,并将数据包发送给这个地址。实际上,
网关将接收到这些数据包,并将之传递到目标地址。
这种方法使网关中的处理层次不是很清楚,因为通常情况下,地址解析服务器和路
由表没有联系。考虑到这点,这种方法不是非常令人满意。但实现起来相当简单,而且
没有显著的性能损失。问题是如果原来的网关出问题后,主机没有办法选择另一个网关。
这样,一条在其他方法下可以成功的连接就断了。
不要混淆“基于地址解析协议的子网技术”和“基于地址解析协议的网桥”的简单
使用。前者是基于网关能检查IP地址从而推导出路由的能力,基于显式的子网的拓扑
结构。一小部分的路由功能从主机转移到网关上。而基于地址解析协议的网桥则在不知
道主机地址和网络拓扑结构的条件下,知道各主机的位置。
注意:基于地址解析协议的子网技术由于广播的使用而变的复杂。地址解析服务器
对目标地址是广播地址的请求作出响应。这样的请求只可能来自于不认识广播地址的主
机。这将导致数据包的循环传递。如果在一个物理网络中有N个不认识广播地址的主
机,那么,生存时间是T的数据包将会被重复广播T**N的时间。
4.例子
这部分我们简要的介绍几个机构的子网使用。
4.1 斯坦福大学
在斯坦福大学,最初的子网是由于历史原因而引入的。自979年以来(当时因特
网协议还没有使用),斯坦福在几个实验性的以太网中使用Pup协议,使用了很多Pup
的网关,所有的主机和网关之间使用广播协议相互交换路由表信息。
当引入因特网协议后,决定采用8位长的子网,以使因特网子网的数目和各个以
太网中的Pup网络数目想匹配。Pup主机的字段长(也是8位)也被作为因特网的主
机地址字段的长度
只支持Pup的网关作了修改,使其可以根据Pup的路由表传递因特网数据包。这
种网关不对IP包中的‘生存时间’(Time-to-live)字段进行操作。当时传递环路的错
误没有表现出来。
因特网主机做了修改以理解子网(有好几种方法,效果都相同)。因为所有主机都
已经实现了Pup,所以因特网的路由表的维护过程和维护Pup的一样,只要简单的把
Pup网络号变成因特网子网号就行了。
加入10M以太网后,网关修改为使用地址解析协议(ARP)的,这样可以不用修
改主机。
因特网子网在1982年早期就开始使用了,当时有大约330台主机,18个子网,
18个子网网关。当只支持Pup的网关换成真正的因特网网关后,会引入基于因特网的
路由信息交换协议,Pup逐渐停止使用。
4.2 麻省理工学院(MIT)
麻省理工学院是第一个有大量局域网连接的使用因特网的地方。当时还没有进行网
络分类,如果每一条连接都分配一个网络号的话,会用掉大量的可用地址空间。麻省理
工学院决定使用一个网络号,并自己管理地址中余下的24位。这些位被分成3个8位
字段:子网字段,保留字段(其值为0)和主机字段。在此之前麻省理工学院使用的
CHAOS协议中使用8位长子网,所以两个协议中可以使用同样的子网号。而使用8位
主机地址是因为CHAOS协议中大多数的硬件都使用8位地址。保留的8位则是为以
后使用。
最初计划在子网网关间使用动态路由协议,并有好几个协议提出,但没有人愿意去
实现一个,因此静态路由表依然被使用。
为了解决引入软件需要修改以使其能在子网环境中工作,麻省理工学院想找到一个
对IP软件做最少修改的模型。这个模型就是IP网关发送ICMP主机重定向消息,而不
是网络重定向消息。所有的麻省理工学院内部IP网关都是这样的。因为每一台主机都
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -