计算机网络-06

 

第六章 链路层和局域网

我们将在本章中探究几个链路层概念和技术 。 我们将更深入地研究差错检测和纠正,这个主题我们在第 3 章中简要讨论过 。 我们将考虑多路访问网络和交换局域网, 包括以太网,这是目前最流行的有线局域网技术 。 我们还将学习虚拟局域网和数据中心网络 。

6.1 链路层概述

数据链路层的最基本的功能是向该层用户提供透明的和可靠的数据传送基本服务。透明性是指该层上传输的数据的内容、格式及编码没有限制,也没有必要解释信息结构的意义;可靠的 传输使用户免去对丢失信息、干扰信息及顺序不正确等的担心。在物理层中这些情况都可能发生,在数据链路层中必须用纠错码来检错与纠错。数据链路层是对物理层传输原始比特流的功能的加强,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一无差错的线路。【来源:百度百科

我们首先学习一些有用的术语 。 在本章中为方便讨论, 将运行链路层协议(即第 2层)协议的任何设备均称为节点 ( node ) 。节点包括主机 、 路由器、交换机和 WiFi 接入点。 我们也把沿着通信路径连接相邻节点的通信信道称为链路 ( link ) 。为了将一个数据报从源主机传输到目的主机 , 数据报必须通过沿端到端路径上的各段链路传输 。举例来说, 显示在图 6-1 下部的公司网络中 ,考虑从无线主机之一向服务器之一发送一个数据报 。 该数据报将实际通过 6 段链路: 发送主机与 WiFi 接入点之间的 WiFi 链路, 接入点和链路层交换机之间的以太网链路,链路层交换机与路由器之间的链路, 两台路由器之间的链路, 最后是交换机和服务器之间的以太网链路 。 在通过特定的链路时 ,传输节点将数据报封装在链路层帧中 , 并将该帧传送到链路中。

image-20220513000933271

为了透彻理解链路层以及它是如何与网络层关联的, 我们考虑一个交通运输的类比例子 。假如一个旅行社计划为游客开辟从美国新泽西州的普林斯顿到瑞士洛桑的旅游路线 。假定该旅行社认为对于游客而言最为便利的方案是 : 从普林斯顿乘豪华大轿车到 JFK 机场 , 然后乘飞机从 JFK 机场去日内瓦机场 , 最后乘火车从日内瓦机场到洛桑火车站 。一旦该旅行社作了这 3 项预定 , 普林斯顿豪华大轿车公司将负责将游客从普林斯顿带到 JFK,航空公司将负责将游客从 JFK 带到日内瓦,瑞士火车服务将负责将游客从日内瓦带到洛桑 。 该旅程中 3 段中的每一段都在两个“ 相邻 ” 地点之间是 “ 直达的 ”。 注意到这 3 段运输是由不同的公司管理, 使用了完全不同的运输方式 (豪华大轿车 、 飞机和火车) 。 尽管运输方式不同 , 但它们都提供了将旅客从一个地点运输到相邻地点的基本服务。 在这个运输类比中 , 一个游客好比一个数据报 , 每个运输区段好比一条链路, 每种运输方式好比一种链路层协议,而该旅行社好比一个路由选择协议 。

6.1.1 链路层提供的服务

  • 成帧(framing)。在每个网络层数据报经链路传送之前 , 几乎所有的链路层协议都要将其用链路层帧封装起来 。一个帧由一个数据字段和若干首部字段组成 , 其中网络层数据报就插在数据字段中。 帧的结构由链路层协议规定 。
  • 链路接入。 媒体访问控制 ( Medium Access Control, MAC) 协议规定了帧在链路上传输的规则。 对于在链路的一端仅有一个发送方 、 链路的另一端仅有一个接收方的点对点链路, MAC 协议比较简单 ( 或者不存在 ), 即无论何吋链路空闲, 发送方都能够发送帧 。 更有趣的情况是当多个节点共享单个广播链路时 , 即所谓多路访问问题 。这里, MAC 协议用于协调多个节点的帧传输 。
  • 可靠交付。当链路层协议提供可靠交付服务时 , 它保证无差错地经链路层移动每个网络层数据报 。前面讲过, 某些运输层协议( 例如 TCP) 也提供可靠交付服务。与运输层可靠交付服务类似 ,链路层的可靠交付服务通常是通过确认和重传取得的( 参见 3. 4 节) 。
  • 差错检测和纠正。当帧中的一个比特作为 1 传输时 , 接收方节点中的链路层硬件可能不正确地将其判断为 0, 反之亦然 。 这种比特差错是由信号衰减和电磁噪声导致的 。通过让发送节点在帧中包括差错检测比特,让接收节点进行差错检查 , 以此来完成这项工作。

6.1.2 链路层在何处实现

图 6-2 显示了一个典型的主机体系结构 “ 链路层的主体部分是在网络适配器 ( network adapter) 中实现的,网络适配器有时也称为网络接口卡 ( Network Interface Card , NIC)。位于网络适配器核心的是链路层控制器 ,该控制器通常是一个实现了许多链路层服务 ( 成帧 、 链路接入、 差错检测等)的专用芯片 。 因此 ,链路层控制器的许多功能是用硬件实现的。

image-20220514140114351

在发送端, 控制器取得了由协议栈较高层生成并存储在主机内存中的数据报 , 在链路层帧中封装该数据报 ( 填写该帧的各个字段 ), 然后遵循链路接入协议将该帧传进通信链路中。 在接收端, 控制器接收了整个帧 , 抽取出网络层数据报 。 如果链路层执行差错检测 , 则需要发送控制器在该帧的首部设置差错检测比特,由接收控制器执行差错检测 。

图 6-2 显示了与主机总线( 例如一条 PCI 或 PCI-X 总线)连接的网络适配器 ,这里它看起来非常像与其他主机组件连接的任何其他 I/O 设备 。 图 6-2 还显示了尽管大部分链路层是在硬件中实现的, 但部分链路层是在运行于主机 CPU 上的软件中实现的 。 链路层的软件组件实现了高层链路层功能, 如组装链路层寻址信息和激活控制器硬件。 在接收端,链路层软件响应控制器中断 ( 例如 ,由于一个或多个帧的到达), 处理差错条件和将数据报向上传递给网络层 。 所以 ,链路层是硬件和软件的结合体 , 即此处是协议栈中软件与硬件交接的地方 。

6.2 差错检测和纠正技术

在上一节中 , 我们提到了比特级差错检测和纠正 ( bit-level error detection and correc­tion) , 即对从一个节点发送到另一个物理上连接的邻近节点的链路层帧中的比特损伤进行检测和纠正 , 它们通常是链路层提供的两种服务。

图 6-3 图示说明了我们研究的环境 。 在发送节点 , 为了保护比特免受差错, 使用差错检测和纠正比特 ( Error- Detection and- Correction , EDC) 来增强数据 D 。 通常 ,要保护的数据不仅包括从网络层传递下来需要通过链路传输的数据报 ,而且包括链路帧首部中的链路级的寻址信息 、 序号和其他字段 。 链路级帧中的 D 和 &DC 都被发送到接收节点 。 在接收节点 , 接收到比特序列D’ 和 EDC’ 。 注意到因传输中的比特翻转所致, D 和EDC , 可能与初始的 D 和 EDC 不同。

image-20220514140934395

图 6-3 中的接收方判定的准确措辞( 我们问是否检测到一个差错,而非是否出现了差错!)是重要的 。 差错检测和纠正技术使接收方有时但并总是检测出已经出现的比特差错 。即使采用差错检测比特, 也还是可能有未检出比特差错( undetected bit error) ;这就是说, 接收方可能无法知道接收的信息中包含着比特差错 。 因此 , 接收方可能向网路层交付一个损伤的数据报 , 或者不知道该帧首部的某个其他字段的内容已经损伤。 我们因此要选择一个差错检测方案 , 使得这种事件发生的概率很小 。一般而言, 差错检测和纠错技术越复杂( 即那些具有未检测出比特差错概率较小的技术 ), 导致的开销就越大 ,这就是意味着需要更多的计算量及更多的差错检测和纠错比特 。

在传输数据中检测差错的 有3 种技术:

  • 奇偶校验
  • 检验和方法
  • 循环冗余校验

6.3 多路访问链路和协议

在本章概述中 , 我们提到了有两种类型的网络链路: 点对点链路和广播链路 。 点对点链路 ( point-to-point link) 由链路一端的单个发送方和链路另一端的单个接收方组成 。 许多链路层协议都是为点对点链路设计的, 如点对点协议 ( point-to-point protocol , PPP)高级数据链路控制( high-level data link control , HDLC) 就是两种这样的协议, 我们将在本章后面涉及它们。 第二种类型的链路是广播链路 ( broadcast link ), 它能够让多个发送和接收节点都连接到相同的 、单一的 、共享的广播信道上。 这里使用术语 “ 广播 ” 是因为当任何一个节点传输一个帧时 , 信道广播该帧 , 每个其他节点都收到一个副本 。以太网和无线局域网是广播链路层技术的例子 。 在本节, 我们暂缓讨论特定的链路层协议,而先研究一个对链路层很重要的问题: 如何协调多个发送和接收节点对一个共享广播信道的访问,这就是多路访问问题 ( muhiple access problem ) 。 广播信道通常用于局域网中 , 局域网是一个地理上集中在一座建筑物中(或者在一个公司 , 或者在大学校园)的网络 。 因此我们还将在本节后面考察一下多路访问信道是如何在局域网中使用的 。

多路访问协议( multiple access protocol ) , 即节点通过这些协议来规范它们在共享的广播信道上的传输行为。 如图 6-8 所示, 在各种各样的网络环境下需要多路访问协议, 包括有线和无线接入网, 以及卫星网络 。 尽管从技术上讲每个节点通过它的适配器访问广播信道, 但在本节中我们将把节点作为发送和接收设备 。 在实践中 , 数以百计或者甚至数以千计个节点能够通过一个广播信道直接通信。

image-20220514141738455

因为所有的节点都能够传输帧 , 所以多个节点可能会同时传输帧 。 当发生这种情况时 ,所有节点同时接到多个帧 ;这就是说, 传输的帧在所有的接收方处碰撞 ( collide)。通常 , 当碰撞发生时 , 没有一个接收节点能够有效地获得任何传输的帧 ; 在某种意义下 ,碰撞帧的信号纠缠在一起 。 因此 , 涉及此次碰撞的所有帧都丢失了 , 在碰撞时间间隔中的广播信道被浪费了。 显然 , 如果许多节点要频繁地传输帧 ,许多传输将导致碰撞 , 广播信道的大量带宽将被浪费掉 。

多个节点处于活跃状态时 , 为了确保广播信道执行有用的工作 , 以某种方式协调活跃节点的传输是必要的 。 这种协调工作由多路访问协议负责 。

这些年来 , 在大量的链路层技术中已经实现了几十种多路访问协议 。 尽管如此 , 我们 能够将任何多路访问协议划分为 3 种类型之一 : 信道划分协议 ( channel partitioning proto­col) , 随机接入协议 ( random access protocol)轮流协议( taking-turns protocol)

6.4 交换局域网

图 6 -15 显示了一个交换局域网连接了 3 个部门, 两台服务器和一台与 4 台交换机连接的 路由器。 因为这些交换机运行在链路层 , 所以它们交换链路层帧 (而不是网络层数据报 ),不识别网络层地址 , 不使用如 RIP 或 OSPF 这样的路由选择算法来确定通过第二层交换机网络的路径 。 我们马上就会看到 , 它们使用链路层地址而不是 IP 地址来转发链路层帧通过交换机网络 。

image-20220514143404395

6.4.1 链路层寻址和 ARP

主机和路由器具有链路层地址 。 现在你也许会感到惊讶,第 4 章中不是讲过主机和路由器也具有网络层地址吗 ? 你也许会问: 为什么我们在网络层和链路层都需要地址呢 ?除了描述链路层地址的语法和功能, 在本节中我们希望明明白白地搞清楚两层地址都有用的原因 , 事实上这些地址是必不可少的 。 我们还将学习地址解析协议 ( ARP), 该协议提供了将 IP 地址转换为链路层地址的机制。

  • MAC 地址

事实上 , 并不是主机或路由器具有链路层地址 ,而是它们的适配器 ( 即网络接口 ) 具有链路层地址 。 因此 , 具有多个网络接口的主机或路由器将具有与之相关联的多个链路层地址 , 就像它也具有与之相关联的多个 IP 地址一样 。 然而,重要的是注意到链路层交换机并不具有与它们的接口 (这些接口是与主机和路由器相连的)相关联的链路层地址 。 这是因为链路层交换机的任务是在主机与路由器之间承载数据报 ; 交换机透明地执行该项任务 ,这就是说, 主机或路由器不必明确地将帧寻址到其间的交换机 。 图 6 ・ 16 中说明了这种情况。 链路层地址有各种不同的称呼 : LAN 地址 ( LAN address)物理地址 ( physical address )MAC 地址 ( MAC address ) 。 因为 MAC 地址似乎是最为流行的术语, 所以我们此后就将链路层地址称为 MAC 地址 。 对于大多数局域网( 包括以太网和 802. 11 无线局域网)而言, MAC 地址长度为 6 字节, 共有 $2^{48}$个可能的 MAC 地址 。 如图 6-16 所示,这些 6个字节地址通常用十六进制表示法 , 地址的每个字节被表示为一对十六进制数 。 尽管MAC 地址被设计为永久的, 但用软件改变一块适配器的 MAC 地址现在是可能的 。 然而,对于本节的后面部分而言, 我们将假设某适配器的MAC 地址是固定的 。

image-20220514143811380

MAC 地址的一个有趣性质是没有两块适配器具有相同的地址 。 考虑到适配器是由许多不同国家和地区的不同公司生产的,这看起来似乎是件神奇之事。中国台湾生产适配器的公司如何能够保证与比利时生产适配器的公司使用不同的地址呢 ?答案是 IEEE 在管理着该 MAC 地址空间 。 特别是 , 当一个公司要生产适配器时 , 它支付象征性的费用购买组成 2” 个地址的一块地址空间 。 IEEE 分配这块个地址的方式是:固定一个 MAC 地址的前 24 比特,让公司自己为每个适配器生成后 24 比特的唯一组合。

当某适配器要向某些目的适配器发送一个帧时 , 发送适配器将目的适配器的 MAC 地址插入到该帧中 , 并将该帧发送到局域网上。 如我们马上要看到的那样 , 一台交换机偶尔将一个入帧广播到它的所有接口。 我们将在第 7 章中看到 802. 11 也广播帧 。 因此一块适配器可以接收一个并非向它寻址的帧 。 这样 , 当适配器接收到一个帧时 , 将检查该帧中的 目的 MAC 地址是否与它自己的 MAC 地址匹配 。 如果匹配,该适配器提取出封装的数据报 , 并将该数据报沿协议栈向上传递 。 如果不匹配,该适配器丢弃该帧 ,而不会向上传递该网络层数据报 。 所以 , 仅当收到该帧时 , 才会中断目的地 。

然而, 有时某发送适配器的确要让局域网上所有其他适配器来接收并处理它打算发送的帧 。 在这种情况下 , 发送适配器在该帧的目的地址字段中插入一个特殊的 MAC 广播地址 ( broadcast address ) 。 对于使用 6 字节地址的局域网( 例如以太网和 802. 11 ) 来说, 广播地址是 48 个连续的 1 组成的字符串 ( 即以十六进制表示法表示的 FF- FF- FF- FF- FF-FF)。

  • 地址解析协议

因为存在网络层地址 ( 例如 , 因特网的 IP 地址 ) 和链路层地址 ( 即 MAC 地址 ), 所以需要在它们之间进行转换 。 对于因特网而言,这是地址解析协议 ( Address Resolution Protocol , ARP) [RFC 826] 的任务。

为了理解对于诸如 ARP 这样协议的需求 ,考虑如图 6-17 所示的网络 。 在这个简单的 例子中 , 每台主机和路由器有一个单一的 IP 地址和单一的 MAC 地址 。与以往一样 , IP 地址以点分十进制表示法表示, MAC 地址以十六进制表示法表示 。为了便于讨论, 我们在本节中将假设交换机广播所有帧 ;这就是说, 无论何时交换机在一个接口接收一个帧 , 它将在其所有其他接口上转发该帧 。

image-20220514144231272

现在假设 IP 地址为 222.222.222.220 的主机要向主机 222. 222. 222. 222 发送 IP 数据报 。 在本例中 , 源和目的均位于相同的子网中 ( 在 4.3.3 节中的寻址意义下 ) 。为了发送数据报 ,该源必须要向它的适配器不仅提供 IP 数据报 ,而且要提供目的主机222. 222. 222. 222 的 MAC 地址 。 然后发送适配器将构造一个包含目的地的 MAC 地址的链路层帧 , 并把该帧发送进局域网 。

在本节中要处理的重要问题是 , 发送主机如何确定 IP 地址为 222. 222. 222. 222 的目的主机的 MAC 地址呢? 正如你也许已经猜想的那样 , 它使用 ARPO 在发送主机中的 ARP 模块将取在相同局域网上的任何 IP 地址作为输入 , 然后返回相应的 MAC 地址 。 在眼下的这个例子中 , 发送主机 222. 222. 222. 220 向它的 ARP 模块提供了 IP 地址 222.222.222.222,并且其 ARP 模块返回了相应的 MAC 地址 49-BD-D2-C7 -56-2A

因此我们看到了 ARP 将一个 IP 地址解析为一个 MAC 地址 。 在很多方面它和 DNS类似 , DNS 将主机名解析为 IP 地址 。 然而,这两种解析器之间的一个重要区别是 , DNS 为在因特网中任何地方的主机解析主机名 ,而 ARP 只为在同一个子网上的主机和路由器接口解析 IP 地址 。 如果美国加利福尼亚州的一个节点试图用 ARP 为美国密西西比州的一个节点解析 IP 地址 , ARP 将返回一个错误 。

既然已经解释了 ARP 的用途, 我们再来看看它是如何工作的 。 每台主机或路由器在其内存中具有一个 ARP 表( ARP table ) , 这张表包含 IP 地址到 MAC 地址的映射关系 。图 6-18 显示了在主机 222. 222. 222. 220 中可能看到的 ARP 表中的内容 。 该 ARP 表也包含一个寿命 ( TTL) 值 , 它指示了从表中删除每个映射的时间 。 注意到这张表不必为该子网上的每台主机和路由器都包含一个表项; 某些可能从来没有进入到该表中 , 某些可能已经过期 。从一个表项放置到某 ARP 表中开始 , 一个表项通常的过期时间是 20 分钟 。

image-20220514144745272

现在假设主机 222. 222. 222. 220 要发送一个数据报 ,该数据报要 IP 寻址到本子网上另一台主机或路由器。发送主机需要获得给定 IP 地址的目的主机的 MAC 地址 。 如果发送方的 ARP 表具有该目的节点的表项,这个任务是很容易完成的 。但如果 ARP 表中当前没有该目的主机的表项, 又该怎么办呢 ?特别是假设 222. 222. 222. 220 要向222.222.222.222发送数据报 。 在这种情况下 , 发送方用 ARP 协议来解析这个地址 。 首先 , 发送方构造一个称为 ARP 分组 (ARP packet) 的特殊分组 。一个 ARP 分组有几个字段 , 包括发送和接收 IP 地址及 MAC 地址 。 ARP 查询分组和响应分组都具有相同的格式 。 ARP 查询分组的目的是询问子网上所有其他主机和路由器 , 以确定对应于要解析的 IP 地址的那个 MAC地址 。

回到我们的例子上来 , 222. 222. 222. 220 向它的适配器传递一个 ARP 查询分组, 并且指示适配器应该用 MAC广播地址 ( 即 FF-FF-FF-FF-FF-FF ) 来发送这个分组 。 适配器在链路层帧中封装这个 ARP 分组,用广播地址作为帧的目的地址 , 并将该帧传输进子网中。包含该 ARP 查询的帧能被子网上的所有其他适配器接收到 , 并且 (由于广播地址 ) 每个适配器都把在该帧中的 ARP 分组向上传递给ARP 模块 。 这些 ARP 模块中的每个都检查它的 IP 地址是否与 ARP 分组中的目的 IP 地址相匹配 。与之匹配的一个给査询主机发送回一个带有所希望映射的响应 ARP 分组 。 然后查询主机 222. 222. 222. 220 能够更新它的 ARP 表, 并发送它的 1P 数据报 ,该数据报封装在一个链路层帧中 , 并且该帧的目的 MAC 就是对先前 ARP 请求进行响应的主机或路由器的 MAC 地址。

学生们常常想知道 ARP 是一个链路层协议还是一个网络层协议 。 如我们所看到的那样 , 一个 ARP 分组封装在链路层帧中 , 因而在体系结构上位于链路层之上。 然而, 一个ARP 分组具有包含链路层地址的字段 , 因而可认为是链路层协议, 但它也包含网络层地址 , 因而也可认为是为网络层协议 。 所以 , 可能最好把 ARP 看成是跨越链路层和网络层边界两边的协议, 即不完全符合我们在第 1 章中学习的简单的分层协议栈 。 现实世界协议就是这样复杂 !

  • 发送数据报到子网以外

现在应该搞清楚当一台主机要向相同子网上的另一台主机发送一个数据报时 ARP 的操作过程 。但是现在我们来看更复杂的情况 , 即当子网中的某主机要向子网之外 ( 也就是跨越路由器的另一个子网)的主机发送网络层数据报的情况。 我们在图 6-19 的环境中来讨论这个问题,该图显示了一个由一台路由器互联两个子网所组成的简单网络 。

image-20220514145641607

有关图 6-19 需要注意几件有趣的事情 。 每台主机仅有一个 【 P 地址和一个适配器。但是 , 如第 4 章所讨论, 一台路由器对它的每个接口都有一个 IP 地址 。 对路由器的每个接口 ,( 在路由器中 ) 也有一个 ARP 模块和一个适配器。 在图6-19 中的路由器有两个接口 ,所以它有两个 IP 地址 、两个 ARP 模块和两个适配器。 当然 ,网络中的每个适配器都有自己的 MAC 地址 。

还要注意到子网 1 的网络地址为 111. 111 111/24, 子网 2 的网络地址为 222. 222. 222/24 。因此 , 与子网 1 相连的所有接口都有格式为 111.111. 111. xxx 的地址 , 与子网 2 相连的所有接口都有格式为 222. 222. 222. xxx 的地址 。

现在我们考察子网 1 上的一台主机将向子网 2 上的一台主机发送数据报 。 特别是 , 假设主机 111. 111. 111. 111 要向主机 222. 222. 222. 222 发送一个 IP 数据报 。和往常一样 , 发送主机向它的适配器传递数据报 。但是 , 发送主机还必须向它的适配器指示一个适当的目的 MAC 地址 。 该适配器应该使用什么 MAC 地址呢 ? 有人也许大胆猜测 ,这个适当的 MAC地址就是主机 222. 222. 222. 222 的适配器地址 , 即 49-BD-D2-C7-56-2A 。 然而,这个猜测是错误的! 如果发送适配器要用那个 MAC 地址 ,那么子网 1 上所有的适配器都不会费心将该 IP 数据报传递到它的网络层 , 因为该帧的目的地址与子网 1 上所有适配器的 MAC 地址都将不匹配 。 这个数据报将只有死亡 , 到达数据报天国 。

如果我们仔细地观察图 6-19, 我们发现为了使一个数据报从 111.111.111.111 到子网2 上的主机 ,该数据报必须首先发送给路由器接口 111.111.111.110, 它是通往最终目的地路径上的第一跳路由器的 IP 地址 。 因此 , 对于该帧来说,适当的 MAC 地址是路由器接口 111. 111. 111. 110 的适配器地址 , 即 E6 - E9-00- 17-BB-4B。 但发送主机怎样获得111.111.111.110 的 MAC 地址呢 ? 当然是通过使用 ARP! 一旦发送适配器有了这个 MAC地址 , 它创建一个帧 ( 包含了寻址到 222. 222. 222. 222 的数据报 ), 并把该帧发送到子网 1中。 在子网 1 上的路由器适配器看到该链路层帧是向它寻址的, 因此把这个帧传递给路由器的网络层 。但是我们的任务还没有结束 。 我们仍然要将该数据报从路由器移动到目的地 。 路由器现在必须决定该数据报要被转发的正确接口。 如在第 4 章中所讨论的,这是通过查询路由器中的转发表来完成的 。 转发表告诉这台路由器该数据报要通过路由器接口 222. 222. 222. 220 转发。 然后该接口把这个数据报传递给它的适配器 ,适配器把该数据报封装到一个新的帧中 , 并且将帧发送进子网 2 中。 这时 ,该帧的目的 MAC 地址确实是最终目的地 MAC 地址 。 路由器又是怎样获得这个目的地 MAC 地址的呢 ? 当然是用 ARP 获得的!