目录

网络-02 链路层

前置阅读:网络-01 网络分层模型

1. 链路层

1.1 数据链路层的主要功能

  • 封装成帧
  • 差错控制
  • 流量控制
  • 链路控制
  • MAC寻址
  • 区分数据和控制信息
  • 透明传输
  1. 成帧(帧同步)—将数据组合成数据块,封装成帧

为了向网络层提供服务,数据链路层必须使用物理层提供的服务。而物理层是以比特流进行传输的,这种比特流并不保证在数据传输过程中没有错误,接收到的位数量可能少于、等于或者多于发送的位数量。而且它们还可能有不同的值,这时数据链路层为了能实现数据有效的差错控制,就采用了一种”帧”的数据块进行传输。而要采帧格式传输,就必须有相应的帧同步技术,这就是数据链路层的”成帧”(也称为”帧同步”)功能。

采用帧传输方式的好处是:在发现有数据传送错误时,只需将有差错的帧再次传送,而不需要将全部数据的比特流进行重传,这就在传送效率上将大大提高。

采用帧传输方式的好处是带来了两方面的问题:

(1)如何识别帧的开始与结束;

(2)在夹杂着重传的数据帧中,接收方在接收到重传的数据帧时是识别成新的数据帧,还是识别成重传帧呢?这就要靠数据链路层的各种”帧同步”技术来识别了。”帧同步”技术既可使接收方能从并不是完全有序的比特流中准确地区分出每一帧的开始和结束,同时还可识别重传帧。

  1. 差错控制

在数据通信过程中可能会因物理链路性能和网络通信环境等因素,难免会出现一些传送错误,但为了确保数据通信的准确,又必须使得这些错误发生的几率尽可能低。这一功能也是在数据链路层实现的,就是它的”差错控制”功能。

在数字或数据通信系统中,通常利用抗干扰编码进行差错控制。一般分为4类:前向纠错(FEC)、反馈检测(ARQ)、混合纠错(HEC)和信息反馈(IRQ)。

FEC方式是在信息码序列中,以特定结构加入足够的冗余位–称为”监督元”(或”校验元”)。接收端解码器可以按照双方约定的这种特定的监督规则,自动识别出少量差错,并能予以纠正。FEC最适合于实时的高速数据传输的情况。

在非实时数据传输中,常用ARQ差错控制方式。解码器对接收码组逐一按编码规则检测其错误。如果无误,向发送端反馈”确认”ACK信息;如果有错,则反馈回ANK信息,以表示请求发送端重复发送刚刚发送过的这一信息。ARQ方式的优点在于编码冗余位较少,可以有较强的检错能力,同时编解码简单。由于检错与信道特征关系不大,在非实时通信中具有普遍应用价值。

HEC方式是上述两种方式的有机结合,即在纠错能力内,实行自动纠错;而当超出纠错能力的错误位数时,可以通过检测而发现错码,不论错码多少都可以利用ARQ方式进行纠错。

IRQ方式是一种全回执式最简单差错控制方式。在该检错方式中,接收端将收到的信码原样转发回发送端,并与原发送信码相比较,若发现错误,则发送端再进行重发。只适于低速非实时数据通信,是一种较原始的做法。

  1. 流量控制

在双方的数据通信中,如何控制数据通信的流量同样非常重要。它既可以确保数据通信的有序进行,还可避免通信过程中不会出现因为接收方来不及接收而造成的数据丢失。这就是数据链路层的”流量控制”功能。

数据的发送与接收必须遵循一定的传送速率规则,可以使得接收方能及时地接收发送方发送的数据。并且当接收方来不及接收时,就必须及时控制发送方数据的发送速率,使两方面的速率基本匹配。

  1. 链路控制

数据链路层的”链路管理”功能包括数据链路的建立、维持和释放三个主要方面。

当网络中的两个节点要进行通信时,数据的发送方必须确知接收方是否已处在准备接收的状态。为此通信双方必须先要交换一些必要的信息,以建立一条基本的数据链路。在传输数据时要维持数据链路,而在通信完毕时要释放数据链路。

  1. MAC寻址

这是数据链路层中的MAC子层主要功能。这里所说的”寻址”与下一章将要介绍的”IP地址寻址”是完全不一样的,因为此处所寻找的地址是计算机网卡的MAC地址,也称”物理地址”、”硬件地址”,而不是IP地址。

在以太网中,采用媒体访问控制(Media Access Control, MAC)地址进行寻址,MAC地址被烧入每个以太网网卡中。这在多点连接的情况下非常必需,因为在这种多点连接的网络通信中,必须保证每一帧都能准确地送到正确的地址,接收方也应当知道发送方是哪一个站。

  1. 区分数据和控制信息

由于数据和控制信息都是在同一信道中传输,在许多情况下,数据和控制信息处于同一帧中,因此一定要有相应的措施使接收方能够将它们区分开来,以便向上传送仅是真正需要的数据信息。

  1. 透明传输

这里所说的”透明传输”是指可以让无论是哪种比特组合的数据,都可以在数据链路上进行有效传输。这就需要在所传数据中的比特组合恰巧与某一个控制信息完全一样时,能采取相应的技术措施,使接收方不会将这样的数据误认为是某种控制信息。只有这样,才能保证数据链路层的传输是透明的。

注:在以上七大链路层功能中,主要的还是前面的五项,后面两项功能是在前五项功能中附带实现的,无需另外的技术,所以在此仅介绍前面五项功能。

链路层向网络层提供的服务

数据链路层的设计目标就是为网络层提供各种需要的服务。实际的服务随系统的不同而不同,但是一般情况下,数据链路层会向网络层提供以下三种类型的服务:

  1. 无确认的无连接服务

“无确认的无连接服务”是指源计算机向目标计算机发送独立的帧,目标计算机并不对这些帧进行确认。这种服务,事先无需建立逻辑连接,事后也不用解释逻辑连接。正因如此,如果由于线路上的原因造成某一帧的数据丢失,则数据链路层并不会检测到这样的丢失帧,也不会恢复这些帧。出现这种情况的后果是可想而知的,当然在错误率很低,或者对数据的完整性要求不高的情况下(如话音数据),这样的服务还是非常有用的,因为这样简单的错误可以交给OSI上面的各层来恢复。如大多数局域网在数据链路层所采用的服务也是无确认的无连接服务。

  1. 有确认的无连接服务

为了解决以上“无确认的无连接服务”的不足,提高数据传输的可靠性,引入了“有确认的无连接服务”。在这种连接服务中,源主机数据链路层必须对每个发送的数据帧进行编号,目的主机数据链路层也必须对每个接收的数据帧进行确认。如果源主机数据链路层在规定的时间内未接收到所发送的数据帧的确认,那么它需要重发该帧。 这样发送方知道每一帧是否正确地到达对方。这类服务主要用于不可靠信道,如无线通信系统。它与下面将要介绍的“有确认的面向连接服务”的不同之处在于它不需要在帧传输之前建立数据链路,也不要在在帧传输结束后释放数据链路。

  1. 有确认的面向连接服务

大多数数据链路层都采用向网络层提供面向连接确认服务。利用这种服务,源计算机和目标计算机在传输数据之前需要先建立一个连接,该连接上发送的每一帧也都被编号,数据链路层保证每一帧都会被接收到。而且它还保证每一帧只被按正常顺序接收一次。这也正是面向连接服务与前面介绍的“有确认无连接服务”的区别,在无连接有确认的服务中,在没有检测到确认时,系统会认为对方没收到,于是会重发数据,而由于是无连接的,所以这样的数据可能会复发多次,对方也可能接收多次,造成数据错误。这种服务类型存在3个阶段,即:数据链路建立、数据传输、数据链路释放阶段。每个被传输的帧都被编号,以确保帧传输的内容与顺序的正确性。大多数广域网的通信子网的数据链路层采用面向连接确认服务。

以太网采用无连接的工作方式,读发送的数据帧不进行编号,也不要求对方发回确认。目的站收到有差错的帧就把他丢弃,不采取其他行为。

1.2 帧格式

./链路层以太网帧格式.png 其中末尾的 FCS 是根据帧内容计算出的 CRC 校验值,用于发现链路传输中的比特错误。CRC 只能检错,不能防止恶意篡改,也不提供身份认证,因此不能类比数字签名。 校验失败的帧通常直接被网卡或交换机丢弃,恢复工作交给 TCP 等上层协议。

1.3 链路层协议

以太网(Ethernet)协议;PPPoE(ADSL)协议;等

1.4 交换机是怎么转发帧的

现代以太网不是“所有数据都广播给全部主机”。交换机内部维护一张 MAC 地址表(CAM 表),记录“某个 MAC 地址位于哪个端口”。

交换机收到一个帧时会做两件事:

  1. 根据帧的源 MAC 学习“这个源地址来自哪个端口”;
  2. 根据帧的目的 MAC 查表决定从哪个端口发出。

目的地址不同,对应三种行为:

目的地址 交换机行为
MAC 表中已知的单播地址 只从对应端口转发
MAC 表中未知的单播地址 除入端口外向其他端口泛洪,等收到回包后完成学习
广播/组播地址 在当前广播域内泛洪

MAC 表有老化时间。设备换端口、虚拟机漂移或表项过期后,短时间出现未知单播泛洪是正常现象。Linux 上可用 bridge fdb show 查看网桥/虚拟交换机的转发表。

冲突域和广播域是面试常考点:

  • 交换机每个端口都是独立的冲突域,现代全双工交换以太网基本不再发生 CSMA/CD 冲突;
  • 默认情况下,一台交换机上的端口仍属于同一个广播域
  • 路由器或 VLAN 可以隔离广播域。

1.5 VLAN:一台交换机划分多个二层网络

VLAN(IEEE 802.1Q)通过在以太网帧中加入 4 字节标签,把同一台物理交换机划成多个互相隔离的逻辑广播域。

  • Access 端口通常只属于一个 VLAN,连接普通主机,收发给主机的帧一般不带标签;
  • Trunk 端口承载多个 VLAN,常用于交换机之间或交换机到虚拟化宿主机,帧携带 VLAN ID;
  • 不同 VLAN 之间不能直接二层通信,需要经过三层网关路由。

服务端排障时,如果“同网段地址配置正确却互相不通”,除了 ARP 和防火墙,还要检查两端是否被放进了不同 VLAN。K8s、虚拟机和云网络虽然有更复杂的封装,底层仍经常能看到 Linux bridge、veth、VLAN 或 VXLAN。

1.6 为什么二层网络不能无限扩大

交换网络中出现环路时,广播帧可能被不断复制,形成广播风暴;同时交换机看到同一个源 MAC 在不同端口来回出现,MAC 表会反复抖动。

传统网络使用 STP/RSTP 阻塞冗余路径,保证二层拓扑逻辑上无环;数据中心和云网络更多使用三层网络配合 VXLAN/EVPN。Go 开发者不需要掌握 STP 报文字段,但应知道:“广播风暴、MAC 漂移、VLAN 配错”属于链路层故障,应用重试解决不了。

2. mac地址

以太网规协议定,接入网络的设备都必须安装网络适配器,即网卡, 数据包必须是从一块网卡传送到另一块网卡。而网卡地址就是数据包的发送地址和接收地址,也就是帧首部所包含的MAC地址,MAC地址是每块网卡的身份标识,就如同我们身份证上的身份证号码,具有全球唯一性。MAC地址采用十六进制标识,共6个字节, 前三个字节是厂商编号,后三个字节是网卡流水号,例如 4C-0F-6E-12-D2-19

MAC 地址并不保证永远全球唯一:虚拟机、容器、软件配置和隐私随机化都可以生成或修改 MAC。工程上真正依赖的是同一二层网络内不能出现冲突的 MAC

只有广播帧、组播帧和目的 MAC 尚未被交换机学习的未知单播帧,才会被泛洪到多个端口。正常单播通信在 MAC 表学习完成后,会由交换机定向转发。

3. ARP 协议

上面说到,同一子网内是靠 MAC 地址通信的。但应用层给出的目标是 IP 地址,从 IP 地址找到对应的 MAC 地址,这就是 ARP(Address Resolution Protocol,地址解析协议)的工作。

ARP 在分层上的位置有点尴尬:它为 IP 协议服务,却又直接操作 MAC 地址和链路层广播。OSI 模型里通常把它划在第 2 层与第 3 层之间,TCP/IP 模型中一般归入链路层。本系列把它放在链路层讲,因为它的工作机制(广播、MAC 寻址)和上文完全是一套东西。

工作过程

  1. 主机 A 要给同网段的 IP 192.168.0.2 发数据,先查自己的 ARP 缓存表,看有没有这个 IP 对应的 MAC。
  2. 缓存没有,就在子网内广播一个 ARP 请求:「谁是 192.168.0.2?请把你的 MAC 告诉我」。这个广播帧的目的 MAC 是全 1(FF-FF-FF-FF-FF-FF),子网内所有主机都会收到。
  3. 每台主机拿请求里的 IP 和自己比对,不是自己就丢弃;是自己就单播回一个 ARP 响应,附上自己的 MAC。
  4. A 收到响应,把这个映射写入 ARP 缓存(有超时时间,一般几分钟),然后开始正常通信。

查看本机 ARP 缓存:

arp -a          # macOS / Linux 通用
ip neigh        # Linux 下更现代的写法

ARP 欺骗(ARP Spoofing)

ARP 协议设计时没有任何认证机制——谁都可以声称自己是某个 IP,收到响应的主机也无法验证真假。这就带来两类攻击:

  • 攻击者响应所有 ARP 请求,把自己的 MAC 报上去,于是本该发给别人的数据都流向了攻击者,形成中间人(配合 网络-16 HTTPS 与 TLS 里讲的证书校验才能发现);
  • 攻击者返回一个不存在的 MAC,导致目标主机收不到数据,造成断网。

防御手段主要是静态 ARP 绑定、交换机端口的动态 ARP 检测(DAI),以及上层协议自己做身份认证。

4. 本章面试题

交换机收到一个以太网帧后怎么处理?

先根据源 MAC 学习入端口,再根据目的 MAC 查 MAC 地址表:

  • 已知单播 → 只转发到对应端口;
  • 未知单播 → 除入端口外泛洪,收到回包后完成学习;
  • 广播/组播 → 在当前广播域内泛洪。

因此“以太网把每个包广播给所有主机”是错的,正常单播在学习完成后是定向转发。

冲突域和广播域有什么区别?VLAN 解决什么问题?

交换机的每个端口是独立冲突域;默认情况下,交换机上的端口仍处于同一个广播域

VLAN 把一台物理交换机划成多个逻辑广播域,不同 VLAN 的广播互相不可见,通信必须经过三层网关。Access 口连接普通主机,Trunk 口携带多个带 802.1Q 标签的 VLAN。

ARP 协议的作用和工作过程?

作用:在同一网段内,由 IP 地址查出对应的 MAC 地址。因为应用层给的是 IP,而链路层通信需要 MAC。

过程:

  1. 先查本机 ARP 缓存表
  2. 没有则在子网内广播 ARP 请求(目的 MAC 为全 1 FF:FF:FF:FF:FF:FF):“谁是 192.168.0.2?”
  3. 每台主机拿请求里的 IP 与自己比对,不是则丢弃,是则单播回自己的 MAC;
  4. 请求方写入 ARP 缓存(有超时,通常几分钟)后开始通信。

查看缓存:arp -aip neigh

什么是 ARP 欺骗?为什么能成功?

根本原因:ARP 协议没有任何认证机制——谁都可以声称自己是某个 IP,收到响应的主机也无法验证真假。

两类攻击:

  • 攻击者响应所有 ARP 请求并报上自己的 MAC,于是本该发给别人的数据流向攻击者,形成中间人
  • 返回一个不存在的 MAC,导致目标收不到数据,造成断网

防御:静态 ARP 绑定、交换机的动态 ARP 检测(DAI),以及上层协议自己做身份认证(HTTPS 的证书校验就能发现中间人,见 网络-16)。

MAC 地址和 IP 地址的区别?为什么两个都需要?
MAC 地址 IP 地址
长度 6 字节 IPv4 为 4 字节
分配 烧在网卡里,全球唯一 由网络管理员/DHCP 分配,可变
作用范围 同一局域网内寻址 跨网络寻址
转发中 每一跳都重写 端到端不变

为什么都需要:IP 负责"最终要送到互联网上的哪台机器",但实际的每一段物理传输都靠 MAC 完成。跨网段时数据帧的目的 MAC 填的是网关的 MAC,而 IP 首部始终写最终目标——详见 网络-05

另一个角度:MAC 是"物理身份"不便于层级化路由,IP 的层级结构(网络号+主机号)才使路由聚合成为可能。