以太网
局域网
在本节中,我们将重点关注局域网内部的情况,例如你家中有电脑和家用路由器组成的网络。这与我们到目前为止看到的广域网形成对比,广域网覆盖的距离更长。
具体来说,我们将研究第二层的转发和寻址机制。我们需要定义数据包如何从本地主机转发到路由器。我们还将了解同一局域网中的主机如何在第二层直接交换消息,而完全不需要与路由器通信。第二层中最主要的协议是以太网。

连接本地主机
到目前为止,我们绘制的链路都是恰好连接两台机器的。在局域网中,我们画了一条线将每个主机连接到路由器。
实际上,一根线缆可能被用来连接多台机器。在局域网中,主机和路由器都可以连接到同一根线缆上。我们可以进一步抽象:在第二层,路由器实际上就像其他任何机器一样(只不过它在更高层运行路由协议)。归根结底,线缆并不关心所连接的机器如何处理它们交换的数据。

在局域网中,连接计算机的最佳方式是什么?早些时候,当我们第一次介绍路由时,我们考虑过使用网状拓扑来连接世界上所有成对的计算机。我们也考虑过用一根线缆连接所有计算机。最终,我们认为对于全球网络来说,这两种方法都不实用,因此我们需要引入路由器。

我们可以在局域网中再次考虑这些拓扑结构。网状拓扑仍然相当不切实际。如果有新主机加入,我们必须添加一根线缆将其连接到其他所有主机。然而,将所有计算机沿着单根线缆连接的总线拓扑,在局域网中是相当常见且实用的。
单线缆总线拓扑引入了共享介质的概念。当我们绘制连接两台机器的链路时,只有这两台计算机使用该链路进行通信。而现在,从 A 到 C 的数据包和从 B 到 D 的数据包可能同时出现在线缆上,线缆上的电信号无法同时承载这两个数据包。

打个比方,想象多个人在一个群组通话中,共享一条电话线:任何两个人都可以交谈,但不能同时进行两个对话,否则没人能听懂说的是什么。
为了简单起见,我们将链路画成带有电信号的线缆,但实际上,链路技术可能使用其他共享介质。例如,在无线链路技术中,所有通过该链路连接的主机共享电磁波谱的同一部分。
共享介质上的通信:协调式方法
在具有共享介质的网络中,不同节点的传输可能会相互干扰或冲突。如果两台计算机尝试同时传输数据,它们的信号会重叠并相互干扰。接收方可能无法解码信号,也无法分辨是谁发送的信号。为了解决这个问题,我们需要一种多路访问协议,以确保多台计算机能够共享链路并在其上传输数据。

一种可能的方法类别是为链路上的每个节点分配固定的资源部分。我们可以通过两种方式划分资源。在频分复用中,我们为每台计算机分配不同的频率片段(想想调幅 / 调频广播或广播电视,它们将频率划分为不同的频道)。在时分复用中,我们将时间划分为固定的时隙,并为每个连接的节点分配一个时隙。
资源的固定分配存在一些缺点。可分配的频率 / 时间数量有限。此外,并非每个节点一直都有数据要发送,因此我们分配的频率 / 时间大部分时间可能处于未使用状态。这种方法很浪费,因为它将计算机限制在特定的分配片段中,即使其他片段可能未被使用。
除了固定分配,另一类方法基于节点轮流使用资源,没有固定分配。在这类方法中,我们通过时间进行动态划分,这样节点只在轮到它们时使用所需的时间,不会浪费时间。我们可以通过两种方式让节点轮流使用资源。
在轮询协议中,一个集中式的协调器决定每个连接的节点何时可以发送数据。协调器逐个访问每个节点,询问节点是否有数据要发送。如果节点说有,协调器允许节点发送一段时间的数据。如果节点说没有,协调器立即转向下一个节点,节点不会浪费任何资源。蓝牙就是使用这种思想的现实世界协议。

让节点轮流发送的另一种方式是令牌传递。没有集中式协调器,而是有一个虚拟令牌在节点之间传递,只有持有令牌的节点才被允许发送数据。如果一个节点有数据要发送,它在传输时持有令牌,然后将令牌传递给下一个节点。如果一个节点此时没有数据要发送,它会立即将令牌传递给下一个节点。IBM 令牌环和 FDDI 是使用这种思想的现实世界协议示例。

这些基于轮流的方法的一个缺点是复杂性。我们必须实现某种形式的节点间通信,这可能会变得很复杂。在令牌传递中,我们可能需要一些专用的频率信道,以便节点之间可靠地传递令牌。我们还可能需要处理一些复杂情况,例如两个节点都认为自己持有令牌而导致冲突。在轮询协议中,我们需要指定一个中央协调器与节点通信,并实现协调器与节点对话的方式。在蓝牙中,你的智能手机可以作为中央协调器与辅助设备通信,但在其他网络中,可能不清楚谁是协调器。
共享介质上的通信:随机访问方法
除了固定分配和轮流使用之外,第三类方法是随机访问。在这种方法中,我们允许节点在有数据要发送时就发送,然后在发生冲突时进行处理。节点之间不进行协调,只要有数据要发送就直接发送。
随机访问协议的一个主要优点是简单。与基于轮流的方法不同,我们不需要实现节点间的通信。
当接收方收到数据包时,它会回复一个确认(ack)。如果两个节点同时发送数据,冲突会导致它们的数据包损坏,因此不会发送确认。如果发送方没有收到确认,它会等待一段随机时间后重新发送。等待一段随机时间而不是立即重新发送,有助于我们避免重发时的冲突。
简单的随机访问协议是 “粗鲁的”,因为节点想发送就发送,之后再处理冲突。这种协议的一个更 “礼貌” 的变体称为载波监听多路访问(CSMA)。节点首先监听共享介质,看看是否有任何节点在发送数据,只有当介质空闲时才开始发送。这里的 “监听” 指的是检测线缆上的信号。
请注意,CSMA 并不能帮助我们避免所有冲突。如果信号能瞬时在整个线缆长度上传播,那么 CSMA 中就不会有冲突。然而,传播延迟可能会带来问题。假设线缆一端的节点 A 听到介质空闲并开始传输。信号可能还没有传播到线缆另一端的节点 B。节点 B 也听到介质空闲,也开始传输,从而导致冲突。

这个二维图展示了传播延迟如何导致冲突。水平横截面显示了某一时刻的线缆,让我们可以看到信号在该时刻在线缆上传播了多远。垂直横截面显示了线缆上的一个位置在不同时间的情况,让我们可以看到该位置何时接收到传输的第一个比特和最后一个比特。H2 和 H4 在开始传输前都听到了介质空闲,但它们的信号仍然发生了冲突。
为了缓解这个问题,我们可以使用CSMA/CD(带冲突检测的载波监听多路访问),它扩展了 CSMA 的思想。除了在发送前监听,我们在发送过程中也会监听。如果你在传输时开始听到其他信号,你会立即停止发送。请注意,CSMA/CD 仍然不能解决冲突问题,但它允许我们更早地检测到冲突。
如果只有一个发送者,就不会有任何冲突,我们所有的随机访问方案都应该能正常工作。如果只有少数几个发送者,可能会偶尔发生冲突,但我们所有的方案都能处理。然而,如果许多发送者想要同时发送数据,我们可能会遇到重复冲突的问题,此时等待随机时间重新发送也无济于事。
为了处理重复冲突,CSMA/CD 使用二进制指数退避。每次我们在重传尝试中检测到冲突时,我们会等待至多两倍的时间再进行下一次重传。请注意,我们仍然随机选择重传时间,但每次检测到冲突时,我们从一个范围中选择随机数,该范围的上限是之前的两倍。例如,如果我们选择的随机时间在 [0,4] 范围内并检测到冲突,下一次选择的随机时间将在 [0,8] 范围内。
二进制指数退避在两种情况下都能很好地工作。当只有少数节点发送数据时,重复冲突并不常见,因此我们可以在短暂等待后重传。当有许多节点发送数据时,会有很多重复冲突,因此延迟会呈指数级增加,直到没有冲突为止(例如,足够多的节点被延迟到很远的将来,此时竞争的节点会更少)。这种方法确保我们只在许多节点想要发送数据时才减慢速度,而在少数节点想要发送数据时保持快速传输。
第二层的简史:ALOHA 网
1968 年,Norman Abramson 在夏威夷大学遇到了一个问题。夏威夷大学有一台中央计算机,他需要一种方法让其他岛屿上的计算机能够访问这台中央计算机。由此产生的设计对现代第二层协议设计产生了很大影响。
由此产生的协议被称为 ALOHA 网(Additive Links On-line Hawaii Area),它允许从其他岛屿到中央计算机的无线通信。ALOHA 网是无线的,使用共享介质,所有节点都通过同一链路发送数据。
由于其非对称设置,ALOHA 网结合了固定分配和随机访问。中央计算机(集线器)使用自己专用的频率传输 outgoing 消息,所有远程节点都在这个频率上监听以接收消息。由于在专用频率上只有一个发送者,因此没有冲突的风险。
相比之下,所有远程节点都在一个单独的共享频率上传输,集线器监听这个频率。集线器不会与远程节点发生冲突,因为它们使用不同的频率,但远程节点之间可能会相互冲突。
这种非对称设计在 ALOHA 网中运行良好,因为集线器可能比远程节点有更多的数据要发送。

ALOHA 网是最早使用随机访问协议处理冲突的系统之一,这种方法后来被用于以太网。ALOHA 网使用简单的 “粗鲁” 随机访问方法。后来的协议如以太网使用更 “礼貌” 的 CSMA/CD 方法,我们在发送前和发送过程中监听冲突,并在发生冲突时进行指数退避。
局域网通信:MAC 地址
由于多台计算机可以连接到同一以太网链路上,我们实际上可以使用第二层协议在同一链路上的本地计算机之间发送消息,而完全不使用任何第三层协议(例如,不需要路由器转发数据包)。用邮政系统打比方,同一个房间里的两个人可以互相传递信件,而不需要把信送到邮局。
在共享介质上发送消息的一个问题是:当我们传输消息时,链路上的所有节点都会收到消息,而不仅仅是目标接收者。要向特定的人发送消息,我们需要第二层的寻址系统,以便我们能够识别消息的目标机器。用邮政系统的类比来说,如果我在房间里说话,每个人都会收到消息。要和一个特定的人说话,我需要用他们的名字来称呼他们。
在第二层,每台计算机都有一个MAC 地址(介质访问控制地址)。MAC 地址是 48 位的,通常以十六进制表示,每 2 个十六进制数字(8 位)之间用冒号分隔,例如f8:ff:c2:2b:36:16。MAC 地址有时也称为以太网地址或链路地址。
MAC 地址通常被永久硬编码(“烧录”)在设备上(例如,你计算机中的网络接口卡(NIC))。大多数操作系统允许你在软件中覆盖 MAC 地址,但每个设备出厂时都已经安装了一个 MAC 地址。MAC 地址是根据制造硬件的厂商进行分配的。前两位是标志位,接下来的 22 位标识厂商,最后 24 位标识该厂商地址空间中的特定机器。
为什么不只用 IP 地址呢?链路上的主机可能想要交换消息,而无需连接到互联网(即它们根本没有 IP 地址)。
这种永久寻址方案与 IP 地址不同,IP 地址是在你首次加入网络时获得的,并且地址取决于你的地理位置。MAC 地址通常应该是全球唯一的,因为你可能会把你的计算机插入任何局域网,如果链路上有两台计算机具有相同的 MAC 地址,那会很糟糕。
局域网通信类型、以太网数据包结构
第二层数据包可能有不同的目的地。在单播中,数据包指向单个接收者。在广播中,数据包指向局域网上的所有机器。在组播中,数据包指向局域网中属于特定组的所有机器。机器可以选择加入某些组,以接收发送到该组的数据包。以太网支持单播、组播和广播。
请注意,广播有时被视为组播的一种特殊情况,即所有人都自动属于广播组。
这种单播 / 广播 / 组播模型也扩展到其他层。例如,我们在第三层看到了任播,其目标是发送到组中的任何一个成员(具有相同 IP 地址的任何服务器)。
以太网数据包结构
以太网中的数据包称为帧。许多字段看起来与 IP 头部字段相似,但也有一些差异。

以太网数据包以 7 字节的前导码开始,前导码指示数据包的开始。这有助于在信号通过线缆传输时区分不同的数据包。
然后,我们有目的 MAC 地址和源 MAC 地址,类似于 IP 头部中的目的和源字段。我们有一个 2 字节的类型字段,它允许我们在 IPv4 或 IPv6 之间进行解复用,并将数据包有效载荷传递给正确的下一个协议。这类似于 IP 头部中的协议字段,或 TCP/UDP 头部中的端口字段。我们还有一个校验和,不过与 IP 不同的是,校验和覆盖整个数据包,因此我们不必依赖更高层(例如,数据包可能根本不是 TCP/IP 数据包)。
要进行单播消息传输,我们将目的 MAC 地址设置为特定机器的 MAC 地址。共享介质上的所有节点都会收到该数据包,因此每个节点都需要检查目的 MAC 地址,看该数据包是否是发给自己的。如果目的 MAC 地址与你的地址不匹配,你应该忽略该数据包。
要进行广播消息传输,我们将目的 MAC 地址设置为特殊地址FF:FF:FF:FF:FF:FF(全为 1)。与单播一样,共享介质上的所有节点都会收到该数据包,但这次,由于目的 MAC 地址是广播地址,所有节点都知道要读取该数据包。请注意,这个全 1 的广播地址在每个以太网网络中都是相同的。
要进行组播消息传输,我们将目的 MAC 地址设置为该组的地址。回想一下,MAC 地址的前两位是标志位。分配给机器的普通地址的第一位总是 0,而组地址的第一位总是 1。与单播和广播一样,所有节点仍然会收到消息。任何属于某个组的节点都需要确保它们正在监听该组的地址,以便接收组播到该组的数据包。需要额外的协议来控制谁属于哪个组,我们在此不再深入讨论。
使用以太网的第二层网络
到目前为止,我们展示的第二层协议都是在连接多台计算机的单条链路上运行的,但我们可以引入多条链路,完全使用第二层来构建网络。数据包可以被转发,机器甚至可以运行路由协议,所有这些都专门使用第二层 MAC 地址。
我们在 IP 层运行的路由协议也可以在第二层运行,但一个缺点是我们不能聚合 MAC 地址。IP 地址是基于地理位置分配的,而 MAC 地址是基于厂商分配的,因此没有明确的方法来聚合它们。这个缺点就是为什么我们不能仅用第二层来构建全球互联网。
如果在一个局域网中有多条链路,我们必须确保如果有人广播消息,所有第二层交换机都将数据包从所有输出端口转发出去。
在具有多条链路的第二层网络中,组播会变得更加复杂。需要额外的协议,不过我们不再进一步讨论。
组播在局域网中有用的一个例子是 Bonjour/mDNS,这是苹果公司开发的协议。在该协议中,所有苹果设备(例如 iPhone、iPad、Apple TV)都被硬编码为加入局域网中的一个特殊组。如果你的 iPhone 想要找到附近可以播放音乐的设备(例如 Apple TV、苹果音箱或 HomePod 等),iPhone 可以向该组发送组播消息,询问是否有设备可以播放音乐。组中的设备也可以发送组播响应,说 “我是 Apple TV,我可以播放音乐。” 有趣的是,该协议实际上还在组播组中使用 DNS 来发送 SRV 记录,该记录将每台机器映射到其功能。
历史注释:在现代互联网中,我们说 “路由器” 和 “交换机” 这两个术语是可以互换的。现在我们有了第二层网络的概念,我们可以说交换机只在第一层和第二层运行,而路由器在第一层、第二层和第三层运行。
回顾我们关于封装和解封装头部的图示,我们假设每个路由器都会解析到第三层的数据包,并通过 IP 将数据包转发到下一个路由器。然而,如果我们有一个具有多条链路的第二层网络,交换机只需要将数据包传递到第二层,并通过以太网将数据包转发到下一个交换机。
如今,几乎所有交换机也实现了第三层,这就是为什么我们可以互换使用这些术语。从历史上看,以太网早于互联网,这就是为什么交换机和路由器之间存在区别。
(注:文档部分内容可能由 AI 生成)