什么是IP转发

从概念上来说, IP转发是很简单的,特别是对于一个主机。如果目的地是直接相连的主机(例如点到点链接)或共享网络(例如以太网), IP数据报直接发送到目的地,不需要或者不使用路由器。否则,主机将数据报发送到一台路由器(称为默认路由器),由该路由器将数据报交付到目的地。这个简单方案适用于大多数主机配置。在本节中,我们讨论这种简单情况的细节,以及如何在复杂情况下转发IP数据报。首先,我们注意到当前的大多数主机既可配置为路由器,也可配置为主机,很多家庭网络使用一台连接到Internet的PC作为路由器。主机与路由器处理IP数据报的区别在于:主机不转发那些不是由它生成的数据报,但是路由器会这样做。在擎个方案中,IP协议可接收一个数据报本地连接一直是正在获取网络地址,它可来自同一主机上的其他协议(TCP、 UDP等),也可来自一个网络接口。 IP层包括一些位于内存中的信息,通常称为路由表或转发表,每次转发一个数据报时需要从中查找信息。当一个网络接日接收到一个数据报时, IP模块首先检查目的地址是否为自已的IP地址(与自已的某个网络接日相关的IP地址),或是它可以接收其流量的一些其他地址,例如IP广播或组播地址。如果是的话,数据报交付给由IPv4头部的协议字段或IPv6头部的下一个头部字段指定的协议模块。如果数据报的目的地不是本地IP模块使用的IP地址,那么: (1)如果IP层配置为一台路由器,则转发该数据报(也就是说,作为一个输出的数据报处理,见5.4.2节中的描述); (2)数据报被默默地丢弃。在某些情况下(例如在情况1中没有路由), ICMP消息可能发送回源节点,以表明发生了一个错误。

转发表

IP协议标准没有规定转发表所需的精确数据,这个选择工作留给IP协议的实现者。但是, IP转发表通常需要包含几个关键信息,我们现在将讨论这些信息。至少在理论上,路由或转发表中的每个条目包含以下字段信息:

●目的地:它是一个32位字段(或128位字段,用于IPv6),用于与一个掩码操作结果相匹配(见下文)。针对涵盖所有目的地的“默认路由”的情况,目的地可简单地设为零;对于仅描述一个目的地的“主机路由”的情况,目的地可设为完整长度的IP地址。

●掩码:它是一个32位字段(或128位字段,用于IPv6),用作数据报目的IP地址按位与操作的掩码,其中的目的IP地址是要在转发表中查找的地址。掩码结果与转发表条目中的多个目的地进行比较。

●下一跳:它是下一个IP实体(路由器或主机)的32位IPv4地址或128位IPv6地址,数据报将被转发到该地址。下一跳实体通常在一个网络中由执行转发查找的系统所共享,这意味着它们共享同一网络前缀。

●接口: 它包含一个由IP层使用的标识符,以确定将数据报发送到下一跳的网络接口。例如,它可能是一台主机的802.11无线接口、一个有线的以太网接日或一个与串行端口相关联的PPP接日。如果转发系统也是IP数据报的发送方,该字段用于选择输出数据报的源IP地址。

IP转发逐跳进行。我们从这个转发表的信息中看到,路由器和主机不包含到任何目的地的完整转发路径(除了那些直接连接主机或路由器的目的地)。 IP转发只提供数据报发送的下一跳实体的IP地址。它假设下一跳比执行转发的系统“更接近”目的地,并且下一跳路由器与执行转发的系统直接连接(即其享同一网络前缀)。它通常也假设与下一跳实体之间没有“环路”,数据报不会在网络中循环,直至其TTL或跳数限制到期。由一个或多个路由协议来确保路由表正确。多种路由协议能做好这项工作,包括RIP、 OSPF、 BGP和IS-1S,这里仅列出几种。

IP转发行动

当一台主机或路由器中的IP层需要向下一跳的路由器或主机发送一个数据报时,它首先检查数据报中的目的IP地址(D)。在转发表中使用该值D来执行最长前缀匹配算法:

在表中搜索具有以下属性的所有条目: (D∧mj)=生其中mj是索引为j的转发条目ej的掩码字段值,dj是转发条目ej的目的地字段值。这意味着目的IP地址D与每个转发表条目中的掩码(mj)执行按位与,并将该结果与同一转发条目中的目的地(dj)比较。如果满足这个属性,该条目(这里为ej)与目的IP地址相“匹配”。当进行匹配时,该算法查看这个条目的索引(这里为j),以及在掩码mj中有多少位设置为1。设置为1的位数越多,说明匹配得“越好”。选择最匹配的条目ek(即掩码仰中最多位为1的条目),并将其下一跳字段nk作为转发数据报的下一跳IP地址。

如果在转发表中没有发现匹配的条目,这个数据报无法交付。如果在本地出现(在这台主机)无法交付的数据报,通常向生成数据报的应用程序返回一个“主机不可达”错误。在一台路由器上, ICMP消息通常返回给发送数据报的主机。在某些情况下,可能有多个条目是匹配的(即为1的位数一样)。例如当多个默认路由可用时会发生这种情况(如连接到多个ISP时,称为多宿主)。在这种情况下,协议标准没有规定终端系统的具体行为,而是由具体操作系统的协议实现来决定。通常是简单地选择第一个匹配的结果。更复杂的系统可能尝试在多个路由上平衡负载或拆分流量。研究表明,多宿主可能不仅对大型企业有用,也包括家庭用户。

例子

为了对简单的局部环境(例如同一LAN)和某些更复杂的多跳环境(全球Internet)中的IP转发工作有深刻的理解,我们将讨论以下两种情况。第一种情况,所有系统使用相同的网络前缀,这称为直接交付;另一种情况为间接交付。

直接交付不需要路由器, IP数据报封装在一个链路层帧中,它可以直接识别数据来源或目的地。间接交付涉及路由器,数据转发到这台路由器,并使用该路由器的链路层地址作为目的地址。路由器的IP地址没有出现在IP数据报中(除非路由器自己是源主机或目的主机,或者使用源路由时)

直接交付

我们看一个简单的例子。 windowsXP主机(IPv4地址S和MAC地址宣)称为S ;一个IP数据报发送到Linux主机(IPv4地址D和MAC地址卫),该主机称为D。这些系统通过一台交换机互连起来。两台主机都在同一以太网中。当S的IP层接收到一个来自上层(例如TCP或UDP)的数据报,它将会查找自已的转发表。我们预期, S的转发表包含的信息如下表所示。

主机S中的(单播)lPv4转发表只包含两个条目。主机S配置了IPv4地址和子网掩码10.0.0.100/25。对于目的地址在10.0.0.1到10.0.0.126范围内的数据报,便用转发表第二个条目,并采用直接交付来发送。其他数据报使用第一个条目,并交付给IPv4地址为10.0.0.1的路由器R。

目的IPv4地址D(10.0.0.9)与第一和第二个转发表条目的匹配。由于它与第二个条目匹配得更好(25位),所以“网关”或下一跳地址为10.0.0.100,即地址S。该条目的网关部分包含发送主机的网络接口(没有涉及路由器),说明采用直接交付来发送数据报。

这个数据报被封装在一个低层帧中,并发送给目的主机D。如果目的主机的低层地址未知,可能需要使用ARP协议或邻居请求操作,以确定正确的低层地址D。如果已经知道该地址,数据报中的目的地址是D的IPv4地址(10.0.0.9),并将卫放在低层头部的目的IP地址字段中。这台交换机基于低层地址D交付该帧,它并不关心IP地址。

间接交付

现在看另一个例子。我们的Windows主机有一个IP数据报发送到主机ftp.uu.net,其IPv4地址为192.48.96.90 上图显示了通过4台路由器的数据报传输路径(在理论上)。首先, Windows主机在自已的转发表中查找,但在本地网络中没有找到匹配的前缀。这时,它使用自己的默认路由条目(匹配每个目的地,但没有“1”位)。这个默认路由条目指出适当的下一跳网关为10.0.0.1 (路由器R1的“a侧”)。这是一个家庭网络的典型情况。

我们回想一下直接交付的情况,源IP地址和目的IP地址对应于相应的源主机和目的主机。对于低层(例如以太网)地址也是这样。在间接交付中, IP地址对应于前面的源主机和目的主机,但是低层地址不对应。实际上,低层地址决定哪台机器在每跳的基础上接收包含数据报的帧。在这个例子中,需要的低层地址为下一跳路由器R1的a侧接口的以太网地址,低层地址对应的IPv4地址为10.0.0.10这由ARP (如果在例子中使用IPv6则是一个邻居请求)在互联S和R1的网络上完成。 R1通过其a侧的低层地址响应后,S将向R1发送数据报。 S向R1交付仅根据低层头部(更具体地说是低层的目的地址)的处理进行。在接收到这个数据报之后, R1将检查自已的转发表。下表中的信息是典型的。

R1的转发表说明需要对流量进行地址转换。路由器一侧是一个私有地址( 10.0.0.1 ),另一侧是一个公有地址( 70.231.132.85 )。地址转换用于使来自10.0.0.0/25网络的数据报,看起来像是从70.231.132.85发送到Internet。

当R1接收到数据报时,它发现数据报的目的IP地址不是自已,因此它将转发这个数据报。 R1搜索转发表,并使用默认的条目。在这种情况下,该默认条目的下一跳位于ISP服务的网络中,即70.231.159.254(这是R2a侧的接口)。这个地址正好在SBC的DSL网络中,它有一个较长的名称adsl-70-231-159-254.ds1.snfe21.sbcgloba1.neto由于这台路由器位于全球Internet中,并且Windows机器的源地址为私有地址10.0.0.100, R1对数据报进行网络地址转换(NAT),以使它在Internet中可路由。对数据报进行NAT处理本地连接一直是正在获取网络地址,结果是生成新的源地址70.231.132.85,它对应于R1的b侧接口。不使用私有地址(例如ISP和大型企业)的网络不需要执行最后一步,并且保持原来的源地址不变。

当路由器R2 (在ISP内部)接收到数据报,它的操作步骤与本地路由器Rl相同(除了NAT操作外)。如果数据报的目的地不是自已的IP地址,则转发这个数据报。在这种情况下,路由器通常不仅有一个默认路由,而且有多个其他路由,这取决于它连接的Internet的其他部分,以及它的本地策略。

注意, IPv6转发与传统IPv4转发只有很少改变。除了更长的地址之外, IPv6还使用一种稍微不同的机制(邻居请求消息),以确定它的下一跳的低层地址。另外, IPv6定义了链路本地地址和全球地址。全球地址的处理方式就像普通的IP地址,链路本地地址只能用于同一链路上。另外,所有的链路本地地址共享相同的IPv6前缀(fe80::/10),在发送一个目的地为链路本地地址的数据报时,一台多宿主主机可能需要用户来决定使用哪个接口。为了说明如何使用链路本地地址,我们在自已的Windows XP主机上运行(假设IPv6已启用并且可操作):

这里,由于没有为链路本地流量指定输出接口,我们将看到一个错误提示。在WindowsXP中,我们可指定一个范围ID或一个源地址。在这个例子中,我们指定的范围ID是一个使用%6扩展目的地址的接日号。当发送一个ping流量时,通知系统使用接口号6作为正确的接口。为了查看一条到达IP目的地的路径,我们可使用traceroute程序(在Windows中称为tracert,它包括的选项稍有不同),使用-n选项表示不将IP地址转换为名称:

这个程序列出了将多个数据报发送到目的地ftp.uu.net ( 192.48.96.9 )经过的每个IP跳步o traceroute程序使用UDP数据报(随着时间增大TTL)和ICMP消息(用于在UDP数据报到期时检测每个跳步)共同完成任务。针对每个TTL值发送3个UDP分组,以便为每个跳步测量3次往返时间。在传统上, traceroute曾经仅携带IP信息,但在这里我们也看到以下信息:

这表明该路径上使用了多协议标签交换(MPLS) [标签ID为32307,服务等级为5, TTL为1,并且该消息并不位于MPLS标签栈底部(S=0)。 MPLS是一种链路层网络,它能够承载多种网络层协议。很多网络运营商将它用于流量工程(即控制通过自己网络的流量)。

讨论

在上述例子中,我们应牢记关于IP单播转发的几个关键点:

在这个例子中,大多数主机和路由器使用默认路由,其中包含一个以下形式的转发表条目:掩码为0,目的地为0,下一跳为。事实上,在Intemet边缘,大多数主机和路由器会使用一个对所有地址而不是本地网络中的目的地址的默认路由,这是因为只有一个接日可连接Internet的其他部分。在传统的Intemet中,数据报中的源IP地址和目的IP地址从不改变。除非是在使用源路由的情况下,或沿着传输路径遇到其他功能(例如这个例子中的NAT),否则情况永远如此。不同的低层头部用于每种链路上的寻址,低层的目的地址(如果存在)总是包含下一跳的低层地址。因此,当数据报沿着到目的地的每个跳步移动时,低层头部经常发生变化。在我们的例子中,以太网封装的链路层头部中包含下一跳的以太网地址,但是在DsL链路上不会这样做。对于IPv4来说,低层地址通常通过ARP获得;对于IPv6来说,则使用ICMPv6邻居发现。

本文到此结束,希望对大家有所帮助!

关于作者:

生活百科常识网