3.4.3 IP路由
IP层将数据包从源地址路由到目的地址。互联网上的每个路由器都实现了IP层的软件,用以提供一个路由算法。
主干 互联网的拓扑图在概念上被分割成自治系统(Autonomous System,AS),再被细分为区域。大多数大型机构(如大学和大公司)的企业内部网可看做AS,通常它们包含几个区域。在图3-10中,校园网是一个AS,图中显示的部分是一个区域。拓扑图上的每个AS都有一个主干区域。将非主干区域连接到主干区域的路由器集合,以及将这些路由器互连的链路构成了网络的主干。主干中的链路通常带宽很高,并且为保证可靠性,链路都被复制。这样的层次结构仅存在于概念中,主要用于管理资源与维护组件。它并不影响IP数据包的路由。
路由协议 RIP-1作为互联网上使用的第一个路由算法,是3.3.5节中描述的距离——向量算法的一个版本。RIP-2(见RFC 1388[Malkin 1993])由它发展而来,但包含了其他需求,如无类别域间路由、更好的组播路由以及认证RIP数据包以避免路由器受到攻击。
随着互联网规模的扩大,路由器的处理能力也不断增加,不再使用距离——向量算法已成为一个趋势,因为它收敛速度慢,并且具有潜在的不稳定性。现在趋向于使用3.3.5节中提到的链路-状态算法,这个算法被称为开放最短路径优先(Open Shortest Path First,OSPF)。该协议基于Dijkstra[1959]的路径寻找算法,它比RIP算法收敛得更快。
应当注意,在IP路由器中可以渐进地采纳新路由算法。路由算法的变化将导致新版本RIP协议的诞生,而每个RIP数据包会携带一个版本号。当引入一个新的RIP协议时,IP协议并不改变。无论使用哪个版本的RIP协议,IP路由器都会基于一个合理的(未必是最优的)路线,将到达的数据包转发出去。但是对于那些在更新路由表过程中需要合作的路由器,它们必须使用相同的算法。为此,需要使用上面定义的拓扑区域。在每个区域中使用一个路由协议,区域中的路由器在维护路由表时相互合作。只支持RIP-1的路由器依然很常见,它们利用新版本协议具有的向后兼容特性,与支持RIP-2和OSPF的路由器共存。
1993年,实际观测获得的数据[Floyd and Jacobson 1993]表明,RIP路由器的信息交换频率为30s,这会使IP传输性能产生周期性。IP数据包传输的平均延迟每隔30s就会出现一个尖峰。这可以追溯到执行RIP协议的路由器的行为——当接收到一个RIP数据包时,路由器会延迟IP数据包的向前传送,113直到路由表对当前收到的所有RIP数据包的更新过程结束。这会引起路由器一批一批地执行RIP动作。建议路由器采用15~45s范围内的随机值作为RIP的更新周期以进行纠正。
默认路由 到目前为止,我们对路由算法的讨论说明,每个路由器维护了一个完整的路由表,该表显示了到达互联网上每个目的地(子网或直接连接的主机)的路线。就互联网当前的规模而言,这显然不可行(目的地的数目可能已经超过了100万,而且仍在快速地增长)。
该问题有两个可能的解决方案,为缓解互联网的增长所带来的后果,这两个方案同时被采纳。第一个方案是采用某种形式的IP地址拓扑分组。1993年以前无法从IP地址推断出有关其位置的任何信息。1993年,为简化与节约IP地址的分配(这在下文的CIDR中讨论),对未来地址的分配决定使用下面的地区位置:
地址194.0.0.0~195.255.255.255在欧洲
地址198.0.0.0~199.255.255.255在北美地区
地址200.0.0.0~201.255.255.255在中南美地区
地址202.0.0.0~203.255.255.255在亚太地区
因为这些地理区域也对应于互联网上确切定义的拓扑区域,并且仅有部分网关路由器提供了对每个区域的访问,所以极大地简化了这些地址范围的路由表。例如,欧洲以外的路由器对于范围在194.0.0.0到195.255.255.255的地址,可以只有一个表项。路由器将所有目的地在这个范围内的IP数据包使用相同的路由发送到最近的欧洲网关路由器上。注意,在做出这个决策之前,IP地址的分配通常与拓扑或地理位置无关,目前这些地址的大部分仍在使用,1993年的决策无法减少这些地址对应路由表项的规模。
解决路由表大小爆炸性增长的第二个解决方案更简单而且非常有效。它基于下述观察结果,如果离主干链路最近的关键路由器具有比较完整的路由表,那么大多数路由器中的路由表信息的精确性可以放宽。放宽的表现形式为路由表中具有默认的目的地项,此默认项指定了所有目的地址不在路由表中的IP数据包所使用的路由。为了说明这种情况,考虑图3-7与图3-8,假设结点C的路由表改为:
结点C忽略了结点A与D。它将所有到达结点A与D的数据包都通过链路5路由到E。结果呢?目的地为D的数据包可以到达其目的地,在路由过程中不会损失有效性,但目的地为A的数据包会增加一跳,需要通过E和B进行传输。总之,默认路由的使用在表格大小与路由有效性之间作出了折中。但在有些情况下,特别是路由器在中继点位置时,所有向外发送的消息必须通过某一个点,此时不会损失有效性。默认路由方案在互联网路由中使用很广泛,互联网上没有一个路由器包含到达所有目的地的路由。
本地子网上的路由 当数据包的目的地主机与发送者在同一网络上时,利用地址的主机标识符部分可获得底层网络上的目的主机的地址,只需一跳就能将数据包传送到目的地。IP层使用ARP来获得目的地的网络地址,然后使用底层网络来传输数据包。
如果发送方计算机的IP层发现目的地在另一个网络上,它必须将消息发送到一个本地路由器。它使用ARP获得网关或路由器的网络地址,再使用底层网络将数据包传送给它们。网关和路由器被连接到两个或更多的网络上,它们具有多个互联网地址,每个地址对应一个所连接的网络。
无类别域间路由(CIDR) 3.4.1节指出,IP地址的短缺导致1996年引入CIDR方案,该方案用于分配地址以及管理路由表中的项。主要问题在于B类地址不足,B类地址用于那些具有255个以上主机的子网,同时又有大量的C类地址可用。CIDR对这个问题的解决方案是给那些需要255个以上地址的子网分配一批连续的C类地址。CIDR方案也允许将B类地址空间分割,以便把它分配给多个子网。
将C类地址分批似乎是一个简单的方法,但除非同时改变路由表的格式,它才会对路由表的大小产生显著的影响,进而影响管理路由表的算法的性能。改变路由表的方法是给路由表增加一个掩码域。掩码是一个位模式,用于选择与路由表项比较的IP地址部分。这有效地使主机/子网地址成为IP地址的任意部分,比A类、B类与C类地址提供了更大的灵活性,无类别域间路由也因此得名。同样,路由器的这些改变是增量式的,所以有些路由器执行CIDR,而其他路由器仍然使用旧的基于类别的算法。
该方案可以工作的原因是新分配的C类地址的范围是256的模,因此每个范围表示了C类大小的子网地址对应的一个整数值范围。另一方面,有些子网也使用CIDR划分单个网络中的地址范围,这个网络可以是A类、B类或C类网络。如果一组子网完全由CIDR路由器与外部世界相连接,那么该组子网的IP地址范围可以成批分配到每个子网中,其中由任意大小的二进制掩码决定子网。
例如,一个C类地址空间可以划分为32组的8地址空间。图3-10包含一个使用CIDR机制将138.37.95这样的C类地址规模的子网划分为多个组,115每组包含8个主机地址,每个地址的路由不同。不同的组用138.37.95.232/29以及138.37.95.248/29等符号表示。这些地址中的/29表示附加一个32的掩码,前29位是1,后3位是0。
未注册的地址和网络地址翻译(NAT) 不是所有访问互联网的计算机和设备都需要分配全局唯一的IP地址。局域网中的计算机通过具有NAT功能的路由器访问互联网,它依靠路由器将到达的UDP和TCP包重定向。图3-18给出了一个典型的家庭网络,其中的计算机和其他网络设备通过一个具有NAT功能的路由器与互联网相连。网络包括能访问互联网的计算机,它们通过有线以太网连接到路由器,还包括通过WiFi接入点连接的设备。为了保证完整性,图中给出了一些具有蓝牙功能的设备,但它们不是与路由器连接,因此不能直接访问互联网。家庭网络具有由互联网服务提供商分配的一个已注册的IP地址(83.215.152.95)。这里描述的方法适合任何希望其没有注册IP地址的计算机连接到互联网的组织。
家庭网络上所有能访问互联网的设备都被分配了192.168.1.x C类子网上的一个未注册的IP地址。大多数的内部计算机和设备由路由器上运行的动态主机配置协议116(Dynamic Host Configuration Protocol,DHCP)动态分配一个IP地址。在图3-18中,192.168.1.100以上的数字由DHCP服务使用,数字较小的结点(例如PC 1)已经以手工方式分配了数字,这样做的理由将在后面解释。虽然NAT路由器使得这些地址对互联网的其他部分完全隐藏,但通常使用IANA为私有互连网保留的三块地址(10.z.y.x,172.16.y.x或192.168.y.x)之一中的一段。
NAT的介绍见RFC 1631[Egevang and Francis 1994],它的扩展见RFC 2663[Srisuresh and Holdrege 1999]。具有NAT功能的路由器维护一个地址翻译表,使用UDP和TCP包中源端口和目的地端口号域,将每个到达的应答消息分配到发送该请求消息的内部计算机。注意,请求消息中给定的源端口总是被用做相应的应答消息中的目的地端口。
最常用的NAT寻址算法的工作流程如下:
1)当内部网络上的计算机发送一个UDP或TCP包给网络外的计算机时,路由器接收到数据包并将源IP地址和端口号保存为地址翻译表中一个可用的项。
2)路由器用路由器的IP地址替换包中的源地址,用虚拟端口号替换源端口,虚拟端口号指向包含发送计算机的地址信息的地址翻译表项。
3)已修改源地址和端口地址的数据包经路由器向它的目的地转发。现在,地址翻译表包含最新的从内部网上计算机发出的包的端口号和从虚拟端口号到实际内部IP地址的映射。
4)当路由器从外部计算机处接收到一个UDP或TCP包时,它使用包中的目的地端口号访问地址翻译表中的项。它用存储在表项中的值替换已接收包中的目的地址和端口号,然后将修改后的包转发到由目的地地址标识的内部计算机。
只要该端口还在使用,路由器就将保留端口映射并重用它。每次路由器访问表中的一项,就重设计时器。如果在计时器过期之前没有访问该表项,那么就从表中删除该表项。
上述方案很好地解决了未注册计算机的通信模式,在这种模式下,未注册计算机可以作为外部服务(例如Web服务器)的客户。但未注册计算机不能作为处理到达请求的服务器。为了处理这种情况,可以手工配置NAT路由器,将某个指定端口上所有到达的请求转发到一台指定的内部计算机上。作为服务器的计算机必须保留同样的内部IP地址,这一点可通过手工分配它们的地址(类似对PC1所做的操作)来达到。只要不要求多于一台内部计算机在指定端口提供服务,这种提供对服务的外部访问的解决方法是令人满意的。
NAT是一种解决个人和家庭计算机分配IP地址的短期解决方案。它使得互联网使用的扩张得比预期的更大,但它也有一些限制,例如上例中的最后一点。117IPv6被看成是未来趋势,它将使得所有计算机和便携设备能全方位地参与互联网。