计算机网络:数据链路层协议

目录

一、数据链路层协议的定义

二、数据链路层:下层MAC协议

(1)奇偶校验法

(2)CRC校验法

(3)MAC地址

三、数据链路层:上层LLC协议---有确认无连接型

(1)停止等待协议

(2)后退N帧协议

[2.1 基本原则](#2.1 基本原则)

[2.2 为什么后退N帧协议的滑动窗口大小是2^N-1?](#2.2 为什么后退N帧协议的滑动窗口大小是2^N-1?)

(3)选择重传协议

(4)对比与总结

四、MAC协议的具体表现:以太网协议

(1)以太网帧格式

(2)数据碰撞问题

(3)最长冲突检测时间与MTU


在计算机网络的分层架构中,数据链路层是承上启下的关键一环:它接收来自网络层的 IP 数据包,封装成帧后通过物理链路交付给下一跳设备,同时通过差错检测、流量控制与介质访问控制,为上层提供稳定、高效的 "一跳传输" 服务。

从早期追求 "可靠传输" 的有确认协议,到现代以太网 "极致高效" 的无确认设计,数据链路层的演进史,正是网络协议在可靠性性能之间不断权衡的缩影。它既包含了滑动窗口、差错校验等底层核心原理,也孕育了以太网这一统治局域网数十年的工程实践。

本文将从数据链路层的核心定义出发,拆解 MAC 层与 LLC 层的分工,深入解析差错检测、可靠传输协议的实现逻辑,并最终落地到以太网的帧格式、CSMA/CD 机制与现代交换网络的演进,带你完整理解这一层 "看不见却至关重要" 的网络基石。

一、数据链路层协议的定义

数据链路层协议是从网卡发出,经双绞线传输的数据包。即网卡与路由器、路由器与路由器之间要遵守的协议。在OSI中,要求数据链路层实现可靠传输:保证数据不出错、不乱序、不丢失、不重复。而实现可靠传输的方式有两种:有连接+有确认;无连接+有确认。

不过现代计算机网络体系中通常并不要求在数据链路层就实现可靠传输,只需要保证数据不出错即可,而可靠、重发、乱序、丢失等部分则交给TCP协议解决。这主要是因为如果数据链路层要求数据可靠,则会付出大量的性能去检测,而网络是一个高速场景,对速率、延迟的要求极高;而TCP则可以根据数据的重要性选择是否重传、可靠等(比如在直播中,实时性通常比丢包更加重要,就会选择不重传)。只有在丢包率极高的环境中才要求数据链路层就做好可靠性(比如WiFi802.11协议)。

数据链路层主要进行了如下两个步骤:

(1)传输服务可靠性协议

将网络层数据封装成帧后,网卡对帧在链路上传输也要进行规定。如提供可靠的传输服务还是不可靠的传输服务。可靠的传输服务是提供面向连接的可靠传输还是不面向连接的可靠传输。

网卡会将网络层数据进一步封装,加入数据链路层协议后发送给路由器。

(2)封装成帧,差错检测

在网卡昨晚上述步骤后,已经完成了数据、协议的包裹。但还无法确定传输过程中是否会受到电磁信号等干扰,使得数据在网线上发生跳变,为了让信息具备能检测是否出现bit错的情况,就需要添加一个用于差错检测的字段。只要根据这个字段就能检测是否有bit错误。一般我们使用CRC校验法求出FCS校验字段。

CRC校验法有点类似哈希法,都是数学家证明出来的具有极高可靠性的验证码方式,不过哈希追求极致的可靠,不能有任何一点错误;CRC则稍稍有所放宽,使用成本更低的模2除+逐步异或的硬件电路实现校验,虽然可靠性略差于哈希,但却是高速网络中的综合权衡。

后续我们数据链路层的讲解就是分别讲解可靠性协议是如何实现的、以及CRC校验的校验过程。

二、数据链路层:下层MAC协议

当网络层数据被交付给网卡后,会由网卡先添加LLC层协议,并最终添加MAC层协议。由于MAC层协议比较简单,所以我们先讲解这个。

FCS校验部分有许多的校验算法,不过在计算机网络中为了兼顾传输性能、硬件成本、校验时间等,通常会采用CRC校验法和奇偶校验法。其中CRC校验法是公认最好的网络校验算法,而奇偶校验法大多只在理论上或者单片机场景中成立,因为他的错误率实在是比较感人。

(1)奇偶校验法

奇偶校验码是奇校验码和偶校验码的统称,是一种最基本的检错码。它由n-1位信息元和1位校验元组成,如果是奇校验码,那么在附加一个校验元后,码长为n的码字中1的个数为奇数;如果是偶校验码,那么在附加一个校验元以后,码长为n的码字中1的个数为偶数。它只能检测奇数位的出错情况,但并不知道哪些位错了,也不能发现偶数位的出错情况。

比如一个数据是8位、且采取偶校验法,则需要保证添加1位校验位后整体的1的个数为偶数。如11001011一共是5个1,那么添加后则变成11001011 1共9位数据,且1的个数是偶数。在对方接收到数据包后,首先由网卡进行偶校验,如果发现1的个数为偶数则正常传输;如果发现1的个数为奇数则错误并丢弃该报文。

不过由于奇偶校验法的错误率实在太高,数据包中间可能受到攻击将任意多个1、0交换顺序使得最终的奇偶个数不变,所以计算机网络中通常不会使用这种方法。

(2)CRC校验法

CRC校验法采用模2除和异或运算。首先双方会约定一个多项式,比如:

发现该多项式的最高次幂为3,于是FCS的字段长度就为3。紧接着将多项式的系数提出来:1101,这个数作为双方验证的除数。然后用完整的包含数据链路层协议的bit流采用循环模2除+异或运算得到3位余数,填入FCS字段即可。

对方在接收数据的时候,首先把FCS字段和其他数据提取出来,用同样的方法计算FCS字段,如果和传来的FCS一致则说明bit流没有任何错误,正常接收。如果不一致则说明有某些地方出错了,直接丢弃。

当然在CRC校验法中,有一个更加方便的计算方式:对数据包+FCS整体使用循环模2除+异或,如果结果为0则表示无错误,直接接收并向上递交。(这是数学的证明,只需要了解即可,不用记住证明方法)

(3)MAC地址

MAC地址头主要是标记目的路由器和源路由器,用于实现路由器间的"一跳"传递。所以MAC头部分会添加两个MAC地址。

而在网络层还会有一个IP地址,是用来做宏观的路由导航的,就好比你从黄鹤楼导航到晴川阁的作用。而MAC地址则是导航说:前方路口左转。导航每说一次就好比经过一个路由器节点。

常见的MAC层帧格式有以太网帧、VLAN帧。以太网帧定义了MAC地址、FCS的长度等。VLAN帧则相较于以太网增加了一个VLAN标签而已。

三、数据链路层:上层LLC协议---有确认无连接型

LLC层协议主要有滑动窗口协议和IEEE 802.2协议。由于IEEE 802.2协议已经废弃,所以在计算机网络中,我们主要学习了解滑动窗口协议即可。如果你完全掌握了滑动窗口协议,那么传输层的TCP协议你也能信手拈来。

滑动窗口协议,顾名思义就是先创建一个缓冲窗口,用于充当发送缓冲区。而这又可以由3个小协议组成。

(1)停止等待协议

停止等待协议是滑动窗口协议的特殊情况,即窗口容量为1。

(2)后退N帧协议

2.1 基本原则

正是由于停止等待协议的效率低下问题,人们针对此进行优化,提出了后退N帧技术。后退N帧协议大幅提升了信道的利用率。

在该技术下,接收方容量仍然是1、只不过发送方滑动窗口的大小不再是1,而是一个大于1的常数N,发送方每次把整个滑动窗口的N帧一股脑都连续发送出去,然后在发送期间同时等待接收方的ACK应答。只有收到的ACK应答序号ACK_num大于等于滑动窗口的左区间,则滑动窗口移动到序号ACK_num+1处,使发送方窗口大小减小。

而接收方会有一个期望序号,只有收到的序号与期望序号一致时,才会接收并返回接受序号的ACK;否则直接丢弃,并发送上一次成功接收的序号ACK。这里的ACK表示我已经接收到此前所有的帧了(包含自己)。

注意:这里会引入帧序号的概念,才能让双方知道到底是从哪里开始丢失的。首先,在LLC层会有一个逻辑序号,它全局递增、无上限。比如可能从0开始一直增加到了10000(有点类似TCP的帧序号)。而滑动窗口也有帧序号的概念,由于滑动窗口不可能无限大,必定有一个确定的大小,比如7帧,那么滑动窗口就仅仅只会在意LLC逻辑序号的后3位,且帧数据包中也只有3bit位用于存储序号。

这个全局递增无上限的序号被发送方存储在内存中方便递增,而LLC协议帧头中为了节约带宽资源,只会把帧序号(比如上面例子的3位)填入帧头中。

注意:这里在下一轮开始前,next_seqnum是保持不变的,而send_base在不断增加,所以看起来滑动窗口在减小(我们前面说的滑动窗口不变其实不准确)。当本轮所有ACK收到末尾后,开启第二轮发送,此时next_seqnum突然跳变滑动窗口容量个大小。

接收方会一直将数据包和期望序号比对,直到收到正确的期望序号。所以在正确之前的所有包都会被丢弃。即后退N帧协议只认序号、不认顺序。

2.2 为什么后退N帧协议的滑动窗口大小是2^N-1?

主要就是防止窗口过大,不知道该序号到底是上一轮的还是这一轮的。(毕竟为了减小序号占用的空间,不能把序号完整的写出来,而是用几个bit位的尾号表示)

(3)选择重传协议

虽然后退N帧协议在一定程度上提高了信道的利用率,但由于其死板的只认期望序号,会让大量乱序帧丢失,而乱序在网络环境中是非常常见的情况。于是人们进一步发明了选择重传协议。

选择重传协议的接收区容量不再限制为1,而是与发送方相等大小=2^(N-1)。于是接收方不再只期望一个序号,而是期望好几个序号,每来一个期望数组中的帧,就返回一个ACK。而发送方不再采用累计ACK,而是单独ACK确认。

从这里可以看出来几个特点:

(1)选择重传协议由于引入了接收滑动窗口,可以更好的接收乱序报文(后退N帧只要乱序就丢了)。

(2)由于ACK不再是累计方式,而是一帧一帧的应答。所以滑动窗口不再依赖于右区间固定来计算需要重发的帧号了,只要收到一个ACK(左区间的ACK)就能往后滑动一次。并且数据包变得平滑而不是一轮轮的,实现流水线传输,信道利用率更高。

(3)滑动窗口在左区间ACK未临时不会向右滑动,而是维护一个ACK队列,先记着后面有哪些收到了应答,等左区间的一到来直接滑动多次,不会少滑动,但是产生了延迟滑动的效果。而后退N帧虽然延迟更低,但他滑动也没有什么意义,因为在下一轮开始前,右区间next_num都不会改变,仅仅是用于标记作用。所以从这个方面考虑选择重传协议不会因为延迟滑动而更低效。

(4)对比与总结

至此,我们完成了从 "可靠传输" 到 "高效传输" 的全流程探索。为了方便记忆与理解,我们将这三种协议的核心行为与优缺点做一个最终的归纳对比。

这三种协议的演变,本质上是在追求 "信道利用率""实现复杂度" 之间的平衡:

  • 停止等待(停等)

    • 代价:发一帧等一帧,发完等待 ACK 期间,信道完全闲置。
    • 优点:实现最简单,逻辑零负担。
    • 适用:链路极长、时延巨大(如深空通信)或极其简单的低速串口通信。
  • 后退 N 帧 (GBN)

    • 代价累积确认虽然简单,但乱序严重时会导致 "一丢全重传"。重传包含了大量已确认的冗余数据,造成严重的带宽浪费。
    • 优点:实现简单,不需要维护复杂的接收缓冲区和状态表。
    • 适用:链路质量好、乱序少的场景,或者嵌入式系统中追求低成本实现的场景。
  • 选择重传 (SR)

    • 代价实现复杂。发送方需要维护超时计时器队列,接收方需要维护有序列号的缓冲区(位图),逻辑开销大。
    • 优点最高效。只重传丢失的帧,避免了冗余带宽消耗;虽然有 "窗口滑动延迟",但那是为了换取效率付出的微小代价,整体吞吐量远优于 GBN。
    • 适用:现代网络环境(如 TCP)的基础,适合丢包率低但乱序常见的复杂网络。

从停止等待到选择重传,我们可以总结出网络协议设计的两大原则:

四、MAC协议的具体表现:以太网协议

前面我们虽然说 MAC 协议只做了两件事:差错校验 + MAC 地址跳转。但这只是理论上的抽象描述,真正工程化的 MAC 层协议在此基础上略加扩充---类型字段(以确认上层是IP层、还是ARP层,亦或者是其他的上层协议),便形成了如今的以太网协议,这也是现代网络通信的基石。

以太网协议完全舍弃了 LLC 层滑动窗口的各种可靠确认、连接机制。这种 "极简" 设计虽然在一定程度上导致了数据链路层的 "不可靠",但换来了极致的传输速率与低延迟

在网络通信的底层逻辑中,"快" 永远是第一优先级。而对于数据是否丢失、是否完整的可靠性责任,完全可以交给更懂业务逻辑的上层协议(如 TCP)全权处理。这正是网络分层架构中职责分离的精髓:下层负责 "送得快",上层负责 "送得稳"。

下面说的是有线网络,至于无限WiFi在后续文章讲解。

(1)以太网帧格式

类型字段(2个字节): 用来标志上一层使用的是什么协议,以便把收到的MAC帧的数据上交给上一层的这个协议;

数据字段(46-1500): 正式名称是MAC客户数据字段。数据部分的最小长度为46字节。数据部分的最大长度为 1500字节。必须控制在这个范围内;

**FCS字段(4 字节):**CRC校验字段,需要校验以太网帧的目的地址,源地址,类型部分以及数据部分;

(2)数据碰撞问题

在以太网(数据链路层)中,各个主机的网卡都是通过总线的方式连接,这是为了节省网线资源,提高利用率。但是每个主机都可能随时发送数据,就有可能出现两个主机同时发送数据的情况,产生了数据碰撞,使得数据整个错乱掉。此时,各主机都会停止发送消息,经过退避算法过一段时间后再重新尝试发送。

不过这些问题都是在传统的集线器拓扑结构下共享总线产生的问题(CSMA/CD协议只适用于总线半双工),而现代多使用交换机的全双工形式,各主机不需要竞争总线,从而完全可以禁用CSMA/CD协议(早期路由器可能是集线器模式、现代大多都是内置交换机--LAN口是交换机,WAN口是连外网的路由器模块)。

注意:这里的检测机制是CSMA/CD协议:一旦检测到数据碰撞就立马停止发送。而我们之前在数电中曾学过总线仲裁机制,它是利用0的下拉能力强于1的上拉能力区分出优先级,造成高优先级的感知不到碰撞,而低优先级的能感知到。在以太网中,由于使用了曼彻斯特差分编码(1bit=2次电平变化),没有了硬件优先级的概念,只要发生数据碰撞都会接收到错误数据,不得不停止发送。

(3)最长冲突检测时间与MTU

由于以太网协议没有LLC层的确认机制,所以不能通过ACK应答判断数据是否发生丢失。尽管以太网协议是不可靠传输,但我们也不希望因为数据碰撞产生的错误过多,所以必须在数据发送完成前检测到数据碰撞,从而后续重发。

主机到信道的时间T1(一帧完全发送到信道的时间)>碰撞检测时间T2,即可保证在信道上传输的都是有效的、无碰撞的!

以太网帧长限制的深层逻辑:

以太网对帧长度的限制,是在协议有效性工程代价之间的完美平衡:

  1. 下限 64B(保证有效性) :以太网规定最小帧长为 64B,核心是为了满足 T1​>T2​(帧发送时长 T1 必须大于碰撞检测时间 T2)。只有这样,才能保证最早发送的主机,在帧发完前一定能检测到冲突。若帧长过短,发送方就会在冲突信号返回前误以为传输成功,导致数据永久丢失。
  2. 上限 1518B(平衡效率与代价) :最大帧长对应 MTU = 1500B。这是在传输效率与重传代价之间的权衡:帧越大,有效载荷比越高,但重传时浪费的带宽也越大。1518B 是工业界达成的工程最优解。
  3. 重要澄清 :以太网协议本身是不可靠传输,除碰撞引发的重传外,无任何独立的可靠重传检测机制,数据丢失后的重传逻辑由上层协议(如 TCP)负责。
  4. 历史兼容性:尽管现代网络速率极大提升,传播时延 T2 已变得微不足道,为了兼容早期的硬件与协议标准,至今仍沿用 64B 的最小帧长规定。
相关推荐
Mr数据杨2 小时前
【Dv3Admin】FastCRUD MD编辑器操作
服务器·网络·编辑器
程序员一点2 小时前
第23章:备份与灾难恢复策略
linux·运维·网络·数据库·openeuler
艾莉丝努力练剑2 小时前
确保多进程命名管道权限一致的方法
java·linux·运维·服务器·开发语言·网络·c++
NGC_66112 小时前
TCP三次握手
运维·服务器·网络
爱看科技3 小时前
微美全息(NASDAQ:WIMI)协同量子生成网络架构:为量子生成对抗学习铺就优化通途
网络·学习·架构
带娃的IT创业者3 小时前
WeClaw WebSocket 路由实战:BridgeConnectionManager 如何用四层映射在 800 个连接中实现毫秒级消息转发?
网络·python·websocket·网络协议·fastapi·实时通信
瘾大侠3 小时前
HTB - VariaType
网络·安全·web安全·网络安全
安科士andxe3 小时前
100G 长距光传输场景选型指南:安科士 QSFP28 ZR4 如何适配全场景需求
网络
信看3 小时前
亚马逊 AWS MQTT(S) 测试
网络·云计算·aws