# Data Link Layer

**数据链路层**（Data Link Layer）是 OSI 参考模型第二层。还可以细分成介质访问控制（MAC）子层和逻辑链路控制（LLC）子层。

介质访问控制（**M**edium **A**ccess **C**ontrol，**MAC**）子层专职处理介质访问的争用与冲突问题。是数据链路层的下层部分。

在物理层提到 Hub，它是把信号复制发送给所有的接口，所以需要解决以下三个问题：

* 谁应该接受这个数据包？
* 多台机器同时发，冲突怎么解决？即**多路访问**问题。
* 如果发送错误怎么解决？

解决多路访问问题的方式：

* 信道划分。
* 轮流协议。
* 随机接入协议，比如以太网。

![第二层网络包格式](https://3232244687-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYZow-MmROshIrkwdtE%2F-LfIzS5qe4UwPiqg7lgQ%2F-LfJ4YHuWpap72Bjv0lX%2Fimage.png?alt=media\&token=d26f5ff1-aa67-454a-bd1d-e4467ed68310)

解决第一个问题就要靠网络包的目标 MAC 地址。

解决第三个问题靠网络包的 CRC，**循环冗余校验**（**Cyclic redundancy check**）。

## ARP

**地址解析协议**（**A**ddress **R**esolution **P**rotocol，缩写：**ARP**）是一个通过解析网络层地址来找寻数据链路层地址的网络传输协议，即通过 IP 地址找 MAC 地址。

通过发送一个广播，谁的 IP 符合条件，谁叫回复自己的 MAC 地址。

![](https://3232244687-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYZow-MmROshIrkwdtE%2F-LfJ6Y0Mt4gmUQL5bmcn%2F-LfJ7apqOxiY64RYjpwj%2Fimage.png?alt=media\&token=2bee3e07-f0d1-43a8-9a16-991fcf73f64d)

为了避免每次都用 ARP 请求，机器本地也会进行 ARP 缓存。当然机器会不断地上线下线，IP 也可能会变，所以 ARP 的 MAC 地址缓存过一段时间就会过期。

## 交换机

是二层设备。

一台 MAC1 电脑将一个包发送给另一台 MAC2 电脑，当这个包到达交换机的时候，一开始交换机也不知道MAC2 的电脑在哪个口，它只能将包转发给除了来的那个口之外的其他所有的口。但是，这个时候，交换机会会记住 MAC1 是来自一个明确的口。以后有包的目的地址是 MAC1 的，直接发送到这个口就可以了。

当交换机作为一个关卡一样，过了一段时间之后，就有了整个网络的一个结构了，这个时候，基本上不用广播了，全部可以准确转发。当然，每个机器的 IP 地址会变，所在的口也会变，因而交换机上的学习的结果，我们称为**转发表**，是有一个过期时间的。

## STP

当机器越来越多，一台交换机不够，所以会出现越来越多的交换机，当交换机较多，连接复杂，就容易出现**环路问题**。

**生成树协议**（**Spanning Tree Protocol**，**STP**），是一种工作在OSI网络模型中的第二层(数据链路层)的通信协议，基本应用是防止交换机冗余链路产生的环路，用于确保以太网中无环路的逻辑拓扑结构，从而避免了广播风暴。

**工作原理**：任意一交换机中如果到达根网桥有两条或者两条以上的链路，生成树协议都根据算法把其中一条切断，仅保留一条，从而保证任意两个交换机之间只有一条单一的活动链路。

**工作过程**：首先进行根网桥的选举，其依据是网桥优先级（bridge priority）和 MAC 地址组合生成的桥 ID，桥 ID 最小的网桥将成为网络中的根桥（bridge root）。在此基础上，计算每个节点到根桥的距离，并由这些路径得到各冗余链路的代价，选择最小的成为通信路径（相应的端口状态变为 forwarding），其它的就成为备份路径(相应的端口状态变为 blocking)。STP 生成过程中的通信任务由 BPDU 完成，这种数据包又分为包含配置信息的配置 BPDU（其大小不超过35B）和包含拓扑变化信息的通知 BPDU（其长度不超过4B）。

* **Root Bridge**，也就是**根交换机**。
* **Designated Bridges**，有的翻译为**指定交换机**。
* **Bridge Protocol Data Units （BPDU）** ，**网桥协议数据单元**。
* **Priority Vector**，**优先级向量**。

## VLAN

交换机增多以后，还会出现广播问题和安全问题。

**虚拟局域网**（**Virtual Local Area Network，VLAN**,，**V-LAN**）是一种建构于局域网交换技术（LAN Switch）的网络管理的技术，网管人员可以借此透过控制交换机有效分派出入局域网的分组到正确的出入端口，达到对不同实体局域网中的设备进行逻辑分群（Grouping）管理，并**降低局域网内大量数据流通**时，因无用分组过多导致壅塞的问题，以及**提升局域网的信息安全保障**。

![](https://3232244687-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYZow-MmROshIrkwdtE%2F-LfKWidPjk6WIrUsZXd9%2F-LfK_qLgmDvt3SCf6grh%2Fimage.png?alt=media\&token=922dc20b-01df-4778-b8dc-4b112d67fdfd)

在原来的二层的头上加一个 TAG，里面有一个 VLAN ID，一共12位。如果交换机是支持 VLAN 的，它会把二层的头取下来，识别 VLAN ID。只有相同 VLAN 的包，才会互相转发，不同 VLAN 的包，是看不到的。这样就能解决广播和安全问题。

可以设置交换机每个口所属的 VLAN。每个 VLAN 的口都是可以重新设置的。

交换机之间的连接靠 **Trunk** 口。它可以转发属于任何 VLAN 的口。

## 总结

* MAC 层是用来解决多路访问的堵车问题的；
* ARP 是通过吼的方式来寻找目标 MAC 地址的，吼完之后记住一段时间，这个叫作缓存；
* 交换机是有 MAC 地址学习能力的，学完了它就知道谁在哪儿了，不用广播了。
* 当交换机的数目变多，会遭遇环路问题，使用 STP 协议将有环路的图变成没有环路的树解决。
* 可以通过 VLAN 形成虚拟局域网，从而解决广播问题和安全问题。
