title: 《计算机网络》笔记-第6章链路层和局域网
date: 2020-11-02 11:00:05
通过网络层,我们知道网络如何选择最优路径,将分组从一个主机发送到另一个主机。
而通过链路层,我们将知道:分组是如何在构成端到端最优路径的各段物理链路上进行传输的。
同样类比物流寄件,如果说网络层解决的是:将邮件从一个地址邮寄到另一个地址;那么链路层解决的就是:将邮件从一个节点交付给下一个节点,是采用卡车、还是飞机、还是轮船呢。
在链路层中,任何设备将称作节点(node),包括主机、路由器、交换机等。
连接相邻节点的通信信道则称为链路(link)。
链路层传输的分组称为帧(frame)。
在链路层的讨论中,将介绍两种不同类型的链路层通信:
链路层协议所提供的服务包括:
链路层主体部分在**网络适配器/网络接口卡/网卡(Network adapter)**中实现,网卡的核心是一个实现了大部分链路层服务的芯片——链路层控制器(Controller)。剩余小部分链路层功能在 CPU 中实现。
上文提到,对链路层帧中的比特差错进行检测和纠正,是链路层提供的服务之一。接下来,将介绍3种差错检测技术:
最简单的奇偶校验即使用单个奇偶校验位(parity bit)。假设发送 d
比特的信息,在偶校验方案中,发送方只需附加一个比特,使得这 d+1
比特中 1
的总数是偶数。奇校验则使 1
的个数是奇数。
实践证明,单个奇偶校验位方案,检测出差错的概率为 50% 。
二维奇偶校验是一种更强大的方案。发送数据的 d
个比特被划分为 i
行 j
列,对每行每列计算奇偶值,产生 i+j+1
个差错检测比特。它还能用来纠正出现差错的比特。
与运输层校验和方法相同。
当下使用最广泛的差错检测技术为循环冗余检测(cyclic redundancy check,CRC)编码,也被称为多项式编码。
其操作过程为:
发送方和接收方事先协商一个 r+1
的比特串(最高位必须是1),称为生成多项式,我们将其表示为 G
。
对于要发送的 d
字节数据 D
,发送方要得出 r
个比特的附加比特串 R
,并附加到 D
右边,使得这个 d+r
个比特能被 G
“整除”(除的过程中,加不进位、减不借位,等价于异或)。那如何得出 R
呢?示例:D=101110, d=6, G=1001, r=3
,其计算过程如下,最后得到 R
为 011
,d+r
个比特为 101110 011
。
接收方接收到 d+r
个比特的数据后,会用 G
去除。如果余数非零,则表示出现差错;余数为零,则表示正确。
此前提到,有两种类型的链路:
我们将主要讨论广播链路,而广播链路中最重要的问题即多路访问问题(multiple access problem)。什么是多路访问问题呢?举个例子:有许多人聚集在一个房间中讨论问题,每个人都能发言。但讨论时,有可能每个人都争抢着发言、互不礼让,导致场面混乱不堪。
而为了让讨论井然有序地进行,我们需要指定一些规则:
这些规则同样适用于解决多路访问问题,这也就是多路访问协议(multiple access protocols)。
当下,有十几种多路访问协议,我们将其划分为 3 种类型:
为了避免碰撞,我们可以将广播信道以不同的方式平均地分配给每个节点,这就是信道划分协议。
主要有三种信道划分方法:
时分多路复用(time-division multiplexing,TDM)。TDM 将时间划分为时间帧(time frame),并进一步将每个时间帧划分成 N 个时隙(slot),然后把 N 个时隙分配给 N 个节点。节点发送数据时,必须在指定时隙中传输比特。
其主要缺点为:节点速率被限制为 R / N b p s R/N bps R/Nbps ( R R R 为整个信道的速率),且必须等待它所属的时隙,即使它是唯一要发送的时隙。
频分多路复用(frequency-division multiplexing,FDM)。将信道划分为不同的频段(每个频段具有 R / N R/N R/N 带宽),并把 N 个频段分配给 N 个节点。它也有着与 TDM 相同的缺点。
码分多址(code division multiple access,CDMA)。一种神奇的方法,目前已广泛地用于蜂窝电话中,我们将在之后详细讲解。
在随机接入协议中,节点总是以 R R R 速率发送数据。当发生碰撞时,节点会在等待随机时间后重新发送,如此循环。
我们将主要介绍两种常用的随机接入协议:
时隙 ALOHA 结合了时分多路复用的方法,但进行了改进。
时隙 ALOHA 先进行了如下规定:
然后,其操作过程为:
与信道划分不同,当只有一个节点发送数据时,它可以独占整个信道,也就是能以 R R R 速率发送数据。
但它的效率并不高。
分享一个历史小故事:
CSMA 的关键在于 载波侦听(carrier sensing),它的本质很简单:一个节点在传输前先听信道,如果没有数据在传输,则发送数据;反之,则等待直到检测到信道一段时间都没有数据传输,再开始传输。
但 CSMA 存在一个问题:当两个节点都监听到信道空闲时,它们会同时发送数据,最终导致数据碰撞。
CSMA/CD 在 CSMA 的基础上,加入了碰撞检测(collision detection)。传输节点在传输时会一直监听此信道,如果它检测到另一个节点正在发送干扰帧并产生碰撞,就停止传输,并等待一段随机时间后,重复“侦听——当空闲时传输——碰撞则等待”。
CSMA/CD 具体过程如下:
算法中有一个很重要的随机时间,如果随机范围太大,则会降低节点效率;如果随即范围太小,则可能会再次碰撞。
为了解决这个问题,人们提出了 二进制指数后退(binary exponential backoff) 算法。算法十分简单,即:当该帧经历了 n n n 次碰撞后,节点将随机从 { 0 , 1 , 2... 2 n − 1 } \{0,1,2...2^n-1\} {0,1,2...2n−1} 中选择一个 K K K 值,等待 K K K 倍数的时间。因此,一个帧经历的碰撞越多, K K K 选择的范围也会越大。
多路访问协议的两个理想特性是:
信道划分协议具备第2个特性,却不具备第1个;随机接入协议具备第1个特性,却不具备第2个。
为了同时实现这两种特性,人们又发明了轮流协议(taking-turns protocol)。轮流协议有很多,我们只讨论两种比较重要的协议:
轮询协议(polling protocol)。协议会从所有节点中指定一个主节点,主节点 轮询(poll) 每个节点。例如,主节点会先询问节点1,如果它要发送数据,那么主节点会告诉它能传输的帧的最多数量,传输完毕后主节点会接着询问节点,周而复始。虽然轮询协议避免了碰撞和空时隙的问题,提高了效率,但也有一些缺点:
令牌传递协议(token-passing protocol)。一个称为 令牌(token) 的小特殊帧会在节点之间循环传递。当一个节点要发送数据时,它会持有这个令牌,并传输所有数据,然后再释放令牌;当不需要发送数据时,则传给下一个节点。令牌传递协议同样也存在着一些问题,例如:一个节点故障可能导致整个信道崩溃,或者一个节点忘记释放令牌等。
主机与路由器都拥有链路层地址。但严格来讲,并不是主机和路由器拥有链路层地址,而是网络适配器(网络接口/网卡)拥有链路层地址。具有多个网卡的主机或路由器将具有多个链路层地址,也具有多个IP地址。
链路层地址有许多不同的称呼:LAN 地址、物理地址 或 MAC 地址,其中 MAC 地址最为常用。
对大多数局域网而言,MAC 地址长度为 6 字节,通常用十六进制表示,如 1A-23-F9-CD-06-9B
。网卡上的 MAC 地址是与生俱来的,也是固定的(现在可以改变,但我们不考虑),而且没有两块网卡的 MAC 地址是相同的。不论网卡到何处,MAC 地址都不会改变。
到此,你或许会疑惑:为什么网络层与链路层都需要地址呢?且听我慢慢道来。
在局域网中,网卡会接收每一个发送的帧,并检查帧中目的 MAC 地址是否与自己 MAC 地址匹配。如果匹配,则取出帧中数据,向上层传递;如果不匹配,则丢弃该帧。
与 IP 协议一样,MAC 也有广播地址,即比特全为 1 的 MAC 地址,用于向局域网所有其它主机广播信息。
当网络层将数据报传给链路层时,链路层只知道目的 IP 地址,那它如何才能知道帧的目的 MAC 地址呢?这就是 地址解析协议(Address Resolution Protocol,ARP) 的任务了。
接下来,将通过两种情况了解 ARP 协议。
每台主机或路由器在内存中都有一个 ARP 表,它包含 IP 地址到 MAC 地址的映射关系,以及每个映射的寿命(TTL)。
现假设主机 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
主机。
如上图所示,现有两个子网 111.111.111/24
和 222.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 地址。
以太网(Ethernet)是当今最流行的有线局域网技术,甚至将一直保持这一位置。
它的成功有很多原因:首先,它是第一个广泛部署的高速局域网;其次,它比令牌环等技术更加简单、便宜;第三,它奋发上进,不断产生更高速率的版本,以抵抗其他技术的竞争。
20世纪80年代到90年代,初始的以太网,使用基于同轴电缆的 总线拓扑 结构,是广播局域网。
20世纪90年代后其,人们使用基于集线器的星形拓扑结构,依旧是广播局域网。
21世纪初,以太网经历了革命性变化,交换机代替了集线器,以太网成为了“无碰撞”局域网。
以太网帧结构如下:
各字段详情如下:
特此说明,以太网提供的是无连接、不可靠服务。即适配器在发送帧之前,不会与目标适配器握手;发送帧之后,也不知道目标适配器是否收到,而且如果某帧出现差错没有通过 CRC 效验,目标适配器则会丢弃该帧。
如今,以太网已发展了多种类型,各有各的特色。这些以太网技术,在多年中已经被 IEEE 802.3 工作组标准化了。
此前提到,基于交换机的以太网已成为主流。由于交换机是全双工的(同时向对方发送消息不会受到干扰),而且具有存储转发的功能,只转发帧到对应的端口。所以交换以太网不再是广播信道,也不会出现碰撞,甚至都不再需要使用多路访问协议了。
为什么交换机如此神奇呢?它的原理是什么呢?
过滤是决定一个帧应该转发还是丢弃,转发是决定一个帧该被导向到哪个接口。
这两个功能都借助于交换机表(switch table),表中每个表项都包含:一个 MAC 地址;通向该地址的交换机接口;表项放置在表中的时间。示例如下:
现假设目的 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
,则将帧转发到该接口。交换机另一个神奇的特性是:自学习。交换机表是自动、动态地建立的,不需要人为配置,所以交换机是一个即插即用设备。
那交换机是如何实现自学习的呢?
虽然交换机简单又好用,但也存在着一些问题(以下图为例):
为了解决这些问题,虚拟局域网(VLAN) 出现了,它可以将一个物理局域网划分成多个虚拟局域网,虚拟局域网之间互不干扰。如下图:
但新的问题是:不同 VLAN 之间如何通信呢?
最简单的方法是,用一个路由器将两个 VLAN 连接起来。幸运的是,综合 VLAN 交换机和路由器的单一设备的出现,使这个方法更为容易。
另一种方法则被称为 VLAN 干线连接(VLAN trunking):