深入浅出链路层:从“媒介访问”理解网络中的第一步

最近在重新梳理计算机网络的知识体系,翻阅讲义的时候忽然意识到:链路层这个我们总觉得"太底层"的部分,其实埋藏着很多非常核心的问题。特别是在复习 MAC 协议的时候,我突然想起了以前学 CSMA/CD 的时候的困惑,也对为什么今天我们还要学习这些"早就被交换机淘汰的技术"产生了很多思考。

这篇博客就作为一个记录,试着从基础出发,重新梳理一下链路层到底在做什么,MAC 协议又在我们现代网络中扮演着怎样的角色。

链路层是干什么的?

我们都知道网络协议是分层的,最常见的结构是五层模型(有时是七层 OSI)。而链路层(Link Layer)就是离物理最近的一层了。很多人觉得链路层很“低级”,离我们太远,但实际上它解决的问题非常基础,也非常关键。

链路层的核心职责可以用一句话总结:

负责将 IP 层的 datagram 从一个节点传到相邻的另一个节点。

overview

这里有两个关键术语:

  • node:可以是主机(host),也可以是路由器(router);
  • frame:链路层处理的单位,我们会把 datagram(来自 IP 层的数据)封装成一个个帧来传输。

链路层不仅要封装帧(加 header 和 trailer),还要考虑很多实际问题:

  • 如果链路是共享的(比如 WiFi),那该怎么决定谁先发数据?(Multiple Access)
  • 该用什么样的地址来识别设备?(用的是 MAC 地址,不是 IP 地址)
  • 如果链路质量差、信道不稳定怎么办?要不要检测错误?

现实中链路层协议五花八门,比如以太网(Ethernet)、Wi-Fi、蓝牙、甚至 4G/5G 的底层都有链路层逻辑。而且,不是所有链路层都提供可靠传输,这就为传输层留了发挥空间。这也是为什么像 TCP 这样的传输层协议仍然需要实现可靠性保障机制。因为一条端到端的路径往往包含多个链路,而我们无法假设每一跳都能保证数据不出错、不丢失。所以必须由更高一层、抽象统一的协议,在端到端的范围内负责整体的数据可靠传输。


MAC 协议的来龙去脉

在链路层中,MAC 是最常被提到的关键词之一。

MAC 是 Medium Access Control 的缩写,翻译成中文是“媒介访问控制”。说白了,它解决的是这样一个问题:

当多个设备共享一根传输介质(比如一根网线、同一个 Wi-Fi 频道)时,谁先发?怎么发?发了别人能不能听到?

这个问题叫做 Multiple Access(多路访问)问题。解决这个问题的一类协议,统称为 MAC 协议

我们现在的网络大多数是点对点的(point-to-point),例如电脑和交换机之间是独占链路,所以听起来好像没什么共享。但实际上,

  • 早期的总线结构(Bus Ethernet)中,所有主机真的就是插在一根线上的;
  • 而现代 Wi-Fi 网络,大家共享空气这个媒介,仍然需要 MAC 协议来协调。

MAC 协议的实现策略可以分为三类:

1. Channel Partitioning(划分信道)

把媒介进行划分,让每个人固定用一段资源。

  • TDMA(时分):每台设备轮流在自己的时间片发送; TDMA
  • FDMA(频分):每台设备用不同频段,类似收音机调频。 FDMA

2. Random Access(随机接入)

大家都可以发,但发之前要先“听”,有冲突再退避。

  • CSMA:监听有无信号再发;
  • CSMA/CD:有线以太网的老方法,边发边听,有冲突就停;
  • CSMA/CA:无线中用的(Wi-Fi),避免冲突而不是检测冲突;
  • ALOHA:早期卫星通信使用,纯随机发送。节点不监听信道,直接发数据,如果发生冲突,发送方不会立即发现,而是等待一段随机时间后再重传。

3. Taking Turns(轮流发)

系统强制大家轮着来,比较公平但效率不一定高。

  • Token Passing:谁拿到“令牌”谁发数据,Token Ring 网络就是这样;
  • 在分布式系统中,这种思想演化成了各种“互斥算法”。

虽然我们家里的网络现在用不上 CSMA/CD,但 Wi-Fi 依然大量用着 CSMA/CA。工业网络、卫星通信、低功耗物联网等领域也经常用到轮询、时分这样的 MAC 协议。


链路层的错误检测机制

链路层不是总能保证传输“完好无损”。现实中,电磁波可能被雨水干扰、Wi-Fi 信号可能被微波炉影响、线缆可能老化,都会造成比特翻转或者丢失。

为了尽量发现这些错误,我们会在每一帧后面加一个校验值,最常见的就是 CRC(循环冗余校验)。

CRC

它的工作方式大致是:

  • 发送方根据帧内容生成一个固定算法的校验值,加到帧末尾;
  • 接收方收到帧后用相同算法计算一次,看和收到的校验值是否一致;
  • 如果不一致,说明帧出错了,直接丢弃。

链路层做了错误检测,但是否重传,取决于协议本身:

  • Ethernet(以太网)出错就丢,不重发;
  • Wi-Fi 会等 ACK,如果没收到就自动重发。

那为什么还要 TCP 做可靠性保证呢?因为链路层只在“一跳”内负责,而且可能并不可靠。而 TCP 是端到端的,是最后的保险。


在现代网络中,CSMA/CD 已成为历史

CSMA/CD 诞生于“共享总线以太网”的年代,所有设备挂在一根线(Bus)上,谁想发包就得先“听听有没有人说话”。

Old Internet

但现在我们早已过了那个时代。现在的网络结构是:

  • 每台主机通过独立的链路接入交换机;
  • 交换机维护转发表,按需将帧转发到目标设备;
  • 每个链路都是点对点的,互不干扰,天然没有冲突。

Modern Internet

所以现代以太网都是 全双工 + 交换结构,压根没有“冲突”的土壤,自然也不需要 CSMA/CD。

不过,理解 CSMA/CD 为什么出现、怎么工作、怎么被替代,仍然对理解网络协议演化很重要。它告诉我们,MAC 协议并不是消失了,而是被“进化”了

下一篇博客我们就可以深入交换机和 MAC 地址是如何配合,让“以太网”变得高效有序的。