《计算机网络》笔记-第6章链路层和局域网

[TOC]

0. 前言

通过网络层,我们知道网络如何选择最优路径,将分组从一个主机发送到另一个主机。

而通过链路层,我们将知道:分组是如何在构成端到端最优路径的各段物理链路上进行传输的

同样类比物流寄件,如果说网络层解决的是:将邮件从一个地址邮寄到另一个地址;那么链路层解决的就是:将邮件从一个节点交付给下一个节点,是采用卡车、还是飞机、还是轮船呢。

1. 概述

在链路层中,任何设备将称作节点(node),包括主机、路由器、交换机等。

连接相邻节点的通信信道则称为链路(link)

链路层传输的分组称为帧(frame)

在链路层的讨论中,将介绍两种不同类型的链路层通信:

  • 广播信道。它用于连接有线局域网、卫星网中的多台主机等。
  • 点对点信道。它用于长距离链路连接的两台路由器之间等。

链路层协议所提供的服务包括:

  • 成帧。将网络层数据封装进链路层分组——帧中。
  • 链路接入。媒体访问控制(Medium Access Control,MAC)协议规定了帧在链路上传输的规则。根据信道的不同,MAC 协议可分为点对点协议和多路访问协议两大类。在点对点信道上,MAC 协议比较简单;而在广播信道上,MAC 协议比较复杂。
  • 可靠交付。有些高差错率的链路会提供可靠交付服务,但大部分都不提供。
  • 差错检测和纠正。

链路层主体部分在网络适配器/网络接口卡/网卡(Network adapter)中实现,网卡的核心是一个实现了大部分链路层服务的芯片——链路层控制器(Controller)。剩余小部分链路层功能在 CPU 中实现。

pic

2. 差错检测和纠正技术

上文提到,对链路层帧中的比特差错进行检测和纠正,是链路层提供的服务之一。接下来,将介绍3种差错检测技术:

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

2.1. 奇偶校验

最简单的奇偶校验即使用单个奇偶校验位(parity bit)。假设发送 d 比特的信息,在偶校验方案中,发送方只需附加一个比特,使得这 d+1 比特中 1 的总数是偶数。奇校验则使 1 的个数是奇数。

pic

实践证明,单个奇偶校验位方案,检测出差错的概率为 50% 。

二维奇偶校验是一种更强大的方案。发送数据的 d 个比特被划分为 ij 列,对每行每列计算奇偶值,产生 i+j+1 个差错检测比特。它还能用来纠正出现差错的比特。

pic

2.2. 校验和方法

与运输层校验和方法相同。

2.3. 循环冗余检测

当下使用最广泛的差错检测技术为循环冗余检测(cyclic redundancy check,CRC)编码,也被称为多项式编码

其操作过程为:

  1. 发送方和接收方事先协商一个 r+1 的比特串(最高位必须是1),称为生成多项式,我们将其表示为 G
  2. 对于要发送的 d 字节数据 D,发送方要得出 r 个比特的附加比特串 R ,并附加到 D 右边,使得这个 d+r 个比特能被 G “整除”(除的过程中,加不进位、减不借位,等价于异或)。那如何得出 R 呢?示例:D=101110, d=6, G=1001, r=3,其计算过程如下,最后得到 R011d+r 个比特为 101110 011
    pic
  3. 接收方接收到 d+r 个比特的数据后,会用 G 去除。如果余数非零,则表示出现差错;余数为零,则表示正确。

3. 多路访问链路和协议

此前提到,有两种类型的链路:

  • 点对点链路。由单个发送方和单个接收方组成,相关协议有:点对点协议(point-to-point protocol,PPP)、高级数据链路控制(high-level data link control,HDLC)。
  • 广播链路。当某节点发送数据时,它会以广播的方式发送,同一广播链路上的节点都能接收到。而当多个发送发同时发送数据时,数据会在链路中发生碰撞,以致数据被损坏。如以太网、无线局域网等都是广播链路。

我们将主要讨论广播链路,而广播链路中最重要的问题即多路访问问题(multiple access problem)。什么是多路访问问题呢?举个例子:有许多人聚集在一个房间中讨论问题,每个人都能发言。但讨论时,有可能每个人都争抢着发言、互不礼让,导致场面混乱不堪。

而为了让讨论井然有序地进行,我们需要指定一些规则:

  • 每个人都有讲话的权力
  • 不要一个人讲太久,导致其它人没有发言机会
  • 想发言可以举手示意
  • 不要贸然打断他人的讲话
  • 当有人讲话时,不能睡觉

这些规则同样适用于解决多路访问问题,这也就是多路访问协议(multiple access protocols)

当下,有十几种多路访问协议,我们将其划分为 3 种类型:

  • 信道划分协议(channel partitioning protocols)
  • 随机接入协议(random access protocols)
  • 轮流协议(taking-turns protocols)

3.1. 信道划分协议

为了避免碰撞,我们可以将广播信道以不同的方式平均地分配给每个节点,这就是信道划分协议。

主要有三种信道划分方法:

  • 时分多路复用(time-division multiplexing,TDM)。TDM 将时间划分为时间帧(time frame),并进一步将每个时间帧划分成 N 个时隙(slot),然后把 N 个时隙分配给 N 个节点。节点发送数据时,必须在指定时隙中传输比特。
    pic
    其主要缺点为:节点速率被限制为 $R/N bps$ ($R$ 为整个信道的速率),且必须等待它所属的时隙,即使它是唯一要发送的时隙。

  • 频分多路复用(frequency-division multiplexing,FDM)。将信道划分为不同的频段(每个频段具有 $R/N$ 带宽),并把 N 个频段分配给 N 个节点。它也有着与 TDM 相同的缺点。
    pic

  • 码分多址(code division multiple access,CDMA)。一种神奇的方法,目前已广泛地用于蜂窝电话中,我们将在之后详细讲解。

3.2. 随机接入协议

在随机接入协议中,节点总是以 $R$ 速率发送数据。当发生碰撞时,节点会在等待随机时间后重新发送,如此循环。

我们将主要介绍两种常用的随机接入协议:

  • ALOHA 协议
  • 载波侦听多路访问协议(CSMA)

3.2.1. 时隙 ALOHA

时隙 ALOHA 结合了时分多路复用的方法,但进行了改进。

时隙 ALOHA 先进行了如下规定:

pic

然后,其操作过程为:

pic

与信道划分不同,当只有一个节点发送数据时,它可以独占整个信道,也就是能以 $R$ 速率发送数据。

但它的效率并不高。

分享一个历史小故事:

pic

3.2.2. 载波侦听多路访问(CSMA)

CSMA 的关键在于 载波侦听(carrier sensing),它的本质很简单:一个节点在传输前先听信道,如果没有数据在传输,则发送数据;反之,则等待直到检测到信道一段时间都没有数据传输,再开始传输。

但 CSMA 存在一个问题:当两个节点都监听到信道空闲时,它们会同时发送数据,最终导致数据碰撞。

3.2.3. 具有碰撞检测的载波侦听多路访问(CSMA/CD)

CSMA/CD 在 CSMA 的基础上,加入了碰撞检测(collision detection)。传输节点在传输时会一直监听此信道,如果它检测到另一个节点正在发送干扰帧并产生碰撞,就停止传输,并等待一段随机时间后,重复“侦听——当空闲时传输——碰撞则等待”。

CSMA/CD 具体过程如下:

pic

算法中有一个很重要的随机时间,如果随机范围太大,则会降低节点效率;如果随即范围太小,则可能会再次碰撞。

为了解决这个问题,人们提出了 二进制指数后退(binary exponential backoff) 算法。算法十分简单,即:当该帧经历了 $n$ 次碰撞后,节点将随机从 ${0,1,2…2^n-1}$ 中选择一个 $K$ 值,等待 $K$ 倍数的时间。因此,一个帧经历的碰撞越多,$K$ 选择的范围也会越大。

3.3. 轮流协议

多路访问协议的两个理想特性是:

  1. 当只有一个节点活跃时,该节点具有 $R bps$ 的吞吐量。
  2. 当有 $M$ 个节点活跃时,每个节点都有接近 $R/M bps$ 的吞吐量。

信道划分协议具备第2个特性,却不具备第1个;随机接入协议具备第1个特性,却不具备第2个。

为了同时实现这两种特性,人们又发明了轮流协议(taking-turns protocol)。轮流协议有很多,我们只讨论两种比较重要的协议:

  • 轮询协议(polling protocol)。协议会从所有节点中指定一个主节点,主节点 轮询(poll) 每个节点。例如,主节点会先询问节点1,如果它要发送数据,那么主节点会告诉它能传输的帧的最多数量,传输完毕后主节点会接着询问节点,周而复始。虽然轮询协议避免了碰撞和空时隙的问题,提高了效率,但也有一些缺点

    • 引入了轮询时延。节点需要等待主节点轮询到它,才能发送数据。
    • 若主节点发生故障,整个信道就不能使用了
  • 令牌传递协议(token-passing protocol)。一个称为 令牌(token) 的小特殊帧会在节点之间循环传递。当一个节点要发送数据时,它会持有这个令牌,并传输所有数据,然后再释放令牌;当不需要发送数据时,则传给下一个节点。令牌传递协议同样也存在着一些问题,例如:一个节点故障可能导致整个信道崩溃,或者一个节点忘记释放令牌等。

4. 交换局域网

4.1. 链路层寻址——MAC地址

主机与路由器都拥有链路层地址。但严格来讲,并不是主机和路由器拥有链路层地址,而是网络适配器(网络接口/网卡)拥有链路层地址。具有多个网卡的主机或路由器将具有多个链路层地址,也具有多个IP地址。

链路层地址有许多不同的称呼:LAN 地址物理地址MAC 地址,其中 MAC 地址最为常用。

对大多数局域网而言,MAC 地址长度为 6 字节,通常用十六进制表示,如 1A-23-F9-CD-06-9B 。网卡上的 MAC 地址是与生俱来的,也是固定的(现在可以改变,但我们不考虑),而且没有两块网卡的 MAC 地址是相同的。不论网卡到何处,MAC 地址都不会改变。

到此,你或许会疑惑:为什么网络层与链路层都需要地址呢?且听我慢慢道来。

  • MAC 地址是扁平结构,且每个地址全球唯一,不论身在何处,它相当于身份证;IP 地址则是层次结构,主机移动时 IP 地址需要改变,它用来定位,相当于邮政地址
  • 链路层是为任意网络层协议而设计的,而不只是用于 IP 协议。如果网卡被指派 IP 地址,而不是“中性”的 MAC 地址,那将不能用于其它网络层协议。
  • 若网卡使用网络层地址,那网络层地址就不能“刻”在网卡上,每次移动主机都得重新配置;或者网卡不使用任何地址,而直接交付给网络层,但这样的话,主机将被局域网发送的每个帧而中断,即使帧的目的地不是自己。

在局域网中,网卡会接收每一个发送的帧,并检查帧中目的 MAC 地址是否与自己 MAC 地址匹配。如果匹配,则取出帧中数据,向上层传递;如果不匹配,则丢弃该帧。

与 IP 协议一样,MAC 也有广播地址,即比特全为 1 的 MAC 地址,用于向局域网所有其它主机广播信息。

4.2. 地址解析协议 ARP

当网络层将数据报传给链路层时,链路层只知道目的 IP 地址,那它如何才能知道帧的目的 MAC 地址呢?这就是 地址解析协议(Address Resolution Protocol,ARP) 的任务了。

接下来,将通过两种情况了解 ARP 协议。

4.2.1. 在子网内发送数据报

每台主机或路由器在内存中都有一个 ARP 表,它包含 IP 地址到 MAC 地址的映射关系,以及每个映射的寿命(TTL)。

pic

现假设主机 222.222.222.220 要向主机 222.222.222.222 发送数据报,但它的 ARP 表并未存在映射关系。当数据报传至链路层时,主机 222.222.222.220 需要用 ARP 解析协议来获取目的主机的 MAC 地址:

  • 首先,222.222.222.220 主机会发送一个 ARP 查询分组,并使用 MAC 广播地址(FF-FF-FF-FF-FF-FF)为目的 MAC 地址。

  • 该分组将被子网中所有主机或路由器接收到,这些主机或路由器将检查分组中的目的 IP 地址是否与自己的 IP 地址相同。若相同,则发送一个 ARP 响应分组

  • 源主机收到响应分组后,便会更新它的 ARP 表,然后正式发送数据报到 222.222.222.222 主机。

4.2.2. 发送数据报到子网外

pic

如上图所示,现有两个子网 111.111.111/24222.222.222/24,假设主机 111.111.111.111 要向主机 222.222.222.222 发送数据报。由于子网 111.111.111/24 中并不存在主机 222.222.222.222 ,所以 ARP 协议并不能获取目的 MAC 地址,那怎么办呢?

  • 首先,主机通过自己的子网信息,得知目的 IP 地址并不在自己的子网中,所以它会把目的 MAC 地址设为网关(路由器)接口的 MAC 地址。由于主机联网时便知道网关路由器的 IP 地址,所以它可以通过 ARP 协议获取网关路由器的 MAC 地址。

  • 将数据报发送到网关路由器后,路由器会根据路由表选择输出链路接口,将数据报传递到对应接口的适配器中,准备发送。

  • 帧的源 MAC 地址是路由器输出接口的 MAC 地址,而目的 MAC 地址是如何知道的呢?当然是 ARP !路由器会向对应子网中发送 ARP 查询分组,从而获取目的 IP 地址对应的 MAC 地址。

4.3. 以太网(Ethernet)

以太网(Ethernet)是当今最流行的有线局域网技术,甚至将一直保持这一位置。最初它使用了总线型拓扑和CSMA/CD技术,后来由于交换机的出现,它成为了星型拓扑和无碰撞局域网。

它的成功有很多原因:首先,它是第一个广泛部署的高速局域网;其次,它比令牌环等技术更加简单、便宜;第三,它奋发上进,不断产生更高速率的版本,以抵抗其他技术的竞争。

20世纪80年代到90年代,初始的以太网,使用基于同轴电缆总线拓扑结构,是广播局域网。

20世纪90年代后其,人们使用基于集线器星形拓扑结构,依旧是广播局域网。

21世纪初,以太网经历了革命性变化,交换机代替了集线器,以太网成为了“无碰撞”局域网。

以太网帧结构如下:

pic

各字段详情如下:

pic

特此说明,以太网提供的是无连接、不可靠服务。即适配器在发送帧之前,不会与目标适配器握手;发送帧之后,也不知道目标适配器是否收到,而且如果某帧出现差错没有通过 CRC 效验,目标适配器则会丢弃该帧。

如今,以太网已发展了多种类型,各有各的特色。这些以太网技术,在多年中已经被 IEEE 802.3 工作组标准化了。

pic

4.4. 链路层交换机

此前提到,基于交换机的以太网已成为主流。由于交换机是全双工的(同时向对方发送消息不会受到干扰),而且具有存储转发的功能,只转发帧到对应的端口。所以交换以太网不再是广播信道,也不会出现碰撞,甚至都不再需要使用多路访问协议了。

为什么交换机如此神奇呢?它的原理是什么呢?

4.4.1. 交换机的转发和过滤

过滤是决定一个帧应该转发还是丢弃,转发是决定一个帧该被导向到哪个接口。

这两个功能都借助于交换机表(switch table),表中每个表项都包含:一个 MAC 地址;通向该地址的交换机接口;表项放置在表中的时间。示例如下:

pic

现假设目的 MAC 地址为 DD-DD-DD-DD-DD-DD 的帧从接口 x 到达交换机:

  • 表中没有 DD-DD-DD-DD-DD-DD 的表项,则向所有接口广播该帧。
  • 表中存在 DD-DD-DD-DD-DD-DD 但对应的接口是 x ,则丢弃该帧。
  • 表中存在 DD-DD-DD-DD-DD-DD 且接口为 y,则将帧转发到该接口。

4.4.2. 自学习

交换机另一个神奇的特性是:自学习。交换机表是自动、动态地建立的,不需要人为配置,所以交换机是一个即插即用设备

那交换机是如何实现自学习的呢?

  1. 交换机表初始为空。
  2. 对于每一个到达交换机的入帧,交换机都会在表中存储一个表项:该帧的源 MAC 地址;该帧进入的接口;当前时间。只要局域网中的主机发送了一个帧,那它就会在交换机中留下记录。
  3. 如果一段时间后,交换机没有收到以该地址为源地址的帧,就会从表中删除这个地址。

4.5. 虚拟局域网

虽然交换机简单又好用,但也存在着一些问题(以下图为例):

pic

pic

为了解决这些问题,虚拟局域网(VLAN) 出现了,它可以将一个物理局域网划分成多个虚拟局域网,虚拟局域网之间互不干扰。如下图:

pic

但新的问题是:不同 VLAN 之间如何通信呢?

最简单的方法是,用一个路由器将两个 VLAN 连接起来。幸运的是,综合 VLAN 交换机和路由器的单一设备的出现,使这个方法更为容易。

另一种方法则被称为 VLAN 干线连接(VLAN trunking)

pic

5. Web 页面请求历程

pic