TCP/IP详解卷学习笔记——第五章

第五章-Internet协议

5.1 引言

IP是TCP/IP协议族中的核心协议。所有TCP、 UDP、 ICMP和IGMP数据都通过IP数
据报传输,IP提供了一种尽力而为、无连接的数据报交付服务。

  • 尽力而为:不保证数据能成功到达目的地。
  • 无连接:IP不维护网络单元(即路由器)中数据报相关的任何链接状态信息,
    每个数据报独立于其他数据报来处理。
    本章我们首先看一下IPv4和IPv6 头部中的字段,然后描述IP如何转发。

5.2 IPv4和IPv6头部

在关于IP头部和数据报的印象中,最高有效位在左侧且编号为0,一个32位值的最低有效位在右侧且编号为31。一个32位值的4字节接以下顺序传输:首先是0 - 7位,然后是8 - 15位,接着是16 - 23位,最后是24 - 31位。这就是所谓的高位优先字节序,它是TCP/IP头部中所有二进制整数在网络中传输时所需的字节顺序。
下图显示了IPv4和IPv6数据报格式。正常的IPv4头部大小为20字节,除非存在选项。IPv6头部长度是它的两倍,但没有任何选项,它可以有扩展头部。

图片描述

图片描述

5.2.1 头部字段

  • 版本字段(4位):它包含IP数据报的版本号:IPv4为4,IPv6为6。
  • Internet头部长度(IHL,4位):字段保存IPv4头部中32位字的数量,包括任何选项。IPv6中不存在这个字段,其头部长度固定为40字节。
  • 服务类型字段(Tos,8位,IPv4),通信类型字段(8位,IPv6):这个8位长的字段被分为两个部分,前6位被称为区分服务字段(DS字段),后2位是显式拥塞通知
    (ECN)字段或指示位。这些字段被用于数据报转发时的特殊处理。
  • 总长度字段(16位):IPv4,通过这个字段和IHL字段,我们知道数据报的数据部分从哪里开始,以及它的长度。IPv4数据报的最大长度(包括头部)为65535字节。
  • 负载长度(16位):这个字段提供IPv6数据报长度,不包括头部长度,扩展头部包括在负载长度中。负载长度被限制为64KB,而不是整个数据报。IPv6支持一个超长数据报选项,它至少在理论上提供了可能性,即单个分组的有效载荷可达到4GB
    (4294967295字节)
  • 标识字段(16位):帮助标识由IPv4主机发送的数据。IPv6中,这个字段显示在分片扩展头部中。
  • 生存期(TTL):IPv4,用于设置一个数据报可经过的路由器数量的上限。
  • 协议字段(8位:IPv4,包含一个数字,表示数据报有效载荷部分的数据类型,最常用的值为17 (UDP)和6 (TCP),
  • 下一个头部字段(8位):IPv6,它用于指出IPv6头部之后的头部类型。
  • 头部校验和字段(16位):IPv4,仅计算IPv4头部。IP协议不检查IPv4数据报有效载荷(例如TCP或UDP数据)的正确性。IPv6头部没有任何校验和字段。
  • 源IP地址和目的IP地址字段:IPv4的32位地址和IPv6的128位地址,通常标识一台计算机的一个接口,但组播地址和广播地址不符合本规则。

5.2.2 Internet校验和

Intemet校验和是一个16位的数字和,它能以相当高的概率确定接收的消息或其中的部分内容是否与发送的相匹配。先将数据报的校验和字段值设置为0,然后,对头部(整个头部被认为是一个16位字的序列)计算16位二进制反码和。当一个IPv4数据报被接收时,对整个头部计算出一个校验和,包括校验和字段自身的值。假设这里没有错误,计算出的校验和值为0(值FFFF的反码)。二制反码加法可通过”循环进位(end-round-Carry)加法”实现:当使用传统(二进制补码)加法产生一个进位时,这个进位以二进制值1加在低位。
图片描述
当发现一个头部出错(计算的校验和不为0)时,IPv4实现将丢弃接收到的数据报。但是,不会生成差错信息。

5.2.2.1 Internet校验和的数学性质

在数学上,16位的十六进制值集合y= (0001, ⋯, FFFF)与其反码和运算“+”共同形成一个阿贝尔群。其属性如下:
图片描述

5.2.3 DS字段和ECN (以前称为ToS字节或IPv6流量类别)

区分服务(DS字段):区分服务(称为DiffServ)是一个框架和一组标准,用于支持Internet上不同类型的服务(即不只是尽力而为服务)。IP数据报以某种方式(通过预定义模式设置某些位)被标记,使它们的转发不同于(例如以更高的优先级)其他数据报。这样做可能导致网络中排队延时的增加或减少,以及出现其他特殊效果。
DS字段中的数字称为区分服务代码点(DSCP)。 “代码点”指的是预定义的具有特定含义的位。通常情况下,如果数据报拥有一个分配的DSCP,它在通过网络基础设施交付过程中会保持不变。
ECN:当通过一台具有内部排队流量的路由器时,头部中的2位ECN位用于为数据报标记拥塞标识符。一台持续拥塞的具有ECN感知能力的路由器在转发分组时会设置这两位。这种功能的设计思路是,当一个被标记的分组被目的节点接收时,有些协议(例如TCP)会发现分组被标记并将这种情况通知发送方,发送方随后会降低发送速度,这样可在路由器因过载而被迫丢弃流量之前缓解拥塞。
6位DS字段用于保存DSCP,提供对64个代码点的支持。特定DSCP值可通知路由器对接收的数据报进行转发或特殊处理,不同类型的转发处理袁示为每跳行为(PHB),因此DSCP值可有效通知路由器哪种PHB被应用于数据报。DSCP的默认值通常为0,对应于常规的尽力而为的Intemet流量。64个可能的DSCP值分为不同用途,它们可从[DSCPREG]中获得,如下表所示
图片描述
这个方案供研究人员和操作人员用于实验或本地用途。以0作为结尾的DSCP用于标准
用途,以1作为结尾的DSCP用于实验或本地用途。以01作为结尾的DSCP最初打算用于
实验或本地用途,但最终会走向标准化。
如下图所示,DS字段中的类别部分包含前3位,并基于较早定义的服务类型的优先级
子字段。路由器通常先将流量分为不同类别。常见类别的流量可能有不同的丢弃概率,如果路由器被迫丢弃流量,允许路由器确定首先丢弃哪些流量。3位的类别选择器提供了8个定义的代码点(称为类别选择代码点),它们对应于一个指定最小功能集的PHB,提供与早期的IP优先级相似的功能。它们称为类别选择兼容的PHB,目的是支持部分兼容的最初定义的IP优先级子字段[RFCO791]。xxx000形式的代码点总被映射为这种PHB,但是其他值也可映射到相同PHB。
图片描述
下表给出了类别选择器的DSCP值,以及[RFCO791]定义的IP优先级字段的相应术语。保证转发(AF)组对固定数量的独立AF类别的IP分组提供转发,它有效地概括了优先级的概念。某个类别的流量与其他类别的流量分别转发。在一个流量类别中,数据报被分配一个丢弃优先级。在一个类别中,较高丢弃优先级的数据报优先于那些较低丢弃优先级的数据报处理(即以较高优先级转发)。结合流量类别和丢弃优先级,名称AFij对应于保证转发类别i的丢弃优先级j。
图片描述
图片描述
加速转发(EF)提供了非拥塞的网络服务,也就是说, EF流量应享受较低的延时、抖
动和丢包率。直观地说,EF流量要求路由器的输出速率至少比输人速率大。因此,在一台路由器的队列中,EF流量仅排在其他EF流量之后。

5.2.4 IP选项

IP支持一些可供数据报选择的选项。由于IPv4头部大小的限制以及相关的安全问题,因此很多选项不再是实用或可取的。在IPv6中,大部分选项已被删除或改变,不再是IPv6基本头部的一部分,而被放在IPv6头部之后的一个或多个扩展头部中。
IP路由器接收到一个包含选项的数据报,通常需要对该数据报进行特殊处理。在某些情况下,尽管IPv6路由器可以处理扩展头部,但很多头部被设计为仅由终端主机处理。在有些路由器中,带选项或扩展的数据报不会像普通数据报那样被快速转发。

下表给出了保留的IPv4选项,它们可在描述性的RFC中找到。选项的范围总是以32位为界。如果有必要,数值0作为填充字节被添加。这确保IPv4头部始终是32位的倍数(IHL字段的要求)。下表中的“编号”列是选项编号。 “值”列给出了放在类型字段中的编号,以表示该选项的存在。由于类型字段有另外的结构,所以这两列中的相应值不必相同。特别指出的是,第1 (高序)位表示如果相关数据报被分片,该选项是否被复制到分片中。后面2位表示该选项的类别。目前,除了“时间戳”和“跟踪”使用类别2 (调试和测量)外,下表中的所有选项使用类别0(控制)。类别1和3被保留。
图片描述
目前,多数标准化选项在Intemet中很少或从未使用

5.3 IPv6扩展头部

在IPv6中,那些由IPv4选项提供的特殊功能,通过在IPv6头部之后增加扩展头部实
现。
IPv4路由和时间戳功能都采用这种方式,其他功能(例如分片和超大分组)很少在IPv6中使用(但仍需要),因此没有为它们在IPv6头部分配相应的位。基于这种设计, IPv6头部固定为40字节,扩展头部仅在需要时添加。在选择IPv6头部为固定大小时,要求扩展头部仅由终端主机(仅有一个例外)处理,IPv6设计者简化了高性能路由器的设计和实现,这是因为IPv6路由器处理分组所需的命令比IPv4简单。实际上,分组处理性能受很多因素影响,包括协议复杂性、路由器硬件和软件功能,以及流量负载等。
扩展头部和更高层协议(例如TCP或UDP)头部与IPv6头部链接起来构成级联的头部。6)。每个头部中的下一个头部字段表示紧跟着的头部的类型,它可能是一个IPv6扩展头部或其他类型。值59表示这个头部链的结尾。下一个头部字段的可能值定义在[IP6PARAM]中,并在下表中列出了其中的大多数。
图片描述

图片描述
图片描述

我们从上表中可以看到, IPv6扩展头部机制将一些功能(例如路由和分片)与选项加
以区分。除了“逐跳选项”的位置之外(它是强制性的),扩展头部的顺序是建议性的,因此一个IPv6实现必须按接收的顺序处理扩展头部。只有“目的地选项”头部可以使用两次,第一次是指出包含在IPv6头部中的目的IPv6地址,第二次(位置8)是关于数据报的最终目的地。在某些情况下(例如使用路由头部),当数据报被转发到最终目的地时,IPv6头部中的目的IP地址字段将会改变

5.3.1 IPv6选项

相对于IPv4, IPv6提供了一种更灵活和可扩展的方式,将扩展和选项相结合。由于IPv4头部空间的限制,那些来自IPv4的选项已停止使用,而IPv6可变长度的扩展头部或编码在特殊扩展头部中的选项可适应当前更大的Internet。如果选项存在,可放入逐跳选项(与一个数据报传输路径上的每个路由器相关)或目的地选项(仅与接收方相关)。逐跳选项(称为HOPOPT)是唯一由分组经过的每个路由器处理的选项。逐跳选项和目的地选项的编码格式一样。
逐跳选项和目的地选项头部的出现可以超过一次。这些选项均被编码为类型一长度一值(TLV)集合,如下图所示。
图片描述
它的长度为2字节,后面是可变长度的数据字节。第一字节表示选项类型,其中包括3个子字段,当5位的类型子字段无法由选项识别时,第一个子字段给出了一个IPv6节点尝试执行的动作。下表显示了所有可能的值。
图片描述
当选项数据可能在数据报转发过程改变时,改变位字段(图5-7中的Chg)设置为1。下表所示的选项已经被IPv6定义。
图片描述

5.3.1.1 填充1和填充N

由于IPv6选项需要与8字节的偏移量对齐,因此较小的选项用0填充到长度为8字节。
这里有两个填充选项,分别称为填充1和填充N。填充1选项(类型0)是唯一缺少长度字段和值字段的选项。它仅有1字节长,取值为0。填充N选项(类型1)向头部的选项区域
填充2字节或更多字节,它使用上图所示格式。对于n个填充字节,选项数据长度字段包含的值为(n-2)。

5.3.1.2 IPv6超大有效载荷

IPv6超大有效载荷选项指定了一种有效载荷大于65 535字节的IPv6数据报,称为超大报文。这个选项无法由MTU小于64kB的链路连接的节点来实现。超大有效载荷选项提供了一个32位的字段,用于携带有效载荷在65 535 - 4294967295字节之间的数据报。当一个用于传输的超大报文形成时,其正常负载长度字段被设置为0。

5.3.1.3 隧道封装限制

隧道是指将一个协议封装在另一个协议中。如, IP数据报可能被封装在另一个IP数据报的有效载荷部分。隧道可用于形成虚拟的覆盖网络,在覆盖网络中,一个网络(例如Intemet)可作为另一个IP的链路层使用[TWEFO3]。隧道可以嵌套,从这个意义上来说,一条隧道中的数据报本身也可采用递归方式封装在另一条隧道中。
在发送一个IP数据报时,发送者通常无法控制最终用于封装的隧道层次。发送者可使
用这个选项设置一个限制。一台路由器打算将一个IPv6数据报封装在一条隧道中,它首先检查隧道封装限制选项是否存在并置位。如果这个限制选项的值为0,该数据报被丢弃,并将一个“ICMPv6参数问题”消息(见第8章)发送到数据报源端(即之前的隧道入口点)。如果这个限制选项的值不为0,该数据报可进行隧道封装,但新形成(封装)的IPv6数据报必须包括一个隧道封装限制选项,其值比封装之前的数据报中的封装限制选项值减1。实际上,封装限制行动类似于IPv4的TTL和IPv6的跳数限制字段,只不过采用隧道封装层次代替转发跳步。

5.3.1.4 路由器警告

路由器警告选项指出数据报包含需要路由器处理的信息。它与IPv4的路由器警告选项
的目的相同。

5.3.1.5 快速启动

快速启动(QS)选项和[RFC4782]定义的TCP/IP实验性“快速启动”程序配合使用。
它适用于IPv4和IPv6,但目前建议仅用于专用网络,而不是全球性的Intemeto选项包括发送者需要的以比特/秒为单位的传输速率的编码值、 QS TTL值和一些额外信息。如果沿途的路由器认为可以接受所需的速率,在这种情况下它们将递减QS TTL,并在转发数据报时保持所需的速率不变。如果路由器不同意(即其支持的速率较低),它将该速率减小到一个可接受的速率。如果路由器不能识别QS选项,它将不递减QS TTLo接收方将向发送方提供反馈,包括接收到的数据报的IPv4TTL或IPv6跳数限制字段和自已的QSTTL之间的差异,以及获得的速率可能被沿途的路由器所调整。这个信息被发送方用于确定发送速率(否则可能超出TCP使用的速率)。对TTL值进行比较的目的是确保沿途每台路由器参与QS谈判。如果发现任何路由器递减IPv4TTL (或IPv6跳数限制)字段,但没有修改QSTTL值,则说明它没有启用QS。

5.3.1.6 CALIPSO

这个选项用于在某些专用网络中支持通用体系结构标签IPv6安全选项(CALIPSO)
[RFC5570]。它提供了一种为数据报做标记的方法,包括一个安全级别标识符和一些额外的信息。需要注意的是,它用于多级安全网络环境(例如,政府、军队和银行),其中所有数据的安全级别必须以某种形式的标签注明。

5.3.1.7 家乡地址

当使用IPv6移动选项时,这个选项保存发送数据报的IPv6节点的“家乡”地址。移动
IP (见5.5节)规定了IP节点的一系列处理过程,这些节点可能改变自已的网络接入点,同时不会断开自已的高层网络连接。这里存在一个节点的“家乡”的概念,它来自其典型位置的地址前缀。当远离家乡漫游时,通常为该节点分配一个不同的IP地址。该选项允许这个节点提供自已正常的家乡地址,以及它在漫游时的新地址(通常是临时分配)。当其他IPv6节点需要与移动节点通信时,它可以使用该节点的家乡地址。如果家乡地址选项存在,包含它的目的地选项头部必须出现在路由头部之后,并且在分片、认证和ESP头部(见第18章)之前(如果这些头部也存在)。我们将在移动IP中详细讨论这个选项。

5.3.2 路由头部

IPv6路由头部为发送方提供了一种IPv6数据报控制机制,以控制(至少部分控制)数据报通过网络的路径。目前,路由扩展头部有两个不同版本,分别称为类型0 (RHO)和类型2 (RH2)。RHO出于安全方面的考虑已被否决[RFC5095],RH2被定义为与移动IP共同使用。
为了更好地理解路由头部,我们首先讨论RHO,然后研究它为什么被放弃,以及它和RH2的不同之处。 RHO规定了数据报转发时可“访问”的一个或多个IPv6节点。下图显示了这个头部
图片描述
上图所示的IPv6路由头部涵盖了来自IPv4的宽松源路由和记录路由选项。它还支持
采用IPv6地址之外的其他标识符路由的可能,对于标准化的IPv6地址的路由,RHO允许发送方指定一个指向目的地址的向量。
这个头部包含一个8位的路由类型标识符和一个8位的剩余部分字段。对于RHO,IPv6地址类型标识符为0;对于RH2,该标识符为2。剩余部分字段指出还有多少段路由需要处理,也就是说,在到达最终目的地之前仍需访问的中间节点数。它是一个32位的从保留字段开始的地址块,由发送方设置为0,并由接收方忽略。在数据报转发时,这些地址并非可访问的组播IPv6地址。
IPv6路由头部在转发过程中不会处理,直至目的IP地址字段中包含的地址所在的节
点。这时,剩余部分字段用于确定来自地址向量的下一跳地址,并将该地址与IPv6头部中的目的IP地址字段交换。因此,在这个数据报转发过程中,剩余部分字段将会变得越来越小,头部中的地址列表反映转发数据报的节点地址。示例如下图
图片描述
上图中,我们可看到中间节点如何处理路由头部。发送方(S)使用一个目的地址
R1以及一个包含地址R2、 R3和D的路由头部(类型0)来构造数据报。数据报的最终目的地是列表中的最后一个地址(D)。剩余部分字段(在图5-9中标为“Left”)从3开始。数据报由s和R0自动向R1转发。由于Ro的地址在数据报中不存在,因此R0没有修改路由头部或地址。当数据报到达R1时,将基本头部的目的地址和路由头部的第一个地址交换,并将剩余部分字段递减1。当数据报被转发时,重复上述将目的地址与路由头部地址列袁中下一个地址交换的过程,直至路由头部中的最后一个目的地址为止。
正如前面提到的,出于安全方面的担心, RHO已在[RFC5095]中被废弃,因为RHO可用于增加DoS攻击效果。RHO的问题是允许在路由头部的多个位置指定相同地址。这可能导致流量在一条特定路径上的两台或多台主机或路由器之间重复转发。大量的流量负载可能在网络中沿着特定路径创建,与相同路径上的其他流量竞争带宽而造成干扰。因此,RHO目前已过时,IPv6唯一支持的路由头部是RH2。RH2与RHO基本相等,区别在于它只容纳一个地址,而且在路由类型字段中使用的值不同。

5.3.3 分片头部

分片头部用于IPv6源节点向目的地发送一个大于路径MTU的数据报。但1280字节是整个网络中针对IPv6定义的链路层最小MTU。在IPv4中,如果数据报大小超过下一跳MTU,任何主机或路由器可将该数据报分片,IPv4头部中第二个32位字段表示分片信息。在IPv6中,仅数据报的发送者可以执行分片操作,在这种情况下需要添加一个分片头部。
分片头部包括的信息与IPv4头部中的相同,只不过标识符字段是32位,而不是IPv4中采用的16位。如下图所示
图片描述
上图中,保留字段和2位的Res字段都为0,并且都会被接收方所忽略。分片偏移字段表明有效载荷以8字节为单位的偏移量放置在分片头部之后。如果M位字段设置为1,表示在数据报中包含更多分片。如果该值为0,表示该分片是原始数据报的最后一个分片。
在分片过程中,输入的数据报称为“原始数据报”,它由两部分组成: “不可分片部分”
和“可分片部分” 。不可分片部分包括IPv6头部和任何在到达目的地之前需由中间节点处理的扩展头部(即包括路由头部之前的所有头部,如果有逐跳选项扩展头部,则是该头部之前的所有头部)。可分片部分包括数据报的其余部分(即目的选项头部、上层头部和有效载荷数据)。
当原始数据报被分片后,将会产生多个分片,其中每个分片都包含一个原始数据报中不可分片部分的副本,但是需要修改每个IPv6头部的负载长度字段,以反映它所描述的分片的大小。在不可分片部分之后,每个新的分片都包含一个分片头部,其中包含一个分片相应的分片偏移字段(例如第一个分片的偏移量为0),以及一个原始分组的标识符字段的副本。最后一个分片的M (更多分片)位字段设置为0。
下图的例子演示了IPv6源节点对数据报的分片过程。
图片描述
在上图中,我们看到较大的原始数据报被分为3个较小的分片,每个分片都包含一
个分片头部。IPv6头部的负载长度字段被修改,以反映数据和新生成的分片头部的大小。每个分片中的分片头部包含一个公共标识符字段,以确保网络中不同的原始数据报在其生存期内不会被分配相同的标识符字段值。
分片头部中的偏移量字段以8字节为单位,因此分片需要在8字节的边界处进行,这
就是第一个和第二个分片包含1448字节,而不是1452字节的原因。因此,除了最后一个分片之外的所有分片都是8字节的倍数(最后一个分片也可能是)。接收方在对分片进行重组之前,必须确保已接收原始数据报的所有分片。重组过程需要聚合所有分片以形成原始数据报。与IPv4分片一样,分片可能不按顺序到达接收方,但需要按顺序重组为一个数据报,以便交给高层的其他协议处理。

5.4 IP转发

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

  • 如果IP层配置为一台路由器,则转发该数据报(也就是说,作为一个输出的数据报处理,见5.4.2节中的描述)
  • 数据报被默默地丢弃。在某些情况下(例如在情况1中没有路由),ICMP消息可能发送回源节点,以表明发生了一个错误。

5.4.1 转发表

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

  • 目的地:它是一个32位字段(或128位字段,用于IPv6),用于与一个掩码操作结果
    相匹配(见下文)。针对涵盖所有目的地的“默认路由”的情况,目的地可简单地设为零;对于仅描述一个目的地的“主机路由”的情况,目的地可设为完整长度的IP地址。
  • 掩码: 它是一个32位字段(或128位字段,用于IPv6),用作数据报目的IP地址按位与操作的掩码,其中的目的IP地址是要在转发表中查找的地址。掩码结果与转发表条目中的多个目的地进行比较。
  • 下一跳:它是下一个IP实体(路由器或主机)的32位IPv4地址或128位IPv6地址,数据报将被转发到该地址。下一跳实体通常在一个网络中由执行转发查找的系统所共享,这意味着它们共享同一网络前缀(见第2章)。
  • 接口:它包含一个由IP层使用的标识符,以确定将数据报发送到下一跳的网络接口。例如,它可能是一台主机的802.11无线接口、一个有线的以太网接日或一个与串行端口相关联的PPP接口。如果转发系统也是IP数据报的发送方,该字段用于选择输出数据报的源IP地址(见5.6.2.1节)。
    IP转发逐跳进行。我们从这个转发表的信息中看到,路由器和主机不包含到任何目的地的完整转发路径(除了那些直接连接主机或路由器的目的地)。IP转发只提供数据报发送的下一跳实体的IP地址。它假设下一跳比执行转发的系统“更接近”目的地,并且下一跳路由器与执行转发的系统直接连接(即其享同一网络前缀)。它通常也假设与下一跳实体之间没有“环路”,数据报不会在网络中循环,直至其TTL或跳数限制到期。由一个或多个路由协议来确保路由表正确。多种路由协议能做好这项工作,包括RIP、OSPF、 BGP和IS-IS等。

5.4.2 IP转发行动

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

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

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

5.4.3 例子

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

5.4.3.1 直接交付

如上图所示,两台主机位于同一以太网中,当S的IP层接收到一个来自上层(例如TCP或UDP)的数据报,它将会查找自已的转发表。
图片描述
在上表中,目的IPv4地址D(10.0.0.9)与第一和第二个转发表条目的匹配。由于它与第二个条目匹配得更好(25位),所以“网关”或下一跳地址为10.0.0.100,即地址S。该条目的网关部分包含发送主机的网络接口(没有涉及路由器),说明采用直接交付来发送数据报。这个数据报被封装在一个低层帧中,并发送给目的主机D。

5.4.3.2 间接交付

现在看另一个例子。我们的Windows主机有一个IP数据报发送到主机ftp.uu.net,其
IPv4地址为192.48.96.9。上图显示了通过4台路由器的数据报传输路径(在理论上)。首先,Windows主机在自已的转发表中查找,但在本地网络中没有找到匹配的前缀。这时,它使用自已的默认路由条目(匹配每个目的地,但没有“1”位)。这个默认路由条目指出适当的下一跳网关为10.0.0.1 (路由器R1的“a侧”)。这是一个家庭网络的典型情况。
我们回想一下直接交付的情况,源IP地址和目的IP地址对应于相应的源主机和目的主机。对于低层(例如以太网)地址也是这样。在间接交付中, IP地址对应于前面的源主机和目的主机,但是低层地址不对应。实际上,低层地址决定哪台机器在每跳的基础上接收包含数据报的帧。在这个例子中,需要的低层地址为下一跳路由器R1的a侧接口的以太网地址,低层地址对应的IPv4地址为10.0.0.1。这由ARP (如果在例子中使用
IPv6则是一个邻居请求)在互联S和Rl的网络上完成。R1通过其a侧的低层地址响应后,S将向R1发送数据报。S向R1交付仅根据低层头部(更具体地说是低层的目的地址)的处理进行。在接收到这个数据报之后,R1将检查自已的转发表。如下表所示
图片描述
当R1接收到数据报时,它发现数据报的目的IP地址不是自已,因此它将转发这个数据报。Rl搜索转发表,并使用默认的条目。在这种情况下,该默认条目的下一跳位于ISP服务的网络中,即70.231.159.254(这是R2a侧的接口)。这个地址正好在SBC的DSL网络中,它有一个较长的名称adsl-70-231-159-254.ds1.snfe21.sbcgloba1.net。由于这台路由器位于全球Internet中,并且Windows机器的源地址为私有地址10.0.0.100,R1对数据报进行网络地址转换(NAT),以使它在Intemet中可路由。对数据报进行NAT处理,结果是生成新的源地址70.231.132.85,它对应于R1的b侧接口.不使用私有地址(例如ISP和大型企业)的网络不需要执行最后一步,并且保持原来的源地址不变。
当路由器R2 (在ISP内部)接收到数据报,它的操作步骤与本地路由器R1相同(除了NAT操作外)。如果数据报的目的地不是自已的IP地址,则转发这个数据报。在这种情况下,路由器通常不仅有一个默认路由,而且有多个其他路由,这取决于它连接的Internet的其他部分,以及它的本地策略。
注意, IPv6转发与传统IPv4转发只有很少改变。除了更长的地址之外, IPv6还使用一
种稍微不同的机制(邻居请求消息),以确定它的下一跳的低层地址(第八章详细介绍)。另外,IPv6定义了链路本地地址和全球地址(见第2章)。全球地址的处理方式就像普通的IP地址,链路本地地址只能用于同一链路上。另外,所有的链路本地地址共享相同的IPv6前缀(fe80::/10),在发送一个目的地为链路本地地址的数据报时,一台多宿主主机可能需要用户来决定使用哪个接口。

5.4.4 讨论

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

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

5.5 移动IP

到目前为止,我们已讨论了IP数据报通过Internet转发的传统方式,以及使用IP的专
用网络。这个模型的假设是一台主机的IP地址与附近主机和路由器共享同一前缀。如果这样一台主机在网络中的连接点改变,但仍保留与链路层网络的连接,它的所有上层(例如TCP)连接将会失效,这是因为它的IP地址必须改变,或路由不能将分组正确交付给(移动后的)主机。移动IP解决了这个问题。
移动IP基于一台主机拥有一个“家乡”网络,但可以不时地访问其他网络的想法。当主机位于家乡内部时,普通转发基于本章讨论的算法。当主机离开家乡时,它保持平时在家乡使用的IP地址,但采用一些特殊的路由和转发手段,使主机可以在这个网络中与其他系统通信,就好像它仍连接在自已的家乡网络中那样。该方案依赖于一种特殊类型的路由器,被称为“家乡代理”,用于为移动节点提供路由。
MIPv6的复杂性主要涉及信令消息,以及如何保证它们的安全。这些消息使用各种形式的移动扩展头部,因此移动IP自身实际上是一种特殊的协议。为了理解MIPv6,我们开始介绍移动IP的基本模型以及相关术语。

5.5.1 基本模型:双向隧道

下图显示了MIPv6运行中涉及的实体。大部分术语也适用于MIPv4 [RFC5944]。一台可能移动的主机称为移动节点(MN),与它通信的主机称为通信节点(CN)。MN被赋予一个由家乡网络的网络前缀获得的IP地址。这个地址称为家乡地址(HoA)。当它漫游到一个可访问的网络时,它被赋予了另一个地址,称为转交地址(CoA)。在基本模型中,当一个CN与一个MN通信时,该流量需要通过MN的家乡代理(HA)来路由。HA是一种特殊类型的路由器,它像其他重要系统(例如路由器和web服务器)一样部署在网络基础设施中,MN的HoA和CoA之间的关联称为MN绑定。
图片描述

基本模型(见上图)工作在一个MN的CN不使用MIPv6协议的情况下。在整个网络移动的情况下,这个模型用于支持网络移动。MN (或移动网络的路由器)连接到网络中的一个新位置时,它接收自已的CoA,并向自已的HA发送一个绑定更新消息。这个HA使用一个绑定确认来响应。如果一切顺利,这个MN和CA之间的流量通过MN的HA来路由,并使用一种双向的IPv6分组隧道,称为双向隧道。

5.5.2 路由优化

双向隧道使MIPv6工作在一种相对简单的方式下,并使用那些不被移动IP所感知的
CN,但是路由效率可能非常差,特别是在MN与CN之间距离近,但与HA之间距离较远的情况下。为了改善MIPv6中可能出现的低效路由,可使用一种称为路由优化(RO)的方法,只要它被涉及的备个节点支持。
在使用RO时涉及一个通信注册过程,一个MN将当前CoA通知相应CN,允许它们执行无须HA协助的路由。RO操作分为两部分:一部分涉及注册绑定的建立和维护;另一部分涉及所有绑定建立后的数据报交换方法。。为了与自已的CN建立一个绑定, MN必须向每个CN证明自已的真实身份。这通过一个返回路由程序(RRP)来完成。
RRP使用以下这些移动消息,它们是IPv6移动扩展头部的子类型:家乡测试初始化
(HoTI)、家乡测试(HoT)、转交测试初始化(CoTI)和转交测试(CoT)。这些消息向CN验
证一个特定MN的家乡地址(HoTI和HoT消息)和转交地址(CoTI和CoT消息)可到达

图片描述
为了理解RRP,我们来看一个简单例子:只有一个MN及其HA,以及一个CN,如上图所示。MN开始向CN发送HoTI和CoTI消息。HoTI消息在到达CN途中通过HA转发。CN以某种顺序接收到这两种消息,并分别以HoT和CoT消息响应。HoT消息经由HA发送到MN。这些消息中包含称为令牌的随机字符串,MN使用它形成一个加密密钥。随后,这个密钥被用于生成发送给CN的经过认证的绑定更新。如果成功的话,路由可优化,数据可以在MN与CN之间直接传输。
当一个绑定成功建立后,数据可直接在MN和CN之间流动,而无须使用效率低的双向
隧道。
对于从MN到CN的流量,可使用IPv6家乡地址目的地选项;对于相反方向的流量,可使用类型2的路由头部(RH2),如下图所示
图片描述
从MN到CN的分组中包括MN的CoA的源IP地址字段,从而避免入口过滤问[RFC2827],它可能导致包含MN的HoA的源IP地址字段的分组被丢弃。由于包含在家乡地址选项中的MN的HoA不会被路由器处理,因此它可不经修改通过路由器到达CN。在返回的路径上,分组被发送到MN的CoA。在成功接收返回的分组后,MN处理扩展头部并用包含在RH2中的HoA替换目的IP地址。这个分组被交付给MN协议栈其余部分,因此应用程序“相信”自已正在使用的是MN的HoA,而不是用于建立连接和其他操作的CoA。

5.5.3 讨论

有很多关于移动IP的问题。它被设计为可处理某种类型的地址移动:一个节点的IP地
址可能改变,同时底层的链路层或多或少保持连接。这种用法对于便携式计算机并不常见,它们在不同地点之间移动的过程中,通常会关机或进人休眠状态。在需要移动IP (特别是MIPv6)的使用模型中,更常见的设备是大量采用IP的智能手机。这些设备可能会运行有延时要求的实时应用(例如VoIP)。因此,为了减少执行绑定更新所需的时间,目前已有几种方法正在探索中。这些方法包括快速切换[RFC5568]、一种称为分层MIPv6 ( HMIPv6 )的MIPv6修改方案[RFC5380],以及MN所需的移动信号由代理执行的修改方案(称为代理MIPv6或PMIPv6 [RFC5213])。

5.6 IP的数据报的主机处理

虽然路由器在转发分组时通常不会考虑将哪个IP地址放在分组的源IP地址和目的IP地
址字段中,但主机必须考虑它们。应用程序(例如Web测览器)可能尝试连接一台指定的主机或服务器,它们也可能有多个地址。因此,发送数据报时使用哪个地址(和IP版本)就有问题。我们将探讨一个更微妙的事,如果流量到达一个错误的接口(即接收的数据报中存在未配置的目的地址),是否接收发送到本地IP地址的流量。

5.6.1 主机模式

虽然可能有一个简单的决策方法,确定一个单播数据报是否匹配一台主机的IP地址并
被处理,它取决于接收系统的主机模式[RFCl122],以及它是否为最相关的多宿主主机。这里存在两种主机模式:强主机模式和弱主机模式。在强主机模式中,只有当目的IP地址字段中包含的IP地址与数据报到达的接口配置的IP地址匹配时,才同意把将数据报交付本地协议栈。在弱主机模式的系统实现中,实际情况相反,一个数据报携带的目的地址与它到达的任何接口的任何本地地址匹配,无论它到达哪个网络接口,它都会被接收的协议栈处理。主机模式也适用于发送行为。也就是说,只有当接口配置的地址与发送数据报的源IP地址字段匹配时,这台采用强主机模式的主机才可从这个特定接口发送数据报。

5.6.2 地址选择

当一台主机发送一个IP数据报时,它必须将自已的IP地址写入数据报的源IP地址字
段,在它已知多个地址的情况下,数据报的目的地址确定一台特定的目的主机。在有些情况下源地址是已知的,这是因为它可以由一个应用程序提供,或者为响应同一连接的前一个分组而发送该分组(详见第13章中如何用TCP管理地址)。
在当前的IP实现中,数据报的源IP地址和目的IP地址字段中使用的IP地址,是通过一组称为源地址选择程序和目的地址选择程序获得的。

5.6.2.1 源地址选择算法

源地址选择算法定义了一个源地址的候选集合CS(D),它基于一个特定的目的地址
D。这里有一个限制,对于任何D,任播、组播和未指定地址从未出现在CS(D)中。我们使用符号R(A)表示地址A在集合CS(D)中的等级。在CS(D)中,A比B的等级更高(即
R(A)值更大),表示R(A) > R(B),意味着优先选择A而不是B作为到达地址D的源地址。表达式R(A) *> R(B)表示在CS(D)中为A分配一个比B更高的等级。符号I(D)表示选择(通过前面所述的最长匹配前缀转发算法)到达目的地D的接口。符号@(i)是分配给接口i的地址集合。如果A是一个临时地址(见第6章), T(A)为布尔值true;否则,T(A)为false。
以下规则用于为目的地D建立地址A和B在CS(D)中的局部顺序:
图片描述
图片描述
局部顺序规则可用于形成CS(D)中所有候选地址的全局顺序。Q(D)表示为目的地D选
择一个最高等级的源地址,它由目的地址选择算法来使用。如果Q(D) =(空),可能无法为目的地D确定源地址。

5.6.3 目的地址选择算法

我们讨论默认目的地址选择问题。该算法指定了一种类似于源地址选择的方式。回想一下, Q(D)是上面例子中为目的地D选择的源地址。如果目的地B不可到达,则令U(B)为布尔值true。E(A)表示采用某些“封装传输” (例如,隧道路由)可到达目的地A。集合SD(S)采用与前面的成对元素A和B相同的结构,我们可获得以下规则。
图片描述
针对源地址的选择问题,这些规则形成一个在可能的目的地集合SD (S)中两个元素之间的偏序。最高等级地址给出了目的地址选择算法的输出。

5.7 与IP相关的攻击

详见网络攻防

5.8 总结

在本章中,我们首先介绍IPv4和IPv6头部,讨论一些相关的功能,例如Intemet校验和与分片。我们分析IPv6如何增加地址空间,改进方案包括在分组中使用扩展头部,以及从IPv4头部中删除一些不重要的字段。随着这些功能的增加,IP头部大小增大为原来的2倍,但地址空间增大为原来的4倍。IPv4和IPv6头部不能直接兼容,并且只共享了4位的版本字段。因此,IPv4和IPv6节点互连需要某个层次的转换。双协议栈主机需要同时实现IPv4和IPv6,但必须选择何时使用哪种协议。
IP从出现开始就包含一个头部字段,表示每个数据报的流量类型或服务类别。这种机制近年来已被重新定义,以便在Intemet上支持差异化的服务。如果它被广泛实现, Internet可能以标准的方式为某些流量或用户提供更好的性能。这种情况能进展到何种程度,部分取决于围绕差异化服务能力的商业模式的发展。
IP转发描述了IP数据报通过单一和多跳网络的传输方式。除了那些需特殊处理的情况,
正转发在逐跳的基础上进行。数据报的目的IP地址经过每跳时都不改变,但是链路层封装和链路层目的地址在每跳时会改变。主机和路由器使用转发表和最长前缀匹配算法,以确定匹配得最好的转发条目,以及沿着一条转发路径的下一跳。在很多情况下,最简单的表只包含一个默认路由就足够了,只要它能公平匹配所有可能的目的地。
通过一组特殊的安全和信令协议,移动IP在移动节点的家乡地址和转交地址之间建立
安全绑定。这些绑定可用于与移动节点通信,即使它并不在家乡内部。这个基本功能涉及通过家乡代理的隧道流量,但这可能会导致非常低效的路由。一些额外的功能可支持路由优化,允许移动节点与其他远程节点直接通信,反之亦然。这要求移动节点的主机支持MIPv6和路由优化,它是一个可选的功能。当前研究致力于减少路由优化绑定更新过程中的延时。
我们也讨论了强主机或弱主机模式如何影响IP数据报的处理。在强主机模式下,只允
许每个接日接收或发送包含该接口相关地址的数据报,而弱主机模式的限制较少。弱主机模式允许在某些特殊情况下通信,但它可能更容易遭受某些形式的攻击。主机模式还涉及主机如何选择通信时使用的地址。早期,大多数主机只有一个IP地址,因此做出决定相当简单。一台IPv6主机可能有多个IP地址,多宿主主机可能使用多个网络接口,这时要做出决定并不容易,并可能对路由产生很大的影响。目前已经有一些地址选择算法(针对源和目的地址),这些算法倾向于选择范围有限、永久性的地址。
我们讨论了一些针对IP协议的攻击。这种攻击通常涉及地址欺骗,包括利用选项来改
变路由行为,以及试图利用IP实现中的漏洞,特别是有关分片的漏洞。很多协议实现中的漏洞在现代操作系统中已修复,在大多数情况下,企业边缘路由器通常会禁用选项。尽管欺骗仍会受到某些关注,但人日过滤器这类程序有助于解决这个问题。

posted @ 2021-01-12 17:23  buguoliujibugaiming  阅读(350)  评论(0编辑  收藏  举报