除了 subnetting ,关于 IP 协定的令一个关键概念就是:IP 路由(routing)。那什么是路由呢﹖简单而言﹐就是当一个封包从发送端被传送到接收端所经过的路径。
IP 路由原理
若您重看上一章所介绍的 IP 封包格式﹐您会发现第 4 和第 5 行﹐分别用来记录来源 IP 位址和目的地 IP 位址。必须注意﹐除非封包由特定程式修改过﹐在正常的传递中﹐这两个栏位的位址是永远不变动。IP 路由的依据主要是看目的地位址﹕如果目的地位址属于处理封包之设备目前所在的网路范围之内(这就是 subnetting 的重要性所在了)﹐那么就直接从 ARP 表格中寻找目的地位址的 IP 所对应的实体位址﹐如果没有的话就用 ARP 协定来查询。但是﹐如果目的位址在其他网路的话﹐那么就在 ARP 表格中寻找 路由器 的实体位址﹐如果没有则用 ARP 协定来查询。
您或许会问﹕这个路由器是怎么跑出来的﹐机器怎么会有路由器的 IP 呢﹖答案很简单﹕在设定网路环境时指定﹐这个可以手工的设定﹐也可以由其他协定如 DHCP 来指定。总之﹐如果您的网路将会和其他网路连接﹐那么您就一定要为每一台主机指定路由器 IP 位址﹔除非﹐您想让该主机﹐除了本地网路之外﹐任何地方都连不上。
要判断一个封包是否要经过路由器﹐前面一段已经讲过了﹕要看目的地位址是否在同一个网路上﹐如果不是﹐就一定要经过路由器来传递封包。那么﹐做为路由器本身也不例外(当然,实际的设定是有例外的,比方说 PPP 或 Static/Prox ARP 等情形)、也就是说必需与发送端在同一个网路里面。通常路由器都有最少两个界面以连接两个网路(多个界面连接多个网路)﹐假如路由器本身的界面位址和封包目的地位址不在同的网路﹐那么路由器必须要将封包交给下一个它认为最合适的路由器﹐继续传送这个封包。情形就像接力游戏一样﹕一站传一站﹐直到最后一个路由器发现目的地位址和它其中一个界面在同一个网路﹐然后才透过 ARP 获得对方的实体位址﹐最后交有下层协定完成最后一段的传送任务。假设所经路由均在 Ethernet 上﹐那么,路由器与路由器之间的传送﹐每两站之间也是同样要经过 ARP 来获得实体位址才能将封包传给对方。
封包的路由选择
我们已经知道一只程式要和远端主机的程式沟通﹐它所送下来到资料﹐往往会被拆成许多个封包在网路中传递。事实上﹐每一个封包所经过的路径都可能不同。在前面所描述的个路由接力过程中﹐封包从一个实体网路传到另一个实体网路﹐每一个传递都是独立的﹐与其他封包之间并非存在着必然关系。也就是说﹐从一个来源到一个目的地﹐可以选择的路径往往不止一条﹐而且﹐请求封包和回应封包所经过过的路径也不尽相同。这情形在 Internet 的环境中尤显突出。
影响每一个封包当前路径的因素很多﹐都由当时所经过的路由器(包括连线两端的主机在内)所使用的路由表格来决定。而路由表格的维护大致上分为两种形式:
· 静态(Static):也就是由管理员预先设定或手工修改。
· 动态(Dynamic):则是路由器之间透过 路由协定 自动更新。
事实上﹐路由协定是非常多样的﹐同时也不断的演变着。早器的网际网路路由器分为两类﹕
· 核心路由器(core router)﹐由 Internet Network Operation Center (INOC) 控制和管理。
· 非核心路由器﹐由个别的群组所控制管理。
在这样的架构下﹐所有网路都经由一个核心路由系统而达成连接﹐各自的网路会有一笔关于核心系统的预设路由设定。我们可以从下图看到核心路由系统的架构模式﹕
然而﹐随着网际网路的迅速成长﹐这样的单一管理核心架构已经难以为继了。首先﹐中央管理骨干的路由将变得越来越复杂﹐核心路由器的一致性也变得异常重要及难以管理。其次﹐并非每一个网点都能连接到核心路由器﹐这就需要新增路由结构和协定。最后﹐基于核心资料一致性的要求﹐所有核心路由器都必须相互交换资料﹐那么核心结构将不能过于庞大。
有鉴于上述原因﹐网际网路的路由结构已经从核心模式转向为对等骨干模式﹐如下图﹕
对大部份对等式骨干组态而言﹐路径的取向依照相连主机之间的几何传输路径选取最短短路径。这样的叙述看起来很简单﹐但事实上要实现起来是非常困难的。首先﹐虽然标准的 IP 路由演算法是使用 IP 位址中的网路部份来选择路径﹐然而在对等骨干架构中的最近路径则需要对单个主机进行单独的路径选择。其次﹐两个骨干的管理者必须在所有路由器之间达成路径的一致性﹐以避免路径回圈的出现。
以现今的网际网路架构来说﹐路由器的界定并非如早期的界定那么明显﹐而网路与网路之间的路由也变得非常复杂多样﹐路径的选择往往是多重的。我们可以从下图看看简化了的网际网路路由环境﹕
]
应用在大型骨干之间的路由协定非常复杂﹐而且种类繁多﹐例如有﹕Gateway-Gateway Protocol (GGP)﹑BGP(Border Bateway Protocol) 等等。这些都属于 外部闸道协定(Exterior Gateway Protocol) 路由协定﹐在本教材中不打算详论了﹐同学们可以自行参考 RFC-1102﹑和 RFC-1104 等文件。
本地网路的路由选择
从上面我们已经了解到网际网路的核心路由结构﹐我们需要知道它是为了帮助我们认识网路与网路之间的路由关系。然而﹐对一般的网路管理人员来说﹐恐怕也难有机会接触和管理那样的路由器﹐反而最通常接触的﹐应该是企业内部的较小型的网路之间的路由。相对而言,内部闸道协定的规模较小、所耗的路由资源也较少。常见的内部路由协定有:RIP(Routing Information Protocol)、OSPF(Open Shortest Path First)、及 EIGRP(Enhanced Interior Gateway Protocol)、等等。内部路由协定的最大缺点是无法应付大型网路的需求。
不管我们管理的网路体积如何﹐只要您的网路是与其它网路相连的﹐路由设定就不能避免。下面先让我们看看两个网路之间的路由设定是怎样的﹕
]
由上图我们可以看到 192.168.0.0 这个网路的所有机器﹐其闸道(gateway) 都指向 192.168.0.254 这个 IP﹐也就是路由器与该网路所连接的界面。同样﹐192.168.1.0 这个网路﹐其闸道则是 192.168.1.254。
通常﹐一个路由器可以同时连接好几个网路﹐只要界面设定好就没问题。作为路由器﹐必须有最少两个界面以上﹐来连接不同的网路。同时﹐许多网路也有超过一个路由器和其它的网路连接﹐那么各主机的路由表格就要一一设定好通往各网路的闸道。
当我们再结合之前学过的 ARP 协定,我们对于封包的路由将有更具体的认知﹕
]
由上图我们可以看到﹕当有一个封包从网路 A 经过网路 B 送到网路 C 的时候﹐其 Software Address (即IP位址)永远不变﹐但 Hardware Address (即实体位址)却随着所经的应体网路而有所不同。这是因为﹕不管封包经过多少个网路﹐在传输中归根结底要靠实体网路达成﹐而实体网路的传送依据是实体位址﹐只要 ARP 能够找出路由器的实体位址﹐就能顺利将封包传给它﹔然而﹐ IP 协定的传送则依据 IP 位址来定﹐路由器会根据目的位址而决定下一站路由的 IP (在这一层级来说,所依据的是 IP 位址而非硬体位址) ﹐当封包交由下层协定处理的时侯,运用 ARP 协定就可解决位址的对应问题(请参考 ARP 协定之章节内容)。然而,再提醒您一遍:在整个过程中﹐封包的目的位址是不会改变的﹐除非﹐路由器本身启动了修改封包位址的功能(如﹕NAT --- Network Address Translation)。 [bitsCN.Com]
要维护这样一个网路数目不多的环境﹐各路由器上面的路由资料不会很复杂﹐这样的情况之下﹐我们可以使用静态路由﹐以手动方式为每台机器设定事先计算好的路由。静态路由的主要好处是它的可预测性﹐而且对路由器或网路做成的负担不多﹐所占频宽较少。
静态路由选择
为了更好的理解静态路由﹐我们不妨从单一的主机路由开始研究一下路由表格。事实上,在每一台机器上面﹐都必需存在一分各自独立的路由表格 (Routing Table)﹐记录着本机的路由资讯。我们可以在 Linux 主机上面用 route 这个命令来查看当前的路由状况﹕
Kernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface192.168.0.17 * 255.255.255.255 UH 0 0 0 eth1203.30.35.134 * 255.255.255.255 UH 0 0 0 eth0203.30.35.128 * 255.255.255.224 U 0 0 0 eth0192.168.0.0 * 255.255.255.0 U 0 0 0 eth1192.168.0.0 * 255.255.255.0 U 0 0 0 eth0203.168.168.0 rhroute 255.255.255.0 UG 0 0 0 eth1127.0.0.0 * 255.0.0.0 U 0 0 0 lo0.0.0.0 rhgw 0.0.0.0 U 0 0 0 lo
第一列是目的“目的地位址”﹐可以是一个网路﹐也可以是一台主机﹔然后“闸道位址”(假如输入 -n 参数﹐则以 IP 位址显示,‘*’表示无需使用闸道﹐例如本地网路位址或本机位址)﹔接下来是目的地使用的 Netmask (这非常重要﹐我们已在前面介绍子网路时说明过了)﹔然后是“旗标”﹐这里的 U 是“Up”的意思﹐也就是目前已启用﹑H 表示目的为一个“Host”﹑ G 表示使用“Gateway”的意思﹔接下来的 Metric 和 Ref 是供路由系统参考的﹔最后是使用的网路界面。
最后有一个路径要特别提醒一下﹐目的地位址为 0.0.0.0 代表那是一个预设路由。也就是说﹐在路由表上找不到关于目的地的路由资讯﹐则尝试把封包传给预设路由所指的路由器处理。