链路层和局域网
链路层概述
链路层(Link Layer)
链路层是网络协议栈中的第二层,位于物理层之上、网络层之下。它的核心职责是在物理上相邻的节点之间,通过链路可靠地传输数据报。
核心术语
- 节点:网络中的设备,包括主机和路由器。
- 链路:连接相邻节点的通信通道。链路可以是:
- 有线的(如以太网线缆、光纤)
- 无线的(如 Wi-Fi、蜂窝网络)
- 局域网(LANs)本身也可以看作是一种链路环境。
- 帧(frame):链路层的协议数据单元(PDU)。网络层的数据报被封装在帧中进行传输。链路层负责将数据报从一个节点传输到路径上的下一个物理相邻的节点。
链路层的上下文
- 异构链路:一个端到端的通信路径可能由多种不同类型的链路组成。例如,从笔记本电脑(Wi-Fi)到家庭路由器,再通过以太网连接到 ISP,最后通过光纤网络传输。数据报在每一段链路上都可能由不同的链路层协议进行处理和传输。
- 多样化服务:不同的链路层协议提供的服务也不同。例如:
- 某些协议(如一些无线链路协议)可能提供可靠的数据传输服务,确保数据无差错、按顺序到达相邻节点。
- 而另一些协议(如经典的以太网)则可能不保证可靠传输,将差错恢复的任务交给上层协议(如 TCP)。
旅行类比
为了更好地理解链路层的作用,我们可以将其与一次旅行进行类比:
- 数据报 「旅客」
- 需要从起点传输到终点的信息单元。
- 链路层协议 「交通工具」(豪华轿车、飞机、火车)
- 在不同路段(链路)上使用的具体传输方式。
- 通信链路 「路段」(Princeton 到 JFK 机场、JFK 到日内瓦、日内瓦到洛桑)
- 连接相邻节点的路径段。
- 路由算法 「旅行社」
- 负责规划整个行程(数据报的端到端路径)。
这个类比突显了链路层负责的是「单段行程」的传输,而路由算法(网络层)负责规划「整个旅程」。
链路层提供的服务
链路层为其上层(网络层)提供多种关键服务:
- 成帧:
- 将来自网络层的数据报封装成帧,添加链路层「首部」和「尾部」。
- 首部:通常包含源和目的 MAC 地址,以及其他控制信息。
- 尾部:通常包含差错检测信息。
- 链路接入:
- 在广播信道或共享介质的环境下(例如 Wi-Fi 或早期的总线型以太网),需要媒体访问控制协议来协调多个节点对信道的访问,避免或解决冲突。
- 帧首部中的 MAC 地址用于标识帧的物理源和目的节点,这与网络层的 IP 地址不同。
- 相邻节点间的可靠交付:
- 通过确认和重传机制,确保数据帧在两个直接相连的节点间无差错地传输。
- 这项服务在误码率较低的有线链路上(如光纤、现代以太网)很少使用,以避免不必要的开销。
- 但在误码率较高的无线链路(如 Wi-Fi、蜂窝网络)上则非常重要,因为在链路层解决错误比等到端到端(如 TCP)才发现和重传要高效得多。
为什么需要链路层和端到端两种可靠性?
- 效率:在易出错的链路上,及早发现并重传错误帧比等待端到端超时重传整个数据报更有效率,避免了错误数据在网络中无效传播。
- 针对性:链路层可靠性只处理特定链路上的传输错误,而端到端可靠性(如 TCP)处理的是整个路径上的丢包、乱序等问题。两者解决的问题层面不同。
- 流量控制:
- 协调相邻的发送节点和接收节点之间的传输速率,防止快速的发送方淹没慢速的接收方。
- 差错检测:
- 由于信号在物理介质传输中可能受到衰减、噪声等干扰,导致比特错误(0 变 1 或 1 变 0)。
- 发送方在帧中加入差错检测位,接收方通过计算和比较这些位来检测帧在传输中是否出错。
- 如果检测到错误,接收方通常会丢弃该帧(如果链路层不提供可靠传输),或者通知发送方重传(如果提供可靠传输)。
- 差错纠正:
- 接收方不仅能检测到错误,还能直接纠正某些类型的比特错误,而无需请求重传。这对于延迟敏感或重传代价高的应用(如实时音视频)尤其有用。
- 半双工与全双工:
- 半双工:链路两端的节点都可以发送数据,但不能同时进行。需要协调机制避免冲突。
- 全双工:链路两端的节点可以同时发送和接收数据,无需担心冲突。现代交换式以太网通常工作在全双工模式。
链路层的实现
网络接口卡(NIC)
链路层及其下方的物理层功能,通常被集成在主机的网络接口卡(Network Interface Card, NIC)中,也称为「网络适配器」或「网卡」。
- 每个主机和路由器都包含链路层实现。
- NIC 通常是一个独立的硬件板卡(如 PCI/PCIe 网卡)或直接集成在主板芯片上。
- 它通过主机的系统总线(如 PCIe)与 CPU 和内存交互。
- NIC 是硬件、软件(驱动程序)和固件(存储在 NIC 上的软件)的结合体。
发送与接收过程
- 发送端:
- NIC 从主机内存中获取网络层传来的数据报。
- 在 NIC 内部(硬件/固件/软件协同)进行「封装」:添加链路层首部(含 MAC 地址)和尾部(含差错检测码),形成帧。
- 可能执行其他链路层服务,如可靠传输控制、流量控制。
- 将帧交给物理层,转换为信号在链路上传输。
- 接收端:
- 物理层接收信号,转换为比特流,传递给 NIC。
- NIC 检测帧的边界。
- 执行链路层服务:
- 差错检测:检查帧尾的 EDC 位。
- 可靠传输处理(如果启用)。
- 流量控制处理(如果启用)。
- 如果帧有效且无误,进行「解封装」:提取出网络层数据报。
- 将数据报通过系统总线传递给主机内存中的网络层协议栈。
差错检测与纠正技术
基本概念
- 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)的首部校验,链路层较少直接使用,但原理类似。
- 发送方:
- 将要校验的数据(如 UDP 首部 + 数据)看作一系列 16 比特的整数。
- 计算这些 16 比特整数的反码和。
- 反码加法:二进制加法,最高位的进位要加回到最低位。
- 将最终得到的和按位取反,得到的值就是校验和。放入校验和字段。
- 接收方:
- 将收到的所有 16 比特数据(包括校验和字段本身)进行反码求和。
- 如果结果的所有比特都是 1(即反码表示的 -0),则认为数据很可能没有错误。否则,检测到错误。
这种校验相对较弱,可能无法检测出某些错误模式(如两个 16 比特字中对应比特同时翻转)。
循环冗余校验
目前应用最广泛、检错能力很强的差错检测技术之一(如以太网、Wi-Fi、HDLC 等)。
可参考旧笔记。
基于多项式编码和模 2 算术(加法和减法等价于异或 XOR,无进位借位)。
- 基本原理:
- 发送方和接收方预先约定一个 比特的生成多项式,记为 (最高位和最低位必须为 1)。
- 设要发送的数据为 ( 比特)。发送方希望计算出一个 比特的冗余校验码(CRC 码),记为 。
- 目标是使得 左移 位后(即 )与 拼接起来形成的数据 ,能够被 模 2 整除。
- 计算方法:(这里的除法是模 2 除法)。
- 发送方将 发送出去。
- 接收方:
- 收到数据 。
- 用约定的生成多项式 去模 2 除 。
- 如果余数为 0,则认为数据很可能没有错误。
- 如果余数非 0,则检测到错误,丢弃该帧。
- 检错能力:
- 可以检测出所有小于等于 位的突发错误(Burst Errors,即连续 位错误)。
- 可以检测出所有奇数个比特的错误。
- 在特定条件下,对于更长的突发错误也有很高的检测概率。
- 常用的 CRC 标准(如 CRC-32 用于以太网)具有非常强大的检错能力。
CRC 计算示意(模 2 除法)
假设 ()。
计算 。
执行模 2 除法 :
所以 。发送的数据为 。
接收方收到 后,计算 ,会发现余数为 0。
多路访问协议
当多个节点共享同一个广播信道时,需要解决如何协调它们访问信道的问题,这就是「多路访问问题」。用于解决此问题的协议称为多路访问控制(Medium Access Control, MAC)协议。
链路类型:
- 点对点链路:链路两端只有两个节点(如 PPP、交换机到主机的以太网连接)。不存在多路访问问题。
- 广播链路:多个节点共享同一物理介质(如早期的总线型以太网、无线局域网 Wi-Fi、卫星通信)。需要 MAC 协议。
在广播链路中,如果两个或多个节点「同时」发送数据,它们的信号会在信道中叠加、相互干扰,导致接收方无法正确解码任何一个信号。这种情况称为碰撞(collision)。
MAC 协议的目标
理想的 MAC 协议应具备以下特性(假设信道速率为 ):
- 高效性(单一节点):当只有一个节点需要发送数据时,它应该能够以全部速率 进行发送。
- 高效性(多节点):当有 个节点活跃并希望发送数据时,每个节点应该能够获得平均约为 的吞吐量。协议应能有效利用信道带宽。
- 公平性:每个节点应该有公平的机会访问信道。
- 完全分布式:
- 没有中心控制节点来协调传输(避免单点故障和瓶颈)。
- 节点间无需时钟同步或时隙同步(简化实现)。
- 简单性:协议本身易于实现和理解。
现实中很难完美达到所有目标,不同的 MAC 协议在这些特性之间进行权衡。
MAC 协议分类
主要有三大类 MAC 协议:
- 信道划分:
- 将信道资源(时间、频率、码字)预先划分成多个小份,并将每一份独占地分配给一个节点。
- 优点:公平、无碰撞。
- 缺点:即使节点没有数据发送,分配给它的资源也被浪费,导致低负载时效率低下。
- 随机接入:
- 不划分信道,节点在需要时尝试发送。
- 允许发生碰撞,但协议需要提供检测碰撞和从碰撞中恢复(通常通过重传)的机制。
- 优点:低负载时效率高,单个节点可以利用全部带宽。
- 缺点:高负载时碰撞增多,导致信道利用率下降,延迟增加。
- 轮流:
- 节点轮流获得发送权。结合了前两类的优点。
- 通常比信道划分效率高,比随机接入在高负载下更可控。
- 需要一定的协调机制(如传递令牌或主节点轮询)。
- 缺点:可能存在协调开销、延迟、单点故障(取决于具体协议)。
信道划分协议
- 时分多路复用(Time Division Multiple Access, TDMA):
- 将时间划分为帧,每个帧再划分为 个时隙, 是网络中的节点数。
- 每个节点被固定分配到每帧中的一个时隙。
- 节点只能在自己的时隙内发送数据。
- 如果节点在自己的时隙没有数据发送,该时隙就「空闲」,造成浪费。
- 例子:某些蜂窝网络标准(如 GSM 的一部分)。
- 频分多路复用(Frequency Division Multiple Access, FDMA):
- 将信道的总频带划分为 个较窄的频段。
- 每个节点被固定分配到一个频段。
- 节点可以在分配给自己的频段内持续发送数据。
- 如果节点没有数据发送,分配给它的频段就「空闲」,造成浪费。
- 例子:传统的广播电台、电视台,某些卫星通信。
- 码分多路复用(Code Division Multiple Access, CDMA):
- 允许所有节点同时在整个频段上发送数据。
- 通过为每个节点分配一个独特的码片序列来区分不同节点的信号。
- 接收方利用发送方的码片序列从混合信号中解码出所需的数据。
- 优点:抗干扰性强,频率利用率高。
- 缺点:实现复杂,需要精确的功率控制。
- 例子:某些 3G 蜂窝网络标准。
随机接入协议
核心思想:「先试再说,错了重来」。
-
ALOHA 协议:
- 最早的随机接入协议。
- 思想:节点有数据就立即发送。
- 碰撞检测:发送方发送后等待一段时间,若未收到确认(或听到自己的信号被干扰),则认为发生碰撞。
- 碰撞恢复:等待一个随机时间后重传。
- 效率极低(最大理论效率约 18%)。
-
时隙 ALOHA:
-
对纯 ALOHA 的改进。
-
假设:
- 时间被划分为等长的时隙,时隙长度等于发送一个标准帧的时间。
- 所有节点时钟同步,只能在「时隙开始」的时刻发送帧。
- 所有帧大小相同。
- 如果在同一时隙内有 个节点发送,则发生碰撞,该时隙内所有传输都失败。所有节点都能检测到碰撞。
-
操作:
- 节点有新帧要发送时,等待下一个时隙开始时发送。
- 如果成功(没有碰撞):该节点可以在下一个时隙发送新帧(如果还有)。
- 如果碰撞:发生碰撞的节点,在后续的每个时隙,以概率 尝试重传该帧,直到成功为止。以概率 则跳过当前时隙,等待下一个时隙再决定是否重传。
-
-
随机化(概率 )至关重要,避免节点在碰撞后持续在同一时隙冲突。
-
优点:
- 单个节点活跃时,可使用全部信道带宽 R。
- 高度分布式(除时隙同步外)。
- 实现相对简单。
-
缺点:
- 仍然会发生碰撞,浪费时隙。
- 存在空闲时隙(没有节点发送)。
- 需要时钟同步。
- 即使发生碰撞,也必须完整发送完整个帧,才能在下一个时隙尝试重传(某些协议可以改进这一点)。
-
效率:在大量节点、重负载条件下,最大理论信道利用率(成功发送帧的时隙比例)为 。比纯 ALOHA 提高了一倍。
Slotted ALOHA 效率推导概要
假设有 个节点,每个节点在任一时隙以概率 发送。
某个特定节点成功发送,当且仅当自己发送且其他 个节点都不发送,即 。
则任意一个节点成功发送的概率(即时隙成功的概率)为 。
为使成功概率最大化,需要找到最优的 。对 求导并令其为 ,可得 。
将 代入,最大成功概率为 。
当节点数 时,。
因此,最大效率约为 。
-
-
载波侦听多路访问(Carrier Sense Multiple Access, CSMA):
- 核心思想:「先听后说」。
- 节点在发送前先侦听信道是否有载波(即其他节点正在发送信号)。
- 如果信道空闲:发送整个帧。
- 如果信道忙:「推迟发送」,持续侦听直到信道变为空闲,然后立即发送(或等待一小段随机时间后再发送,取决于具体 CSMA 变种)。
- 人类类比:在谈话中不打断别人。
- 问题:即使进行了载波侦听,仍然可能发生碰撞。
- 原因在于信号传播延迟。当节点 A 开始发送时,信号需要时间才能传播到节点 B。如果 B 在 A 的信号到达之前侦听到信道空闲并开始发送,就会发生碰撞。
- 距离越远,传播延迟越大,碰撞的可能性越高。
- 碰撞发生时,整个帧的传输时间都被浪费了。
-
带碰撞检测的载波侦听多路访问(CSMA with Collision Detection, CSMA/CD):
- 对 CSMA 的重要改进,是经典以太网(有线)使用的核心协议。
- 核心思想:「边听边说,一旦冲突,立即停说」。
- 节点在发送帧的同时,持续侦听信道。
- 如果检测到碰撞(即发送信号的同时也收到了来自其他节点的信号),立即执行以下操作:
- 停止发送当前帧(避免继续浪费信道时间)。
- 发送一个简短的「拥塞信号」,确保所有卷入碰撞的节点都意识到发生了碰撞。
- 执行二进制指数退避算法后,返回到载波侦听阶段,尝试重新发送。
- 人类类比:有礼貌的谈话者,如果发现和别人同时说话,会立即停止,并稍等片刻再尝试发言。
- 优点:显著减少了碰撞造成的信道时间浪费,提高了信道利用率,尤其是在传播延迟相对于帧传输时间较短的网络中(如典型的局域网)。
- 碰撞检测:在有线网络(如以太网)中相对容易实现(通过检测发送线路上的电压/功率异常)。但在无线网络中,由于信号强度差异巨大(发送功率远大于接收到的微弱信号),实现碰撞检测非常困难(所谓的「近场效应」),因此无线局域网(如 Wi-Fi)通常使用 CSMA/CA(Collision Avoidance, 碰撞避免)。
以太网 CSMA/CD 算法流程
- NIC 从网络层获取数据报,创建链路层帧。
- 侦听信道:
- 如果信道空闲,开始发送帧。
- 如果信道忙,持续侦听直到信道变为空闲,然后立即发送。
- 发送期间:持续侦听信道。
- 如果成功发送完整个帧而未检测到碰撞,则本次传输完成!
- 如果检测到碰撞:
- 立即中止帧的发送。
- 发送一个拥塞信号。
- 进入二进制指数退避阶段:
- 对于第 次连续碰撞( 从 1 开始计数,通常有上限,如 10 或 16),从集合 中随机选择一个整数 。
- 等待 比特时间(512 bit time 是以太网中的一个标准时间单位,称为 slot time,大约是信号在最大长度以太网段上传播一个来回的时间)。
- 等待结束后,返回第 2 步(重新侦听信道)。
- 退避机制:碰撞次数越多,随机等待时间的上限()呈指数级增长,从而增大了节点选择不同等待时间的概率,有效降低了再次碰撞的可能性。
轮流协议
试图结合「信道划分」和「随机接入」的优点。
-
轮询:
- 有一个主节点和多个从节点。
- 主节点依次轮询(「邀请」)每个从节点:「你是否有数据要发送?」
- 被轮询到的从节点如果有数据,则发送给主节点(或直接发送到目的地,取决于网络结构)。如果没有,则回复一个否定消息。
- 主节点控制着所有的数据传输。
- 优点:消除了碰撞,可以控制带宽分配。
- 缺点:
- 轮询开销:即使从节点没有数据,也需要进行一次轮询交互。
- 延迟:节点必须等待被轮询到才能发送。
- 单点故障:主节点故障会导致整个网络瘫痪。
- 应用:常用于连接许多简单(「哑」)设备的环境,如工业控制网络、蓝牙微微网。
-
令牌传递:
- 网络中有一个特殊的短控制帧,称为令牌。
- 令牌在节点之间按照预定义的逻辑环顺序依次传递。
- 只有持有令牌的节点才能发送数据帧。
- 节点发送完数据(或在持有令牌一段时间后),必须将令牌传递给环中的下一个节点。
- 如果节点收到令牌但没有数据发送,则立即将令牌传给下一个节点。
- 优点:无碰撞,高负载下性能稳定且公平。
- 缺点:
- 令牌开销:即使网络空闲,令牌也必须持续传递。
- 延迟:节点必须等待令牌到达才能发送。
- 单点故障:令牌丢失或损坏、节点故障导致环中断等问题需要复杂的恢复机制。
- 应用:经典的 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),也称为物理地址(Physical Address)、硬件地址(Hardware Address)或以太网地址(Ethernet Address)。
- 长度:通常为 48 比特(6 字节)。
- 唯一性:由 IEEE (电气和电子工程师协会) 负责管理和分配。制造商购买地址块,理论上保证全球每个网络接口(NIC)都有一个独一无二的 MAC 地址。这个地址通常被固化(burned-in)在 NIC 的 ROM 中(但有时也可以通过软件修改)。
- 格式:通常表示为 6 组十六进制数,用连字符或冒号分隔,如
1A-2F-BB-76-09-AD
或1A: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 地址 ≈ 身份证号:唯一标识个体,不随居住地改变。
- IP 地址 ≈ 邮政地址:标识位置,搬家后地址会改变,具有层级结构(国家/省/市/街道/门牌号)。
地址解析协议(ARP - Address Resolution Protocol)
-
问题:在一个局域网(如以太网)中,主机 A 知道主机 B 的 IP 地址,但要将 IP 数据报封装成链路层帧发送给 B,还需要知道 B 的 MAC 地址。如何根据 IP 地址找到对应的 MAC 地址?
-
解决方案:ARP 协议。
-
作用范围:仅在同一个广播域(子网)内工作。
-
ARP 表(ARP Cache):
- 每个在局域网上的 IP 节点(主机、路由器接口)都维护一个 ARP 表。
- 表中存储了近期通信过的、在同一子网内的其他节点的 IP 地址到 MAC 地址的映射关系。
- 表项格式通常为:
<IP Address, MAC Address, TTL>
。 - TTL (Time To Live):表项的生存时间(例如 20 分钟),超时后该表项会被删除,以应对网络中设备 MAC 地址可能发生的变化。
-
ARP 工作流程(主机 A 查询主机 B 的 MAC 地址):
- 主机 A 要向同一子网的 IP 地址
IP_B
发送数据。 - A 首先检查自己的 ARP 表中是否有
IP_B
的条目。 - 情况一:ARP 缓存命中(Cache Hit)
- 如果在 ARP 表中找到了
IP_B
对应的 MAC 地址MAC_B
,则 A 直接使用MAC_B
作为目的 MAC 地址封装帧,并发送。
- 如果在 ARP 表中找到了
- 情况二:ARP 缓存未命中(Cache Miss)
- A 构造一个 ARP 请求(ARP Request)消息。
- 请求内容:「我是 IP 地址
IP_A
,MAC 地址MAC_A
。请问谁拥有 IP 地址IP_B
?请告诉我你的 MAC 地址。」
- 请求内容:「我是 IP 地址
- A 将 ARP 请求消息封装在一个链路层帧中。
- 源 MAC 地址:
MAC_A
。 - 目的 MAC 地址:广播地址
FF-FF-FF-FF-FF-FF
。
- 源 MAC 地址:
- A 将该广播帧发送到局域网上。
- A 构造一个 ARP 请求(ARP Request)消息。
- 局域网上的所有节点都会收到这个广播帧,并解封装得到 ARP 请求消息。
- 每个节点检查 ARP 请求中的目标 IP 地址
IP_B
:- 如果目标 IP 地址不是自己的 IP 地址,则忽略该 ARP 请求。
- 如果目标 IP 地址是自己的 IP 地址(即主机 B 收到了请求):
a. B 将发送方 A 的 IP 地址IP_A
和 MAC 地址MAC_A
记录到自己的 ARP 表中(因为 A 很可能马上要给自己发数据,或者 B 可能需要回复 A)。
b. B 构造一个 ARP 回复(ARP Reply)消息。
- 回复内容:「我是 IP 地址IP_B
,我的 MAC 地址是MAC_B
。」
c. B 将 ARP 回复消息封装在一个链路层帧中。
- 源 MAC 地址:MAC_B
。
- 目的 MAC 地址:MAC_A
(直接发回给请求者 A,是单播帧)。
d. B 将该单播帧发送出去。
- 主机 A 收到来自 B 的 ARP 回复帧。
- A 从 ARP 回复中提取出 B 的 IP 地址
IP_B
和 MAC 地址MAC_B
,将这个映射关系存入自己的 ARP 表,并设置 TTL。 - 现在 A 知道了
MAC_B
,可以封装原始的 IP 数据报(目的 IP 为IP_B
),使用MAC_B
作为目的 MAC 地址,发送帧给 B。
- 主机 A 要向同一子网的 IP 地址
ARP 是即插即用的
ARP 协议自动运行,无需网络管理员手动配置 IP 到 MAC 的映射。
发送数据到另一个子网
当主机 A 要发送数据报给不同子网的主机 B 时,情况有所不同:
- 关键点:A 不能直接将帧发送给 B,因为它们不在同一个广播域。A 必须将帧发送给其默认路由器(Default Router),由路由器负责将数据报转发出去。
- 假设:
- A 知道 B 的 IP 地址
IP_B
。 - A 知道其默认路由器 R 的 IP 地址
IP_R
(通常通过 DHCP 获取)。 - A 需要知道路由器 R 的接口(连接到 A 所在子网的那个接口)的 MAC 地址
MAC_R
。
- A 知道 B 的 IP 地址
- 流程:
- A 创建 IP 数据报:
- 源 IP 地址:
IP_A
- 目的 IP 地址:
IP_B
(注意:IP 地址始终是最终目的地的地址)
- 源 IP 地址:
- A 需要确定下一跳的 MAC 地址。由于
IP_B
不在本地子网,A 知道需要将数据发送给默认路由器IP_R
。 - A 使用 ARP 查询路由器
IP_R
的 MAC 地址MAC_R
(如果 ARP 表中没有的话)。过程与查询同一子网主机 MAC 地址相同。 - A 创建链路层帧:
- 源 MAC 地址:
MAC_A
- 目的 MAC 地址:
MAC_R
(路由器的 MAC 地址!) - 帧的数据部分:包含着源 IP 为
IP_A
、目的 IP 为IP_B
的 IP 数据报。
- 源 MAC 地址:
- A 将帧发送到局域网上。
- 路由器 R 的接口(MAC 地址为
MAC_R
)收到该帧。 - R 解封装帧,提取出 IP 数据报。
- R 查看 IP 数据报的目的 IP 地址
IP_B
。 - R 查询自己的路由表,确定将该数据报转发到哪个下一跳(可能是 B 所在的子网接口,也可能是另一个路由器)。
- R 确定了下一跳的 IP 地址(假设是
IP_{NextHop}
)和发送该数据报的出接口。 - R 需要知道
IP_{NextHop}
的 MAC 地址MAC_{NextHop}
(如果下一跳就在出接口连接的子网上)。R 会在该子网上使用 ARP 查询MAC_{NextHop}
(如果需要)。 - R 创建一个新的链路层帧:
- 源 MAC 地址:R 的出接口的 MAC 地址。
- 目的 MAC 地址:
MAC_{NextHop}
。 - 帧的数据部分:仍然是那个原始的 IP 数据报(源
IP_A
,目的IP_B
)。
- R 通过其出接口将这个新帧发送出去。
- 这个过程在每一跳路由器上重复,直到数据报最终到达目的主机 B 所在的子网。最后一跳路由器会将帧的目的 MAC 地址设置为
MAC_B
,发送给 B。 - B 收到帧,解封装,得到 IP 数据报,发现目的 IP 是自己,交给上层处理。
- A 创建 IP 数据报:
重要结论
- IP 数据报在从源到目的的整个传输过程中,其源 IP 地址和目的 IP 地址通常是不变的。
- 链路层帧在每一跳(hop-by-hop)传输时,其源 MAC 地址和目的 MAC 地址是会改变的,分别对应当前发送接口和下一跳接收接口的 MAC 地址。