通过网络接口收到的数据报如果目的地址不是本机,就会被丢弃。
路由守护程序通常是用户进程。
路由表经常被IP访问,而它被守护程序更新的频度低很多,当收到ICMP重定向报文时,路由表要被更新。
IP搜索路由表的步骤:
1.搜索匹配的主机地址。
2.搜索匹配的网络地址。
3.搜索默认表项(一般被指定为一个网络表项,其网络号为0)。
以上是IP层的选路机制,是由IP执行的。而选路策略指决定把哪些路由放入路由表的规则,路由守护程序一般提供选路策略。
-r选项的netstat命令列出路由表;-n选项以数字格式打印出IP地址,而非网络名:
上图中,第一行说明,如果目的地是140.252.13.65,则路由器(网关)会把分组转发给140.252.13.35。
对于一个路由,可打印出以下flag:
1.U:下一跳路由可用。
2.G:下一跳是到一个路由器,而非和目的地(目的地可能是网络地址也可能是主机地址)直连,没有此标志表示其是直接路由。
3.H:该路由到一个主机,即目的地址是一个完整主机地址,没有设置H时说明目的地址是一个网络地址(主机号全为0)。
4.D:该路由是由重定向报文创建的。
5.M:该路由已被重定向报文修改。
当为某目的IP搜索路由表时,主机地址项(H)必须与目的地址完全匹配,而网络地址项只需匹配目的地址的网络号和子网号。
参考记数Refcnt列给出正在使用路由的活动进程个数。面向连接的协议(如TCP)在建立连接时要固定路由,此时参考记数值加1。
use列显示的是通过该路由发送的分组数。
interface是本地接口的名字。
输出第二行是环回接口,它的名字是lo0,未设置G标志,因为该路由项表示的下一跳不是一个网关;H标志说明目的地址127.0.0.1是一个主机地址,而非网络地址。
输出的第三行是默认路由,可有一个或多个。
输出的最后一行是主机所在以太网,它的H没有设置,说明目的地址是一个网络地址,其主机部分设为0。同时这是一个直接路由(没设置G)。列出的gateway IP地址是外出地址。
路由表的复杂度取决于主机所在网络的拓扑结构:
1.主机不与任何网络相连,路由表只含环回接口一项,只能与自身通信。
2.主机连在一个局域网上,路由表中含一个环回接口和一个局域网。
3.主机通过单个路由访问其他网络,一般增加一个默认表项指向该路由器。
使用上述路由表为该主机上的一些分组选择路由:
1.假定目的地址是140.252.13.33,先匹配两个主机地址表项,都不匹配,之后进行网络地址(网络地址的主机号全为0)匹配,找到了网络号和子网号都相同的网络地址140.252.13.32,因此使用emd0接口。这是一个直接路由,因此链路层地址将是目的端的链路层地址。
2.假定目的主机是10.252.13.65,首先搜索主机地址,找到后,发现是一个间接路由,因此目的端的IP仍是140.252.13.65,但链路层地址是网关140.252.13.65的链路层地址,使用的接口名为emd0。
3.假定给主机192.207.117.2发送一份数据报,先搜索主机地址,再搜索网络地址,发现都没有匹配,于是找到默认表项,默认表项使用接口emd0,下一跳的地址为140.252.13.33。
4.给本机发送一份数据报,可用以下方法:
从上到下依次是使用主机名、主机IP地址、环回名、环回IP地址。
前两种在路由表中会先搜索主机地址失败,然后搜索网络地址找到140.252.13.32,并把IP报文传送给以太网驱动程序,以太网驱动程序发现目的地址为本机IP,于是将此报文送给环回驱动程序,然后由环回驱动程序将报文放到IP输入队列中。
后两种由于指定了环回接口的名字或IP,第一次搜索就找到匹配的主机地址,因此报文直接被送给环回驱动程序,然后由驱动程序把报文放入IP输入队列。
当初始化一个接口时(通常是ifconfig命令设置接口地址),就在本机上为接口自动创建一个直接路由,对于点对点链路和环回接口,路由是到达主机(设置H标志)的,对于广播接口,如以太网,路由是到达网络的。
如果到达主机或网络的路由不是直接相连的,就必须将其加入路由表,可在系统引导时显式地在初始化文件中运行route命令添加。以下是在svr4主机上运行的命令,作用是添加表项到路由表:
第三个参数代表目的端,第四个代表到目的端的下一跳路由器,最后一个参数代表路由的度量(代表与目标主机的距离,它们用来在寻找路由时确定最优路由),在度量大于0时会为该路由设置G标志,表示下一跳是路由器。
几乎没有系统在启动文件中包含route命令。
一些系统允许在某个文件中指定默认路由,这样在每次重启时都向路由表中加入该文件中的项。
初始化路由表的方法还有运行路由守护程序或用较新的路由器发现协议。
一个较复杂的路由表:
第三项是一个直达主机的路由(设置了H,但没设置G),对应一个点对点链路,即SLIP接口,ifconfig命令查看此接口:
可发现路由表中的目的地址就是点对点链路的另一端。路由表中下一跳地址为本地IP 140.252.1.29,这是由于netstat命令为直接路由打印出来的下一跳地址是本地接口的IP地址。
默认的路由表项是通过第三项中的SLIP链路到达另一端,默认路由的目标是网络地址,且目的地址不是直接路由(有G标志而没有H标志),此处的下一跳地址是SLIP链路的另一端的地址而非本机的IP地址,这是由于此路由项是间接路由,不是直接路由。
当找不到匹配项且没有默认路由时,如果该IP数据报是本机产生的,就发送给产生该数据报的应用一个差错(主机不可达差错或网络不可达差错);如果是被转发的数据报,就给原始发送端发送一份ICMP主机不可达的差错报文。
如果ping一个其他网络上的、但没有连接在Internet的地址,IP数据报会通过多个路由器才会返回主机不可达差错,这说明许多路由器只能在局部范围内工作。
大多伯克利派生出来的系统都有一个内核变量ipforwarding(或其他类似的名字),一些系统(如BSD/386或SVR4)只有在该变量不为0时才转发数据报。SunOS 4.1.x允许该变量有三个不同值:-1表示不转发且始终不改变它的值、0表示默认条件下不转发,但当打开两个或多个接口时,把该值设为1、1表示始终转发。而Solaris 2.x的三个值含义为:0表示始终不转发、1表示始终转发、2表示在打开两个或以上接口时才转发。
当IP数据报应该发送给另一个路由但发送到了错误路由时,收到数据报的错误路由器发送ICMP重定向差错报文给IP数据报的发送端:
描述上图:
(1)主机选择默认路由向R1发送数据报。
(2)R1收到数据报并检查它的路由表,发现R2是该数据报的下一站,把数据报发送给R2时,发现发送接口与收到该数据报的接口是相同的,这说明应该发送给主机一个ICMP重定向差错报文。
(3)R1发送一份ICMP重定向报文给主机,告诉它应该将该数据报发给R2。
重定向一般用来让有很少选路信息的主机逐渐完善它的路由表。主机启动时路由表中可以只有一个默认选项。
上边的三台主机(aix、solaris、gemini)访问下面四台主机时,如果下面只有一台主机,可以用代理ARP(跨网络发送ARP请求时可用),这意味着上面三台主机不需其他条件即可访问下面的一台主机,位于netb上的代理ARP软件处理这些事情。
但当下面有多个主机组成的网络时,可以让所有主机和路由器都知道路由器netb是网络140.252.13的网关,这可以在每个主机的路由表中设置静态路由(一般是管理员加入到路由表中的,不会消失的路由表项)或在每个主机上运行守护程序来实现,另一个方法就是使用ICMP重定向报文实现。
在solaris上ping bsdi,由于子网号不同,假设代理ARP不能使用,也没有安装静态路由,于是发送的第一个分组将到gateway(默认路由),下面是运行ping之前的solaris路由表:
ping的-v选项可以看到主机接受的任何ICMP报文:
在收到ping的第一个响应前,主机收到了来自gateway的一份ICMP重定向报文,之后再查看路由表:
可见第二项有D标志,说明该路由是由ICMP重定向报文创建的。
第二项是一个到达bsdi的路由项,如果我们向svr4发送报文,则gateway会产生另一个ICMP重定向差错报文,创建另一个主机路由。ICMP重定向报文创建的是主机路由而非网络路由,因为本例中产生ICMP重定向报文的路由器不知道140.25.13网络上的子网信息。
ICMP重定向报文接收者要查看三个IP:
1.导致重定向的目的IP地址。(位于ICMP重定向报文中的IP首部字段)
2.发送重定向报文的路由器IP地址。(包含该ICMP重定向报文的IP数据报的首部)
3.应该采用的路由器IP地址。
重定向报文只能由路由器(配置好的主机也能生成)生成,不能由主机(此处主机含义为不带路由功能的主机)生成。重定向报文是为主机而不是为路由器使用的。如果路由器和其他路由器共同参与某种选路协议,则该协议能消除重定向的需要。路由表要么被选路守护程序修改,要么被重定向修改,但不能同时被两者修改。
4.4 BSD主机在收到ICMP重定向报文后要做以下检查,防止路由器或主机误操作以及恶意用户的破坏:
1.新路由器必须与网络直接相连。
2.重定向报文必须来自到目的地所选的路由器。
3.重定向报文不能是主机作为路由器发送的。
4.被修改的路由必须是一个间接路由。
可用ICMP路由器通告和请求报文添加路由表项。
主机在引导后一般要广播或多播传送一份路由器请求报文,路由器响应一份路由器通告报文。路由器还会定期地广播或多播它的路由器通告报文,使得正在监听的主机更新它们的路由表。
ICMP路由器通告报文中的地址数指报文中含的地址数;地址项长度指每个路由器地址信息包含的32bit字的数目,恒为2;生存时间指通告的路由器地址的有效时间(单位为秒);路由器地址必须是发送路由器的某个接口的地址;优先级指作为默认路由器地址的优先等级,是与子网上的其他路由器相比较而言的,值越大,优先级越高,优先级0x80000000说明对应地址不能作为默认路由器地址使用,优先级的默认值一般为0。
路由器定期在广播或多播传送接口上发送通告报文,准确说不是定期发送,而是随机发送,以减小与子网上其他路由器发生冲突的概率。一般每两次通告间隔450s或600s。一份通告的默认生命周期是30min。
当路由器上某接口要被关闭时,可发送一个生命周期为0的通告报文。
如果子网上有多台路由器,则由管理员为每个路由器设置优先级,如主默认路由器比备份路由器具有更高优先级。
主机引导期间一般发送三份路由器请求报文,每3s发送一次,一旦接收到一个有效的通告报文,就停止发送请求报文。
如果接收不到来自当前默认路由器的通告报文,那么默认路由器会超时。一般路由器10min就会发送一次通告报文,而报文的生命周期是30min,这样即使错过一两份通告报文默认表项也不会超时。
路由器发现报文一般由用户进程(守护进程)创建和处理。
ICMP网络重定向报文可以节省路由表空间,它用一个网络地址代替了网络中的主机们。
当4.2 BSD收到目的地址是140.1.255.255的数据报时,会发现它的路由表中有一个通往本地网络140.1的路由,于是就试图转发数据报,它发送一个ARP广播来寻找目的IP为140.1.255.255的链路层地址,而这个ARP请求不会收到任何应答,所以这个数据报最终被丢弃。如果网络上有许多这样的4.2 BSD主机,每一个都会在差不多同一时刻发送ARP请求,会暂时地阻塞网络。
这次每个ARP请求都收到一个应答,告诉每个4.2 BSD主机140.1.255.255对应的以太网地址(这是一个以太网广播地址),网络上所有的这样的4.2 BSD主机都收到了它们自己的ARP应答,于是它们都发送了一个以太网广播,这个以太网广播的内容是一个广播IP数据报,由于现在每个4.2 BSD的主机上都有一个ARP缓存项,这个以太网广播被其他4.2 BSD主机收到后,会试图转发该数据报,经过查ARP缓存,该数据报会发送给其他的4.2 BSD主机,于是一直循环下去,产生了一次以太网熔毁。