为网络层提供服务、链路管理、帧定界、帧同步与透明传输、流量控制和差错控制

组帧

在物理层中,数据是一串连续的比特流(101010111001011011010…)

如果不加边界标识,接收方根本无法知道起点终点,是否出错。

组帧就是数据链路层负责将比特流“打包成帧”,每一帧都有明确的开头、内容和结尾。

帧结构:

典型结构如下:

[帧头] [控制字段] [数据部分] [校验字段] [帧尾]

例如:

| 起始标志 | 地址 | 控制位 | 数据 | CRC 校验 | 结束标志 |

字符计数法

  • 记录数据长度:帧头里一个字段指明后面多少字节是数据。
  • 缺点:如果长度字段出错,会“跑偏”。

首尾定界法

也叫 标志字节法 + 字节填充(Byte Stuffing)。

  • 用特殊字节(如 FLAG = 01111110)做帧边界。
  • 若数据中出现相同字节,则进行转义处理(插入特殊转义字符或填充)。

违规编码法

  • 适用于物理层使用编码机制的情况(如曼彻斯特编码、差分曼彻斯特等)。
  • 利用某些本不应出现的非法编码位模式作为帧的边界信号。

差错控制

差错控制的目标是检测并(在可能时)纠正传输中的比特错误,分为两大类方法:

检错编码

只能发现错误,不能自己改正错误。发现错误后,需要依赖重传机制(如 ARQ)来修复。

奇偶校验(Parity Check)

发送方根据原始数据中的“1”的个数决定添加的校验位。

有两种常用方式:

偶校验(Even Parity):

  • 让所有 1 的总数为偶数
  • 如果原始数据中有奇数个 1 → 添加校验位 1;
  • 如果原始数据中有偶数个 1 → 添加校验位 0。

奇校验(Odd Parity):

  • 让所有 1 的总数为奇数
  • 如果原始数据中有奇数个 1 → 添加校验位 0;
  • 如果原始数据中有偶数个 1 → 添加校验位 1。

能有效检测单个比特错误,无法检测偶数位错误(比如 2 位、4 位出错时校验仍然通过)

循环冗余检验(CRC)

把数据看成一个 二进制多项式,对它进行模一个固定多项式的除法运算,将余数作为冗余校验位(CRC码)附加到数据后发送。

假设:

要发送的数据是 110101 。使用的生成多项式是 1011(对应多项式是 x3+x+1,阶数为 3)

  1. 数据左移:

    在数据后面加上 3 个 0(生成多项式阶数为3):

    原始数据: 110101 加3个0后: 110101000

  2. 二进制模2除法(不进位异或运算)

    110101000 除以 1011,每次从左向右对齐除数并异或,得到余数为 001

  3. 发送帧

    将余数 001 加到原始数据末尾,发送的是: 110101001

  4. 接收端验证

    接收方收到 110101001,用同样的除数 1011 做模2除法:

    • 如果余数是 0 → 校验通过;
    • 如果余数 ≠ 0 → 出错。

校验和(Checksum)

发送方流程:

  1. 将数据分成若干固定长度的“字”(如 8 位、16 位、32 位)
  2. 将这些字逐个相加(可能带进位)
  3. 对结果做“反码”(可选)
  4. 将这个和作为校验和(checksum)附加在数据末尾一起发送

接收方流程:

  1. 收到数据和校验和
  2. 对数据部分重新分组并相加
  3. 加上收到的校验和
  4. 检查最终结果是否为全 1(如用反码时),或者是否模为 0(根据实现)

纠错编码

不仅能发现错误,还能在接收方直接改正错误,不依赖重传。

主要原理是:发送方加入冗余信息,使得接收方可以定位出错位置并自动修正。

海明码

能自动纠正1位错误以及能检测2位错误

可靠传输

  • 序号(Sequence Number):用于数据排序
  • 确认号(Acknowledgment Number):确认已收到数据的下一个期望字节序号
  • 超时重传:未收到ACK超时后重发

流量控制

停止等待协议

是最简单的一种 自动重传请求协议(ARQ)。

流程

  • 发送方发送一个数据帧后,停止发送并等待确认(ACK)。
  • 收到确认后再发送下一个帧。
  • 若在超时前未收到确认,则重传该帧。

发送方行为

  • 发送当前数据帧
  • 等待直到收到确认帧(ACK)
  • 收到确认后进入下一个数据帧

接收方行为

  • 接受数据帧后回复ACK

后退N帧协议

一个一个等实在太慢了,在等下一个包的时候完全可以先把之后的发送。

于是允许一次发送多个数据帧(新增发送窗口),加快效率,批量发批量等。

在线模拟:点我试试

流程

  • 发送方维持一个发送窗口,可以连续发送多个数据包(比如 seq=1~5)。
  • 接收方只按顺序接收,如果中间某个包丢了,就只确认前一个正确的包。
  • 一旦发生丢包或出错,发送方会回退重传这个包及其后面的所有包。

发送方行为

以窗口为5为例,窗口内的帧有三个状态:未发,已发

  • 维持发送窗口,例如 [1, 5],一旦窗口还有标记为未发的就顺序发送,发送后标记为已发
  • 接收到 ACK x,表示 x 及之前的帧都已正确接收,将窗口起点滑动到 x+1,对应新窗口为 [x+1, x+5]
  • 当在窗口一直不变化的情况下没有收到ACK包,就把窗口内所有已发送的再发送一份

接收方行为

只期待下一个数据帧 X。

  • 如果是数据帧X,回复ACK X,期待下一个数据帧 X +1;
  • 如果不是数据帧X(即 X 之后的帧),丢弃并回复ACKX,期待值X不变

选择重传协议

因为前面一个包的错,就导致后面的包都被浪费,实在太坏了。

接收方担起一定责任,负责把后面提前到的包暂存起来。

在线模拟:点我试试

流程

  • 发送方仍可连续发送多个数据包。
  • 接收方可以缓存乱序到达的数据包,并分别确认每一个。
  • 只有丢失的那个数据包会被重传,而不是之后所有的。

发送方行为

以窗口为5为例,窗口内的帧有三个状态:未发,未应答,完成

  • 维持发送窗口,例如 [1, 5],一旦窗口还有标记为未发的就顺序发送,发送后标记为未应答。
  • 当接收到ACK x,就把x标记为完成,维护找到第一个未完成的包y,窗口调整为[y, y + 4]
  • 每个发送的数据帧都启动一个 独立的定时器,若超时则仅重传该帧。

接收方行为

需要维护接收情况,有两个状态:未收,已收

  • 当收到数据包X,将X标记为已收,回复ACK X

介质访问

信道划分

是指在多用户通信环境下,如何把有限的通信资源(信道)分配给多个用户使用的技术和方法。目的是让多个用户能够共享同一物理介质,同时避免互相干扰,提高资源利用率。

频分复用(FDM)

将多路信号调制到不同的频率载波上,叠加成一个复合信号同时传输。

适用于模拟信号和无线电传输。

时分复用(TDM)

将物理信道按时间划分成多个时隙,不同信号轮流使用各自的时间片。

常见于数字通信和电话交换。

波分复用(WDM)

在一根光纤中同时传输多种不同波长(频率)的光信号,实现光信号的多路复用。

广泛用于光纤通信。

码分复用(CDM)

利用不同的编码序列区分各路信号,允许它们在同一时间、同一频率上传输。

典型技术是CDMA,用于3G及部分4G无线通信。

随机访问

随机访问是一种不事先分配信道资源,设备在需要发送时随机尝试访问信道的方式。因为许多设备并不会一直占用信道,所以不一定要事先分配一个方式,随机访问是无序的抢占,当一个设备需要使用,就去看看是不是空的。对此可能会发生同一个时间多个设备抢占一个信道,因此有了多个协议来解决问题。

ALOHA协议

纯ALOHA:

  • 设备有数据就直接发送。
  • 若在发送期间检测到冲突(或者等待ACK超时),等待随机时间后重发。
  • 因为发送时间无序,冲突概率较高。

时隙ALOHA:

  • 把时间规划成时隙,例如1-2 2-3秒这样,要求每个发送都只能在时隙开头(例如整数秒)
  • 这样就避免“有人发到一半另一个人突然插入”的情况
  • 例如:本来A在1s开始发送,1.1s有B插入,在时隙ALOHA下只能在2s才能发送,此时A大概率已经发送完了。

三种CSMA协议:

1-坚持CSMA(1-persistent CSMA)

  • 节点检测信道:
    • 若空闲,立即发送(概率为1,故称1-persistent)。
    • 若忙碌,持续监听信道直到空闲,再立即发送。
  • 优点:信道利用率高。缺点:易产生冲突,特别是在高负载情况下。

非坚持CSMA(non-persistent CSMA)

  • 节点检测信道:
    • 若空闲,立即发送。
    • 若忙碌,等待随机时间后重新检测信道(避免频繁监听引起冲突)。
  • 优点:减少冲突发生概率,效率较高。缺点:信道利用率低

p-坚持CSMA(p-persistent CSMA)

  • 节点检测信道:
    • 若空闲,以概率p发送,概率1-p等待下一个时间间隔再检测。
    • 若忙碌,等待直到信道空闲。
  • 是介于1-persistent和non-persistent之间的一种折衷方案。

CSMA/CD(Collision Detection)协议

应用场景:主要用于有线以太网(如传统10BASE-T)

  • 基于 1-坚持CSMA 的改进。
  • 发送前监听(Carrier Sense)信道是否空闲:
    • 若空闲:开始发送。
    • 若忙碌:等待空闲。
  • 发送中继续监听信道:
    • 若检测到冲突(Collision Detected),立即停止发送,并发送干扰信号(Jam)通知其他设备。
    • 然后等待一个随机退避时间(通常使用指数退避算法)后重试发送。

特点:

  • 实时冲突检测,提高可靠性;
  • 仅适用于半双工通信(不能边收边发);
  • 在高负载时冲突较多,但轻载下效率较高。

最小帧长

我们现在来分析CSMA是如何检测到冲突的。模拟一个情况:

[ A ] -------------------------- [ B ] 发送端 接收端

  1. A 开始发送一个帧。
  2. 假设 B 也在这时刚好开始发送。
  3. 冲突发生在中间的某一点。冲突信号开始从冲突点往两边传播。

现在出现两个情况:

  1. 如果 A 还没有发完帧,就能接收到冲突信号(检测到冲突)。
  2. 如果 A 已经发完帧,它就检测不到冲突,以为发送成功,造成数据丢失。

显然我们希望出现的事第一种情况,那就要求了 A 发送帧的时间要足够长,足够获取到冲突信号。所以最坏的情况就是冲突发生在B点附近,此时的A发送数据包时间就要满足一个来回。也就是

A 的发送时间 ≥ 信号在链路中往返一次的传播时延(2 × 最大传播时延)

只要满足上述条件,A就能成功检测到冲突,故要求了A的帧要足够大,因此,帧不能过小,才称为最小帧长。

出现以下公式:

我们也用 τ 来表示最大传播时延,故也可以表示为

以太网规定的最短帧长是 64 字节

CSMA/CA(Collision Avoidance)协议

应用场景:主要用于无线网络(如 Wi-Fi)

  • 无线通信中,不能像CSMA/CD那样边发送边监听,所以改为避免冲突(Avoidance)。
  • 工作机制:
    1. 监听信道是否空闲;
    2. 若空闲,等待一个随机退避时间后才发送,避免“大家同时看到空闲后一起发”的冲突;
    3. 通常还结合 RTS/CTS(请求发送/允许发送)机制来预告数据传输,进一步避免冲突;
    4. 若信道忙碌,继续等待。

特点:

  • 适合无线网络中的广播环境;
  • 不能检测冲突,只能尽量避免;
  • 加入随机等待机制提高成功率;
  • RTS/CTS 有助于避免“隐藏节点”问题。

轮询访问

轮询访问是一种由中心设备依次轮流询问各个终端设备是否有数据需要发送的介质访问方式。中心设备按照固定顺序轮询各设备,被轮询的设备如果有数据就发送,否则等待下一轮轮询。设备只能在被轮询时发送,没有主动权。

在开始之前,需要确定一台设备作为主控,要求主控可以逻辑上访问到所有设备的通信资源

工作原理

  • 主控 周期性地向每个设备发送轮询信号;
  • 设备接收到轮询后,判断是否有数据要发送;
  • 若有数据,则开始发送数据帧;
  • 若无数据,则响应空闲,等待下一次轮询。

优缺点

访问有序,避免冲突;适合流量均匀且设备数目较少的场景;易于管理和控制。

当设备较多且大多数设备无数据时,资源浪费严重;轮询延迟较大,实时性差;依赖中心控制器,存在单点故障风险。

典型应用

  • 计算机系统中CPU对外设的轮询访问;
  • 一些局域网协议(如早期的令牌总线);
  • 工业自动化中的主从式通信。

ARP协议

见网络层博客,arp属于 网络层和链路层之间的协议

广域网

PPP协议(Point-to-Point Protocol)

如果把PPP协议看成一个黑盒,它的主要功能是在两个直接相连的节点之间传输网络层数据,让不同网络层协议的数据包可以通过多种物理链路可靠传输。

  • 输入:
    • 来自网络层(如IP)的数据包
    • 链路控制命令(例如链路配置、认证消息)
  • 输出:
    • 封装成PPP帧后发送到物理层
    • 从物理层接收的PPP帧解封装出的网络层数据
    • 链路控制和管理反馈信息

主要工作内容

  • 链路建立与管理:PPP通过链路控制协议(LCP)来建立、配置、维护和终止点对点链路,保证链路在使用期间稳定可靠。
  • 数据帧封装:将网络层(如IP)数据封装成统一格式的PPP帧,便于通过物理链路传输。
  • 多协议支持:PPP支持多种网络层协议(IP、IPX等),通过网络控制协议(NCP)协商确定使用哪种协议。
  • 错误检测:使用帧校验序列(FCS)检测数据传输中的错误,保证数据完整性。
  • 身份认证:通过PAP或CHAP等认证协议,确保链路两端设备身份合法,提升安全性。

字节填充

PPP帧以0x7E作为帧的起始和结束标志。如果数据内容中也出现了0x7E(标志字节)或0x7D(转义字节),直接发送会被误认为是帧边界或转义符,导致接收端错误解析。

PPP采用字节填充的方法对数据部分进行“转义”,保证帧边界的唯一性。

具体规则:

  • 当数据中出现 0x7E(帧标志)时,发送时替换为两个字节:0x7D 0x5E
  • 当数据中出现 0x7D(转义字符)时,发送时替换为:0x7D 0x5D

换句话说:

  • 发送端遇到特殊字节时,先发送转义字节 0x7D,然后发送该字节与 0x20 按位异或后的结果(0x7E ^ 0x20 = 0x5E,0x7D ^ 0x20 = 0x5D)。
  • 接收端遇到 0x7D,就把后面的字节与 0x20 异或还原,恢复成原始数据。

工作内容

  • 链路建立、维护与释放:通过控制字段完成链路的建立、维护和断开。
  • 数据帧封装和传输:定义了标准的数据帧格式,负责对网络层数据进行封装并可靠传输。
  • 差错检测与纠正:通过循环冗余校验(CRC)实现数据差错检测。
  • 流量控制与顺序控制:利用序列号实现帧的顺序传输和流量控制,保证数据完整且按序到达。
  • 多路复用:支持多个逻辑链路在同一物理链路上传输。

帧类型

其设计了三种不同的帧类型,分别有不同的工作内容:

  • 信息帧(I帧):携带用户数据,支持序号和确认。
  • 监督帧(S帧):传输控制信息,如确认和请求重传。
  • 无编号帧(U帧):管理链路控制,如建立和断开连接。

0比特插入法

在HDLC中,一个帧的起始和结束标志字段为:01111110(即十六进制的 0x7E)。

为了避免这个比特序列误出现在数据部分(信息字段或控制字段中),HDLC采用了比特填充(Bit Stuffing)机制。

  • 原理:

发送端在数据中每出现连续 5个1(即 11111)时,自动插入1个0,变成 111110

这样就能避免数据中“无意”产生6个1(111111)的情况,从而不会被错误识别为帧的起始或结束标志。

  • 例如:

假设要发送的数据部分中包含:01111110(可能被识别为帧边界)

但经过比特填充后(加入0):011111010 (安全,不会被误识为标志)

  • 接收方处理:

每当检测到 连续5个1 后,如果下一个是0,就将它删掉还原为原始数据;

如果下一个是1,则说明这是帧标志字段的部分(01111110),标志着一帧结束或开始。