欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > TCPIP详解 卷1协议 五 Internet协议

TCPIP详解 卷1协议 五 Internet协议

2025/4/18 22:29:44 来源:https://blog.csdn.net/shihui_0516/article/details/147233711  浏览:    关键词:TCPIP详解 卷1协议 五 Internet协议

5.1——Internet协议

IP是TCP/IP协议族中的核心协议。所有TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。IP 提供了一种尽力而为、无连接的数据报交付服务。“尽力而为”的含义是不保证 IP 数据报能成功到达目的地。任何可靠性必须由上层(例如TCP)提供。IPv4和IPv6都使用这种尽力而为的基本交付模式。

“无连接”意味着 IP不维护网络单元(即路由器)中数据报相关的任何链接状态信息,每个数据报独立于其他数据报来处理。这也意味着 IP 数据报可不按顺序交付。IP数据报也可能发生其他问题:它们可能在传输过程中被复制,可能改变内容从而导致错误。此外,IP之上的一些协议(通常是TCP)需要处理这些潜在问题,以便为应用提供无差错的交付。

5.2——IPv4头部和IPv6头部

IPv4数据报格式

image-20250407204418116

IPv4头部大小为20字节,除非存在选项。

  • 版本:IP 数据报的版本号,IPv4 为 4。

  • IHL(Internet 头部长度):保存IPv4头部中32位字的数量,包括任何选项。由于它是一个 4 位的字段,所以IPv4 头部被限制为最多 15 个 32 位字,即 60 字节。正常值是5(没有选项)。

  • DS(区分服务)和ECN(显示拥塞通知):这两个字段的前身是IPv4的服务类型(ToS)字段和IPv6的通信类型字段。

    • DS(区分服务):IP数据报以某种方式(通过预定义模式设置某些位)被标记,使它们的转发不同于(例如以更高的优先级)其他数据报。这样做可能导致网络中排队延时的增加或减少,以及出现其他特殊效果(可能与ISP收取的特殊费用相关)。DS字段中的数字称为区分服务代码点(DSCP)。6位DS字段用于保存DSCP,提供对64个代码点的支持。特定DSCP值可通知路由器对接收的数据报进行转发或特殊处理。不同类型的转发处理表示为每跳行为(PHB),因此DSCP值可有效通知路由器哪种PHB被应用于数据报。DSCP的默认值通常为 0,对应于常规的尽力而为的Internet流量。64 个可能的 DSCP 值分为不同用途。

      image-20250408202041032

      上图中,DS 字段中的类别部分包含前 3 位,并基于较早定义的服务类型的优先级子字段。路由器通常先将流量分为不同类别。常见类别的流量可能有不同的丢弃概率,如果路由器被迫丢弃流量,允许路由器确定首先丢弃哪些流量。3 位的类别选择器提供了 8 个定义的代码点(称为类别选择代码点),它们对应于一个指定最小功能集的PHB,它们称为类别选择兼容的PHB,目的是支持部分兼容的最初定义的IP优先级子字段。xxx000形式的代码点总被映射为这种PHB,但是其他值也可映射到相同 PHB。

      下表给出了类别选择器的DSCP值,以及[RFC0791]定义的IP优先级字段的相应术语。保证转发(AF)组对固定数量的独立AF类别的IP 分组提供转发,它有效地概括了优先级的概念。某个类别的流量与其他类别的流量分别转发。在一个流量类别中,数据报被分配一个丢弃优先级。在一个类别中,较高丢弃优先级的数据报优先于那些较低丢弃优先级的数据报处理(即以较高优先级转发)。结合流量类别和丢弃优先级,名称 AFij 对应于保证转发类别 i 的丢弃优先级 j 。例如,一个标记为 AF32 的数据报的流量类别为 3,丢弃优先级为 2。

      image-20250408202759535

      加速转发(EF)提供了非拥塞的网络服务,也就是说,EF流量应享受较低的延时、抖动和丢包率。直观地说,EF流量要求路由器的输出速率至少比输入速率大。因此,在一台路由器的队列中,EF流量仅排在其他EF流量之后。

    • ECN(显示拥塞通知):当通过一台具有内部排队流量的路由器时,头部中的 2位 ECN 位用于为数据报标记拥塞标识符。一台持续拥塞的具有ECN感知能力的路由器在转发分组时会设置这两位。这种功能的设计思路是,当一个被标记的分组被目的节点接收时,有些协议(例如 TCP)会发现分组被标记并将这种情况通知发送方,发送方随后会降低发送速度,这样可在路由器因过载而被迫丢弃流量之前缓解拥塞。这种机制是避免或处理网络拥塞的方法之一,

  • 总长度:是IPv4数据报的总长度(以字节为单位)。通过这个字段和IHL字段,我们知道数据报的数据部分从哪里开始,以及它的长度。由于它是一个16位的字段,所以IPv4数据报的最大长度为65535字节。由于一些携带IPv4数据报的低层协议不能(精确)表达自己封装的数据报大小,所以需要在头部中给出总长度字段。

    例如,以太网会将短帧填充到最小长度(64字节)。虽然以太网最小有效载荷为46字节,但一个IPv4数据报也可能会更小(20字节)。如果没有提供总长度字段,IPv4实现将无法知道一个46字节的以太网帧是一个IP数据报,还是经过填充的IP数据报,这样可能会导致混淆。

    尽管可发送一个65 535字节的IP数据报,但是主机不需要接收大于576字节的IPv4数据报 (在 IPv6 中,主机需要能处理所连接链路MTU 大小的数据报,而最小链路 MTU 为1280 字节)。很多使用 UDP 协议传输数据(例如 DNS、DHCP 等)的应用程序,限制为使用512字节大小的数据,以避免576字节的IPv4限制。

    TCP根据额外信息选择自己的数据报大小。当一个 IPv4 数据报被分为多个更小的分片时,每个分片自身仍是一个独立的IP 数据报,总长度字段反映具体的分片长度。

  • 标识:帮助标识由IPv4主机发送的数据报。为了避免将一个数据报分片和其他数据报分片混淆,发送主机通常在每次(从它的一个IP地址)发送数据报时都将一个内部计数器加 1,并将该计数器值复制到 IPv4 标识字段。这个字段对实现分片很重要。

  • 标志

  • 分片偏移

  • 生存期(TTL):用于设置一个数据报可经过的路由器数量的上限。发送方将它初始化为某个值(建议为64),每台路由器在转发数据报时将该值减1。当这个字段值达到 0 时,该数据报被丢弃,并使用一个ICMP消息通知发送方。这可以防止由于出现不希望的路由环路而导致数据报在网络中永远循环。

  • 协议:表示数据报有效载荷部分的数据类型。最常用的值为17(UDP)和6(TCP)

  • 头部校验和:仅计算IPv4头部。这意味着IP协议不检查IPv4数据报有效载荷的正确性。为了确保IP数据报的有效载荷部分已正确传输,其他协议必须通过自己的数据完整性检验机制来检查重要数据。封装在IP中的几乎所有协议(ICMP、IGMP、UDP 和 TCP)在自己头部中都有一个涵盖其头部和数据的校验和,也涵盖它们认为重要的IP 头部的某些部分。

    注意,当一个IPv4数据报经过一台路由器时,TTL字段减1带来的结果是其头部校验和必须改变。

    大多数使用校验和的其他 Internet 相关协议也使用该校验和计算算法,因此有时称之为Internet校验和。Internet 校验和是一个16位的数字和,它能以相当高的概率确定接收的消息或其中的部分内容是否与发送的相匹配。注意,Internet校验和算法与常见的循环冗余校验不同,后者提供了更强的保护功能。

    校验和的算法步骤:

    1. 置零校验和字段

      将头部中的校验和字段临时设为0,确保计算时不包含该值

    2. 分割为16位字

      将整个头部按16位(2字节)一组分割。由于IPv4头部长度是4字节的整数倍(由头部长度字段决定),分割后不会出现单字节剩余的情况。

    3. 累加所有16位字

      将所有16位字视为无符号整数,求和得到一个32位数值。

      例如:若总和为0x1A3B2C4D,则高位为0x1A3B,地位为2C4D

    4. 回卷进位

      将32位数值的高16位与低16位相加,若结果扔超过16位(如0x1FFFF),则重复此过程

      0x1+0xFFFF=0x10000,即0x0001

    5. 取反码

      将最终16位结果按位取反(1的补码),作为检验和填入头部。

    接收方验证步骤

    1. 按16位分割头部

      包含校验和字段的整个头部被分割为16位字

    2. 累加所有字

      若数据无错误,总和为0xFFFF(全1)。若结果非全1,说明传输过程中发生错误,数据报将被丢弃。

  • 源IP地址

  • 目的IP地址

  • IPv4选项:IPv4支持一些可供数据报选择的选项,IPv6的选项被放在扩展头部中。如果选项存在,它在IPv4分组中紧跟在基本IPv4头部之后。选项由一个8位的类型字段标识。这个字段被细分为3个子字段:

    • 复制(1位):表示如果相关数据报被分片,该选项是否被复制到分片中。
    • 类别(2位):选项的类别,目前,除了“时间戳”和“跟踪”使用类别 2(调试和测量)外,下表中的所有选项使用类别0(控制)。类别1和3被保留。
    • 编号(5位)。选项0和1的长度是 1 字节,多数的其他选项的长度可变。可变选项包括 1 字节的类型标识符、1 字节的长度以及选项自身

    下表给出了保留的 IPv4 选项,选项的范围总是以32位为界。如果有必要,数值0 作为填充字节被添加。这确保 IPv4 头部始终是 32 位的倍数(IHL 字段的要求)。

    image-20250408203758617

    • 编号:选项编号,类型字段标识中编号的值
    • 值:类型字段标识的值(即复制1位,类别2位,编号5位,合并后的值)
    • 长度:选项 0和1的长度是1 字节,多数的其他选项的长度可变。可变选项包括 1 字节的类型标识符、1 字节的长度以及选项自身

IPv6数据报格式

image-20250407204538629

IPv6头部大小固定为40字节,没有选项,但是它可以有扩展头部,可提供类似IPv4选项的功能。

  • 版本:IP 数据报的版本号,IPv6 为 6。
  • DS(区分服务)和ECN(显示拥塞通知)
  • 流标签
  • 负载长度:提供 IPv6 数据报长度,不包括头部长度,包括扩展头部。负载长度被限制为64KB(不包括IPv6的头部)。
  • 下一个头部:表示紧跟着的头部的类型,它可能是一个IPv6扩展头部或其他类型。值59表示这个头部链的结尾。
  • 跳数限制:相当于IPv4的,生存期(TTL)

5.3——IPv6扩展头部

在IPv6中,那些由IPv4 选项提供的特殊功能,通过在IPv6头部之后增加扩展头部实现。扩展头部仅由终端主机(仅有一个例外)处理。

扩展头部和更高层协议(例如TCP或UDP)头部与IPv6头部链接起来构成级联的头部(见下图)。每个头部中的下一个头部字段表示紧跟着的头部的类型,它可能是一个IPv6扩展头部或其他类型。值59表示这个头部链的结尾。

image-20250409160712901

下一个头部字段的可能值定义在[IP6PARAM]中,下表中列出了其中的大多数。

image-20250409161405853

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

5.3.1 IPv6选项

如果选项存在,可放入逐跳选项(与一个数据报传输路径上的每个路由器相关)或目的地选项(仅与接收方相关)。逐跳选项(称为HOPOPT)是唯一由分组经过的每个路由器处理的选项。逐跳选项和目的地选项的编码格式一样。逐跳选项和目的地选项头部的出现可以超过一次。这些选项均被编码为类型-长度-值(TLV)集合,对应于下图所示格式。

image-20250409162213571

TLV结构,它的长度为2字节,后面是可变长度的数据字节。

  • 选项类型

    • 动作(2位):当5位的类型子字段无法由选项识别时,第一个字段给出了一个IPv6节点尝试执行的动作。

      下表显示了所有值

      image-20250409162851239

      动作子字段的灵活性在开发新的选项时是有用的。一个新的选项可携带在一个数据报中,并被那些无法理解它的路由器所忽略,这样有助于促进新选项的增量部署。

    • Chg(改变):当选项数据可能在数据报转发过程改变时,改变位字段设为1。

    • 类型子字段

  • 选项数据长度

下表中显示的是已被IPv6定义的选项。

image-20250409163520690

  • 填充1和填充N:由于IPv6选项需要与8 字节的偏移量对齐,因此较小的选项用0 填充到长度为8 字节。这里有两个填充选项,分别称为填充1和填充N。填充1选项(类型0)是唯一缺少长度字段和值字段的选项。它仅有1字节长,取值为0。填充N选项(类型1)向头部的选项区域填充 2字节或更多字节,它使用上面图示TLV格式。对于n个填充字节,选项数据长度字段包含的值为(n-2)。
  • IPv6超大有效载荷:IPv6超大有效载荷选项指定了一种有效载荷大于 65 535字节的IPv6数据报,称为超大报文。这个选项无法由MTU小于64KB的链路连接的节点来实现。超大有效载荷选项提供了一个32位的字段,用于携带有效载荷在 65 535 ~ 4 294 967 295字节之间的数据报。
    当一个用于传输的超大报文形成时,其正常负载长度字段被设置为0。TCP协议使用负载长度字段,计算由前面所述的Internet校验和算法得到的校验和。当使用超大有效载荷选项时,TCP必须使用来自选项的长度值,而不是基本头部中的长度字段值。
  • 隧道封装限制:在发送一个IP 数据报时,发送者通常无法控制最终用于封装的隧道层次。发送者可使用这个选项设置一个限制。一台路由器打算将一个IPv6 数据报封装在一条隧道中,它首先检查隧道封装限制选项是否存在并置位。如果这个限制选项的值为0,该数据报被丢弃,并将一个"ICMPv6参数问题”消息发送到数据报源端(即之前的隧道入口点)。如果这个限制选项的值不为 0,该数据报可进行隧道封装,但新形成(封装)的 IPv6 数据报必须包括一个隧道封装限制选项,其值比封装之前的数据报中的封装限制选项值减1。实际上,封装限制行动类似于IPv4的TTL和IPv6的跳数限制字段,只不过采用隧道封装层次代替转发跳步。
  • 路由器警告:路由器警告选项指出数据报包含需要路由器处理的信息。它与IPv4的路由器警告选项的目的相同。
  • 快速启动:快速启动(QS)选项和[RFC4782]定义的TCP/IP实验性“快速启动”程序配合使用。它适用于IPv4和IPv6,但目前建议仅用于专用网络,而不是全球性的Internet。选项包括发送者需要的以比特/秒为单位的传输速率的编码值、QS TTL值和一些额外信息。如果沿途的路由器认为可以接受所需的速率,在这种情况下它们将递减 QS TTL,并在转发数据报时保持所需的速率不变。如果路由器不同意(即其支持的速率较低),它将该速率减小到一个可接受的速率。如果路由器不能识别QS选项,它将不递减QS TTL。接收方将向发送方提供反馈,包括接收到的数据报的 IPv4 TTL 或 IPv6 跳数限制字段和自己的 QS TTL 之间的差异,以及获得的速率可能被沿途的路由器所调整。这个信息被发送方用于确定发送速率(否则可能超出 TCP 使用的速率)。对 TTL 值进行比较的目的是确保沿途每台路由器参与 QS 谈判。如果发现任何路由器递减 IPv4 TTL(或 IPv6 跳数限制)字段,但没有修改 QS TTL 值,则说明它没有启用 QS。
  • 快速启动
  • CALIPSO:用于在某些专用网络中支持通用体系结构标签IPv6安全选项(CALIPSO)[RFC5570]。它提供了一种为数据报做标记的方法,包括一个安全级别标识符和一些额外的信息。需要注意的是,它用于多级安全网络环境(例如,政府、军队和银行),其中所有数据的安全级别必须以某种形式的标签注明。
  • 家乡地址:当使用 IPv6 移动选项时,这个选项保存发送数据报的 IPv6 节点的“家乡”地址。移动IP规定了IP 节点的一系列处理过程,这些节点可能改变自己的网络接入点,同时不会断开自己的高层网络连接。这里存在一个节点的“家乡”的概念,它来自其典型位置的地址前缀。当远离家乡漫游时,通常为该节点分配一个不同的IP地址。该选项允许这个节点提供自己正常的家乡地址,以及它在漫游时的新地址(通常是临时分配)。当其他IPv6节点需要与移动节点通信时,它可以使用该节点的家乡地址。如果家乡地址选项存在,包含它的目的地选项头部必须出现在路由头部之后,并且在分片、认证和ESP头部之前(如果这些头部也存在)。

5.3.2 路由头部

IPv6路由头部为发送方提供了一种IPv6数据报控制机制,以控制(至少部分控制)数据报通过网络的路径。目前,路由扩展头部有两个不同版本:

  • 类型0(RHO):RHO出于安全方面的考虑已被否决

    image-20250409170844268

    上图所示的 IPv6 路由头部涵盖了来自 IPv4 的宽松源路由和记录路由选项。对于标准化的 IPv6 地址的路由,RH0允许发送方指定一个指向目的地址的向量。这个头部包含:

    • 一个 8 位的路由类型标识符:对于 RH0,路由类型标识符为0;对于RH2,该标识符为2。

    • 一个 8 位的剩余部分字段:剩余部分字段指出还有多少段路由需要处理,也就是说,在到达最终目的地之前仍需访问的中间节点数。它是一个32位的从保留字段开始的地址块,由发送方设置为0,并由接收方忽略。在数据报转发时,这些地址并非可访问的组播 IPv6 地址。IPv6路由头部在转发过程中不会处理,直至目的IP地址字段中包含的地址所在的节点。这时,剩余部分字段用于确定来自地址向量的下一跳地址,并将该地址与IPv6头部中的目的IP 地址字段交换。因此,在这个数据报转发过程中,剩余部分字段将会变得越来越小,头部中的地址列表反映转发数据报的节点地址。这个转发过程可看下图

      image-20250409171633177

  • 类型2(RH2),RH2被定义为与移动IP共同使用。IPv6唯一支持的路由头部是RH2。RH2与 RH0 基本相当,区别在于它只容纳一个地址,而且在路由类型字段中使用的值不同。

5.3.3 分片头部

分片头部用于IPv6源节点向目的地发送一个大于路径MTU的数据报。但1280字节是整个网络中针对IPv6定义的链路层最小MTU。在IPv4中,如果数据报大小超过下一跳 MTU,任何主机或路由器可将该数据报分片,IPv4 头部中第二个 32 位字段表示分片信息。在IPv6中,仅数据报的发送者可以执行分片操作,在这种情况下需要添加一个分片头部。

分片头部包括的信息与 IPv4头部中的相同,只不过标识符字段是 32 位,而不是IPv4中采用的 16 位。这个更大的字段提供了在网络中容纳更多分片的能力。如下图所示。

image-20250409172121782

  • 保留:值为0,会被接收方忽略
  • 分片偏移:表明数据以 8 字节为单位的偏移量放置在分片头部之后
  • Res:值为0,会被接收方忽略
  • M:值为 1,表示在数据报中包含更多分片。值为0,表示该分片是原始数据报的最后一个分片。

在分片过程中,输入的数据报称为“原始数据报”,它由两部分组成:“不可分片部分”和“可分片部分”。不可分片部分包括IPv6头部和任何在到达目的地之前需由中间节点处理的扩展头部(即包括路由头部之前的所有头部,如果有逐跳选项扩展头部,则是该头部之前的所有头部)。可分片部分包括数据报的其余部分(即目的选项头部、上层头部和有效载荷数据)。

当原始数据报被分片后,将会产生多个分片,其中每个分片都包含一个原始数据报中不可分片部分的副本,但是需要修改每个IPv6头部的负载长度字段,以反映它所描述的分片的大小。在不可分片部分之后,每个新的分片都包含一个分片头部,其中包含一个分片相应的分片偏移字段(例如第一个分片的偏移量为0),以及一个原始分组的标识符字段的副本。最后一个分片的 M(更多分片)位字段设置为0。

image-20250409172801006

5.4——IP转发

对于一个主机。如果目的地是直接相连的主机(例如点到点链接)或共享网络(例如以太网),IP数据报直接发送到目的地,不使用路由器。否则,主机将数据报发送到一台路由器(称为默认路由器),由该路由器将数据报交付到目的地。

主机与路由器处理IP数据报的区别在于:主机不转发那些不是由它生成的数据报,但是路由器会这样做。

IP转发的大体流程:

IP 协议可接收一个数据报,它可来自同一主机上的其他协议(TCP、UDP等),也可来自一个网络接口。IP 层包括一些位于内存中的信息,通常称为路由表或转发表,每次转发一个数据报时需要从中查找信息。当一个网络接口接收到一个数据报时,IP 模块首先检查目的地址是否为自己的 IP 地址(与自己的某个网络接口相关的 IP 地址),或是它可以接收其流量的一些其他地址,例如 IP 广播或组播地址。如果是的话,数据报交付给由IPv4 头部的协议字段或 IPv6头部的下一个头部字段指定的协议模块。如果数据报的目的地不是本地IP 模块使用的IP 地址,那么:(1)如果IP 层配置为一台路由器,则转发该数据报(也就是说,作为一个输出的数据报处理);

(2)数据报被默默地丢弃。在某些情况下(例如在情况1中没有路由),ICMP消息可能发送回源节点,以表明发生了一个错误。

5.4.1 转发表

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 地址。

5.4.2 最长前缀匹配法

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

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

如果在转发表中没有发现匹配的条目,这个数据报无法交付。如果在本地出现(在这台主机)无法交付的数据报,通常向生成数据报的应用程序返回一个“主机不可达”错误。在一台路由器上,ICMP 消息通常返回给发送数据报的主机。

在某些情况下,可能有多个条目是匹配的(即为 1 的位数一样)。例如当多个默认路由可用时会发生这种情况(如连接到多个ISP时,称为多宿主)。在这种情况下,通常是简单地选择第一个匹配的结果。更复杂的系统可能尝试在多个路由上平衡负载或拆分流量。

5.4.3 例子

image-20250409175439168

为了对简单的局部环境(例如同一 LAN)和某些更复杂的多跳环境(全球 Internet)中的IP转发工作有深刻的理解,我们将讨论以下两种情况。

  • 第一种情况,所有系统使用相同的网络前缀,这称为直接交付:

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

    image-20250409182308385

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

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

  • 另一种情况为间接交付:

    另一个例子。我们的 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 和R1的网络上完成。R1通过其a侧的低层地址响应后,S 将向 R1发送数据报。S 向 R1交付仅根据低层头部(更具体地说是低层的目的地址)的处理进行。在接收到这个数据报之后,R1将检查自己的转发表。我们预期,R1的转发表包含的信息如下表所示。

    image-20250409183332783

    当 R1 接收到数据报时,它发现数据报的目的IP 地址不是自己,因此它将转发这个数据报。R1 搜索转发表,并使用默认的条目。在这种情况下,该默认条目的下一跳位于 ISP 服务的网络中,即 70.231.159.254(这是 R2 a 侧的接口)。这个地址正好在SBC 的 DSL 网络中,它有一个较长的名称 adsl-70-231-159-254.dsl.snfc21.sbcglobal.net。由于这台路由器位于全球Internet中,并且Windows机器的源地址为私有地址10.0.0.100,R1对数据报进行网络地址转换(NAT),以使它在Internet中可路由。对数据报进行NAT处理,结果是生成新的源地址70.231.132.85,它对应于 R1 的 b 侧接口。不使用私有地址(例如ISP和大型企业)的网络不需要执行最后一步,并且保持原来的源地址不变。当路由器 R2(在 ISP 内部)接收到数据报,它的操作步骤与本地路由器R1 相同(除了NAT 操作外)。如果数据报的目的地不是自己的 IP 地址,则转发这个数据报。在这种情况下,路由器通常不仅有一个默认路由,而且有多个其他路由,这取决于它连接的Internet的其他部分,以及它的本地策略。

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

讨论

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

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

5.5——移动IP

这个模型的假设是一台主机的IP地址与附近主机和路由器共享同一前缀。如果这样一台主机在网络中的连接点改变,但仍保留与链路层网络的连接,它的所有上层(例如TCP)连接将会失效,这是因为它的IP地址必须改变,或路由不能将分组正确交付给(移动后的)主机。

移动IP解决了这个问题。移动IP自身实际上是一种特殊的协议。虽然有各种版本的移动IP——针对IPv4的[RFC5944](称为 MIPv4)和针对 IPv6 的[RFC6275](称为 MIPv6),但我们更关注移动 IPv6,因为它更灵活和更容易解释。另外,它似乎更容易在快速增长的智能手机上应用。它是非常复杂的,我们只介绍它的基本概念和原则。

移动IP 基于一台主机拥有一个“家乡”网络,但可以不时地访问其他网络的想法。当主机位于家乡内部时,普通转发基于上面IP转发的算法。当主机离开家乡时,它保持平时在家乡使用的IP 地址,但采用一些特殊的路由和转发手段,使主机可以在这个网络中与其他系统通信,就好像它仍连接在自己的家乡网络中那样。该方案依赖于一种特殊类型的路由器,它被称为“家乡代理”,用于为移动节点提供路由。

5.5.1 基本模型:双向隧道

基本模型

image-20250409191756113

上图显示了 MIPv6 运行中涉及的实体。大部分术语也适用于 MIPv4。一台可能移动的主机称为移动节点(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分组隧道,称为双向隧道[RFC2473]。这些消息通常使用IPsec的封装安全有效负载(ESP)来保护。这样做可确保一个 HA 不会在接收到一个伪造的 MN 绑定更新时被欺骗。

5.5.2 路由优化

为了改善MIPv6中可能出现的低效路由,可使用一种称为路由优化(RO)的方发,只要它被涉及的各个节点支持。

在使用 RO 时涉及一个通信注册过程,一个 MN 将当前 CoA 通知相应 CN,允许它们执行无须HA协助的路由。RO操作分为两部分:

  • 一部分涉及注册绑定的建立和维护;
  • 另一部分涉及所有绑定建立后的数据报交换方法。

为了与自己的 CN 建立一个绑定,MN 必须向每个 CN 证明自己的真实身份。这通过一个返回路由程序(RRP)来完成。

RRP 使用以下这些移动消息,它们是 IPv6 移动扩展头部的子类型:家乡测试初始化(HoTI)、家乡测试(HoT)、转交测试初始化(CoTI)和转交测试(CoT)。这些消息向CN验证一个特定 MN 的家乡地址(HoTI 和 HoT 消息)和转交地址(CoTI 和 CoT 消息)可到达。这个协议如下图所示。
image-20250409193323284

上图,只有一个MN 及其 HA,以及一个 CN。MN 开始向 CN 发送 HoTI和 CoTI 消息。HoTI 消息在到达 CN 途中通过 HA转发。CN以某种顺序接收到这两种消息,并分别以 HoT 和 CoT消息响应。HoT消息经由HA 发送到 MN。这些消息中包含称为令牌的随机字符串,MN 使用它形成一个加密密钥。随后,这个密钥被用于生成发送给CN的经过认证的绑定更新。如果成功的话,路由可优化,数据可以在MN与 CN 之间直接传输,如下图所示。

image-20250409194132020

当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。

一个节点的 IP 地址可能改变,同时底层的链路层或多或少保持连接。这种用法对于便携式计算机并不常见,它们在不同地点之间移动的过程中,通常会关机或进入休眠状态。在需要移动IP(特别是MIPv6)的使用模型中,更常见的设备是大量采用 IP 的智能手机。这些设备可能会运行有延时要求的实时应用(例如 VoIP)。

5.6——IP数据报的主机处理

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

5.6.1 主机模式

虽然可能有一个简单的决策方法,确定一个单播数据报是否匹配一台主机的IP 地址并被处理,它取决于接收系统的主机模式[RFC1122],以及它是否为最相关的多宿主主机。

这里存在两种主机模式:

  • 强主机模式:只有当目的IP 地址字段中包含的IP地址与数据报到达的接口配置的IP地址匹配时,才同意把将数据报交付本地协议栈。

    主机模式也适用于发送行为。也就是说,只有当接口配置的地址与发送数据报的源 IP地址字段匹配时,这台采用强主机模式的主机才可从这个特定接口发送数据报。

    windows中强主机模式是IPv4 和 IPv6发送和接收的默认模式。Linux中,IP操作默认采用弱主机模式。

  • 弱主机模式:一个数据报携带的目的地址与它到达的任何接口的任何本地地址匹配,无论它到达哪个网络接口,它都会被接收的协议栈处理。

5.6.2 地址选择

当一台主机发送一个IP 数据报时,它必须将自己的 IP 地址写入数据报的源 IP 地址字段,在它已知多个地址的情况下,数据报的目的地址确定一台特定的目的主机。在有些情况下源地址是已知的,这是因为它可以由一个应用程序提供,或者为响应同一连接的前一个分组而发送该分组。
在当前的IP 实现中,数据报的源IP 地址和目的IP 地址字段中使用的IP地址,是通过一组称为源地址选择程序和目的地址选择程序获得的。从历史上来看,大多数Internet主机只有一个IP 地址用于外部通信,因此选择地址并不是很困难。随着一个接口可使用多个地址和支持多个地址范围的 IPv6 的使用,有些程序必须开始使用。当两台实现IPv4 和 IPv6的主机之间通信时,这个情况变得更复杂。地址选择失败可能导致非对称路由、不必要的过滤或丢弃分组。
[RFC3484]给出了IPv6默认地址的选择规则,纯IPv4主机通常不会面临这样复杂的问题。[RFC3484]中的默认规则是:

  • 优先在相同范围内选择成对的源/目的地址。
  • 优先选择更小而不是更大的范围以避免在其他地址可用时使用临时地址
  • 优先选择具有更长的通用前缀的成对地址。
  • 当全球地址有效时,优先选择它而不是临时地址。

默认地址选择通过一个策略表来控制,它(至少在理论上)存在于每台主机中。它是一个最长匹配前缀查找表,类似于IP路由使用的转发表。对于一个地址A,在该表中进行一次查找过程,对A生成一个优先级P(A),以及一个标签L(A)。优先级的数值越大,表示更加偏好。标签用于相似地址类型的分组。例如,如果L(S) = L(D),该算法倾向于使用该对(S,D)作为源 / 目的地址对。如果没有规定其他策略,建议使用下表中的策略值。

image-20250409202220721

这个表或一个按管理配置参数在站点中配置的表,用于驱动地址选择算法。函数CPL(A,B)或“通用前缀长度”,是在IPv6地址A和B中从最左边的位开始的一个最长通用前缀的位长度。函数S(A)将IPv6地址A 的范围映射到一个数值,范围越大,映射的值越大。如果A是链路范围,B是全球范围,则S(A)< S(B)。函数M(A)将IPv4地址A映射为一个 IPv4 映射的 IPv6 地址。由于 IPv4 地址范围是基于地址自身,因此需要定义以下关系:
S(M(169.254.xx)=S(M(127.xxx))<S(M(专用地址空间))<S(M(任何其他地址))。符号A(A)是地址的生命周期。如果A 是一个过期地址(不鼓励使用的地址),而B是一个首选地址(优先选择使用的地址),则A(A)<A(B)。最后,如果A是一个家乡地址,则H(A)为真;如果 A 是一个转交地址,则 C(A)为真。最后两个术语仅用于移动IP 中。

算法。函数CPL(A,B)或“通用前缀长度”,是在IPv6地址A和B中从最左边的位开始的一个最长通用前缀的位长度。函数S(A)将IPv6地址A 的范围映射到一个数值,范围越大,映射的值越大。如果A是链路范围,B是全球范围,则S(A)< S(B)。函数M(A)将IPv4地址A映射为一个 IPv4 映射的 IPv6 地址。由于 IPv4 地址范围是基于地址自身,因此需要定义以下关系:
S(M(169.254.xx)=S(M(127.xxx))<S(M(专用地址空间))<S(M(任何其他地址))。符号A(A)是地址的生命周期。如果A 是一个过期地址(不鼓励使用的地址),而B是一个首选地址(优先选择使用的地址),则A(A)<A(B)。最后,如果A是一个家乡地址,则H(A)为真;如果 A 是一个转交地址,则 C(A)为真。最后两个术语仅用于移动IP 中。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词