计算机网络:原理、协议和实践,第三版 第 1 部分:原则 2 建立网络
转自:Computer Networking : Principles, Protocols and Practice, third edition
链接:https://beta.computer-networking.info/syllabus/default/index.html
- 构建网络
- 数据报组织
- 计算转发表
- 平面或分层地址
- 处理异构数据链层
- 虚拟线路组织
- 控制平面
- 距离矢量路由
- 链路状态路由
- 数据报组织
在上一节中,我们已经解释了可靠协议如何允许主机可靠地交换数据,即使底层物理层不完善并因此不可靠。通过电线将两台主机连接在一起是构建网络的第一步。然而,这还不够。主机通常需要与其他不通过直接物理层链路直接连接的主机进行交互。这可以通过在数据链路层之上添加一层来实现:网络层。
网络层
网络层的主要目标是:允许连接到不同网络的主机通过称为路由器的中间系统交换信息。网络层的信息单位称为数据包。
在解释网络层的操作之前,记住数据链路层提供的服务的特性是很有用的。数据链路层有许多变体。有些提供可靠的服务,而有些则不提供任何交付保证。可靠的数据链路层服务在传输错误频繁的无线网络等环境中很受欢迎。另一方面,当物理层提供几乎可靠的服务时,通常使用不可靠的服务(即只有极少部分的帧受到传输错误的影响)。这种几乎可靠的服务经常用于有线和光网络。在本章中,我们将假设数据链路层服务提供了一个几乎可靠的服务,因为这既是最通用的服务,也是部署最广泛的服务。
有两种主要类型的数据链路层。最简单的数据链路层是当只有两个通信系统通过物理层直接连接时。当两个通信系统之间存在点对点链路时,使用这种数据链路层。这两个系统可以是主机或路由器。PPP(点对点协议),定义在RFC 1661 是这种点对点数据链路层的示例。数据链路层实体交换帧。左侧数据链路层实体发送的数据链路帧通过物理层传输,可以到达右侧数据链路层实体。点对点数据链路层既可以提供不可靠的服务(帧可能损坏或丢失),也可以提供可靠的服务(在这种情况下,数据链路层包括重传机制)。
第二种类型的数据链路层是在局域网 (LAN) 中使用的层。从概念上讲,LAN 是一组通信设备,因此任何两个设备都可以通过数据链路层直接交换帧。主机和路由器都可以连接到 LAN。有的局域网只连接几个设备,但也有可以连接成百上千台设备的局域网。在本章中,我们关注点对点数据链路层的利用。我们稍后将描述局域网的组织和操作以及它们对网络层的影响。
即使我们只考虑点对点数据链路层,这些层也有一个我们不能忽视的重要特征。没有数据链路层能够发送无限大小的帧。每个数据链路层都有一个最大帧大小。有十多个不同的数据链路层,不幸的是,它们中的大多数使用不同的最大帧大小。当我们需要在连接到不同类型数据链路层的主机之间交换数据时,最大帧大小的这种异质性会导致问题。
作为第一步,让我们假设我们只需要交换少量数据。在这种情况下,帧的最大长度没有问题。但是,还有其他更有趣的问题需要我们解决。为了理解这些问题,让我们考虑下图中表示的网络。
该网络包含两种类型的设备。主机用圆圈表示,路由器用方框表示。主机是一种能够发送和接收数据以供自己使用的设备,而路由器在大多数情况下只是将数据转发到其最终目的地。路由器有多个链接到相邻的路由器或主机。主机通常通过单个链接连接到网络。如今,随着无线网络的发展,越来越多的主机配备了多个物理接口。这些主机通常称为多宿主。尽管如此,同时使用多个接口通常会导致超出本文档范围的实际问题。出于这个原因,我们在这本电子书中只考虑单宿主主机。
要了解网络操作背后的关键原理,让我们分析一下需要执行的所有操作,以允许上述网络中的主机 A 向主机 B 发送一个字节。由于在 A-R1 链路之上使用了数据链路层,主机 A 可以轻松地在一个帧内向路由器 R1 发送一个字节。然而,在接收到这个帧后,路由器 R1 需要知道这个字节是发往主机 B 而不是它自己的。这是网络层的目标。
网络层使不通过中间路由器直接连接的主机之间能够传输信息。这种传输是通过将要传输的信息放入称为数据包的数据结构中来执行的。作为包含有用数据和控制信息的帧,数据包还包含用户提供的数据和控制信息。网络层的一个重要问题是:识别网络内部节点(主机或路由器)的能力。该识别是通过将地址与每个节点相关联来执行的。地址_通常表示为一个比特序列。大多数网络使用固定长度的地址。在这个阶段,让我们简单地假设上述网络中的每个节点都有一个地址,该地址对应于图中其名称的二进制表示。
为了向主机 B 发送一个字节的信息,主机 A 需要将该信息放入一个数据包中。除了正在传输的数据之外,数据包还包含源节点和目标节点的地址,或者指示到达目标需要遵循的路径的信息。
网络层有两种可能的组织:
- 数据报
- 虚电路
网络层的第一个也是最流行的组织是数据报组织。该组织的灵感来自邮政服务的组织。每个主机都由一个网络层地址标识。要将信息发送到远程主机,主机会创建一个数据包,其中包含:
- 目的主机的网络层地址
- 自己的网络层地址
- 要发送的信息
为了理解数据报的组织,让我们考虑下图。一个由字母表示的网络层地址已分配给每个主机和路由器。为了向主机J发送一些信息,主机A创建一个包含它自己的地址、目标地址和要交换的信息的数据包。
通过数据报组织,路由器使用逐跳转发。这意味着当路由器接收到一个不是发往自己的数据包时,它会在其转发表中查找该数据包的目标地址。转发表是一种数据结构,它将每个目标地址(或一组目标地址)映射到传出接口,发往该地址的数据包必须通过该传出接口转发以到达其最终目标。路由器查询其转发表来转发它处理的每个数据包。
该图说明了该网络中一些可能的转发表。通过检查不同路由器的转发表,可以找到从源发送到特定目的地的数据包所遵循的路径。在上面的示例中,主机A将其数据包发送到路由器R1。R1查阅其转发表并将数据包转发给R2。根据自己的表,R2决定将数据包转发给R5,R5 可以将其传递到其目的地。因此,从 A 到 J 的路径是 A -> R1 -> R2 -> R5 -> J。
网络内所有路由器的转发表的计算是网络正确运行的关键要素。该计算可以通过使用分布式或集中式算法来执行。这些算法提供不同的性能,可能导致不同类型的路径,但它们的组合必须导致有效路径。
在网络中,路径可以定义为给定 源目标对 的所有中间路由器的列表。对于给定的 源/目标对,可以通过首先查询连接到源的路由器的转发表来确定路径上通往所选目标的下一个路由器,从而得出路径。然后,查询该路由器的转发表是否有相同的目的地……查询将继续,直到到达目的地。在具有有效转发表的网络中,所有源/目标对之间的所有路径都包含有限数量的中间路由器。但是,如果未正确计算转发表,则可能会出现两种类型的无效路径。
一条路径可能导致一个黑洞。在网络中,黑洞是一种路由器,它接收至少一个给定源/目标对的数据包,但在其转发表中没有针对该目标的条目。由于不知道如何到达目的地,路由器无法转发接收到的数据包,必须丢弃它们。任何计算转发表的集中式或分布式算法都必须确保网络内部没有黑洞。
第二类问题可能存在于使用数据报组织的网络中。考虑包含循环的路径。例如,路由器 R1 通过路由器 R2 将所有数据包发送到目的地 D。路由器 R2 将这些数据包转发到路由器 R3 ,最后路由器 R3 的转发表使用路由器 R1 作为其到达目的地 D 的下一跳。在这种情况下,如果路由器 R1 接收到发往 D 的数据包,它将在 R1 -> R2 -> R3 -> R1 上循环循环,永远不会到达最终目的地。与黑洞的情况一样,网络中的所有源都无法到达目的地。实际上,环路问题比黑洞问题更令人讨厌,因为当数据包陷入转发环路时,它会不必要地消耗带宽。在黑洞的情况下,有问题的数据包被迅速丢弃。稍后我们将看到网络层协议包括将此类转发循环的影响降至最低的技术。
任何用于计算网络转发表的解决方案都必须确保所有目的地都可以从任何来源到达。这意味着它必须保证没有黑洞和转发循环。
在网络内部交换的数据包的转发表和精确格式是网络数据平面的一部分。此数据平面包含主机和路由器用于创建和处理包含用户数据的数据包的所有协议和算法。在高端路由器上,出于性能原因,数据平面通常在硬件中实现。
除数据平面外,网络的特征还在于其控制平面。控制平面包括计算转发表的所有协议和算法(通常是分布式的),这些转发表安装在网络内的所有路由器上。虽然对于给定的网络技术只有一个可能的数据平面,但使用相同技术的不同网络可能使用不同的控制平面。
网络最简单的控制平面是手动计算网络内所有路由器的转发表。当网络(非常)小,通常最多几个路由器时,这个简单的控制平面就足够了。
在大多数网络中,手动转发表不是解决方案,原因有两个。首先,大多数网络太大而无法手动计算转发表。其次,使用手动计算的转发表,很难处理链路和路由器故障。网络需要每年 365 天、每天 24 小时运行。许多事件会影响组成网络的路由器和链路。链路故障是已部署网络中的常规事件。链路可能因各种原因而失败,包括电磁干扰、光纤切断、终止路由器上的硬件或软件问题……有些链路还需要添加到网络中或从网络中删除,因为它们的利用率太低或成本太高.
同样,路由器也会失败。有两种类型的故障会影响路由器。由于硬件或软件问题(例如,由于其操作系统崩溃),路由器可能会停止转发数据包。路由器可能还需要不时停止(例如,升级其操作系统或安装新的接口卡)。这些计划内和计划外事件会影响可用于在网络中转发数据包的一组链路和路由器。尽管如此,大多数网络用户仍希望他们的网络将继续正确转发数据包,尽管发生了所有这些事件。使用手动计算的转发表,通常不可能在考虑所有可能的故障情况的同时预先计算转发表。
手动计算转发表的替代方法是使用网络管理平台,该平台跟踪网络状态,并在检测到对网络拓扑的任何修改时将新的转发表推送到路由器上。该解决方案为网络管理员在计算其网络内的路径时提供了一些灵活性。但是,该解决方案仅在网络管理平台始终能够到达所有路由器的情况下才有效,即使网络拓扑发生变化。这可能需要一个允许管理平台在转发表上推送信息的专用网络。Openflow 是此类解决方案的现代示例MAB2008. 简而言之,Openflow 是一种协议,它使网络控制器能够在远程路由器的转发表中安装特定条目等等。
另一个值得讨论的有趣点是何时计算转发表。一种广泛使用的解决方案是计算所有路由器上所有目的地的转发表条目。这确保了每个路由器都有一条通往每个目的地的有效路由。当事件发生并且网络拓扑发生变化时,可以更新这些条目。这种方法的一个缺点是转发表在大型网络中可能会变得很大,因为每个路由器必须始终在其转发表中为每个目的地维护一个条目。
一些网络使用数据包的到达作为触发器来计算转发表中的相应条目。一些技术已经建立在这个原则之上。当数据包到达时,路由器会查询其转发表以找到通往目的地的路径。如果目标存在于转发表中,则转发数据包。否则,路由器需要找到一种方法来转发数据包并更新其转发表。
网络部署了多种技术来在数据包到达时更新转发表。在本节中,我们将简要介绍其中三种技术的基本原理。
第一种技术假设底层网络拓扑是一棵树。树是转发数据包时要考虑的最简单的网络。使用树的主要优点是网络内任何一对节点之间只有一条路径。由于一棵树不包含任何循环,因此在树形网络中不可能有转发循环。
在树形网络中,每个节点通过检查其接收到的数据包来自动计算其转发表是相对简单的。为此,每个节点都使用每个数据包中存在的源地址和目标地址。由于源地址,节点可以了解网络内不同源的位置。每个来源都有一个唯一的地址。当一个节点通过给定接口接收到一个数据包时,它会知道这个数据包的源(地址)可以通过这个接口到达。该节点维护一个将每个已知源地址映射到传入接口的数据结构。这种数据结构通常称为端口地址表,因为它指示接口(或端口)到达给定地址。
仅了解源的位置是不够的,节点还需要将数据包转发到它们的目的地。当一个节点收到一个目标地址已经存在于其端口地址表中的数据包时,它只是在端口地址表中列出的接口上转发该数据包。在这种情况下,数据包将遵循下游节点中的端口地址表条目并到达目的地。如果目的地址不包括在端口地址表中,则节点仅在其所有接口上转发数据包,但接收数据包的接口除外。通过所有接口转发数据包通常称为广播在计算机网络的术语中。通过除一个以外的所有接口发送数据包是一项昂贵的操作,因为数据包是通过未到达目的地的链路发送的。给定网络的树形,数据包将探索树的所有下游分支并最终到达目的地。在实践中,广播操作不会经常发生,其性能影响仍然有限。
为了理解端口地址表的操作,让我们考虑下图所示的示例网络。该网络包含三台主机:A、B和C,以及五台路由器,R1到R5。当网络启动时,所有节点的转发表都是空的。
主机A向B发送一个数据包。当接收到这个数据包时,R1得知A可以通过它的West接口到达。由于它的端口地址表中没有目的地B的条目,因此它将数据包转发到R2和R3。当R2收到数据包时,它会更新自己的转发表并将数据包转发给C。由于C不是预期的接收者,它只是丢弃接收到的数据包。路由器R3也接收该数据包。它知道A可以通过它的西北到达接口并将数据包广播到R4和R5。R5还更新其转发表并最终将其转发到目的地B。现在让我们考虑当B向A发送回复时会发生什么。R5 首先得知B连接到其东北端口。然后它查阅其端口地址表并发现A可通过其西北接口到达。然后,该数据包被逐跳转发到A,而不进行任何广播。稍后,如果C向B发送一个数据包,该数据包将到达在其转发表中包含有效转发表项的R1 。
通过检查数据包的源地址和目的地址,网络节点可以自动导出它们的转发表。正如我们稍后将讨论的,这种技术用于以太网。尽管被广泛使用,但它有两个重要的缺点。首先,即使目的地没有连接到网络,发送到未知目的地的数据包也会在网络中广播。考虑上述网络中以Z为目的地的十个数据包的传输。当一个节点接收到一个发往该目的地的数据包时,它只能广播该数据包。由于Z没有连接到网络,因此没有节点会收到源为Z的数据包更新其转发表。第二个也是更重要的问题是很少有网络具有树形拓扑。分析在包含循环的网络中使用端口地址表时会发生什么是很有趣的。考虑下面显示的具有单个主机的简单网络。
假设网络已经启动并且所有的端口地址和转发表都是空的。主机A向B发送一个数据包。收到此数据包后,R1会更新其端口地址表。由于B不在端口地址表中,因此该数据包被广播。R2和R3都收到A发送的数据包的副本。他们都更新了他们的端口地址表。不幸的是,它们也都广播了接收到的数据包。B收到数据包的第一个副本,但R3和R2再次收到它。然后R3将这个数据包的副本广播给B和R1而R2将其副本广播到R1。虽然B已经收到了两份数据包,但它仍然在网络内部并继续循环。由于循环的存在,发往未知目的地的单个数据包会生成该数据包的许多副本,这些副本会循环并最终使网络饱和。使用端口地址表自动计算转发表的网络运营商也使用分布式算法来确保网络拓扑始终是一棵树。
另一种称为源路由的技术可用于自动计算转发表。它已用于互连令牌环网络和一些无线网络。直观地说,源路由使目的地能够自动发现从给定源到自身的路径。这种技术需要节点在一些数据包内编码信息。为简单起见,让我们假设数据平面支持两种类型的数据包:
- 数据包
- 控制包
数据包用于交换数据,而控制包用于发现主机之间的路径。使用源路由,可以使路由器尽可能简单,并将所有复杂性放在主机上。这与以前的技术形成对比,在以前的技术中,节点必须维护一个端口地址和一个转发表,而主机只是发送和接收数据包。每个节点都配置有一个唯一地址,并且每个传出链路都有一个标识符。为简单起见并避免将这些标识符与数字混淆,我们假设每个节点都使用北、西、南…
在上面的网络中,路由器R2连接到两个传出链路。R2连接到R1和R3。通过与这两个节点交换数据包或观察它通过每个接口接收的数据包,R2可以很容易地确定它连接到这两个节点。例如,假设当一个节点(主机或路由器)启动时,它会通过其每个接口发送一个特殊的控制数据包,以将其自己的地址通告给它的邻居。当一个节点收到这样的数据包时,它会自动回复它自己的地址。此交换还可用于验证邻居(路由器或主机)是否仍然存在。使用源路由,数据平面数据包包括标识符列表。该列表称为源路由。它以链路标识符序列的形式指示数据包要遵循的路径。当节点接收到这样的数据平面数据包时,它首先检查数据包的目的地是否是直接邻居。在这种情况下,数据包被转发到这个邻居。否则,节点从列表中提取下一个地址并将其转发给邻居。这允许源为每个数据包指定要遵循的显式路径。例如,在上图中,A和B之间有两条可能的路径。要使用通过R2的路径,A将发送一个包含R1,R2,R3的数据包作为源路线。为了避免通过R2,A会将R1,R3作为其传输数据包中的源路由。如果A知道完整的网络拓扑和所有链路标识符,它就可以轻松地计算到每个目的地的源路由。它甚至可以使用不同的路径(例如为了冗余)到达给定的目的地。然而,在真实网络中的主机通常没有整个网络拓扑图。
在依赖源路由的网络中,主机使用控制数据包自动发现最佳路径。除了源地址和目的地址之外,控制数据包还包含一个记录中间节点的列表。该列表通常称为记录路由,因为它允许记录给定数据包所遵循的路由。当一个节点收到这样一个控制包时,它首先检查它的地址是否包含在记录路由中。如果是,则该数据包已被该节点转发,并被静默丢弃。否则,它将自己的地址添加到记录路由并将数据包转发到它的所有接口,除了接收数据包的接口。多亏了这一点,控制包可以探索源和给定目的地之间的所有路径。
例如,再次考虑上面的网络拓扑。A向B发送控制数据包。初始记录路径为空。当R1收到数据包时,它会将自己的地址添加到记录路由中,并将副本转发给R2,将另一个副本转发给R3。R2收到数据包,将自己添加到记录路由并将其转发给R3。R3接收到数据包的两个副本。第一个包含[R1,R2] 记录路由和第二个[R1]。最后,B将接收两个包含 [R1,R2,R3,R4]和[R1,R3,R4]的控制数据包作为记录路由。B可以保留这两条路径,或者选择最好的一条并丢弃第二条。一种流行的启发式方法是选择第一个接收到的数据包的记录路由作为最佳路由,因为这可能对应于最短延迟路径。
有了收到的记录路由,B就可以向A发送一个数据包。为此,它只是反转所选的记录路线。但是,我们仍然需要将选择的路径传达给A。这可以通过将记录路由放入控制数据包中来完成,该控制数据包通过反向路径发送回A。另一种方法是简单地将数据包发送回A。该数据包将返回A。为了让A检查数据包所遵循的整个路径,它的源路由当A接收到它时,它必须包含所有中间路由器。这可以通过使用包含索引和有序节点地址列表的数据结构对源路由进行编码来实现。索引总是指向源路由中的下一个地址。它在每个中间节点创建和递增数据包时初始化为0 。
计算转发表的第三种技术是依靠使用分布式算法的控制平面。路由器交换控制消息以发现网络拓扑并基于它们构建转发表。我们将在本节后面对此类分布式算法进行更详细的描述。
关于依赖数据报模式的网络的数据平面,最后但重要的一点是它们的寻址方案。在上面的示例中,我们使用字母来表示主机和网络节点的地址。实际上,所有地址都被编码为位串。大多数网络技术使用固定大小的位串来表示源地址和目标地址。这些地址可以以两种不同的方式组织。
第一个组织,也是我们迄今为止隐含假设的组织,是平面寻址方案。在这种方案下,每个主机和网络节点都有一个唯一的地址。地址的唯一性对于网络的运行很重要。如果两台主机具有相同的地址,网络将很难将数据包转发到该目的地。平面地址通常用于网络节点和主机需要能够立即与唯一地址通信的情况。这些平面地址通常嵌入在网络接口卡中。网卡制造商为每个接口创建一个唯一的地址,该地址存储在接口的只读存储器中。这种寻址方案的一个优点是它很容易支持非结构化和移动网络。当主机移动时,它可以连接到另一个网络,并确信其地址是唯一的,并使其能够在新网络内进行通信。
使用平面寻址,转发表中的查找操作可以实现为精确匹配。转发表包含所有已知目标地址的(排序的)列表。当一个数据包到达时,网络节点只需要检查这个地址是否包含在转发表中。在软件中,如果列表已排序,这是一个O(log(n))操作。在硬件中,内容可寻址存储器 (Content Addressable Memories)可以有效地执行这种查找操作,但它们的大小通常是有限的。
平面寻址方案的缺点是转发表随着网络中主机和路由器的数量线性增长。使用此寻址方案,每个转发表必须包含一个条目,该条目指向网络内部可到达的每个地址。由于大型网络可能包含数千万甚至更多的主机,这对于需要能够快速转发数据包的路由器来说是一个主要问题。作为说明,考虑以 10 Gbps 运行的接口的情况很有趣。如今,在高端服务器和各种路由器中都可以找到此类接口。假设数据包大小为 1000 位,这是一个相当大且保守的数字,这样的接口每秒必须转发一千万个数据包。这意味着通过此类链路接收数据包的路由器必须每 100 纳秒转发一个 1000 位的数据包。
一种广泛使用的平面寻址方案的替代方案是分层寻址方案。这种寻址方案建立在网络通常包含比路由器多得多的主机这一事实的基础上。在这种情况下,减少转发表大小的第一个解决方案是创建地址层次结构。这是邮局选择的解决方案,因为邮政地址包含国家(有时是州或省)、城市、街道,最后是门牌号。当一个信封被异地的邮局转寄时,它只看目的地国家,而同省的邮局会看城市信息。只有负责给定城市的邮局才会查看街道名称,并且只有邮递员会使用街道号码。分层地址为网络地址提供了类似的解决方案。例如,连接到校园网络的 Internet 主机的地址可以在高阶位中包含为校园网络提供服务的 Internet 服务提供商 (ISP) 的标识。然后,随后的位块标识校园网,它是 ISP 的客户之一。最后,地址的低位标识校园网中的主机。
这种分层的地址分配可以应用于任何类型的网络。实际上,地址的分配必须遵循网络拓扑。通常,这是通过将寻址空间划分为连续的块,然后将这些块分配给网络的不同部分来实现的。在小型网络中,最简单的解决方案是为每个网络节点分配一个地址块,并从所连接的节点分配主机地址。
在上图中,假设网络使用 16 位地址,并且前缀 01001010 已分配给整个网络。由于网络包含四个路由器,网络运营商可以为每个路由器分配一组 64 个地址。R1 将使用地址 0100101000000000 而 A 可以使用地址 0100101000000001。可以为 R2 分配从 0100101001000000 到 0100101001111111 的所有地址。R4 然后可以使用 0100101011000000 并将 0100101011000001 分配给 B . 其他分配方案也是可能的。例如,可以为 R3 分配比 R2 更大的地址块,并且 R4 可以使用 R3 的地址块中的子块。
类型 | 描述 |
---|---|
R1 | 0100101000000000 |
A | 0100101000000001 |
R2 | 0100101001000000 |
R2 | 0100101001111111 |
R4 | 0100101011000000 |
B | 0100101011000001 |
分层地址的主要优点是可以显着减小转发表的大小。在许多网络中,路由器的数量可能比主机的数量少几个数量级。一个校园网可能包含十几台路由器和几千台主机。最大的 Internet 服务提供商通常包含不超过几万个路由器,但仍为数千万或数亿主机提供服务。
尽管它们很受欢迎,但分层地址有一些缺点。他们的第一个缺点是转发表中的查找比使用平面地址时更复杂. 例如,在互联网上,网络节点必须执行最长匹配来转发每个数据包。这通过转发表大小的减少得到部分补偿,但是查找操作的额外复杂性一直是实现数据包转发的硬件支持的困难。使用分层地址的第二个缺点是当主机第一次连接到网络时,它必须联系一个路由器以确定它自己的地址。这需要在主机和一些路由器之间进行一些数据包交换。此外,如果主机移动并连接到另一台路由器,其网络地址也会发生变化。这可能是某些移动主机的问题。
有时,网络层需要处理异构数据链路层。例如,连接到不同数据链路层的两台主机通过使用其他类型数据链路层的路由器交换数据包。多亏了网络层,这种数据包交换是可能的,前提是每个数据包在传输之前都可以放在数据链路层帧中。如果所有数据链路层都支持相同的帧大小,这很简单。当一个节点收到一个帧时,它解封装它包含的数据包,检查报头并将它转发,封装在另一个帧中,到传出接口。不幸的是,封装操作并不总是可行的。每个数据链路层都以其支持的最大帧大小为特征。数据链路层通常支持最多包含数百或数千字节的帧。给定数据链路层支持的最大帧大小取决于其底层技术。不幸的是,大多数数据链路层支持不同的最大帧大小。这意味着当主机将帧内的大数据包发送到其下一跳路由器时,存在该数据包必须穿越无法在单个帧内转发数据包的链路的风险。原则上,存在三种可能来解决这个问题。为了讨论它们,我们考虑一个简单的场景,其中两台主机连接到路由器,如下图所示。这意味着当主机将帧内的大数据包发送到其下一跳路由器时,存在该数据包必须穿越无法在单个帧内转发数据包的链路的风险。原则上,存在三种可能来解决这个问题。为了讨论它们,我们考虑一个简单的场景,其中两台主机连接到路由器,如下图所示。这意味着当主机将帧内的大数据包发送到其下一跳路由器时,存在该数据包必须穿越无法在单个帧内转发数据包的链路的风险。原则上,存在三种可能来解决这个问题。为了讨论它们,我们考虑一个简单的场景,其中两台主机连接到路由器,如下图所示。
考虑在上面的网络中,主机 A 想要通过路由器 R1 向主机 B 发送一个 900 字节的数据包(870 字节的有效载荷和 30 字节的标头)。主机A将此数据包封装在一个帧中。该帧由提取数据包的路由器R1接收。路由器R1有三个可能的选项来处理此数据包。
- 数据包太大,路由器R1无法将其转发到路由器R2。它拒绝数据包并将控制数据包发送回源(主机A)以指示它不能转发长度超过 500 字节(减去数据包标头)的数据包。源可以通过在较小的数据包中重新传输信息来对此控制数据包做出反应。
- 网络层能够对数据包进行分段。在我们的示例中,路由器可以将数据包分成两部分。第一部分包含有效载荷的开头,第二部分包含结尾。有两种可能的方法来执行此分段。
- 路由器R1将数据包分成两个片段,然后将它们传输到路由器R2。路由器R2将两个数据包片段重新组装成一个更大的数据包,然后在链路上将它们传输到主机B。
- 每个数据包片段都是一个有效的数据包,其中包含带有源(主机A)和目标(主机B)地址的标头。当路由器R2收到数据包片段时,它将此数据包视为常规数据包并将其转发到最终目的地(主机B)。主机B重新组装接收到的片段。
这三种解决方案各有优缺点。使用第一种解决方案,路由器仍然很简单,不需要执行任何分片操作。当路由器主要以硬件实现时,这一点很重要。然而,主机必须是复杂的,因为如果它们需要通过不支持大数据包的链路,它们需要存储它们产生的数据包。这会增加主机所需的缓冲。
此外,单个大数据包可能需要多次重传。例如,考虑一个与上图类似但有四个路由器的网络。假设链路 R1->R2 支持 1000 字节数据包,链路 R2->R3 支持 800 字节数据包,链路 R3->R4 支持 600 字节数据包。连接到 R1 的发送大数据包的主机必须首先尝试 1000 字节,然后是 800 字节,最后是 600 字节。幸运的是,这种情况在实践中并不经常发生,这就是为什么在实际网络中使用该解决方案的原因。
以每个链路为基础对数据包进行分段,如第二种解决方案所示,可以最大限度地减少传输开销,因为数据包仅在需要分段的链路上进行分段。大数据包可以继续在仅接受小数据包的链路的下游使用。然而,这种开销的减少带来了两个缺点。首先,分段数据包(可能在所有链路上)会增加路由器的处理时间和缓冲区要求。其次,此解决方案会导致更长的端到端延迟,因为下游路由器必须在转发数据包之前重新组装所有数据包片段。
最后一个解决方案是其他两个之间的折衷方案。路由器需要执行分片,但不需要重新组装数据包片段。只有主机需要有缓冲区来重组接收到的片段。该解决方案具有较低的端到端延迟,并且需要较少的路由器处理时间和内存。
上面提出的分段问题的第一个解决方案建议使用控制数据包来通知源接收到一个太长的数据包。这只是网络层控制协议执行的功能之一。其他功能包括:
- 如果路由器收到的数据包在其转发表中没有有效条目,则将控制数据包发送回源
- 如果路由器检测到数据包在网络内部循环,则将控制数据包发送回源
- 验证数据包是否可以到达给定的目的地
当我们描述在 TCP/IP 协议族的网络层中使用的协议时,我们将更详细地讨论这些功能。
网络层的第二种组织方式,称为虚电路, 受到电话网络组织的启发。电话网络被设计用来承载通常持续几分钟的电话呼叫。每部电话都由电话号码标识,并连接到电话交换机。要发起电话呼叫,电话首先需要将目的地的电话号码发送到其本地交换机。该交换机与网络中的其他交换机协作,通过网络在两部电话之间创建双向通道。该信道将在通话期间由两部电话使用,并在通话结束时释放。直到 1960 年代,这些频道中的大部分都是由电话接线员根据呼叫者的要求手动创建的。今天的电话网络使用自动交换机并允许在同一物理链路上传输多个信道,
在使用虚电路的网络中,所有的主机也用一个网络层地址来标识。然而,数据包转发并不是通过查看每个数据包的目的地地址来执行的。采用虚电路组织,每个数据包包含一个标签[1]。标签是一个整数,它是数据包标头的一部分。路由器实现标签交换来转发带标签的数据包。收到数据包后,路由器会查询其标签转发表以找到该数据包的传出接口。与数据报模式相比,这种查找非常简单。标签转发表是一个存储在内存中的数组,传入数据包的标签是访问该数组的索引。这意味着与其他数据包转发技术相比,查找操作的复杂度为O(1) 。为确保每个节点上的数据包标签是标签转发表中的一个索引,每个转发数据包的路由器都将转发数据包的标签替换为在标签转发表中找到的标签。标签转发表的每个条目包含两条信息:
- 数据包的传出接口
- 传出数据包的标签
例如,考虑下面网络节点的标签转发表。
指数 | 出接口 | 标签 |
---|---|---|
0 | 南 | 7 |
1个 | 没有任何 | 没有任何 |
2个 | 西方 | 2个 |
3个 | 东方 | 2个 |
如果此节点收到标签为 2 的数据包,它会在其西向接口上转发该数据包,并将传出数据包的标签设置为2。如果接收到的数据包的标签设置为3 ,则数据包通过East接口转发,而传出数据包的标签设置为2。如果接收到标签字段设置为1 的数据包,则丢弃该数据包,因为相应的标签转发表条目无效。
标签交换可以完全控制网络内数据包所遵循的路径。考虑下面的网络并假设我们要使用两个虚拟电路:R1->R3->R4->R2->R5和R2->R1->R3->R4->R5。
平面寻址(Flat addressing)VS 分层寻址(Hierarchical addressing)
类型 | 描述 | 举例 |
---|---|---|
平面寻址 | 地址按照顺序 | MAC 地址 |
分层寻址 | 地址按照不同层级,包含网络部分和端口部分 | IP 地址 |