网站建设 技术,电子商务网页设计代码,类豆瓣的模板wordpress,凡科建站怎么用9.1 引言
选路是IP最重要的功能之一。图9-1是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生#xff0c;也可以由其他主机产生。在后一种情况下#xff0c;主机必须配置成一个路由器#xff0c;否则通过网络接口接收到的数据报#xff0c;如果目的地址不…9.1 引言
选路是IP最重要的功能之一。图9-1是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生也可以由其他主机产生。在后一种情况下主机必须配置成一个路由器否则通过网络接口接收到的数据报如果目的地址不是本机就要被丢弃例如悄无声息地被丢弃。
在图9-1中我们还描述了一个路由守护程序daemon通常这是一个用户进程。在Unix系统中大多数普通的守护程序都是路由程序和网关程序术语daemon指的是运行在后台的进程它代表整个系统执行某些操作。daemon一般在系统引导时启动在系统运行期间一直存在。在某个给定主机上运行何种路由协议如何在相邻路由器上交换选路信息以及选路协议是如何工作的所有这些问题都是非常复杂的其本身就可以用整本书来加以讨论有兴趣的读者可以参考文献[Perlman 1992]以获得更详细的信息。在第10章中我们将简单讨论动态选路和选路信息协议RIPRouting Information Protocol。在本章中我们主要的目的是了解单个IP层如何作出路由决策。
图9-1所示的路由表经常被IP访问在一个繁忙的主机上一秒钟内可能要访问几百次但是它被路由守护程序更新的频度却要低得多可能大约30秒种一次。当接收到ICMP重定向报文时路由表也要被更新这一点我们将在9.5节讨论route命令时加以介绍。在本章中我们还将用netstat命令来显示路由表。
9.2 选路的原理
开始讨论IP选路之前首先要理解内核是如何维护路由表的。路由表中包含的信息决定了IP层所做的所有决策。
在3.3节中我们列出了IP搜索路由表的几个步骤
搜索匹配的主机地址搜索匹配的网络地址搜索默认表项默认表项一般在路由表中被指定为一个网络表项其网络号为0。
匹配主机地址步骤始终发生在匹配网络地址步骤之前。
IP层进行的选路实际上是一种选路机制它搜索路由表并决定向哪个网络接口发送分组。这区别于选路策略它只是一组决定把哪些路由放入路由表的规则。IP执行选路机制而路由守护程序则一般提供选路策略。
9.2.1 简单路由表
首先来看一看一些典型的主机路由表。在主机svr4上我们先执行带-r选项的netstat命令列出路由表然后以-n选项再次执行该命令以数字格式打印出IP地址我们这样做是因为路由表中的一些表项是网络地址而不是主机地址。如果没有-n选项netstat命令将搜索文件/etc/networks并列出其中的网络名。这样会与另一种形式的名字—网络名加主机名相混淆。
个人理解
路由表目的项用于和ip头的目的地址执行按主机名网络名匹配匹配成功时网关项用于设置外发的以太网头中目的MAC地址的依据接口项用于指明从那个本机接口输出网络帧。
第1行说明如果目的地是140.252.13.65slip主机那么将把分组转发给140.252.13.35bsdi。这正是我们所期望的因为主机slip通过SLIP链路与bsdi相连接而bsdi与该主机在同一个以太网上。
对于一个给定的路由器可以打印出五种不同的标志flag
U 该路由可以使用。G 该路由是到一个网关路由器。如果没有设置该标志说明目的地是直接相连的。H 该路由是到一个主机也就是说目的地址是一个完整的主机地址。如果没有设置该标志说明该路由是到一个网络而目的地址是一个网络地址一个网络号或者网络号与子网号的组合。D 该路由是由重定向报文创建的9.5节。M 该路由已被重定向报文修改9.5节。
标志G是非常重要的因为由它区分了间接路由和直接路由对于直接路由来说是不设置标志G的。其区别在于发往直接路由的分组中不但具有指明目的端的IP地址还具有其链路层地址见图3-3。当分组被发往一个间接路由时IP地址指明的是最终的目的地但是链路层地址指明的是网关即下一站路由器。我们在图3-4已看到这样的例子。在这个路由表例子中有一个间接路由设置了标志G因此采用这一项路由的分组其IP地址是最终的目的地140.252.13.65但是其链路层地址必须对应于路由器140.252.13.35。
理解G和H标志之间的区别是很重要的。G标志区分了直接路由和间接路由如上所述。但是H标志表明目的地址netstat命令输出第一行是一个完整的主机地址。没有设置H标志说明目的地址是一个网络地址主机号部分为0。当为某个目的IP地址搜索路由表时主机地址项必须与目的地址完全匹配而网络地址项只需要匹配目的地址的网络号和子网号就可以了。另外大多数版本的netstat命令首先打印出所有的主机路由表项然后才是网络路由表项。
参考记数RefcntReference count列给出的是正在使用路由的活动进程个数。面向连接的协议如TCP在建立连接时要固定路由。如果在主机svr4和slip之间建立Telnet连接可以看到参考记数值变为1。建立另一个Telnet连接时它的值将增加为2依此类推。
下一列“use”显示的是通过该路由发送的分组数。如果我们是这个路由的唯一用户那么运行ping程序发送5个分组后它的值将变为5。最后一列interface是本地接口的名字。
输出的第2行是环回接口2.7节它的名字始终为lo0。没有设置G标志因为该路由不是一个网关。H标志说明目的地址127.0.0.1是一个主机地址而不是一个网络地址。由于没有设置G标志说明这是一个直接路由网关列给出的是外出IP地址。
输出的第3行是默认路由。每个主机都有一个或多个默认路由。这一项表明如果在表中没有找到特定的路由就把分组发送到路由器140.252.13.33sun主机。这说明当前主机svr4利用这一个路由表项就可以通过Internet经路由器sun及其SLIP链路访问其他的系统。建立默认路由是一个功能很强的概念。该路由标志UG表明它是一个网关这是我们所期望的。
输出中的最后一行是所在的以太网。H标志没有设置说明目的地址140.252.13.32是一个网络地址其主机地址部分设为0。事实上是它的低5位设为0见图3-11。由于这是一个直接路由G标志没有被设置网关列指出的IP地址是外出地址。
netstat命令输出的最后一项还隐含了另一个信息那就是目的地址140.252.13.32的子网掩码。如果要把该目的地址与140.252.13.33进行比较那么在比较之前首先要把它与目的地址掩码0xffffffe03.7节进行逻辑与。由于内核知道每个路由表项对应的接口而且每个接口都有一个对应的子网掩码因此每个路由表项都有一个隐含的子网掩码。
主机路由表的复杂性取决于主机所在网络的拓扑结构。
最简单的也是最不令人感兴趣的情况是主机根本没有与任何网络相连。TCP/IP协议仍然能用于这样的主机但是只能与自己本身通信这种情况下的路由表只包含环回接口一项。接下来的情况是主机连在一个局域网上只能访问局域网上的主机。这时路由表包含两项一项是环回接口另一项是局域网如以太网。如果主机能够通过单个路由器访问其他网络如Internet时那么就要进行下一步。一般情况下增加一个默认表项指向该路由器。如果要新增其他的特定主机或网络路由那么就要进行最后一步。在我们的例子中到主机slip的路由要通过路由器bsdi就是这样的例子。
我们根据上述IP操作的步骤使用这个路由表为主机svr4上的一些分组例子选择路由。
假定目的地址是主机sun140.252.13.33。首先进行主机地址的匹配。路由表中的两个主机地址表项slip和localhost均不匹配接着进行网络地址匹配。这一次匹配成功找到表项140.252.13.32网络号和子网号都相同因此使用emd0接口。这是一个直接路由因此链路层地址将是目的端的地址。假定目的地址是主机slip140.252.13.65。首先在路由表搜索主机地址并找到一个匹配地址。这是一个间接路由因此目的端的IP地址仍然是140.252.13.65但是链路层地址必须是网关140.252.13.35的链路层地址其接口名为emd0。这一次我们通过Internet给主机aw.com192.207.11 7.2发送一份数据报。首先在路由表中搜索主机地址失败后进行网络地址匹配。最后成功地找到默认表项。该路由是一个间接路由通过网关140.252.13.33并使用接口名为emd0。在我们最后一个例子中我们给本机发送一份数据报。有四种方法可以完成这件事如用主机名、主机IP地址、环回名或者环回IP地址
在前两种情况下对路由表的第2次搜索得到一个匹配的网络地址140.252.13.32并把IP报文传送给以太网驱动程序。正如图2-4所示的那样IP报文中的目的地址为本机IP地址因此报文被送给环回驱动程序然后由驱动程序把报文放入IP输出队列中。
在后两种情况下由于指定了环回接口的名字或IP地址第一次搜索就找到匹配的主机地址因此报文直接被送给环回驱动程序然后由驱动程序把报文放入IP输出队列中。
上述四种情况报文都要被送给环回驱动程序但是采用的两种路由决策是不相同的。
9.2.2 初始化路由表
我们从来没有说过这些路由表是如何被创建的。每当初始化一个接口时通常是用ifconfig命令设置接口地址就为接口自动创建一个直接路由。对于点对点链路和环回接口来说路由是到达主机例如设置H标志。对于广播接口来说如以太网路由是到达网络。
到达主机或网络的路由如果不是直接相连的那么就必须加入路由表。一个常用的方法是在系统引导时显式地在初始化文件中运行route命令。在主机svr4上我们运行下面两个命令来添加路由表中的表项
第3个参数default和slip代表目的端第4个参数代表网关路由器最后一个参数代表路由的度量(metric)。route命令在度量值大于0时要为该路由设置G标志否则当耗费值为0时就不设置G标志。
一些系统允许在某个文件中指定默认的路由器如/etc/defaultrouter。于是在每次重新启动系统时都要在路由表中加入该默认项。
初始化路由表的其他方法是运行路由守护程序第10章或者用较新的路由器发现协议9.6节。
9.2.3 较复杂的路由表
在我们的子网上主机sun是所有主机的默认路由器因为它有拨号SLIP链路连接到Internet上参见扉页前图。
前两项与主机svr4的前两项一致通过路由器bsdi到达slip的特定主机路由以及环回路由。
第3行是新加的。这是一个直接到达主机的路由(没有设置G标志但设置了H标志)对应于点对点的链路即SLIP接口。如果我们把它与ifconfig命令的输出进行比较
可以发现路由表中的目的地址就是点对点链路的另一端(即路由器netb)网关地址为外出接口的本地IP地址(140.252.1.29)(前面已经说过netstat为直接路由打印出来的网关地址就是本地接口所用的IP地址)。
默认的路由表项是一个到达网络的间接路由(设置了G标志但没有设置H标志)这正是我们所希望的。网关地址是路由器的地址(140.252.1.183SLIP链路的另一端)而不是SLIP链路的本地IP地址(140.252.1.29)。其原因还是因为是间接路由不是直接路由。
9.2.4 没有到达目的地的路由
我们所有的例子都假定对路由表的搜索能找到匹配的表项即使匹配的是默认项。如果路由表中没有默认项而又没有找到匹配项这时会发生什么情况呢
结果取决于该IP数据报是由主机产生的还是被转发的例如我们就充当一个路由器。如果数据报是由本地主机产生的那么就给发送该数据报的应用程序返回一个差错或者是“主机不可达差错”或者是“网络不可达差错”。如果是被转发的数据报那么就给原始发送端发送一份ICMP主机不可达的差错报文。下一节将讨论这种差错。
9.3 ICMP主机与网络不可达差错
当路由器收到一份IP数据报但又不能转发时就要发送一份ICMP“主机不可达”差错报文ICMP主机不可达报文的格式如图6-10所示。可以很容易发现在我们的网络上把接在路由器sun上的拨号SLIP链路断开然后试图通过该SLIP链路发送分组给任何指定sun为默认路由器的主机。
我们在上一节通过在路由器sun上运行netstat命令可以看到当接通SLIP链路启动时就要在路由表中增加一项使用SLIP链路的表项而当断开SLIP链路时则删除该表项。这说明当SLIP链路断开时sun的路由表中就没有默认项了。但是我们不想改变网络上其他主机的路由表即同时删除它们的默认路由。相反对于sun不能转发的分组我们对它产生的ICMP主机不可达差错报文进行计数。
在主机svr4上运行ping程序就可以看到这一点它在拨号SLIP链路的另一端拨号链路已被断开
在主机bsdi上运行tcpdump命令的输出如图9-2所示。
当路由器sun发现找不到能到达主机gemini的路由时它就响应一个主机不可达的回显请求报文。
如果把SLIP链路接到Internet上然后试图ping一个与Internet没有连接的IP地址那么应该会产生差错。但令人感兴趣的是我们可以看到在返回差错报文之前分组要在Internet上传送多远
从图8-5可以看出在发现该IP地址是无效的之前该分组已通过了6个路由器。只有当它到达NSFNET骨干网的边界时才检测到差错。这说明6个路由器之所以能转发分组是因为路由表中有默认项。只有当分组到达NSFNET骨干网时路由器才能知道每个连接到Internet上的每个网络的信息。这说明许多路由器只能在局部范围内工作。
参考文献[Ford, Rekhter, and Braun 1993]定义了顶层选路域top-level routing domain由它来维护大多数Internet网站的路由信息而不使用默认路由。他们指出在Internet上存在5个这样的顶层选路域NSFNET主干网、商业互联网交换Commercial Internet Exchange: CIX、NASA科学互联网NASA Science Internet: NSI、SprintLink以及欧洲IP主干网EBONE。
9.4 转发或不转发
前面我们已经提过几次一般都假定主机不转发IP数据报除非对它们进行特殊配置而作为路由器使用。如何进行这样的配置呢
大多数伯克利派生出来的系统都有一个内核变量ipforwarding或其他类似的名字参见附录E。一些系统如BSD/386和SVR4只有在该变量值不为0的情况下才转发数据报。SunOS 4.1.x允许该变量可以有三个不同的值-1表示始终不转发并且始终不改变它的值0表示默认条件下不转发但是当打开两个或更多个接口时就把该值设为11表示始终转发。Solaris 2.x把这三个值改为0始终不转发、1始终转发和2在打开两个或更多个接口时才转发。
较早版本的4.2BSD主机在默认条件下可以转发数据报这给没有进行正确配置的系统带来了许多问题。这就是内核选项为什么要设成默认的“始终不转发”的原因除非系统管理员进行特殊设置。
9.5 ICMP重定向差错
当IP数据报应该被发送到另一个路由器时收到数据报的路由器就要发送ICMP重定向差错报文给IP数据报的发送端。这在概念上是很简单的正如图9-3所示的那样。只有当主机可以选择路由器发送分组的情况下我们才可能看到ICMP重定向报文回忆我们在图7-6中看过的例子。
我们假定主机发送一份IP数据报给R1。这种选路决策经常发生因为R1是该主机的默认路由。R1收到数据报并且检查它的路由表发现R2是发送该数据报的下一站。当它把数据报发送给R2时R1检测到它正在发送的接口与数据报到达接口是相同的即主机和两个路由器所在的LAN。这样就给路由器发送重定向报文给原始发送端提供了线索。R1发送一份ICMP重定向报文给主机告诉它以后把数据报发送给R2而不是R1。
重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。主机启动时路由表中可以只有一个默认表项在图9-3所示的例子中为R1或R2。一旦默认路由发生差错默认路由器将通知它进行重定向并允许主机对路由表作相应的改动。ICMP重定向允许TCP/IP主机在进行选路时不需要具备智能特性而把所有的智能特性放在路由器端。显然在我们的例子中R1和R2必须知道有关相连网络的更多拓扑结构的信息但是连在LAN上的所有主机在启动时只需一个默认路由通过接收重定向报文来逐步学习。
9.5.1 一个例子
可以在我们的网络上观察到ICMP重定向的操作过程见封二的图。尽管在拓扑图中只画出了三台主机aixsolaris和gemini和两台路由器gateway和netb但是整个网络有超过150台主机和10台另外的路由器。大多数的主机都把gateway指定为默认路由器因为它提供了Internet的入口。
子网140.252.1上的主机是如何访问作者所在子网图中底下的四台主机的呢首先如果在SLIP链路的一端只有一台主机那么就要使用代理ARP4.6节。这意味着位于拓扑图顶部的子网140.252.1中的主机不需要其他特殊条件就可以访问主机sun140.252.1.29。位于netb上的代理ARP软件处理这些事情。
但是当网络位于SLIP链路的另一端时就要涉及到选路了。一个办法是让所有的主机和路由器都知道路由器netb是网络140.252.13的网关。这可以在每个主机的路由表中设置静态路由或者在每个主机上运行守护程序来实现。另一个更简单的办法也是实际采用的方法是利用ICMP重定向报文来实现。
在位于网络顶部的主机solaris上运行ping程序到主机bsdi(140.252.13.35)。由于子网号不相同代理ARP不能使用。假定没有安装静态路由发送的第一个分组将采用到路由器gateway的默认路由。下面是我们运行ping程序之前的路由表
224.0.0.0所在的表项是IP广播地址。我们将在第12章讨论。如果为ping程序指定-v选项可以看到主机接收到的任何ICMP报文。我们需要指定该选项以观察发送的重定向报文。
在收到ping程序的第一个响应之前主机先收到一份来自默认路由器gateway发来的ICMP重定向报文。如果这时查看路由表就会发现已经插入了一个到主机bsdi的新路由该表项如以下黑体字所示。
这是我们第一次看到D标志表示该路由是被ICMP重定向报文创建的。G标志说明这是一份到达gateway(netb的间接路由H标志则说明这是一个主机路由正如我们期望的那样而不是一个网络路由。
由于这是一个被主机重定向报文增加的主机路由因此它只处理到达主机bsdi的报文。如果我们接着访问主机svr4那么就要产生另一个ICMP重定向报文创建另一个主机路由。类似地访问主机slip也创建另一个主机路由。位于子网上的三台主机bsdi,svr4和slip还可以由一个指向路由器sun的网络路由来进行处理。但是ICMP重定向报文创建的是主机路由而不是网络路由这是因为在本例中产生ICMP重定向报文的路由器并不知道位于140.252.13网络上的子网信息。
9.5.2 更多的细节
ICMP重定向报文的格式如图9-4所示。
有四种不同类型的重定向报文有不同的代码值如图9-5所示。
ICMP重定向报文的接收者必须查看三个IP地址
导致重定向的IP地址即ICMP重定向报文的数据网络重定向主机重定向位于IP数据报的首部发送重定向报文的路由器的IP地址包含重定向信息的IP数据报中的源地址应该采用的路由器IP地址在ICMP报文中的4~7字节。
关于ICMP重定向报文有很多规则。首先重定向报文只能由路由器生成而不能由主机生成。另外重定向报文是为主机而不是为路由器使用的。假定路由器和其他一些路由器共同参与某一种选路协议则该协议就能消除重定向的需要这意味着在图9-1中的路由表应该消除或者能被选路守护程序修改或者能被重定向报文修改但不能同时被二者修改。
在4.4BSD系统中当主机作为路由器使用时要进行下列检查。在生成ICMP重定向报文之前这些条件都要满足。
出接口必须等于入接口。用于向外传送数据报的路由不能被ICMP重定向报文创建或修改过而且不能是路由器的默认路由。数据报不能用源站选路来转发。内核必须配置成可以发送重定向报文。
另外一台4.4BSD主机收到ICMP重定向报文后在修改路由表之前要作一些检查。这是为了防止路由器或主机的误操作以及恶意用户的破坏导致错误地修改系统路由表。
新的路由器必须直接与网络相连接。重定向报文必须来自当前到目的地所选择的路由器。重定向报文不能让主机本身作为路由器。被修改的路由必须是一个间接路由。
关于重定向最后要指出的是路由器应该发送的只是对主机的重定向代码1或3如图9-5所示而不是对网络的重定向。子网的存在使得难于准确指明何时应发送对网络的重定向而不是对主机的重定向。只当路由器发送了错误的类型时一些主机才把收到的对网络的重定向当作对主机的重定向来处理。
9.6 ICMP路由器发现报文
在本章前面已提到过一种初始化路由表的方法即在配置文件中指定静态路由。这种方法经常用来设置默认路由。另一种新的方法是利用ICMP路由器通告和请求报文。
一般认为主机在引导以后要广播或多播传送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。另外路由器定期地广播或多播传送它们的路由器通告报文允许每个正在监听的主机相应地更新它们的路由表。
RFC 1256 [Deering 1991]确定了这两种ICMP报文的格式。ICMP路由器请求报文的格式如图9-6所示。ICMP路由器通告报文的格式如图9-7所示。
路由器在一份报文中可以通告多个地址。地址数指的是报文中所含的地址数。地址项大小指的是每个路由器地址32 bit字的数目始终为2。生存期指的是通告地址有效的时间秒数。
接下来是一对或多对IP地址和优先级。IP地址必须是发送路由器的某个地址。优先级是一个有符号的32 bit整数指出该IP地址作为默认路由器地址的优先等级这是与子网上的其他路由器相比较而言的。值越大说明优先级越高。优先级为0x80000000说明对应的地址不能作为默认路由器地址使用尽管它也包含中通告报文中。优先级的默认值一般为0。
9.6.1 路由器操作
当路由器启动时它定期在所有广播或多播传送接口上发送通告报文。准确地说这些通告报文不是定期发送的而是随机传送的以减小与子网上其他路由器发生冲突的概率。一般每两次通告间隔450秒和600秒。一份给定的通告报文默认生命周期是30分钟。
使用生命周期域的另一个时机是当路由器上的某个接口被关闭时。在这种情况下路由器可以在该接口上发送最后一份通告报文并把生命周期值设为0。
除了定期发送主动提供的通告报文以外路由器还要监听来自主机的请求报文并发送路由器通告报文以响应这些请求报文。
如果子网上有多台路由器由系统管理员为每个路由器设置优先等级。例如主默认路由器就要比备份路由器具有更高的优先级。
9.6.2 主机操作
主机在引导期间一般发送三份路由器请求报文每三秒钟发送一次。一旦接收到一个有效的通告报文就停止发送请求报文。
主机也监听来自相邻路由器的请求报文。这些通告报文可以改变主机的默认路由器。另外如果没有接收到来自当前默认路由器的通告报文那么默认路由器会超时。
只要有一般的默认路由器该路由器就会每隔10分钟发送通告报文报文的生命周期是30分钟。这说明主机的默认表项是不会超时的即使错过一份或两份通告报文。
9.6.3 实现
路由器发现报文一般由用户进程守护程序创建和处理。这样在图9-1中就有另一个修改路由表的程序尽管它只增加或删除默认表项。守护程序必须把它配置成一台路由器或主机来使用。
9.7 小结
IP路由操作对于运行TCPIP的系统来说是最基本的不管是主机还是路由器。路由表项的内容很简单包括5bit标志、目的IP地址主机、网络或默认、下一站路由器的IP地址间接路由或者本地接口的IP地址直接路由及指向本地接口的指针。主机表项比网络表项具有更高的优先级而网络表项比默认项具有更高的优先级。
系统产生的或转发的每份IP数据报都要搜索路由表它可以被路由守护程序或ICMP重定向报文修改。系统在默认情况下不转发数据报除非进行特殊的配置。用route命令可以进入静态路由可以利用新ICMP路由器发现报文来初始化默认表项并进行动态修改。主机在启动时只有一个简单的路由表它可以被来自默认路由器的ICMP重定向报文动态修改。
在本章中我们集中讨论了单个系统是如何利用路由表的。在下一章我们将讨论路由器之间是如何交换路由信息的。