分类: LINUX
2009-08-22 13:00:05
例子
首先考虑一个简单的例子:我们的主机bsdi有一个IP数据报要发送给主机sun。双方都在同一个以太网上(参见封面内侧的图)。数据报的传输过程如图3.3所示。
当IP从某个上层收到这份数据报后,它搜索路由表,发现目的IP地址(140.252.13.133)在一个直接相连的网络上(以太网140.252.13.0)。于是,在表中找到匹配网络地址。(在下一节中,我们将看到,由于以太网的子网掩码的存在,实际的网络地址是140.252.13.32,但是这并不影响这里所讨论的路由选择。)
数据报被送到以太网驱动程序,然后作为一个以太网数据帧被送到sun主机上(图2.1)。IP数据报中的目的地址是sun的IP地址(140.252.13.33),而在链路层首部中的目的地址是48 bit的sun主机的以太网接口地址。这个48 bit的以太网地址是用ARP协议获得的,我们将在下一章对此进行描述。
图3.3 数据报从主机bsdi到sun的传送过程
现在让我们来看另一个例子:主机bsdi有一份IP数据报要传到ftp.uu.net主机上,它的IP地址是192.48.96.9。经过的前三个路由器如图3.4所示。首先,主机bsdi搜索路由表,但是没有找到与主机地址或网络地址相匹配的表目,因此只能用默认的表目,把数据报传给下一站路由器,即主机sun。当数据报从bsdi被传到sun主机上以后,目的IP地址是最终的信宿机地址(192.48.96.9),但是链路层地址却是sun主机的以太网接口地址。这与图3.3不同,在那里数据报中的目的IP地址和目的链路层地址都指的是相同的主机(sun)。
当sun收到数据报后,它发现数据报的目的IP地址并不是本机的任一地址,而sun已被设置成具有路由器的功能,因此它把数据报进行转发。经过搜索路由表,选用了默认表目。根据sun 的默认表目,它把数据报转发到下一站路由器netb,该路由器的地址是140.252.1.183。数据报是经过点对点SLIP链路被传送的,采用了图2.2所示的最小封装格式。这里,我们没有给出像以太网链路层数据帧那样的首部,因为在SLIP链路中没有那样的首部。
当netb收到数据报后,它执行与sun主机相同的步骤:数据报的目的地址不是本机地址,而netb也被设置成具有路由器的功能,于是它也对该数据报进行转发。采用的也是默认路由表目,把数据报送到下一站路由器gateway(140.252.1.4)。位于以太网140.252.1上的主机netb用ARP获得对应于140.252.1.4的48 bit以太网地址。这个以太网地址就是链路层数据帧头上的目的地址。
路由器gateway也执行与前面两个路由器相同的步骤。它的默认路由表目所指定的下一站路由器IP地址是140.252.104.2。(我们将在图8.4中证实,使用Traceroute程序时,它就是gateway使用的下一站路由器。)
对于这个例子我们需要指出一些关键点:
1. 该例子中的所有主机和路由器都使用了默认路由。事实上,大多数主机和一些路由器可以用默认路由来处理任何目的,除非它在本地局域网上。
图3.4 从bsdi到ftp.uu.net (192.48.96.9)的初始路径
2. 数据报中的目的IP地址始终不发生任何变化。(在8.5节中,我们将看到,只有使用源路由选项时目的IP地址才有可能被修改,但这种情况很少出现。)所有的路由选择决策都是基于这个目的IP地址。
3. 每个链路层可能具有不同的数据帧首部,而且链路层的目的地址(如果有的话)始终指的是下一站的链路层地址。在我们的例子中,两个以太网封装了含有下一站以太网地址的链路层首部,但是SLIP链路没有这样做。以太网地址一般通过ARP获得。
在第9章,我们在描述了ICMP之后将再次讨论IP路由选择问题。我们将看到一些路由表的例子,以及如何用它们来进行路由决策的。
3.4 子网寻址
现在所有的主机都要求支持子网编址(RFC 950 [Mogul and Postel 1985])。不是把IP地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。
这样做的原因是因为A类和B类地址为主机号分配了太多的空间,可分别容纳主机数224-2和216-2。事实上,在一个网络中人们并不安排这么多的主机。(各类IP地址的格式如图1.5所示。)由于全0或全1的主机号都是无效的,因此我们把总数减去2。
在InterNIC获得某类IP网络号后,就由当地的系统管理员来进行分配,由他(或她)来决定是否建立子网,以及分配多少比特给子网号和主机号。例如,这里有一个B类网络地址(140 .252),在剩下的16 bit中,8 bit用于子网号,8 bit用于主机号,格式如图3.5所示。这样就允许有254个子网,每个子网可以有254台主机。
图3.5 B类地址的一种子网编址
许多管理员采用自然的划分方法,即把B类地址中留给主机的16 bit中的前8 bit作为子网地址,后8 bit作为主机号。这样用点分十进制方法表示的IP地址就可以比较容易确定子网号。但是,并不要求A类或B类地址的子网划分都要以字节为划分界限。
大多数的子网例子都是B类地址。其实,子网还可用于C类地址,只是它可用的比特数较少而已。很少出现A类地址的子网例子是因为A类地址本身就很少。(但是,大多数A类地址都是进行子网划分的。)
子网对外部路由器来说隐藏了内部网络组织(一个校园或公司内部)的细节。在我们的网络例子中,所有的IP地址都有一个B类网络号140.252。但是其中有超过30个子网,多于400台主机分布在这些子网中。由一台路由器提供了Internet的接入,如图3.6所示。
在这个图中,我们把大多数的路由器编号为Rn,n是子网号。我们给出了连接这些子网的路由器,同时还包括了封二图中的九个系统。在图中,以太网用粗线表示,点对点链路用虚线表示。我们没有画出不同子网中的所有主机。例如,在子网140.252.3上,就超过50台主机,而在子网140.252.1上则超过100台主机。
与30个C类地址相比,用一个包含30个子网的B类地址的好处是,它可以缩小Internet路由表的规模。B类地址140.252被划分为若干子网的事实对于所有子网以外的Internet路由器都是透明的。为了到达IP地址开始部分为140.252的主机,外部路由器只需要知道通往IP地址140.252.104.1的路径。这就是说,对于网络140.252只需一个路由表目,而如果采用30个C类地址,则需要30个路由表目。因此,子网划分缩减了路由表的规模。(在10.8小节中,我们将介绍一种新技术,即使用C类地址也可以缩减路由表的规模。)
图3.6网络noao.edu(140.252)中的大多数子网安排
子网对于子网内部的路由器是不透明的。如图3.6所示,一份来自Internet的数据报到达gateway,它的目的地址是140.252.57.1。路由器gateway需要知道子网号是57,然后把它送到kpno。同样,kpno必须把数据报送到R55,最后由R55把它送到R57。
3.5 子网掩码
任何主机在引导时进行的部分配置是指定主机IP地址。大多数系统把IP地址存在一个磁盘文件里供引导时读用。在第5章我们将讨论一个无盘系统如何在引导时获得IP地址。
除了IP地址以外,主机还需要知道有多少比特用于子网号及多少比特用于主机号。这也是在引导过程中通过子网掩码来确定的。这个掩码是一个32 bit的值,其中值为1的比特留给网络号和子网号,为0的比特留给主机号。图3.7是一个B类地址的两种不同的子网掩网格式。第一个例子是noao.edu网络采用的子网划分方法,如图3.5所示,子网号和主机号都是8 bit宽。第二个例子是一个B类地址划分成10 bit的子网号和6 bit的主机号。
图3.7 两种不同的B类地址子网掩码例子
尽管IP地址一般以点分十进制方法表示,但是子网掩码却经常用十六进制来表示,特别是当界限不是一个字节时,因为子网掩码是一个比特掩码。
给定IP地址和子网掩码以后,主机就可以确定IP数据报的目的是:(1)本子网上的主机;(2)本网络中其它子网中的主机;(3)其它网络上的主机。如果知道本机的IP地址,那么就知道它是否为A类,B类或C类地址(从IP地址的高位可以得知),也就知道网络号和子网号之间的分界限。而根据子网掩码则知道子网号与主机号之间的分界限。
例子
假设我们的主机地址是140.252.1.1(一个B类地址),而子网掩网为255.255.255.0(其中8 bit为子网号,8 bit为主机号)
. 如果目的IP地址是140.252.4.5,那么我们知道B类网络号是相同的(140.252),但是子网号是不同的(1和4)。用子网掩码在两个IP地址之间的比较如图3.8所示。
. 如果目的IP地址是140.252.1.22,那么B类网络号还是一样的(140.252),而且子网号也是一样的(1),但是主机号是不同的。
. 如果目的IP地址是192.43.235.6(一个C类地址),那么网络号是不同的,因而进一步的比较就不用再进行了。
图3.8 使用子网掩码的两个B类地址之间的比较
给定两个IP地址和子网掩码后,IP路由选择功能一直进行这样的比较。
3.6 特殊情况的IP地址
经过子网划分的描述,我们现在介绍7个特殊的IP地址,如图3.9所示。在这个图中,0表示所有的比特位全为0,-1表示所有的比特位全为1,netid, subnetid, 和hostid分别表示不为全0或全1的对应字段。子网号栏为空表示该地址没有进行子网划分。
(以下是图3.9的译文)
IP地址
可以为
描述
网络号
子网号
主机号
源端?
目的端?
0
0
OK
不可能
网络上的主机(参见下面的限制)
0
hostid
OK
不可能
网络上的特定主机(参见下面的限制)
127
任何值
OK
OK
环回地址(2.7节)
-1
-1
不可能
OK
受限的广播(永远不被转发)
netid
-1
不可能
OK
以网络为目标向netid广播
netid
subnetid
-1
不可能
OK
以子网为目标向netid, subnetid广播
netid
-1
-1
不可能
OK
以所有子网为目标向netid广播
图3.9 特殊情况的IP地址
我们把这个表分成三个部分。表的头两项是特殊的源地址,中间项是特殊的环回地址,最后四项是广播地址。
表中的头两项,网络号为0,只能作为初始化过程中的源地址出现,如主机使用BOOTP协议确定本机IP地址时。
在12.2节中,我们将进一步分析四类广播地址。
3.7 一个子网的例子
这个例子是本文中采用的子网,以及如何使用两个不同的子网掩码。具体安排如图3.10所示。
图3.10 作者所在子网中的主机和网络安排
如果把该图与封二中的图相比,你会发现我们在图3.10中省略了从路由器sun到上面的以太网之间的连接细节,实际上它们之间的连接是拔号SLIP。这个细节不影响我们本节中讨论的子网划分问题。我们在4.6节讨论ARP代理时将再回头讨论到这个细节。
问题是我们在子网13中有两个分离的网络:一个以太网和一个点对点链路(硬件连接的SLIP链路)。(点对点链接始终会带来问题,因为它一般在两端都需要IP地址。)将来或许会有更多的主机和网络,但是为了不让主机跨越不同的网络就得使用不同的子网号。我们的解决方法是把子网号从8 bit扩充到11 bit,把主机号从8 bit减为5 bit。这就叫作变长子网,因为140.252网络中的大多数子网都采用8 bit子网掩码,而我们的子网却采用11 bit的子网掩码。
(下面是原书p.46①的译文)
RFC 1009[Braden and Postel 1987]允许一个含有子网的网络使用多个子网掩码。新的路由器需求RFC[Almquist 1993]则要求支持这一功能。
但是,问题在于并不是所有的路由选择协议在交换目的网络时也交换子网掩码。在第10章中,我们将看到RIP不支持变长子网,RIP 2版和OSPF则支持变长子网。在我们的例子中不存在这种问题,因为在我的子网中不要求使用RIP协议。
作者子网中的IP地址结构如图3.11所示,11位子网号中的前8 bit始终是13。在剩下的3 bit中,我们用二进制001表示以太网,010表示点对点SLIP链路。这个变长子网掩码在140.252网络中不会给其它主机和路由器带来问题――只要目的是子网140.252.13的所有数据报都传给路由器sun(IP地址是140.252.1.29),如图3.11所示,而如果sun知道子网13中的主机有11 bit子网号,那么一切都好办了。
图3.11 变长子网
140.252.13子网中的所有接口的子网掩码是255.255.255.224,或0xffffffe0。这表明最右边的5 bit留给主机号,左边的27 bit留给网络号和子网号。
图3.10中所有接口的IP地址和子网掩码的分配情况如图3.12所示。
图3.12 作者子网的IP地址
第一栏标为是“主机”,但是sun和bsdi也具有路由器的功能,因为它们是多接口的,可以把分组数据从一个接口转发到另一个接口。
这个表中的最后一行是图3.10中的广播地址140.252.13.63:它是根据以太网子网号(140.252.13.32)和图3.11中的低5位置1(16+8+4+2+1=31)得来的。(我们在第12章中将看到,这个地址被称作以子网为目标的广播地址(subnet-directed broadcast address)。)
3.8 ifconfig命令
到目前为止,我们已经讨论了链路层和IP层,现在可以介绍TCP/IP对网络接口进行配置和查询的命令了。ifconfig(8)命令一般在引导时运行,以配置主机上的每个接口。
由于拔号接口可能会经常接通和挂断(如SLIP链路),每次线路接通和挂断时ifconfig都必须(以某种方法)运行。这个过程如何完成取决于使用的SLIP软件。
下面是作者子网接口的有关参数。请把它们与图3.12的值进行比较。
(见原书p.48的①)
环回接口(2.7节)被认为是一个网络接口。它是一个A类地址,没有进行子网划分。
需要注意的是以太网没有采用尾部封装(2.3节),而且可以进行广播,而SLIP链路是一个点对点的链接。
SLIP接口的标志LINK0是一个允许压缩slip的数据(CSLIP,参见2.5节)的配置选项。其它的选项有LINK1(如果从另一端收到一份压缩报文,就允许采用CSLIP)和LINK2(所有外出的ICMP报文都被丢弃)。我们在4.6节中将讨论SLIP链接的目的地址。
(下面是原书p.48②的译文)
安装指南中的注释对最后这个选项进行了解释:“一般它不应设置,但是由于一些不当的ping操作,你可能会导致吞吐量降到0。”
bsdi是另一台路由器。由于-a参数是SunOS操作系统具有的功能,因此我们必须多次执行ifconfig,并指定接口名字参数:
(见原书p.48的③)
这里,我们看到以太网接口(we0)的一个新选项:SIMPLEX。这个4.4BSD标志表明接口不能收到本机传送的数据。在BSD/386中所有的以太网都这样设置。一旦这样设置后,如果接口发送一帧数据到广播地址,那么就会为本机拷贝一份数据送到环回地址。(在6.3小节我们将举例子说明这一点。)
在主机slip中,SLIP接口的设置基本上与上面的bsdi一致,只是两端的IP地址进行了互换:
slip % /sbin/ifconfig sl0
sl0: flags=1011
inet 140.252.13.65 --> 140.252.13.66 netmask ffffffe0
最后一个接口是主机svr4上的以太网接口。它与前面的以太网接口类似,只是SVR4版的ifconfig没有打印RUNNING标志:
svr4 % /usr/sbin/ifconfig emd0
emd0: flags=23
inet 140.252.13.34 netmask ffffffe0 broadcast 140.252.13.63
ifconfig命令一般支持TCP/IP以外的其它协议族,而且有很多参数。关于这些细节你可以查看系统说明书。
3.9 netstat命令
netstat(1)命令也提供系统上的接口信息。-i参数将打印出接口信息,-n参数则打印出IP地址,而不是主机名字。
(见原书p.49的①)
这个命令打印出每个接口的MTU,输入分组数,输入错误,输出分组数,输出错误,冲突,以及当前的输出队列长度。
我们在第9章将用netstat命令检查路由表,那时再回头讨论该命令。另外,在第13章我们将用它的一个改进版本来查看活动的广播组。
3.10 IP的未来
IP主要存在三个方面的问题。这是Internet在过去几年快速增长所造成的结果。(参见习题1.2。)
1. 超过半数的B类地址已被分配。根据当前的估计,如果B类地址继续以当前的速度分配,它们将大约在1995年耗尽。
2. 32 bit的IP地址从长期的Internet增长角度来看一般是不够用的。
3. 当前的路由结构没有层次结构,属于平面型(flat)结构,每个网络都需要一个路由表目。随着网络数目的增长,一个具有多个网络的网站就必须分配多个C类地址,而不是一个B类地址,因此路由表的规模会不断增长。
无类别的域间路由选择CIDR(Classless Interdomain Routing)提出了一个可以解决第三个问题的建议,对当前版本的IP(IP版本4)进行扩充,以适应下个世纪Internet的发展。对此我们将在10.8节进一步详细介绍。
对新版的IP,即下一代IP,经常称作IPng,主要有四个方面的建议。1993年5月发行的IEEE Network (vol.7, no.3)对前三个建议进行了综述,同时有一篇关于CIDR的论文。RFC 1454 [Dixon 1993]对前三个建议进行了比较。
1. SIP,简单Internet协议。它针对当前的IP提出了一个最小幅度的修改建议,采用64位地址和一个不同的首部格式。(首部的前4比特仍然包含协议的版本号,其值不再是4。)
2. PIP。这个建议也采用了更大的,可变长度的,有层次结构的地址,而且首部格式也不相同。
3. TUBA,代表“TCP and UDP with Bigger Address”,它基于OSI 的CLNP(Connectionless Network Protocol,无连接网络协议),一个与IP类似的OSI协议。它提供大得多的地址空