链路层和局域网

链路层概述

链路层(Link Layer)

链路层是网络协议栈中的第二层,位于物理层之上、网络层之下。它的核心职责是在物理上相邻的节点之间,通过链路可靠地传输数据报。

核心术语

  • 节点:网络中的设备,包括主机和路由器。
  • 链路:连接相邻节点的通信通道。链路可以是:
    • 有线的(如以太网线缆、光纤)
    • 无线的(如 Wi-Fi、蜂窝网络)
    • 局域网(LANs)本身也可以看作是一种链路环境。
  • (frame):链路层的协议数据单元(PDU)。网络层的数据报被封装在帧中进行传输。链路层负责将数据报从一个节点传输到路径上的下一个物理相邻的节点。

链路层的上下文

  • 异构链路:一个端到端的通信路径可能由多种不同类型的链路组成。例如,从笔记本电脑(Wi-Fi)到家庭路由器,再通过以太网连接到 ISP,最后通过光纤网络传输。数据报在每一段链路上都可能由不同的链路层协议进行处理和传输。
  • 多样化服务:不同的链路层协议提供的服务也不同。例如:
    • 某些协议(如一些无线链路协议)可能提供可靠的数据传输服务,确保数据无差错、按顺序到达相邻节点。
    • 而另一些协议(如经典的以太网)则可能不保证可靠传输,将差错恢复的任务交给上层协议(如 TCP)。

旅行类比

为了更好地理解链路层的作用,我们可以将其与一次旅行进行类比:

  • 数据报 \to「旅客」
    • 需要从起点传输到终点的信息单元。
  • 链路层协议 \to「交通工具」(豪华轿车、飞机、火车)
    • 在不同路段(链路)上使用的具体传输方式。
  • 通信链路 \to「路段」(Princeton 到 JFK 机场、JFK 到日内瓦、日内瓦到洛桑)
    • 连接相邻节点的路径段。
  • 路由算法 \to「旅行社」
    • 负责规划整个行程(数据报的端到端路径)。

这个类比突显了链路层负责的是「单段行程」的传输,而路由算法(网络层)负责规划「整个旅程」。

链路层提供的服务

链路层为其上层(网络层)提供多种关键服务:

  1. 成帧:将来自网络层的数据报封装成帧,添加链路层「首部」和「尾部」。
    • 首部:通常包含源和目的 MAC 地址,以及其他控制信息。
    • 尾部:通常包含差错检测信息。
  2. 链路接入:在广播信道共享介质的环境下(例如 Wi-Fi 或早期的总线型以太网),需要媒体访问控制协议来协调多个节点对信道的访问,避免或解决冲突。
    • 帧首部中的 MAC 地址用于标识帧的物理源和目的节点,这与网络层的 IP 地址不同。
  3. 相邻节点间的可靠交付:通过确认和重传机制,确保数据帧在两个直接相连的节点间无差错地传输。
    • 这项服务在误码率较低的有线链路上(如光纤、现代以太网)很少使用,以避免不必要的开销。
    • 但在误码率较高的无线链路(如 Wi-Fi、蜂窝网络)上则非常重要,因为在链路层解决错误比等到端到端(如 TCP)才发现和重传要高效得多。

为什么需要链路层和端到端两种可靠性?

  • 效率:在易出错的链路上,及早发现并重传错误帧比等待端到端超时重传整个数据报更有效率,避免了错误数据在网络中无效传播。
  • 针对性:链路层可靠性只处理特定链路上的传输错误,而端到端可靠性(如 TCP)处理的是整个路径上的丢包、乱序等问题。两者解决的问题层面不同。
  1. 流量控制:协调相邻的发送节点和接收节点之间的传输速率,防止快速的发送方淹没慢速的接收方。
  2. 差错检测:发送方在帧中加入差错检测位,接收方通过计算和比较这些位来检测帧在传输中是否出错。
    • 由于信号在物理介质传输中可能受到衰减、噪声等干扰,导致比特错误(0 变 1 或 1 变 0)。
    • 如果检测到错误,接收方通常会丢弃该帧(如果链路层不提供可靠传输),或者通知发送方重传(如果提供可靠传输)。
  3. 差错纠正:接收方不仅能检测到错误,还能直接纠正某些类型的比特错误,而无需请求重传。这对于延迟敏感或重传代价高的应用(如实时音视频)尤其有用。
  4. 半双工与全双工
    • 半双工:链路两端的节点都可以发送数据,但不能同时进行。需要协调机制避免冲突。
    • 全双工:链路两端的节点可以同时发送和接收数据,无需担心冲突。现代交换式以太网通常工作在全双工模式。

链路层的实现

网络接口卡(NIC)

链路层及其下方的物理层功能,通常被集成在主机的网络接口卡(Network Interface Card, NIC)中,也称为「网络适配器」或「网卡」。

  • 每个主机和路由器都包含链路层实现。
  • NIC 通常是一个独立的硬件板卡(如 PCI/PCIe 网卡)或直接集成在主板芯片上。
  • 它通过主机的系统总线(如 PCIe)与 CPU 和内存交互。
  • NIC 是硬件、软件(驱动程序)和固件(存储在 NIC 上的软件)的结合体。

发送与接收过程

  • 发送端
    1. NIC 从主机内存中获取网络层传来的数据报。
    2. 在 NIC 内部(硬件/固件/软件协同)进行「封装」:添加链路层首部(含 MAC 地址)和尾部(含差错检测码),形成帧。
    3. 可能执行其他链路层服务,如可靠传输控制、流量控制。
    4. 将帧交给物理层,转换为信号在链路上传输。
  • 接收端
    1. 物理层接收信号,转换为比特流,传递给 NIC。
    2. NIC 检测帧的边界。
    3. 执行链路层服务:
      • 差错检测:检查帧尾的 EDC 位。
      • 可靠传输处理(如果启用)。
      • 流量控制处理(如果启用)。
    4. 如果帧有效且无误,进行「解封装」:提取出网络层数据报。
    5. 将数据报通过系统总线传递给主机内存中的网络层协议栈。

差错检测与纠正技术

基本概念

  • EDC(Error Detection and Correction bits): 用于差错检测和纠正的冗余比特。
  • D: 需要保护的数据(可能包括数据报本身以及帧首部的某些字段)。
  • 发送方根据 D 计算出 EDC,并将 D 和 EDC 一起发送。
  • 接收方收到 D' 和 EDC'(可能在传输中出错)。接收方根据 D' 重新计算 EDC'',并比较 EDC'' 和 EDC'。
    • 如果一致,认为数据很可能没有错误(并非 100% 可靠)。
    • 如果不一致,则检测到错误。

差错检测并非万无一失

  • 任何差错检测机制都有可能漏掉某些错误模式(即 D' 和 EDC' 都错了,但恰好匹配)。
  • 通常,EDC 字段越长,检测能力越强,漏检概率越低。

奇偶校验

  • 单比特奇偶校验
    • 最简单的差错检测方法。
    • 在数据 D 后面附加一个奇偶校验位
    • 偶校验:设置校验位,使得整个数据(D + 校验位)中 1 的总数是偶数。
    • 奇校验:设置校验位,使得 1 的总数是奇数。
    • 接收方计算收到的数据(D' + 校验位')中 1 的个数,与约定的奇偶性比较。
    • 能力:只能检测出奇数个比特错误。如果发生偶数个比特错误,则无法检测。
  • 二维奇偶校验
    • 将数据 D 排列成二维矩阵(例如 i 行 j 列)。
    • 为每一行计算一个行校验位(单比特奇偶校验)。
    • 为每一列计算一个列校验位(单比特奇偶校验)。
    • 发送 D 以及所有的行、列校验位。
    • 能力:
      • 可以检测出所有 1、2、3 个比特的错误
      • 可以检测并纠正单比特错误。如果只有一个比特出错,其所在的行校验和列校验都会出错,交叉点即为错误比特位置,将其翻转即可纠正。
      • 对于某些多比特错误(如同一行或同一列的两个错误)只能检测不能纠正。对于某些特定模式的 4 比特错误可能无法检测。

因特网校验和

主要用于网络层(IP)和传输层(TCP/UDP)的首部校验,链路层较少直接使用,但原理类似。

  • 发送方
    1. 将要校验的数据(如 UDP 首部 + 数据)看作一系列 16 比特的整数。
    2. 计算这些 16 比特整数的反码和
      • 反码加法:二进制加法,最高位的进位要加回到最低位。
    3. 将最终得到的和按位取反,得到的值就是校验和。放入校验和字段。
  • 接收方
    1. 将收到的所有 16 比特数据(包括校验和字段本身)进行反码求和。
    2. 如果结果的所有比特都是 1(即反码表示的 -0),则认为数据很可能没有错误。否则,检测到错误。

这种校验相对较弱,可能无法检测出某些错误模式(如两个 16 比特字中对应比特同时翻转)。

循环冗余校验

目前应用最广泛、检错能力很强的差错检测技术之一(如以太网、Wi-Fi、HDLC 等)。

可参考旧笔记

基于多项式编码和模 2 算术(加法和减法等价于异或 XOR,无进位借位)。

  • 基本原理:
    1. 发送方和接收方预先约定一个 r+1r+1 比特的生成多项式,记为 GG(最高位和最低位必须为 1)。
    2. 设要发送的数据为 DDdd 比特)。发送方希望计算出一个 rr 比特的冗余校验码(CRC 码),记为 RR
    3. 目标是使得 DD 左移 rr 位后(即 D2rD \cdot 2^r)与 RR 拼接起来形成的数据 D,R\langle D, R\rangle,能够GG 模 2 整除
    4. 计算方法:R=remainder(D2rG)R = \text{remainder} \left( \frac{D \cdot 2^r}{G} \right)(这里的除法是模 2 除法)。
    5. 发送方将 D,R\langle D, R\rangle 发送出去。
  • 接收方
    1. 收到数据 D,R\langle D', R'\rangle
    2. 用约定的生成多项式 GG模 2 除 D,R\langle D', R'\rangle
    3. 如果余数为 0,则认为数据很可能没有错误。
    4. 如果余数非 0,则检测到错误,丢弃该帧。
  • 检错能力:
    • 可以检测出所有小于等于 rr 位的突发错误(Burst Errors,即连续 kk 位错误)。
    • 可以检测出所有奇数个比特的错误。
    • 在特定条件下,对于更长的突发错误也有很高的检测概率。
    • 常用的 CRC 标准(如 CRC-32 用于以太网)具有非常强大的检错能力。

CRC 计算示意(模 2 除法)

假设 D=101110,G=1001D = 101110, G = 1001r=3r=3)。

计算 D23=101110000D \cdot 2^3 = 101110000

执行模 2 除法 101110000÷1001101110000 \div 1001

所以 R=011R = 011。发送的数据为 D,R=101110011\langle D, R\rangle = 101110011

接收方收到 101110011101110011 后,计算 101110011÷1001101110011 \div 1001(模 2),会发现余数为 0。

多路访问协议

当多个节点共享同一个广播信道时,需要解决如何协调它们访问信道的问题,这就是「多路访问问题」。用于解决此问题的协议称为多路访问控制(Medium Access Control, MAC)协议。

链路类型:

  • 点对点链路:链路两端只有两个节点(如 PPP、交换机到主机的以太网连接)。不存在多路访问问题。
  • 广播链路:多个节点共享同一物理介质(如早期的总线型以太网、无线局域网 Wi-Fi、卫星通信)。需要 MAC 协议。

在广播链路中,如果两个或多个节点「同时」发送数据,它们的信号会在信道中叠加、相互干扰,导致接收方无法正确解码任何一个信号。这种情况称为碰撞(collision)。

MAC 协议的目标

理想的 MAC 协议应具备以下特性(假设信道速率为 Rbps\pu{\mathit{R} bps}):

  1. 高效性(单一节点):当只有一个节点需要发送数据时,它应该能够以全部速率 RR 进行发送。
  2. 高效性(多节点):当有 MM 个节点活跃并希望发送数据时,每个节点应该能够获得平均约为 R/MR/M 的吞吐量。协议应能有效利用信道带宽。
  3. 公平性:每个节点应该有公平的机会访问信道。
  4. 完全分布式
    • 没有中心控制节点来协调传输(避免单点故障和瓶颈)。
    • 节点间无需时钟同步或时隙同步(简化实现)。
  5. 简单性:协议本身易于实现和理解。

现实中很难完美达到所有目标,不同的 MAC 协议在这些特性之间进行权衡。

MAC 协议分类

主要有三大类 MAC 协议:

  1. 信道划分:将信道资源(时间、频率、码字)预先划分成多个小份,并将每一份独占地分配给一个节点。
    • 优点:公平、无碰撞。
    • 缺点:即使节点没有数据发送,分配给它的资源也被浪费,导致低负载时效率低下。
  2. 随机接入:不划分信道,节点在需要时尝试发送。
    • 允许发生碰撞,但协议需要提供检测碰撞从碰撞中恢复(通常通过重传)的机制。
    • 优点:低负载时效率高,单个节点可以利用全部带宽。
    • 缺点:高负载时碰撞增多,导致信道利用率下降,延迟增加。
  3. 轮流:节点轮流获得发送权。结合了前两类的优点。
    • 通常比信道划分效率高,比随机接入在高负载下更可控。
    • 需要一定的协调机制(如传递令牌或主节点轮询)。
    • 缺点:可能存在协调开销、延迟、单点故障(取决于具体协议)。

信道划分协议

  • 时分多路复用(Time Division Multiple Access, TDMA):
    • 将时间划分为,每个帧再划分为 NN时隙NN 是网络中的节点数。
    • 每个节点被固定分配到每帧中的一个时隙。
    • 节点只能在自己的时隙内发送数据。
    • 如果节点在自己的时隙没有数据发送,该时隙就「空闲」,造成浪费。
    • 例子:某些蜂窝网络标准(如 GSM 的一部分)。
  • 频分多路复用(Frequency Division Multiple Access, FDMA):
    • 将信道的总频带划分为 NN 个较窄的频段
    • 每个节点被固定分配到一个频段。
    • 节点可以在分配给自己的频段内持续发送数据。
    • 如果节点没有数据发送,分配给它的频段就「空闲」,造成浪费。
    • 例子:传统的广播电台、电视台,某些卫星通信。
  • 码分多路复用(Code Division Multiple Access, CDMA):
    • 允许所有节点同时整个频段上发送数据。
    • 通过为每个节点分配一个独特的码片序列来区分不同节点的信号。
    • 接收方利用发送方的码片序列从混合信号中解码出所需的数据。
    • 优点:抗干扰性强,频率利用率高。
    • 缺点:实现复杂,需要精确的功率控制。
    • 例子:某些 3G 蜂窝网络标准。

随机接入协议

核心思想:「先试再说,错了重来」。

  • ALOHA 协议

    • 最早的随机接入协议。
    • 思想:节点有数据就立即发送
    • 碰撞检测:发送方发送后等待一段时间,若未收到确认(或听到自己的信号被干扰),则认为发生碰撞。
    • 碰撞恢复:等待一个随机时间后重传。
    • 效率极低(最大理论效率为 12e\dfrac{1}{2\e},约 18%)。
  • 时隙 ALOHA

    • 对纯 ALOHA 的改进。

    • 假设:

      • 时间被划分为等长的时隙,时隙长度等于发送一个标准帧的时间
      • 所有节点时钟同步,只能在「时隙开始」的时刻发送帧。
      • 所有帧大小相同。
      • 如果在同一时隙内有 2\ge 2 个节点发送,则发生碰撞,该时隙内所有传输都失败。所有节点都能检测到碰撞。
    • 操作:

      1. 节点有新帧要发送时,等待下一个时隙开始时发送。
      2. 如果成功(没有碰撞):该节点可以在下一个时隙发送新帧(如果还有)。
      3. 如果碰撞:发生碰撞的节点,在后续的每个时隙,以概率 pp 尝试重传该帧,直到成功为止。以概率 1p1-p 则跳过当前时隙,等待下一个时隙再决定是否重传。
    • 随机化(概率 pp)至关重要,避免节点在碰撞后持续在同一时隙冲突。

    • 优点

      • 单个节点活跃时,可使用全部信道带宽 R。
      • 高度分布式(除时隙同步外)。
      • 实现相对简单。
    • 缺点

      • 仍然会发生碰撞,浪费时隙。
      • 存在空闲时隙(没有节点发送)。
      • 需要时钟同步。
      • 即使发生碰撞,也必须完整发送完整个帧,才能在下一个时隙尝试重传(某些协议可以改进这一点)。
    • 效率:在大量节点、重负载条件下,最大理论信道利用率(成功发送帧的时隙比例)为 1/e37%1/\e \approx 37\%。比纯 ALOHA 提高了一倍。

      Slotted ALOHA 效率推导概要

      假设有 NN 个节点,每个节点在任一时隙以概率 pp 发送。

      某个特定节点成功发送,当且仅当自己发送且其他 N1N-1 个节点都不发送,即 p(1p)N1p(1-p)^{N-1}

      则任意一个节点成功发送的概率(即时隙成功的概率)为 Np(1p)N1N p(1-p)^{N-1}

      为使成功概率最大化,需要找到最优的 pp^*。对 Np(1p)N1N p(1-p)^{N-1} 求导并令其为 00,可得 p=1/Np^* = 1/N

      p=1/Np^*=1/N 代入,最大成功概率为 N(1/N)(11/N)N1=(11/N)N1N \cdot (1/N) \cdot (1 - 1/N)^{N-1} = (1 - 1/N)^{N-1}

      当节点数 NN \to \infty 时,(11/N)N11/e(1 - 1/N)^{N-1} \to 1/\e

      因此,最大效率约为 1/e0.3681/\e \approx 0.368

  • 载波侦听多路访问(Carrier Sense Multiple Access, CSMA):

    • 核心思想:「先听后说」。
    • 节点在发送前先侦听信道是否有载波(即其他节点正在发送信号)。
      • 如果信道空闲:发送整个帧。
      • 如果信道忙:「推迟发送」,持续侦听直到信道变为空闲,然后立即发送(或等待一小段随机时间后再发送,取决于具体 CSMA 变种)。
    • 人类类比:在谈话中不打断别人。
    • 问题:即使进行了载波侦听,仍然可能发生碰撞
      • 原因在于信号传播延迟。当节点 A 开始发送时,信号需要时间才能传播到节点 B。如果 B 在 A 的信号到达之前侦听到信道空闲并开始发送,就会发生碰撞。
      • 距离越远,传播延迟越大,碰撞的可能性越高。
      • 碰撞发生时,整个帧的传输时间都被浪费了。
  • 带碰撞检测的载波侦听多路访问(CSMA with Collision Detection, CSMA/CD):

    • 对 CSMA 的重要改进,是经典以太网(有线)使用的核心协议。
    • 核心思想:「边听边说,一旦冲突,立即停说」。
    • 节点在发送帧的同时,持续侦听信道。
    • 如果检测到碰撞(即发送信号的同时也收到了来自其他节点的信号),立即执行以下操作:
      1. 停止发送当前帧(避免继续浪费信道时间)。
      2. 发送一个简短的「拥塞信号」,确保所有卷入碰撞的节点都意识到发生了碰撞。
      3. 执行二进制指数退避算法后,返回到载波侦听阶段,尝试重新发送。
    • 人类类比:有礼貌的谈话者,如果发现和别人同时说话,会立即停止,并稍等片刻再尝试发言。
    • 优点:显著减少了碰撞造成的信道时间浪费,提高了信道利用率,尤其是在传播延迟相对于帧传输时间较短的网络中(如典型的局域网)。
    • 碰撞检测:在有线网络(如以太网)中相对容易实现(通过检测发送线路上的电压/功率异常)。但在无线网络中,由于信号强度差异巨大(发送功率远大于接收到的微弱信号),实现碰撞检测非常困难(所谓的「近场效应」),因此无线局域网(如 Wi-Fi)通常使用 CSMA/CA(Collision Avoidance, 碰撞避免)。

以太网 CSMA/CD 算法流程

  1. NIC 从网络层获取数据报,创建链路层帧。
  2. 侦听信道
    • 如果信道空闲,开始发送帧。
    • 如果信道忙,持续侦听直到信道变为空闲,然后立即发送。
  3. 发送期间:持续侦听信道。
    • 如果成功发送完整个帧而未检测到碰撞,则本次传输完成!
    • 如果检测到碰撞:
      1. 立即中止帧的发送。
      2. 发送一个拥塞信号。
      3. 进入二进制指数退避阶段:
        • 对于第 mm 次连续碰撞(mm 从 1 开始计数,通常有上限,如 10 或 16),从集合 {0,1,2,...,2m1}\{0, 1, 2, ..., 2^m - 1\} 中随机选择一个整数 KK
        • 等待 K×512K \times 512 比特时间(512 bit time 是以太网中的一个标准时间单位,称为 slot time,大约是信号在最大长度以太网段上传播一个来回的时间)。
        • 等待结束后,返回第 2 步(重新侦听信道)。
  • 退避机制:碰撞次数越多,随机等待时间的上限(2m12^m-1)呈指数级增长,从而增大了节点选择不同等待时间的概率,有效降低了再次碰撞的可能性。

轮流协议

试图结合「信道划分」和「随机接入」的优点。

  • 轮询

    • 有一个主节点和多个从节点
    • 主节点依次轮询(「邀请」)每个从节点:「你是否有数据要发送?」
    • 被轮询到的从节点如果有数据,则发送给主节点(或直接发送到目的地,取决于网络结构)。如果没有,则回复一个否定消息。
    • 主节点控制着所有的数据传输。
    • 优点:消除了碰撞,可以控制带宽分配。
    • 缺点
      • 轮询开销:即使从节点没有数据,也需要进行一次轮询交互。
      • 延迟:节点必须等待被轮询到才能发送。
      • 单点故障:主节点故障会导致整个网络瘫痪。
    • 应用:常用于连接许多简单(「哑」)设备的环境,如工业控制网络、蓝牙微微网。
  • 令牌传递

    • 网络中有一个特殊的短控制帧,称为令牌
    • 令牌在节点之间按照预定义的逻辑环顺序依次传递。
    • 只有持有令牌的节点才能发送数据帧。
    • 节点发送完数据(或在持有令牌一段时间后),必须将令牌传递给环中的下一个节点。
    • 如果节点收到令牌但没有数据发送,则立即将令牌传给下一个节点。
    • 优点:无碰撞,高负载下性能稳定且公平。
    • 缺点
      • 令牌开销:即使网络空闲,令牌也必须持续传递。
      • 延迟:节点必须等待令牌到达才能发送。
      • 单点故障:令牌丢失或损坏、节点故障导致环中断等问题需要复杂的恢复机制。
    • 应用:经典的 IBM Token Ring 网络、FDDI(光纤分布式数据接口)。

总结与对比

  • 信道划分(TDMA, FDMA):
    • 高负载:公平、高效。
    • 低负载:低效,带宽浪费。
  • 随机接入(ALOHA, CSMA/CD):
    • 低负载:高效,延迟低。
    • 高负载:碰撞增多,效率下降,延迟增大。
  • 轮流(Polling, Token Passing):
    • 试图在各种负载下都表现良好,介于前两者之间。
    • 存在各自的开销和潜在问题(延迟、单点故障)。

混合应用:有线电视网络

现代有线电视网络(基于 DOCSIS 标准)巧妙地混合使用了多种 MAC 策略:

  • 下行信道(从头端 CMTS 到用户 Cable Modem):
    • 通常使用 FDM 划分出多个宽带信道。
    • 在一个信道内,CMTS「广播」数据给所有用户,Cable Modem 只接收发给自己的数据。这里不存在多路访问问题。
  • 上行信道(从用户 Cable Modem 到头端 CMTS):
    • 也使用 FDM 划分出多个(通常较窄的)上行信道。
    • 在一个上行信道内,时间被划分为微时隙
    • CMTS 通过下行信道发送 MAP 帧,告诉各个 Cable Modem 哪些微时隙是「分配」给它们的(类似 TDM),哪些微时隙是「竞争」的(类似 Slotted ALOHA 或 CSMA/CD)。
    • 用户需要发送数据时:
      • 如果之前已请求并被分配了时隙,就在指定时隙发送。
      • 如果没有分配时隙,就在竞争时隙中发送「带宽请求」(或少量数据)。
      • 在竞争时隙中发送可能会发生碰撞,需要使用随机退避算法重试。
      • CMTS 收到请求后,通过 MAP 帧分配后续的数据传输时隙。

DOCSIS

DOCSIS(Data Over Cable Service Interface Specification) 是有线电视网络上传输数据的国际标准,它详细规定了物理层、链路层(包括 MAC 层)的协议和操作方式。

局域网(LANs)与 MAC 地址

MAC 地址

  • 定义:媒体访问控制地址(MAC Address),也称为「物理地址」「硬件地址」或「以太网地址」。
  • 长度:通常为 48 比特(6 字节)。
  • 唯一性:由 IEEE 负责管理和分配。制造商购买地址块,理论上保证全球每个网络接口(NIC)都有一个「独一无二」的 MAC 地址。这个地址通常被固化(burned-in)在 NIC 的 ROM 中(但有时也可以通过软件修改)。
  • 格式:通常表示为 6 组十六进制数,用连字符或冒号分隔,如 1A-2F-BB-76-09-AD1A:2F:BB:76:09:AD。每个十六进制数代表 4 比特。
  • 功能:在同一个广播域(如一个局域网子网)内,用于唯一标识一个网络接口,使得帧能够在链路层被正确地从源接口发送到目的接口。

MAC 地址 vs. IP 地址

特性 MAC 地址 IP 地址(IPv4)
层级 链路层(Layer 2) 网络层(Layer 3)
长度 48 比特 32 比特(IPv6 为 128 比特)
表示 十六进制 点分十进制
唯一性 全球唯一(理论上) 全球唯一(公网 IP),子网内唯一(私网 IP)
分配/管理 IEEE 分配给制造商,固化在硬件 IANA/RIR 分配给 ISP/组织,可配置
结构 扁平,无层次结构 分层,包含网络部分和主机部分
作用范围 本地,仅在同一广播域内有效 全局,用于端到端路由
可变性 通常不变(随硬件移动) 可变(随设备接入的网络改变而改变)

地址类比

  • MAC 地址 \approx 身份证号:唯一标识个体,不随居住地改变。
  • IP 地址 \approx 邮政地址:标识位置,搬家后地址会改变,具有层级结构(国家/省/市/街道/门牌号)。

地址解析协议

在一个局域网(如以太网)中,主机 A 知道主机 B 的 IP 地址,但要将 IP 数据报封装成链路层帧发送给 B,还需要知道 B 的「MAC 地址」。如何根据 IP 地址找到对应的 MAC 地址?

解决方案:地址解析协议(ARP, Address Resolution Protocol)。

  • 作用范围:仅在同一个广播域(子网)内工作。
  • ARP 表(ARP Cache):
    • 每个在局域网上的 IP 节点(主机、路由器接口)都维护一个 ARP 表。
    • 表中存储了「近期」通信过的、在同一子网内的其他节点的 IP 地址到 MAC 地址的映射关系。
    • 表项格式通常为:<IP Address, MAC Address, TTL>
    • TTL:表项的生存时间(例如 20 分钟),超时后该表项会被删除,以应对网络中设备 MAC 地址可能发生的变化。

ARP 工作流程(主机 A 查询主机 B 的 MAC 地址):

  1. 主机 A 要向同一子网的 IP 地址 IP_B 发送数据。
  2. A 首先检查自己的 ARP 表中是否有 IP_B 的条目。
  3. 两种情况:
    1. ARP 缓存命中
      • 如果在 ARP 表中找到了 IP_B 对应的 MAC 地址 MAC_B,则 A 直接使用 MAC_B 作为目的 MAC 地址封装帧,并发送。
    2. ARP 缓存未命中
      • A 构造一个 ARP 请求消息。
        • 请求内容:「我是 IP 地址 IP_A,MAC 地址 MAC_A。请问谁拥有 IP 地址 IP_B?请告诉我你的 MAC 地址。」
      • A 将 ARP 请求消息封装在一个链路层帧中。
        • 源 MAC 地址:MAC_A
        • 目的 MAC 地址广播地址 FF-FF-FF-FF-FF-FF
      • A 将该广播帧发送到局域网上。
  4. 局域网上的所有节点都会收到这个广播帧,并解封装得到 ARP 请求消息。
  5. 每个节点检查 ARP 请求中的目标 IP 地址 IP_B
    • 如果目标 IP 地址不是自己的 IP 地址,则忽略该 ARP 请求。
    • 如果目标 IP 地址自己的 IP 地址(即主机 B 收到了请求):
      1. B 将发送方 A 的 IP 地址 IP_A 和 MAC 地址 MAC_A 记录到自己的 ARP 表中(因为 A 很可能马上要给自己发数据,或者 B 可能需要回复 A)。
      2. B 构造一个 ARP 回复消息。
        • 回复内容:「我是 IP 地址 IP_B,我的 MAC 地址是 MAC_B。」
      3. B 将 ARP 回复消息封装在一个链路层帧中。
        • 源 MAC 地址:MAC_B
        • 目的 MAC 地址MAC_A(直接发回给请求者 A,是单播帧)。
      4. B 将该单播帧发送出去。
  6. 主机 A 收到来自 B 的 ARP 回复帧。
  7. A 从 ARP 回复中提取出 B 的 IP 地址 IP_B 和 MAC 地址 MAC_B将这个映射关系存入自己的 ARP 表,并设置 TTL。
  8. 现在 A 知道了 MAC_B,可以封装原始的 IP 数据报(目的 IP 为 IP_B),使用 MAC_B 作为目的 MAC 地址,发送帧给 B。

ARP 是即插即用的

ARP 协议自动运行,无需网络管理员手动配置 IP 到 MAC 的映射。

发送数据到另一个子网

当主机 A 要发送数据报给「不同子网」的主机 B 时,情况有所不同:

  • 关键点在于,A 不能直接将帧发送给 B,因为它们不在同一个广播域。A 必须将帧发送给其默认路由器,由路由器负责将数据报转发出去。

假设

  • A 知道 B 的 IP 地址 IP_B
  • A 知道其默认路由器 R 的 IP 地址 IP_R(通常通过 DHCP 获取)。
  • A 需要知道路由器 R 的接口(连接到 A 所在子网的那个接口)的 MAC 地址 MAC_R

流程

  1. A 创建 IP 数据报:
    • 源 IP 地址:IP_A
    • 目的 IP 地址IP_B(注意:IP 地址始终是最终目的地的地址)
  2. A 需要确定下一跳的 MAC 地址。由于 IP_B 不在本地子网,A 知道需要将数据发送给默认路由器 IP_R
  3. A 使用 ARP 查询路由器 IP_R 的 MAC 地址 MAC_R(如果 ARP 表中没有的话)。过程与查询同一子网主机 MAC 地址相同。
  4. A 创建链路层帧:
    • 源 MAC 地址:MAC_A
    • 目的 MAC 地址MAC_R(路由器的 MAC 地址!)
    • 帧的数据部分:包含着源 IP 为 IP_A、目的 IP 为 IP_B 的 IP 数据报。
  5. A 将帧发送到局域网上。
  6. 路由器 R 的接口(MAC 地址为 MAC_R)收到该帧。
  7. R 解封装帧,提取出 IP 数据报。
  8. R 查看 IP 数据报的目的 IP 地址 IP_B
  9. R 查询自己的路由表,确定将该数据报转发到哪个下一跳(可能是 B 所在的子网接口,也可能是另一个路由器)。
  10. R 确定了下一跳的 IP 地址(假设是 IP_N)和发送该数据报的出接口。
  11. R 需要知道 IP_N 的 MAC 地址 MAC_N(如果下一跳就在出接口连接的子网上)。R 会在该子网上使用 ARP 查询 MAC_N(如果需要)。
  12. R 创建一个新的链路层帧:
    • 源 MAC 地址:R 的出接口的 MAC 地址。
    • 目的 MAC 地址:MAC_N
    • 帧的数据部分:仍然是那个原始的 IP 数据报(源 IP_A,目的 IP_B)。
  13. R 通过其出接口将这个新帧发送出去。
  14. 这个过程在每一跳路由器上重复,直到数据报最终到达目的主机 B 所在的子网。最后一跳路由器会将帧的目的 MAC 地址设置为 MAC_B,发送给 B
  15. B 收到帧,解封装,得到 IP 数据报,发现目的 IP 是自己,交给上层处理。
  • IP 数据报在从源到目的的整个传输过程中,其「源 IP 地址」和「目的 IP 地址」通常是不变的。
  • 链路层帧在每一跳传输时,其「源 MAC 地址」和「目的 MAC 地址」是会改变的,分别对应当前发送接口下一跳接收接口的 MAC 地址。

局域网与以太网

在讨论了链路层的基础概念、差错检测和多路访问协议后,我们将深入探讨局域网(LAN)的具体实现,特别是占据主导地位的以太网(Ethernet)技术。

以太网物理拓扑演进

  1. 总线型(Bus Topology):

    • 流行于 20 世纪 90 年代中期之前。
    • 所有节点共享同一物理介质(如同轴电缆)。
    • 所有节点位于同一个冲突域内,任何两个节点同时发送数据都会导致冲突。
    • 采用 CSMA/CD 协议进行介质访问控制。
  2. 星型交换式(Switched Topology):

    • 当前主流拓扑结构。
    • 中心设备为交换机(Switch),这是一个活跃的链路层设备。
    • 每个节点通过独立的线路(通常是双绞线或光纤)连接到交换机端口。
    • 每个端口是一个独立的冲突域。交换机内部通过缓存和转发机制处理数据帧,节点之间通常不会发生冲突(尤其是在全双工模式下)。
    • 现代交换式以太网通常运行在全双工模式下,允许节点同时发送和接收数据,无需 CSMA/CD。

以太网帧结构

发送方的网络接口(NIC)将来自网络层的数据包(如 IP 数据报)封装在以太网帧中进行传输。

  • 前同步码(Preamble, 8 Bytes):
    • 用于接收方 NIC 与发送方时钟同步。
    • 包含 7 字节的 10101010 和 1 字节的帧起始定界符(Start Frame Delimiter, SFD)10101011。SFD 标志着有效帧内容的开始
  • 目的 MAC 地址(Destination MAC Address, 6 Bytes):接收方 NIC 的物理地址。可以是单播、多播或广播地址(FF:FF:FF:FF:FF:FF)。
  • 源 MAC 地址(Source MAC Address, 6 Bytes):发送方 NIC 的物理地址。
  • 类型(Type, 2 Bytes):指示上层协议类型
    • 例如,0x0800 表示 IP 数据报,0x0806 表示 ARP 请求/应答。
    • 接收方根据此字段将数据部分(Payload)解复用给相应的网络层协议处理
    • 也可能承载其他协议,如 Novell IPX, AppleTalk 等(尽管现在较少见)。
  • 数据(Data/Payload, 46-1500 Bytes):封装的网络层数据包。
    • 最小长度为 46 字节。如果上层数据不足,需要填充(Padding)到 46 字节。这是为了确保帧长足够长,以便在使用 CSMA/CD 时能可靠地检测到冲突(帧的传输时间应不小于信号在网络中传播一个来回的时间)。
    • 最大长度为 1500 字节(标准 MTU, Maximum Transmission Unit)。
  • 循环冗余校验(Cyclic Redundancy Check, CRC, 4 Bytes):
    • 用于检测帧在传输过程中是否出现错误。
    • 接收方计算接收到的数据(地址、类型、数据字段)的 CRC,并与帧尾的 CRC 值比较。
    • 如果校验失败,表明帧出错,接收方会丢弃该帧

以太网特性

  • 无连接:发送方和接收方 NIC 之间没有握手过程。发送方直接发送,不事先确认接收方是否准备好
  • 不可靠
    • 接收方 NIC 对成功接收的帧不发送确认(ACK),对出错或丢失的帧不发送否认(NAK)。
    • 如果帧因 CRC 错误或其他原因被丢弃,数据的恢复依赖于上层协议(如 TCP)的可靠数据传输(RDT)机制。如果上层协议不提供可靠性(如 UDP),则数据丢失。
  • MAC 协议
    • 早期总线型以太网使用 CSMA/CD(载波侦听多路访问/冲突检测)协议,配合二进制指数退避算法解决冲突。
    • 现代交换式以太网(点对点连接,全双工)不再需要 CSMA/CD。

以太网交换机

交换机是现代以太网的核心设备,工作在「链路层」(Layer 2)。

交换机功能与特性

  • 主动角色:与被动连接设备的集线器不同,交换机是「主动」设备。
    • 存储转发:接收完整的以太网帧,检查其 CRC,然后根据目的 MAC 地址决定从哪个端口转发出去。
    • 检查 MAC 地址:查看入帧的目的 MAC 地址。
    • 选择性转发:仅将帧转发到必要的出端口。如果目的地址位于入端口所在的网段,则不转发(过滤)。
    • 访问控制:在需要转发帧到某个端口时,如果该端口连接的是共享介质(半双工),交换机也需要使用 CSMA/CD 访问该网段(现代通常是全双工点对点,无需 CSMA/CD)。
  • 透明性主机通常不知道网络中存在交换机。它们就像直接连接在一个大的局域网段上一样,但性能远超共享介质。
  • 即插即用交换机通常无需手动配置转发表,它们具有自学习能力。

交换机实现多路并发传输

  • 专用连接:主机与交换机端口之间是点对点的直接连接。
  • 帧缓冲:交换机内部有缓冲区,可以暂存待转发的帧。
  • 独立冲突域:每个交换机端口是一个独立的冲突域。
    • 无冲突:由于连接是点对点的,且通常工作在全双工模式下,主机与交换机之间以及交换机内部转发(只要出端口空闲)通常不会发生冲突。
  • 并发传输:交换机可以同时在多个端口对之间转发帧,只要这些路径不冲突(例如,A 到 A' 的传输和 B 到 B' 的传输可以同时进行)。这极大地提高了网络的总吞吐量。

传输冲突

虽然交换机内部可以并发处理多对传输,但如果多个入帧的目的地是同一个出端口,它们仍然需要在该出端口排队等待传输,不能同时发送到该端口连接的链路上。例如,A 到 A' 和 C 到 A' 的传输不能同时发生(在 A' 所连接的链路上)。

交换机转发表

交换机如何知道将帧转发到哪个端口?它维护一个交换表,也常被称为 MAC 地址表CAM 表(Content Addressable Memory Table)。每个表项包含:

  • MAC 地址:某个主机的 MAC 地址。
  • 接口:要到达该 MAC 地址需要从哪个交换机端口转发出去。
  • 时间戳/TTL:该表项的老化时间。用于自动删除长时间不活动的条目,以适应网络拓扑的变化。

交换表在功能上类似于路由器的「路由表」,但工作在链路层,使用 MAC 地址进行查找。

交换机的自学习

交换机通过观察流经它的帧自动构建和维护其转发表

学习过程:

  1. 当一个帧到达交换机的某个端口(例如,端口 1)时,交换机检查该帧的源 MAC 地址(例如,主机 A 的 MAC 地址)。
  2. 交换机在其转发表中查找该源 MAC 地址。
    • 如果没有找到该 MAC 地址,或者找到的条目指向不同的端口,交换机就学习到:MAC 地址 A 可以通过端口 1 到达。它会在转发表中添加或更新一条记录 (MAC_A, Port_1, TTL)
    • 如果找到的条目已经指向端口 1,则刷新该条目的 TTL(重置老化计时器)。

示例:

  • 初始时,交换表为空。
  • 主机 A(MAC_A) 通过端口 1 向主机 A'(MAC_A') 发送一个帧。
  • 交换机收到帧,记录下 (MAC_A, 1, TTL)

交换机的帧过滤与转发

当交换机收到一个帧后,它执行以下步骤:

  1. 记录源地址:执行自学习过程,记录或更新帧的源 MAC 地址与入端口的关联。
  2. 查找目的地址:使用帧的目的 MAC 地址在交换表中进行查找。
  3. 转发决策
    1. 找到匹配条目
      • 设找到的条目指示目的 MAC 地址可以通过端口 X 到达。
      • 过滤(Filtering):如果端口 X该帧的入端口,说明目的主机与源主机在同一个网段(连接到同一个端口),交换机丢弃该帧(无需转发)。
      • 转发(Forwarding):如果端口 X 不是该帧的入端口,交换机将该帧从端口 X 转发出去。
    2. 未找到匹配条目(目的 MAC 地址未知)
      • 泛洪(Flooding):交换机将该帧复制并从除入端口之外的所有其他端口转发出去。这确保了帧能够到达网络中的所有其他网段,最终到达目的主机(如果存在且在线)。目的主机响应后,交换机就能学习到它的位置。
    3. 目的地址是广播地址(FF:FF:FF:FF:FF:FF
      • 泛洪(Flooding):同样执行泛洪操作,将帧转发到除入端口外的所有端口。

伪代码表示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 1. 自学习过程:记录/更新源 MAC 地址
source_mac = frame.source_address
update_switch_table(source_mac, incoming_port)

# 2. 获取目的 MAC 地址
dest_mac = frame.destination_address

# 3. 转发决策
# 3.1 检查是否是广播地址
if dest_mac == "FF:FF:FF:FF:FF:FF":
# 广播帧:泛洪到所有其他端口
flood_frame(frame, exclude_port=incoming_port)
return

# 3.2 在交换表中查找目的 MAC
out_port = lookup_switch_table(dest_mac)

if out_port is not None:
# 找到匹配条目
if out_port == incoming_port:
# 过滤:源和目的在同一端口,丢弃帧
drop_frame(frame)
else:
# 转发:从指定端口发出
forward_frame(frame, out_port)
else:
# 未知目的 MAC:泛洪
flood_frame(frame, exclude_port=incoming_port)

自学习与转发示例:

  • 续上例,交换表中有 (MAC_A, 1, TTL)
  • 此时主机 A (MAC_A) 通过端口 1 向主机 A' (MAC_A') 发送帧。
  • 学习:刷新 (MAC_A, 1, TTL) 的 TTL。
  • 查找:在表中查找 MAC_A'。
  • 决策
    • 如果 MAC_A' 未知泛洪该帧到除端口 1 外的所有端口(假设 A' 连接在端口 4)。
    • 当 A' 响应 A 时,帧从端口 4 进入交换机。交换机学习到 (MAC_A', 4, TTL)
    • 此后,当 A 再向 A' 发送帧时,交换机查找 MAC_A',找到条目 (MAC_A', 4, TTL),直接将帧转发到端口 4。
    • 当 A' 向 A 发送帧时,交换机查找 MAC_A,找到条目 (MAC_A, 1, TTL),直接将帧转发到端口 1。

交换机互联

自学习交换机可以相互连接,构建更大规模的局域网。

  • 工作方式不变:多交换机环境下的自学习和转发机制与单交换机情况完全相同。
  • 透明扩展:对于主机而言,网络拓扑仍然是透明的。
  • 路径学习:当一个帧需要跨越多个交换机时(例如,从 S1 下的 A 发送到 S3 下的 G),中间的交换机(如 S4)也会通过自学习过程记录下 MAC 地址与相应端口(连接其他交换机的端口)的关联。

示例:假设 C(连接 S1)发送帧给 I(连接 S3),然后 I 响应 C。

  1. C \to I:
    • 帧到达 S1。S1 学习 (MAC_C, Port_C)。查找 MAC_I 未知,泛洪。
    • 帧通过 S1 连接 S4 的端口到达 S4。S4 学习 (MAC_C, Port_S1)。查找 MAC_I 未知,泛洪。
    • 帧通过 S4 连接 S3 的端口到达 S3。S3 学习 (MAC_C, Port_S4)。查找 MAC_I 未知,泛洪。
    • 帧通过 S3 连接 I 的端口到达 I。
  2. I \to C:
    • 帧到达 S3。S3 学习 (MAC_I, Port_I)。查找 MAC_C 已知 (MAC_C, Port_S4),转发到 S4。
    • 帧到达 S4。S4 学习 (MAC_I, Port_S3)。查找 MAC_C 已知 (MAC_C, Port_S1),转发到 S1。
    • 帧到达 S1。S1 学习 (MAC_I, Port_S4)。查找 MAC_C 已知 (MAC_C, Port_C),转发到 C。

之后,所有交换机都知道了 C 和 I 的位置,后续通信将是选择性转发。

交换机 vs. 路由器

虽然交换机和路由器都执行存储转发,并且都有转发表,但它们在网络协议栈中扮演不同角色:

特性 交换机(Switch) 路由器(Router)
工作层级 链路层(Layer 2) 网络层(Layer 3)
检查头部 链路层头部(MAC 地址) 网络层头部(IP 地址)
转发依据 MAC 地址 IP 地址
转发表名称 MAC 地址表/CAM 表 路由表(Routing Table)
表建立方式 自学习(观察流量),泛洪 路由算法(如 RIP, OSPF, BGP),配置
处理范围 通常在单个广播域 连接不同的广播域(网络)
隔离 隔离冲突域 隔离广播域
地址修改 通常不修改帧内容(除 VLAN tag) 修改 L2 头部(MAC 地址), 递减 TTL
主要功能 在局域网内高效转发帧 在不同网络间选择最佳路径转发数据包

虚拟局域网(VLAN)

随着局域网规模扩大和用户移动性增加,传统的单一扁平化 LAN 面临挑战。

VLAN 动机

  • 单一广播域问题
    • 扩展性:在一个大型物理 LAN 中,所有二层广播流量(如 ARP 请求、DHCP 请求、未知单播帧的泛洪)必须传播到整个 LAN 的每个角落。这会消耗大量带宽和主机 CPU 资源。
    • 效率、安全、隐私:广播风暴可能影响整个网络的性能。任何用户都可能监听到广播流量,存在安全和隐私风险。
  • 管理问题
    • 用户物理位置变动(例如,从计算机科学系办公室搬到电气工程系办公室)但逻辑归属不变。如果仅基于物理连接,用户会加入新的物理 LAN 段,可能需要重新配置 IP 地址等,管理复杂。

目标:在「逻辑上」将一个大的物理 LAN 划分为多个虚拟的隔离的广播域,即使这些域的成员物理上分布在不同的交换机上。

VLAN

虚拟局域网(Virtual Local Area Network, VLAN)允许将一个物理交换网络划分为多个逻辑上的广播域。同一 VLAN 内的设备可以像在同一个物理 LAN 段一样通信,而不同 VLAN 间的通信通常需要通过路由器(Layer 3 设备)进行。

基于端口的 VLAN (Port-based VLAN)

这是最常见的 VLAN 实现方式。

  • 配置:网络管理员通过交换机管理软件将交换机的物理端口分配给不同的 VLAN ID(例如 VLAN 10 for CS, VLAN 20 for EE)。
  • 效果:一个物理交换机可以被配置为像多个独立的虚拟交换机一样工作。
    • 例如,端口 1-8 属于 VLAN 10,端口 9-15 属于 VLAN 20。
  • 流量隔离
    • 从属于 VLAN 10 的端口(1-8)进入的帧(包括广播帧)只能被转发到同属于 VLAN 10 的其他端口(1-8)。它们不能到达属于 VLAN 20 的端口(9-15)。
    • 反之亦然。
  • 动态成员:虽然基于端口是最常见的,VLAN 成员关系也可以基于 MAC 地址、协议类型等动态定义,但这在管理上更复杂。
  • VLAN 间转发:由于不同 VLAN 是隔离的广播域(如同独立的物理 LAN),它们之间的通信必须通过路由器(或支持路由功能的 L3 交换机)进行。路由器连接到每个 VLAN,并根据 IP 地址进行跨 VLAN 的数据包转发。

跨越多交换机的 VLAN 与 Trunking

当 VLAN 需要跨越多个物理交换机时(例如,CS 系的用户分布在两栋楼的交换机上,但都属于 VLAN 10),需要一种机制来连接这些物理上分离但逻辑上属于同一 VLAN 的段。

  • Trunk 端口(Trunk Port):交换机之间互联的端口可以配置为 Trunk 模式。Trunk 端口承载多个 VLAN 的流量
  • VLAN 标记(VLAN Tagging):由于 Trunk 端口上传输的帧可能来自不同的 VLAN,普通以太网帧无法区分它们属于哪个 VLAN。因此,在 Trunk 链路上转发的帧需要携带额外的 VLAN 标识信息
  • IEEE 802.1Q 协议:这是最广泛使用的 VLAN 标记协议。
    • 当一个帧需要通过 Trunk 端口发送时,交换机会在标准的以太网帧头(源 MAC 和类型字段之间)插入一个 4 字节的 802.1Q 标签
    • 当帧通过 Trunk 端口到达对端交换机时,该交换机检查 802.1Q 标签,确定帧所属的 VLAN,然后移除标签,并将帧转发到该 VLAN 内的相应普通端口。

802.1Q VLAN 帧格式

  • 802.1Q Tag (4 Bytes) 插入在源 MAC 地址和原始类型字段之间:
    • Tag Protocol Identifier(TPID) (2 Bytes): 值通常为 0x8100,表明这是一个带有 802.1Q 标签的帧。
    • Tag Control Information(TCI) (2 Bytes):
      • Priority Code Point(PCP) (3 bits): 用于实现服务质量(QoS),类似于 IP 头部的 TOS/DSCP 字段,定义 8 个优先级。
      • Drop Eligible Indicator(DEI) (1 bit):(以前叫 CFI)指示在网络拥塞时该帧是否可以被优先丢弃。
      • VLAN Identifier(VLAN ID) (12 bits): 标识该帧所属的 VLAN。12 位允许最多 212=40962^{12} = 4096 个 VLAN(其中一些 ID 保留)。
  • CRC:由于帧内容(增加了 Tag)发生了改变,需要重新计算 CRC 值。

EVPN/VXLAN (Ethernet VPNs/Virtual Extensible LANs)

在大型数据中心和广域网场景下,需要更灵活、可扩展的方式来连接跨越 Layer 3 网络的 Layer 2 网段(例如,连接不同地理位置数据中心内的同一个 VLAN)。

  • 目标:逻辑上将分散的 Layer 2 以太网交换机(或网络)连接起来,仿佛它们在同一个 LAN 中。
  • 方法:隧道技术(Tunneling)。将原始的以太网帧(Layer 2)封装在 IP 数据报(Layer 3)或其他隧道协议(如 UDP,用于 VXLAN)中,通过底层的 IP 网络进行传输。
  • 效果:在 Layer 3 网络之上构建一个覆盖网络(Overlay Network),实现 Layer 2 网段的「延伸」。
  • EVPN (Ethernet VPN) 和 VXLAN (Virtual Extensible LAN) 是实现这种功能的常用技术,它们提供了更强的扩展性(VXLAN 支持多达 2242^{24} 个逻辑网络)和灵活性。

VXLAN 通常将原始以太网帧封装在 UDP \to IP \to 以太网 头部中进行传输。VTEP 负责封装和解封装。

链路虚拟化:MPLS

MPLS(Multiprotocol Label Switching, 多协议标签交换) 是一种在 IP 网络中提高转发速度和实现流量工程的技术,可以看作一种链路层(或介于 L2 和 L3 之间,常称为 L2.5)的虚拟化技术。

MPLS 目标与思想

  • 目标:在 MPLS 网络内部实现高速转发,同时提供比传统 IP 路由更灵活的路径控制能力(如流量工程)。
  • 核心思想
    • 进入 MPLS 网络的 IP 数据包会被分配一个定长的标签 MPLS。
    • 网络内部的 MPLS 路由器(称为标签交换路由器 Label Switched Router, LSR)仅根据这个标签进行转发决策,而无需查看 IP 头部(特别是无需进行最长前缀匹配)。
    • 转发基于精确匹配标签值,查找速度快。
    • 借鉴了虚电路(Virtual Circuit, VC)的思想,为特定的流量类别或路径(称为 Label Switched Path, LSP)预先建立标签转发路径。
    • 但与纯 VC 不同,IP 数据报本身仍然保留其 IP 地址,只是在 MPLS 网络内部被「贴标」传输。

MPLS 帧/标签结构

MPLS 标签通常插入在链路层头部和网络层头部之间。

  • Label (20 bits): 标签值,用于转发查找。
  • Experimental(Exp) (3 bits): 通常用于 QoS (Class of Service)。
  • Stack(S) (1 bit): 栈底指示位。1 表示这是标签栈中的最后一个标签。MPLS 支持标签嵌套(标签栈)。
  • Time to Live(TTL) (8 bits): 与 IP TTL 类似,用于防止数据包在 MPLS 网络中无限循环。

MPLS 路由器(LSR)

  • 也称为标签交换路由器(Label-Switched Router)。
  • 转发机制:
    • 根据入端口和入标签值,在 MPLS 转发表(LFIB, Label Forwarding Information Base)中查找。
    • LFIB 指示:出端口、要替换的新标签值(标签交换)、以及可能的其他操作(如压入新标签、弹出标签)。
    • 不检查 IP 地址进行转发决策。
  • 转发表分离:MPLS 转发表(LFIB)与 IP 路由表(FIB, Forwarding Information Base)是分开的。

MPLS 的灵活性

MPLS 的转发决策可以独立于 IP 路由协议(如 OSPF, BGP)计算出的最短路径。

  • 流量工程:可以基于源地址、目的地址、服务类型等多种因素,为不同的流量流规划不同的路径(LSP),即使它们的目的地相同。这有助于负载均衡、优化网络资源利用、满足特定 QoS 要求。
  • 快速重路由(Fast Reroute, FRR):可以预先计算和建立备份路径。当主路径发生链路或节点故障时,入口 LSR 或故障点上游的 LSR 可以迅速将流量切换到备份路径,恢复时间远快于 IP 路由协议的收敛时间。

MPLS vs. IP 路径

  • IP 路由:路径选择通常仅基于目的 IP 地址(采用最长前缀匹配),并且通常选择最短路径(根据路由协议的度量)。
  • MPLS 路由:路径(LSP)可以基于多种因素(源、目的、端口、QoS 等)进行设定,不一定是 IP 协议计算出的最短路径。由网络管理员或控制平面(如 RSVP-TE, SDN 控制器)进行路径计算和标签分发。

例如:

  • IP 路由可能总是选择 R4 \to R3 \to R1 到达 A。
  • MPLS 可以配置一条路径 R4 \to R2 \to R1 到达 A,即使 R4 \to R3 \to R1 是 IP 上的最短路径。例如,为了避开 R3 的拥塞,或者为特定源(如 R6)的流量指定不同路径。

MPLS 转发表示例

MPLS 路由器(LSR)维护 LFIB,指导标签交换操作。

  • 当 R4 收到来自 R6、标签为 10 的包时,查找 LFIB,发现应将标签换为 6,并从连接 R2 的接口发出。
  • 当 R2 收到来自 R4、标签为 6 的包时,查找自己的 LFIB,可能发现应弹出标签(PHP, Penultimate Hop Popping)或换成最终标签,并从连接 A 的接口发出。

数据中心网络

现代互联网应用(云计算、大数据、视频流、搜索等)严重依赖于大规模数据中心。

数据中心特点与挑战

  • 规模:包含数万到数十万甚至更多的服务器(主机),紧密部署。
  • 应用:承载多种应用,如电子商务(Amazon)、内容分发(YouTube)、搜索引擎/数据挖掘(Google)。
  • 挑战
    • 多应用与多租户:需要支持大量并发客户请求,隔离不同应用/租户的流量。
    • 可靠性:硬件故障是常态,网络必须具备高容错性。
    • 负载管理:需要在服务器和网络链路上进行负载均衡,避免瓶颈。
    • 性能:低延迟和高带宽对许多应用至关重要。

数据中心网络架构

通常采用多层级高冗余的交换网络拓扑。

  • 服务器机架:包含 20~40 台服务器(刀片服务器)。
  • 机架顶交换机:每个机架配备一个或两个 ToR 交换机,直接连接该机架内的所有服务器。通常使用高速以太网(如 100G~400G)连接服务器。
  • 汇聚层交换机:连接多个 ToR 交换机。
  • 核心层交换机:连接多个汇聚层交换机,提供高带宽骨干。
  • 边界路由器:连接数据中心到外部互联网。

常见拓扑:Clos 网络(如 Fat-Tree)、Facebook F16 Minipack 使用的多平面 Fabric 架构等,旨在提供高带宽、低延迟、多路径的连接。

数据中心网络特性

  • 多路径:丰富的交换机互联提供了大量冗余路径。
    • 提高吞吐量:流量可以在多条路径上传输(如使用 ECMP, Equal Cost Multi-Path)。
    • 提高可靠性:单条链路或交换机故障不影响整体连通性。
  • 应用层路由/负载均衡
    • 负载均衡器:通常部署在数据中心入口,作为应用层设备。
    • 接收外部客户端请求。
    • 根据服务器负载、健康状况、会话亲和性等策略,将请求定向到内部的某台服务器。
    • 对外部客户端隐藏数据中心内部结构

数据中心协议创新

为了满足高性能、高可靠、易管理的需求,数据中心网络采用了许多协议创新:

  • 链路层
    • RoCE(RDMA over Converged Ethernet):允许服务器通过以太网进行远程直接内存访问(Remote Direct Memory Access, RDMA),绕过 CPU 和操作系统内核,实现极低延迟的数据传输。
  • 传输层
    • ECN(Explicit Congestion Notification):路由器/交换机在发生拥塞时,在 IP 头部标记 ECN 位,而不是直接丢包,通知端系统降低发送速率。
    • DCTCP(Data Center TCP), DCQCN:基于 ECN 的、专门为数据中心低延迟、高带宽环境优化的拥塞控制算法。
    • Hop-by-Hop Congestion Control(Backpressure):一些方案尝试在交换机之间实现逐跳的拥塞控制(流控),防止拥塞蔓延。
  • 路由与管理
    • SDN(Software-Defined Networking):广泛应用于数据中心,实现网络控制平面与数据平面的分离,提供集中化、可编程的网络管理和流量调度能力。
    • 服务就近部署:将相互关联的服务或数据尽可能部署在同一个机架或邻近机架,以最小化跨越 Tier-2/Tier-1 交换机的通信延迟和带宽消耗。

综合:一个 Web 请求的生命周期

通过一个具体的场景,回顾并综合运用从应用层到链路层所学的协议知识。

  • 场景:一个学生带着笔记本电脑来到校园网,连接网络,并访问 www.google.com
  • 假设
    • 校园网使用 DHCP 分配 IP 地址。
    • 校园网网关路由器同时作为 DHCP 服务器和本地 DNS 解析的转发器(或缓存)。
    • 校园网通过 Comcast 网络接入互联网。
    • www.google.com 的 Web 服务器 IP 地址为 64.233.169.105
    • 校园网内部使用以太网交换机。

步骤

  1. 连接到网络(物理层 & 链路层):

    • 学生将笔记本电脑通过以太网线连接到墙上的端口,或连接到 Wi-Fi AP。物理连接建立。
    • 以太网 NIC 或 Wi-Fi NIC 启动。
  2. 获取 IP 配置(DHCP - UDP/IP/Ethernet 之上应用层):

    • 笔记本电脑需要获取 IP 地址、子网掩码、默认网关地址、DNS 服务器地址。
    • DHCP Discover (应用层):客户端构建 DHCP Discover 消息。
    • 封装
      1. DHCP(App)
      2. UDP(Transport, src port 68, dst port 67)
      3. IP(Network, src IP 0.0.0.0, dst IP 255.255.255.255)
      4. Ethernet(Link, src MAC = client MAC, dst MAC = FF:FF:FF:FF:FF:FF)
    • 发送:以太网帧在本地 LAN(校园网)内广播
    • 交换机处理:交换机学习客户端 MAC 地址与端口的关联,并将广播帧泛洪到除入端口外的所有端口。
    • DHCP 服务器响应:校园网的 DHCP 服务器(可能在网关路由器上)收到 Discover 帧。
    • DHCP Offer:服务器构建 DHCP Offer 消息(包含提议的 IP 配置)。
    • 封装与发送
      1. DHCP
      2. UDP
      3. IP(src IP = DHCP server IP, dst IP = 255.255.255.255/提议的 client IP,取决于实现)
      4. Ethernet(src MAC = server MAC, dst MAC = client MAC/FF:FF:..)
      • 通常单播或广播回送 Offer。
    • DHCP Request & ACK:客户端收到 Offer 后,发送 DHCP Request 确认接受;服务器回复 DHCP ACK,完成配置。
    • 结果
      • 客户端获得 IP 地址,如 68.80.2.x
      • 网关 IP,如 68.80.2.1
      • DNS 服务器 IP,如 68.80.0.1
  3. 解析域名(DNS - UDP/IP/Ethernet 之上应用层):

    • 用户在浏览器输入 www.google.com。浏览器需要获取其 IP 地址。
    • DNS Query (应用层):客户端构建 DNS 查询请求。
    • 封装
      1. DNS
      2. UDP(dst port 53)
      3. IP(src IP = client IP, dst IP = DNS server IP)
      4. Ethernet(src MAC = client MAC, dst MAC = ???)
    • 需要网关 MAC 地址(ARP - 链路层辅助):客户端发现 DNS 服务器 IP 不在本地子网,需要将 IP 包发给默认网关。但它不知道网关的 MAC 地址。
      • ARP Request:客户端构建 ARP 请求(查询网关 IP 对应的 MAC 地址)。
      • 封装
        1. ARP
        2. Ethernet(src MAC = client MAC, dst MAC = FF:FF:FF:FF:FF:FF)
      • 发送与响应:ARP 请求在本地 LAN 广播。网关路由器收到后,回复 ARP Reply(包含网关 MAC 地址),单播给客户端。
      • 结果:客户端学习到网关的 MAC 地址。
    • 发送 DNS 查询:现在客户端可以构建完整的以太网帧了。
      • Ethernet(src MAC = client MAC, dst MAC = gateway MAC)
    • 转发:帧发送到交换机,交换机根据 MAC 地址表将帧转发给网关路由器。
    • DNS 解析过程:网关路由器收到 IP 包,解封装到 DNS 查询。它可能自己缓存了结果,或代表客户端向根 DNS、顶级域 DNS、权威 DNS 服务器迭代或递归查询,最终获得 www.google.com 的 IP 地址 64.233.169.105
    • DNS Reply:DNS 服务器将包含 IP 地址的 DNS 回复发送回客户端(经过 IP 路由和以太网转发)。
    • 结果:客户端知道了 www.google.com 的 IP 地址。
  4. 建立 TCP 连接(TCP - IP/Ethernet 之上传输层):

    • 浏览器需要向 Web 服务器(64.233.169.105)的 80 端口发起 HTTP 请求,首先需要建立 TCP 连接。
    • TCP SYN:客户端构建 TCP SYN 段(设置 SYN=1, 随机选择初始序列号)。
    • 封装
      1. TCP
      2. IP(src IP = client IP, dst IP = 64.233.169.105)
      3. Ethernet(src MAC = client MAC, dst MAC = gateway MAC)
    • 发送与路由:帧发送到网关。网关路由器进行 IP 路由查找,将 IP 包转发到下一跳(例如,Comcast 网络中的路由器),并重写以太网头部(src MAC = 网关出接口 MAC, dst MAC = 下一跳路由器 MAC)。IP 包跨越多个网络(校园网 \to Comcast \to Google 网络)被路由到 Google Web 服务器。
    • TCP SYNACK:Web 服务器收到 SYN 后,回复 TCP SYNACK 段(SYN=1, ACK=1, ack num = client isn + 1, server 选择自己的 isn)。
    • 封装与路由:TCP \to IP \to Ethernet… 包被路由回客户端。
    • TCP ACK:客户端收到 SYNACK 后,回复 TCP ACK 段(ACK=1, ack num = server isn + 1)。
    • 结果:TCP 三次握手完成,连接建立。
  5. 发送 HTTP 请求(HTTP - TCP/IP/Ethernet 之上应用层):

    • HTTP GET Request:浏览器构建 HTTP GET 请求消息。
    • 封装
      1. HTTP
      2. TCP(将 HTTP 消息放入 TCP 段)
      3. IP
      4. Ethernet…
    • 发送与路由:数据包通过已建立的 TCP 连接,经由互联网路由到 Web 服务器。
  6. 接收 HTTP 响应(HTTP - TCP/IP/Ethernet 之上应用层):

    • HTTP Response:Web 服务器处理请求,构建包含网页内容的 HTTP 响应消息。
    • 封装
      1. HTTP
      2. TCP(可能分成多个 TCP 段)
      3. IP
      4. Ethernet…
    • 发送与路由:数据包通过 TCP 连接路由回客户端。
    • 客户端处理:客户端 TCP 接收数据段,进行重组、确认。浏览器接收到完整的 HTTP 响应。
  7. 渲染页面(应用层):

    • 浏览器解析 HTML,可能需要请求额外的资源(图片、CSS、JS),重复步骤 3-6。最终将页面显示给用户。

协议栈协同工作

这个简单的 Web 请求过程展示了计算机网络中不同层次协议的紧密协作:

  • 应用层(HTTP, DNS, DHCP)定义了通信的内容和规则。
  • 传输层(TCP, UDP)提供端到端的连接管理、可靠性(TCP)或速度(UDP)。
  • 网络层(IP)负责跨网络的数据包路由和寻址。
  • 链路层(Ethernet, ARP, Wi-Fi)负责在单个物理网络段上传输数据帧,进行介质访问控制和物理寻址(MAC)。
  • 物理层 负责比特流的传输。