ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

数据链路层核心考点全解析:封装成帧、CRC校验与滑动窗口协议

数据链路层核心考点全解析:封装成帧、CRC校验与滑动窗口协议

1. 数据链路层到底在解决什么问题

1.1 从“两台机器怎么说话”说起

学计算机网络,到了数据链路层这一章,很多人会突然觉得画风变了。物理层讲的是比特流怎么在铜线、光纤里跑,网络层讲的是路由和转发,而数据链路层夹在中间,干的事情特别具体:让相邻的两个节点之间,能够可靠地传数据帧。

什么叫“相邻”?不是地理上挨着,而是在同一条链路上,中间没有经过任何路由器。比如你的电脑连到宿舍的交换机,这是一段链路;交换机连到楼层的汇聚设备,这又是一段链路。数据链路层管的就是这一段一段的“局部传输”,它不关心从广州到北京怎么走,那是网络层的事。

谢希仁老师的教材在这一章安排得非常扎实,核心就围绕三个问题展开:封装成帧、差错检测、可靠传输。这三个问题看起来简单,但每一个背后都有一堆细节和坑。我当年期末复习的时候,最开始觉得“不就是加个头加个尾吗”,结果做题才发现,帧定界、透明传输、CRC校验、滑动窗口,每一个都能出大题。

这一章在期末考试里的分量很重,通常能占到卷面20%到30%。选择题、填空题、计算题、简答题都可能出。尤其是CRC校验的计算和滑动窗口协议的分析,几乎是每年必考。所以这篇内容,我打算把这一章的重点从头到尾捋一遍,不光讲知识点,还讲怎么考、怎么答、怎么避坑。

1.2 这一章的知识地图

先把框架搭起来,后面往里填东西就不会乱。数据链路层这一章,谢希仁老师的教材主要讲了这么几块:

  • 基本概念:链路、数据链路、帧、封装成帧、透明传输
  • 差错检测:奇偶校验、CRC循环冗余校验
  • 可靠传输:停止等待协议、后退N帧协议、选择重传协议
  • 流量控制:滑动窗口机制
  • 介质访问控制:CSMA/CD、CSMA/CA、令牌传递
  • 以太网:MAC地址、帧格式、交换机工作原理
  • PPP协议:点对点协议的基本流程

这些内容不是孤立的,它们之间有很强的逻辑关系。封装成帧是基础,差错检测是保障,可靠传输和流量控制是核心机制,介质访问控制解决的是“大家抢着说话怎么办”,以太网和PPP是具体的技术实现。

复习的时候,我建议按这个顺序走:先搞懂帧的结构和透明传输,再理解CRC怎么算,然后重点攻克滑动窗口的三种协议,最后把以太网和PPP的细节记住。这样从底层到应用,逻辑是顺的。

提示:这一章的概念特别多,容易混淆。建议自己画一张思维导图,把每个概念的定义、作用、相互关系都标清楚。考前一周每天看一遍,比死记硬背强得多。

2. 封装成帧与透明传输的细节拆解

2.1 帧是怎么“包”出来的

数据链路层传给物理层的数据单位叫帧。帧就像快递包裹,里面装的是网络层交下来的IP数据报,外面要加包装——帧头和帧尾。帧头里放的是控制信息,比如源MAC地址、目的MAC地址、类型字段;帧尾里放的是校验码,比如CRC。

为什么要加帧头和帧尾?因为物理层传的是连续的比特流,接收方怎么知道从哪里开始是一帧、到哪里结束?就是靠帧头和帧尾的特定比特模式来定界。这就像你在一长串数字里找电话号码,得有个分隔符才知道边界在哪。

谢希仁老师教材里重点讲了两种帧定界方法:

  • 字符计数法:在帧头用一个计数字段标明帧的长度。这个方法有个致命问题——如果计数字段本身出错了,后面全乱套,所以实际中很少用。
  • 字符填充法:用特定的字符(比如SOH表示帧开始,EOT表示帧结束)来定界。但问题是,如果数据里恰好出现了SOH或EOT怎么办?这就引出了透明传输的问题。

2.2 透明传输:数据里出现控制字符怎么办

透明传输的意思是:不管数据部分是什么内容,哪怕它看起来像帧定界符,接收方也不能误判。就像玻璃是透明的,你看过去不影响视线;数据链路层对数据也是“透明”的,不关心你传的是什么。

解决方法是字节填充或比特填充。

字节填充的做法是:在数据中出现的SOH或EOT前面,插入一个转义字符ESC。接收方看到ESC,就知道后面的字符是数据而不是定界符,把它去掉就行。如果数据里本来就有ESC呢?那就再插一个ESC,变成ESC ESC。接收方看到连续两个ESC,就还原成一个ESC。

比特填充的做法更巧妙,用在HDLC协议里。帧的起始和结束标志是01111110。为了防止数据里出现这个模式,发送方在数据中每遇到连续5个1,就自动插入一个0。接收方每收到连续5个1,就把后面的0删掉。这样数据里永远不会出现6个连续的1,也就不会和标志字段混淆。

这个知识点考试怎么考?常见的是给你一段数据,让你写出填充后的比特序列,或者反过来,给你填充后的序列,让你还原原始数据。看起来简单,但容易数错。我的经验是:用笔在纸上一个一个数,别心算。尤其是连续5个1后面插0的规则,数错一个就全错。

注意:字节填充和比特填充是两种不同的方法,别搞混。字节填充针对的是字符型数据,比特填充针对的是任意比特流。考试的时候看清楚题目给的是哪种场景。

2.3 帧同步的常见考法

帧同步相关的题目,期末考通常有这么几种:

  1. 给出一段比特流,判断能否正确分帧
  2. 给出原始数据和填充规则,写出填充后的序列
  3. 给出填充后的序列,还原原始数据
  4. 分析某种填充方法的优缺点

我印象最深的一道题是:给了一串包含多个01111110的比特流,问接收方会怎么分帧。这种题就是考你知不知道比特填充的作用——如果发送方正确填充了,数据里就不会有6个连续的1,接收方就能准确找到帧边界。如果没填充,接收方就会把数据里的01111110误认为是帧结束标志,导致分帧错误。

答题的时候,一定要把“为什么会误判”和“填充后为什么不会误判”这两个逻辑说清楚。光写结论拿不到满分。

3. CRC校验:手把手教你算

3.1 CRC到底在算什么

CRC全称是循环冗余校验,是数据链路层最常用的差错检测方法。它的核心思想是:把数据看成一个多项式,除以一个约定的生成多项式,得到的余数就是校验码。

听起来很抽象,但实际算起来是有固定套路的。我把它拆成三步:

  1. 确定生成多项式G(x),比如G(x) = x^4 + x + 1,对应的比特串是10011
  2. 在数据后面补上k个0,k是G(x)的最高次幂
  3. 用补零后的数据对G(x)做模2除法,得到的余数就是CRC校验码

模2除法和普通除法不一样,它不借位,本质上是异或运算。这是最容易出错的地方,很多人习惯性地按普通除法算,结果全错。

3.2 一道完整的CRC计算题

假设数据是1101011011,生成多项式是G(x) = x^4 + x + 1,求CRC校验码。

第一步,确定G(x)的比特串。x^4 + x + 1对应的是10011,最高次幂是4,所以补4个0。

第二步,数据补零:1101011011 0000。

第三步,做模2除法:

1100001010 ______________ 10011 ) 11010110110000 10011 ----- 10011 10011 ----- 00001 00000 ----- 00010 00000 ----- 00101 00000 ----- 01010 00000 ----- 10100 10011 ----- 01110 00000 ----- 11100 10011 ----- 11110 10011 ----- 11010 10011 ----- 10010 10011 ----- 0001

余数是0001,但CRC校验码要取4位,所以是0001。

最终发送的帧是:1101011011 0001。

接收方收到后,用同样的G(x)去除,如果余数为0,说明传输无误;如果不为0,说明出错了。

3.3 CRC计算的避坑指南

我见过太多人在CRC上翻车,总结下来主要是这几个坑:

  • 模2除法当普通除法算:记住,模2除法没有借位,每一位的运算就是异或。1-1=0,0-1=1,但不需要向高位借。
  • 补零的个数搞错:补零的个数等于生成多项式的最高次幂,不是项数。比如x^4 + x + 1,最高次幂是4,补4个0,不是补3个。
  • 余数位数不够:余数必须和生成多项式的最高次幂位数一致。如果算出来是1,要写成0001。
  • 生成多项式记错:常见的生成多项式有CRC-16、CRC-32等,考试通常会直接给出,但你要会把它转换成比特串。

提示:考试的时候,CRC计算题一定要在草稿纸上一步一步写清楚,别跳步。跳步容易出错,而且检查的时候找不到问题在哪。我一般会算两遍,第一遍正常算,第二遍用不同的顺序验算,确保万无一失。

3.4 CRC的检错能力到底有多强

CRC不是万能的,它只能检测错误,不能纠正错误。而且它有一定的漏检概率。具体来说:

  • 如果生成多项式选得好,CRC可以检测出所有单比特错误
  • 可以检测出所有双比特错误(前提是生成多项式的项数足够)
  • 可以检测出所有奇数个错误(前提是生成多项式包含因子x+1)
  • 可以检测出所有长度小于等于k的突发错误(k是生成多项式的最高次幂)

这些结论考试可能考简答题,让你分析CRC的检错能力。答题的时候,要把条件和结论对应起来,别只写结论。

4. 滑动窗口与可靠传输协议

4.1 停止等待协议:最简单的可靠传输

停止等待协议是最基础的可靠传输机制。它的逻辑特别简单:发送方发一帧,然后停下来等确认;收到确认后再发下一帧;如果超时没收到确认,就重发。

这个协议的核心是超时重传。发送方每发一帧,就启动一个计时器。如果在规定时间内收到ACK,就取消计时器,发下一帧;如果计时器超时,就重发当前帧。

但这里有个问题:如果ACK丢了怎么办?发送方会重发,接收方收到重复帧。所以接收方需要给帧编号,通常是0和1交替。接收方收到重复帧就丢弃,但会再发一次ACK。

停止等待协议的效率很低。假设发送一帧的时间是T,往返时间是RTT,那么信道利用率是T/(T+RTT)。如果RTT远大于T,利用率就非常低。所以实际中很少用,但它是理解滑动窗口的基础。

考试里,停止等待协议常考的是信道利用率计算和帧编号的作用。计算题一般会给出帧长、带宽、传播时延,让你算利用率。公式要记牢:利用率 = 发送时延 / (发送时延 + 往返时延)。

4.2 后退N帧协议:批量发送,批量重传

后退N帧协议(GBN)解决了停止等待效率低的问题。它的思路是:发送方可以连续发多帧,不需要每帧都等确认。接收方只按顺序接收,如果某一帧出错,后面所有帧都丢弃,发送方从出错的那帧开始重传。

GBN的关键参数是窗口大小。发送窗口的大小不能超过2^n - 1,其中n是帧编号的位数。为什么?因为如果窗口太大,接收方无法区分新帧和重传帧。比如n=3,编号是0到7,窗口最大是7。如果窗口是8,发送方发了0到7,接收方全收到了但ACK全丢了,发送方重传0,接收方会以为是新的一轮,就出错了。

GBN的接收窗口大小是1,因为它只能按顺序接收。这一点和选择重传协议不同。

考试里,GBN常考的是窗口大小的计算和重传帧的确定。给你一个发送序列和确认序列,让你判断哪些帧需要重传。这种题的关键是:找到第一个出错的帧,它和它之后的所有帧都要重传。

4.3 选择重传协议:只重传出错的帧

选择重传协议(SR)比GBN更高效,因为它只重传出错的帧,而不是后面的所有帧。接收方可以接收乱序到达的帧,先缓存起来,等缺失的帧到了再一起交给上层。

SR的窗口大小限制更严格:发送窗口和接收窗口的大小都不能超过2^(n-1)。比如n=3,窗口最大是4。为什么?因为要保证发送窗口和接收窗口不重叠,否则接收方无法区分新帧和重传帧。

SR的接收窗口大于1,这是它和GBN最大的区别。接收方需要缓存乱序帧,所以实现起来更复杂。

考试里,SR常考的是窗口大小的计算和接收方缓存的分析。给你一个场景,让你判断接收方会缓存哪些帧、丢弃哪些帧。这种题要画图,把发送窗口和接收窗口的位置标出来,一目了然。

4.4 三种协议的对比与选择

协议发送窗口接收窗口重传方式效率实现复杂度
停止等待11超时重传最低最简单
后退N帧≤2^n-11批量重传中等中等
选择重传≤2^(n-1)≤2^(n-1)单帧重传最高最复杂

这张表考试前一定要背下来。选择题、填空题、简答题都可能用到。尤其是窗口大小的限制条件,经常考。

注意:n是帧编号的位数,不是窗口大小。比如编号用3位,n=3,GBN窗口最大是7,SR窗口最大是4。别搞混。

4.5 滑动窗口的常见考法

滑动窗口相关的题目,期末考通常有这么几种:

  1. 给出n的值,求GBN和SR的最大窗口大小
  2. 给出发送序列和确认序列,判断哪些帧需要重传
  3. 分析接收方在不同协议下的行为
  4. 计算信道利用率

我印象最深的一道题是:给了一个GBN的发送序列,其中第3帧丢失,问发送方会重传哪些帧。答案是第3帧及之后的所有帧。如果换成SR,答案就只是第3帧。这种对比题很常见,考的就是你对两种协议区别的理解。

答题的时候,一定要把“为什么”写清楚。比如GBN为什么重传后面的帧?因为接收方只按顺序接收,第3帧丢了,后面的帧即使到了也会被丢弃,所以发送方必须重传。这样答才能拿满分。

5. 介质访问控制与以太网

5.1 CSMA/CD:先听后说,冲突就退

CSMA/CD是以太网早期使用的介质访问控制方法,全称是载波监听多点接入/碰撞检测。它的逻辑可以用一句话概括:先听后说,边听边说,冲突就退,随机再发。

具体来说:

  • 载波监听:发送前先听信道,如果空闲就发,如果忙就等
  • 碰撞检测:发送过程中继续听,如果发现信号冲突,立即停止发送
  • 退避算法:冲突后,随机等待一段时间再重试。等待时间用二进制指数退避算法计算

二进制指数退避算法的规则是:第i次冲突后,从0到2^i - 1中随机取一个数,乘以基本退避时间,就是等待时间。比如第1次冲突,从0和1中选;第2次冲突,从0到3中选;以此类推,到第10次冲突后,范围不再增大。

这个算法考试常考计算题:给你冲突次数,让你算等待时间的范围。记住公式就行:范围是[0, 2^i - 1] × 基本退避时间。

CSMA/CD有个重要参数叫争用期,也叫碰撞窗口。它是往返传播时延的2倍。如果发送方在争用期内没检测到冲突,就可以确认这次发送不会冲突了。以太网规定争用期是51.2微秒,对应512比特的发送时间。

5.2 CSMA/CA:无线环境下的变通

CSMA/CA用在无线局域网里,因为无线环境无法像有线那样检测碰撞。它的思路是尽量避免碰撞,而不是检测碰撞。

CSMA/CA的核心机制是:

  • 载波监听:发送前先听信道
  • 退避机制:信道忙时,随机退避一段时间再听
  • 确认机制:接收方收到帧后必须发ACK,发送方收到ACK才认为发送成功
  • RTS/CTS:可选机制,用于解决隐藏站问题

CSMA/CA和CSMA/CD最大的区别是:CD是检测冲突,CA是避免冲突。考试里经常考两者的对比,要能说清楚为什么无线不能用CD。

5.3 以太网的帧格式与MAC地址

以太网V2的帧格式是考试重点,必须记住每个字段的长度:

字段长度作用
目的MAC地址6字节接收方的物理地址
源MAC地址6字节发送方的物理地址
类型2字节上层协议类型,如0x0800表示IP
数据46-1500字节网络层交下来的数据
FCS4字节CRC校验码

数据字段最小46字节,最大1500字节。为什么最小是46?因为要保证帧的总长度不小于64字节,这样CSMA/CD才能正常工作。如果数据太短,发送方可能在检测到冲突之前就发完了。

MAC地址是48位,通常写成12个十六进制数,比如00-1A-2B-3C-4D-5E。前24位是厂商代码,后24位是厂商自行分配。MAC地址是全局唯一的,但可以通过软件修改。

考试里,以太网帧格式常考的是字段长度和最小帧长的计算。给你一个数据长度,让你判断是否需要填充。这种题套公式就行:如果数据小于46字节,要填充到46字节。

5.4 交换机的工作原理

交换机是数据链路层的设备,它根据MAC地址转发帧。交换机内部有一张MAC地址表,记录每个MAC地址对应的端口。

交换机的工作流程是:

  1. 收到帧后,提取源MAC地址和端口号,更新MAC地址表
  2. 提取目的MAC地址,查表
  3. 如果表中找到对应端口,就从该端口转发
  4. 如果找不到,就向除接收端口外的所有端口广播
  5. 如果目的端口和接收端口相同,就丢弃

交换机有自学习能力,MAC地址表是动态建立的。这一点和集线器不同,集线器只是简单地广播。

考试里,交换机常考的是MAC地址表的更新和帧的转发决策。给你一个拓扑和一系列帧的发送,让你画出MAC地址表的变化,或者判断某个帧会从哪些端口转发出去。这种题要一步一步来,别跳步。

6. PPP协议与常见问题排查

6.1 PPP协议的基本流程

PPP是点对点协议,用在直接连接的两个节点之间,比如家庭宽带拨号。它的帧格式和以太网类似,但有一些特殊字段:

  • 标志字段:0x7E,表示帧的开始和结束
  • 地址字段:0xFF,固定值
  • 控制字段:0x03,固定值
  • 协议字段:2字节,标识上层协议
  • 信息字段:可变长度,默认最大1500字节
  • FCS:2或4字节,CRC校验

PPP的透明传输用字节填充:如果信息字段中出现0x7E,就转义成0x7D 0x5E;如果出现0x7D,就转义成0x7D 0x5D。

PPP的工作流程分为三个阶段:

  1. 链路建立:通过LCP协商链路参数
  2. 认证:可选,通过PAP或CHAP验证身份
  3. 网络层协议协商:通过NCP协商网络层参数,比如IP地址

考试里,PPP常考的是帧格式和透明传输。给你一段数据,让你写出填充后的序列。规则和字节填充一样,注意转义字符的替换。

6.2 常见问题速查表

问题可能原因排查方法
CRC校验失败传输错误、生成多项式不匹配检查生成多项式,重新计算
帧定界错误数据中出现定界符,未填充检查填充规则,确认转义字符
滑动窗口卡住窗口大小设置错误检查n的值,确认窗口不超过限制
交换机不转发MAC地址表未更新检查源MAC地址,确认学习功能正常
CSMA/CD效率低冲突太多检查网络负载,考虑用交换机替代集线器

这张表是我自己复习的时候整理的,考试前看一遍,能解决大部分概念题。

6.3 独家避坑技巧

最后分享几个我踩过的坑和总结的技巧:

  • CRC计算别跳步:每一步都写清楚,尤其是模2除法,跳步必错。
  • 窗口大小记牢公式:GBN是2^n-1,SR是2^(n-1),别记反了。
  • 以太网帧最小64字节:数据不够46字节要填充,计算题常考。
  • CSMA/CD的争用期是2τ:不是τ,是往返时间。
  • PPP的转义字符是0x7D:不是0x7E,别搞混。

提示:考试的时候,遇到不确定的题,先跳过,把会的做完再回来想。数据链路层这一章计算题多,时间分配很重要。我一般先做选择题和填空题,再做计算题,最后做简答题。计算题至少留20分钟,因为CRC和滑动窗口的题很耗时间。

这一章的内容就捋到这里。数据链路层看起来杂,但核心就是那几个机制:封装成帧、差错检测、可靠传输、介质访问控制。把这四个搞懂了,考试基本没问题。复习的时候多动手算,别光看,算一遍比看十遍都管用。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进